REPORT ZZBGS092 LINE-COUNT 50 LINE-SIZE 132. *----------------------------------------------------------------------* * Description: Program generating an overview of profiles and authori- * * zations. The list is build as a tree list, with * * splitting up composite profiles in single profiles. * * Single profiles are split into authorization. * * Authorization are printed with the both object name and * * Auth name. * * * * Implementing:The program uses recursion. Due to the amount of data * * it was nessesary to keep the data in internal tables * * filled and released as stack tables. * * * * Customizing: None. * * * * Change of None. * * release: * * * * SAP Releases:2.2x - 3.0x * * * * Programmer: Benny G. Sørensen * * Date: September 1996 * * * * Submitting: By transaction SA38 or by batch job scheduling. * * * * Authori- : None * * zation * * * * Parametre: P_mandt : Client * * P_user : Userid * * P_modbe : Userid for creator * * P_profn : Profile * * * * Select-options : * *-------------------------------Corrections----------------------------* * Date Userid Correction * * 21-12-1996 BGS Bug: Missing refresh of Ustack and Pstack * *----------------------------------------------------------------------* *----------------------------------------------------------------------* * Tables: * *----------------------------------------------------------------------* TABLES: USR10 "User master authorization profil ,USR12 "User master authorization values ,USR11 "Usermaster text for profiles (USR10) ,USR13 "Korttekster til authorizations ,TOBJ "Objects ,USR04 "User ,USR03 "User . SELECT-OPTIONS P_MANDT FOR USR10-MANDT DEFAULT SY-MANDT. PARAMETERS: P_USER LIKE USR04-BNAME DEFAULT SY-UNAME. SELECT-OPTIONS P_MODBE FOR USR10-MODBE. SELECT-OPTIONS P_PROFN FOR USR10-PROFN. SELECT-OPTIONS P_AKTPS FOR USR10-AKTPS DEFAULT 'A'. SELECT-OPTIONS P_TYP FOR USR10-TYP. PARAMETERS: P_SHWAUT AS CHECKBOX DEFAULT 'X'. PARAMETERS: P_SHWVAL AS CHECKBOX DEFAULT 'X'. *----------------------------------------------------------------------* * CONSTANTS * *----------------------------------------------------------------------* DATA: _ADDPOS TYPE I VALUE 4 ,_SINGLEPROF VALUE 'S' ,_COLECTPROF VALUE 'C' ,_AKTIVATED VALUE 'A' ,_INWORK VALUE 'P' ,_FINESEL VALUE 'F' ,_ROUGHSEL VALUE 'R' ,_AUTHLNG LIKE SY-FDPOS VALUE 12 ,_PROFLNG LIKE SY-FDPOS VALUE 12 ,_OBJLNG LIKE SY-FDPOS VALUE 10 ,_FLDLNG LIKE SY-FDPOS VALUE 10 ,_MAXCPF TYPE I VALUE 300 ,_MAXPRO TYPE I VALUE 170 ,_MAXUSR TYPE I VALUE 300 ,OK TYPE I VALUE 0 . *----------------------------------------------------------------------* * Variables * *----------------------------------------------------------------------* DATA: W_OFF TYPE I ,W_NRAUT TYPE I ,W_STACK TYPE P ,W_COLUMN TYPE P ,W_ROWS TYPE I . FIELD-SYMBOLS: <TEXT>. *----------------------------------------------------------------------* * Internal tables * *----------------------------------------------------------------------* DATA: MAXSET TYPE I VALUE 100. DATA: BEGIN OF TABSET OCCURS 30, SFIELD LIKE TOBJ-FIEL1, VON(18), BIS(18), END OF TABSET. DATA: BEGIN OF TUSR10 OCCURS 0. "Selected profiles INCLUDE STRUCTURE USR10. DATA: END OF TUSR10. DATA: BEGIN OF USTACK OCCURS 0. "Stacked profiles INCLUDE STRUCTURE USR10. DATA: NUMBER TYPE P ,COLUMN TYPE P. DATA: END OF USTACK. DATA: BEGIN OF PSTACK OCCURS 30, "Stacked profiles/authorizations MANDT LIKE USR10-MANDT ,PROFN LIKE USR10-PROFN ,OBJCT LIKE USR12-OBJCT ,AUTH LIKE USR12-AUTH ,AKTPS LIKE USR10-AKTPS ,NUMBER TYPE P ,COLUMN TYPE P ,END OF PSTACK. DATA: BEGIN OF PROFILE. INCLUDE STRUCTURE USR10. DATA: END OF PROFILE. DATA: BEGIN OF TABUSR OCCURS 30, "Int. Tab. PROFILE LIKE USR10-PROFN, SAMPROF(1), PTEXT LIKE USR11-PTEXT, END OF TABUSR. *----------------------------------------------------------------------* * Event: TOP-OF-PAGE * *----------------------------------------------------------------------* TOP-OF-PAGE. WRITE:/02 SY-ULINE. IF P_USER NE SPACE. WRITE:/02 'For brugerid: ', USR04-BNAME, USR03-NAME1. WRITE:/02 SY-ULINE. ENDIF. WRITE:/02(80) SPACE COLOR COL_HEADING ,/01(16) 'Compositeprofile' COLOR 1 , 21(13) 'Singleprofile' COLOR 2 , 41(13) 'Authorization' COLOR 6 , 61(12) 'Object' COLOR 5 , 81 'PF6 = Retur' COLOR 7 . WRITE:/02 SY-ULINE. *----------------------------------------------------------------------* * Event: INITALIZATION * *----------------------------------------------------------------------* INITIALIZATION. *----------------------------------------------------------------------* * Event: START-OF-SELECTION * * Read and process all profiles wether nor it is a composite or single * * profile. Select only active profiles and only profiles in user selec-* * tions. * *----------------------------------------------------------------------* START-OF-SELECTION. DATA: USRFILL TYPE I ,RC LIKE SY-SUBRC. W_STACK = 0. REFRESH: PSTACK, USTACK. DESCRIBE TABLE P_PROFN LINES W_ROWS. CONDENSE P_USER. "If P_USER entered by user, select "only that users allocated profiles IF P_USER NE SPACE AND W_ROWS = 0. PERFORM GET_USER_PROFILES. ENDIF. SELECT * FROM USR10 CLIENT SPECIFIED INTO TABLE TUSR10 WHERE MANDT IN P_MANDT AND AKTPS IN P_AKTPS AND MODBE IN P_MODBE AND PROFN IN P_PROFN AND TYP IN P_TYP. COMMIT WORK. IF SY-SUBRC = OK. LOOP AT TUSR10. CLEAR: USTACK, PSTACK. REFRESH: PSTACK, USTACK. MOVE-CORRESPONDING TUSR10 TO USTACK. ADD 1 TO W_STACK. USTACK-NUMBER = W_STACK. USTACK-COLUMN = 2. APPEND USTACK. PERFORM SPLIT_AUTHS_INTO_ITEMS. "Recursive form DELETE USTACK INDEX W_STACK. CLEAR USTACK. SUBTRACT 1 FROM W_STACK. COMMIT WORK. NEW-PAGE. ENDLOOP. ELSE. WRITE:/02 'No Profiles matching criteria found'(020) COLOR COL_HEADING. ENDIF. *----------------------------------------------------------------------* * EVENT: AT PF * *----------------------------------------------------------------------* AT PF6. LEAVE TO TRANSACTION 'ZAUT'. *----------------------------------------------------------------------* * EVENT: END-OF-SELECTION * *----------------------------------------------------------------------* END-OF-SELECTION. Write:/02(80) sy-uline. WRITE:/02(80) 'Profile list finished' COLOR COL_HEADING. *----------------------------------------------------------------------* * FORM: If the parameter P_USER is entered, only profiles for this * * user are selected and only for one specified client * *----------------------------------------------------------------------* FORM GET_USER_PROFILES. PERFORM READ_USR04 USING P_USER RC USRFILL. IF RC NE OK. MESSAGE ID 'FT' TYPE 'E' NUMBER '001' WITH 'User does not exists in client ' P_MANDT-LOW. ENDIF. REFRESH P_PROFN. "Get all profiles attached LOOP AT TABUSR. "to the user and save it P_PROFN-SIGN = 'I'. "in the internal table P_PROFN-OPTION = 'EQ'. "P_PROFN. P_PROFN-LOW = TABUSR-PROFILE. " APPEND P_PROFN. " ENDLOOP. " ENDFORM. *----------------------------------------------------------------------* * FORM: Split_Auths_Into_Items * * This form is called recursivly until AUTHS only hold authorizations, * * meaning when single profile type = S. Note that the printing position* * are calculated depending on the hierarcy level. * *----------------------------------------------------------------------* FORM SPLIT_AUTHS_INTO_ITEMS. DATA: COLUMN TYPE P ,AUTHORIZATION(23) TYPE C ,RC LIKE SY-SUBRC. CLEAR W_COLUMN. READ TABLE USTACK INDEX W_STACK. MOVE-CORRESPONDING USTACK TO PROFILE. MOVE USTACK-COLUMN TO COLUMN. POSITION COLUMN. SELECT SINGLE * FROM USR11 CLIENT SPECIFIED WHERE MANDT = PROFILE-MANDT AND LANGU = SY-LANGU AND PROFN = PROFILE-PROFN AND AKTPS = PROFILE-AKTPS . IF SY-SUBRC NE OK. CLEAR USR11. USR11-PTEXT = 'No description found'. ENDIF. CASE PROFILE-TYP. When 'C'. "Composite profile WRITE: PROFILE-PROFN COLOR 1 , USR11-PTEXT COLOR COL_NORMAL, /. PERFORM FILL_TABPRO. LOOP AT PSTACK WHERE NUMBER = W_STACK. SELECT SINGLE * FROM USR10 CLIENT SPECIFIED WHERE MANDT = PSTACK-MANDT AND AKTPS = PSTACK-AKTPS AND PROFN = PSTACK-PROFN. IF SY-SUBRC = OK. W_COLUMN = PSTACK-COLUMN . CLEAR USTACK. MOVE-CORRESPONDING USR10 TO USTACK. ADD 1 TO W_STACK. USTACK-NUMBER = W_STACK. USTACK-COLUMN = W_COLUMN. APPEND USTACK. PERFORM SPLIT_AUTHS_INTO_ITEMS. DELETE USTACK INDEX W_STACK. LOOP AT PSTACK WHERE NUMBER = W_STACK. DELETE PSTACK. ENDLOOP. SUBTRACT 1 FROM W_STACK. ELSE. W_COLUMN = COLUMN + _ADDPOS. POSITION W_COLUMN. WRITE: PSTACK-PROFN COLOR 2, '%'. ENDIF. ENDLOOP. When 'S'. "Single profile WRITE: PROFILE-PROFN COLOR 2 ,USR11-PTEXT COLOR COL_NORMAL, /. IF P_SHWAUT = 'X'. PERFORM FILL_TABPRO. LOOP AT PSTACK WHERE NUMBER = W_STACK. SELECT SINGLE * FROM USR13 CLIENT SPECIFIED WHERE MANDT = PSTACK-MANDT AND LANGU = SY-LANGU AND OBJCT = PSTACK-OBJCT AND AUTH = PSTACK-AUTH AND AKTPS = PSTACK-AKTPS . IF SY-SUBRC NE OK. CLEAR USR13. USR13-ATEXT = 'No description found'. ENDIF. W_COLUMN = PSTACK-COLUMN. POSITION W_COLUMN. WRITE: PSTACK-AUTH COLOR 6. W_COLUMN = COLUMN + _ADDPOS + _PROFLNG + 2. POSITION W_COLUMN. WRITE: PSTACK-OBJCT COLOR 5 , USR13-ATEXT COLOR COL_NORMAL, /. IF P_SHWVAL = 'X'. PERFORM READ_USR12 USING PSTACK-OBJCT PSTACK-AUTH PSTACK-AKTPS RC. LOOP AT TABSET. POSITION W_COLUMN. WRITE: TABSET-SFIELD, TABSET-VON, TABSET-BIS,/. ENDLOOP. ENDIF. ENDLOOP. ENDIF. WHEN OTHERS. PERFORM ERRORHANDLING USING 21 TEXT-021. ENDCASE. ENDFORM. "Split_Auths_Into_Items *----------------------------------------------------------------------* * FORM: ErrorHandling * * If any error occurs the program terminates. * *----------------------------------------------------------------------* FORM ERRORHANDLING USING ERRORNUMBER ERRORTEXT. WRITE:/02 ERRORNUMBER, ERRORTEXT COLOR 7. stop. Endform. "ErrorHandling *---------------------------------------------------------------------* * FORM FILL_TABPRO * * The splitting up of AUTHS field depend on wether profile-typ is * * Composite or single profile. If Composite we split for each 12 * * Character, if Single profile we split for each 22 character, because* * an authorization id consist of both object and authorization Id. * *---------------------------------------------------------------------* FORM FILL_TABPRO. * Composite profile consist only of single-profiles IF PROFILE-TYP = _COLECTPROF. CLEAR PSTACK. W_OFF = 2. W_NRAUT = PROFILE-NRAUT / 12. IF W_NRAUT > _MAXCPF. W_NRAUT = 0. ENDIF. DO W_NRAUT TIMES. ASSIGN PROFILE-AUTHS+W_OFF(_PROFLNG) TO <TEXT>. WRITE <TEXT> TO PSTACK-PROFN. PSTACK-NUMBER = W_STACK. PSTACK-MANDT = PROFILE-MANDT. PSTACK-AKTPS = PROFILE-AKTPS. PSTACK-COLUMN = USTACK-COLUMN + _ADDPOS. APPEND PSTACK. W_OFF = W_OFF + _PROFLNG. ENDDO. * Single profile consist only of authorizations ELSE. IF PROFILE-TYP = _SINGLEPROF. CLEAR PSTACK. W_OFF = 2. W_NRAUT = PROFILE-NRAUT / 22. IF W_NRAUT > _MAXPRO. W_NRAUT = 0. ENDIF. DO W_NRAUT TIMES. ASSIGN PROFILE-AUTHS+W_OFF(_OBJLNG) TO <TEXT>. WRITE <TEXT> TO PSTACK-OBJCT. W_OFF = W_OFF + _OBJLNG. ASSIGN PROFILE-AUTHS+W_OFF(_AUTHLNG) TO <TEXT>. WRITE <TEXT> TO PSTACK-AUTH. W_OFF = W_OFF + _AUTHLNG. PSTACK-MANDT = PROFILE-MANDT. PSTACK-AKTPS = PROFILE-AKTPS. PSTACK-NUMBER = W_STACK. PSTACK-COLUMN = USTACK-COLUMN + _ADDPOS. APPEND PSTACK. ENDDO. ENDIF. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM : Read_USR12 * *---------------------------------------------------------------------* FORM READ_USR12 USING VALUE(OBJECT) VALUE(AUTH) VALUE(AKTPAS) RC. DATA: INTFLAG TYPE I VALUE 0, OFF TYPE I, VTYP, LNG TYPE I, CLNG(2), GLNG(2), SETFILL LIKE SY-TFILL. FIELD-SYMBOLS: <TEXT>. * CLEAR USR12. RC = 0. IF AKTPAS = _AKTIVATED OR AKTPAS = _INWORK. SELECT SINGLE * FROM USR12 "Expl. Aktiv- od. Pflegeversion WHERE OBJCT = OBJECT AND AUTH = AUTH AND AKTPS = AKTPAS. ELSE. SELECT SINGLE * FROM USR12 "Wenn nicht, dann zuerst Pflege- WHERE OBJCT = OBJECT AND AUTH = AUTH AND AKTPS = _INWORK. IF SY-SUBRC <> 0. SELECT SINGLE * FROM USR12 "Nicht vorh., dann Aktivv. lesen WHERE OBJCT = OBJECT AND AUTH = AUTH AND AKTPS = _AKTIVATED. ENDIF. ENDIF. IF SY-SUBRC = 0. SETFILL = 0. REFRESH TABSET. CLEAR TABSET. OFF = 2. * Werte aufschluesseln und in die int. Tab. tabset laden ASSIGN USR12-VALS+OFF(1) TO <TEXT>. WRITE <TEXT> TO VTYP. * Var. Teil bis zum FF (= Endezeichen) lesen WHILE VTYP <> ' ' AND OFF < USR12-LNG. OFF = OFF + 1. * vtyp steht fuer Schluessel, ob es sich um Feldnamen, Einzelwert, * Anfang Intervall oder Ende Intervall handelt. CASE VTYP. WHEN 'F'. "Feldname OFF = OFF + 5. ASSIGN USR12-VALS+OFF(2) TO <TEXT>. WRITE <TEXT> TO CLNG. LNG = CLNG. OFF = OFF + 2. ASSIGN USR12-VALS+OFF(_FLDLNG) TO <TEXT>. WRITE <TEXT> TO TABSET-SFIELD. OFF = OFF + _FLDLNG. WHEN 'E'. "Einzelwert ASSIGN USR12-VALS+OFF(LNG) TO <TEXT>. WRITE <TEXT> TO TABSET-VON. IF TABSET-VON = SPACE. TABSET-VON = ''' '''. ENDIF. APPEND TABSET. SETFILL = SETFILL + 1. TABSET-VON = SPACE. TABSET-BIS = SPACE. OFF = OFF + LNG. WHEN 'G'. ASSIGN USR12-VALS+OFF(2) TO <TEXT>. WRITE <TEXT> TO CLNG. GLNG = CLNG. OFF = OFF + 2. ASSIGN USR12-VALS+OFF(LNG) TO <TEXT>. IF INTFLAG = 0. WRITE <TEXT> TO TABSET-VON. WRITE '*' TO TABSET-VON+GLNG. ELSE. WRITE <TEXT> TO TABSET-BIS. WRITE '*' TO TABSET-BIS+GLNG. INTFLAG = 0. ENDIF. APPEND TABSET. SETFILL = SETFILL + 1. TABSET-VON = SPACE. TABSET-BIS = SPACE. OFF = OFF + LNG. WHEN 'V'. INTFLAG = 1. ASSIGN USR12-VALS+OFF(LNG) TO <TEXT>. WRITE <TEXT> TO TABSET-VON. IF TABSET-VON = SPACE. TABSET-VON = ''' '''. ENDIF. OFF = OFF + LNG. WHEN 'B'. INTFLAG = 0. ASSIGN USR12-VALS+OFF(LNG) TO <TEXT>. WRITE <TEXT> TO TABSET-BIS. IF TABSET-BIS = SPACE. TABSET-BIS = ''' '''. ENDIF. APPEND TABSET. SETFILL = SETFILL + 1. TABSET-VON = SPACE. TABSET-BIS = SPACE. OFF = OFF + LNG. ENDCASE. ASSIGN USR12-VALS+OFF(1) TO <TEXT>. WRITE <TEXT> TO VTYP. ENDWHILE. ELSE. RC = SY-SUBRC. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM : Read_USR04 * *---------------------------------------------------------------------* FORM READ_USR04 USING VALUE(USER) RC USRFILL. CLEAR USR04. RC = 0. SELECT SINGLE * FROM USR04 CLIENT SPECIFIED WHERE MANDT = P_MANDT-LOW AND BNAME = USER. IF SY-SUBRC = 0. SELECT SINGLE * FROM USR03 CLIENT SPECIFIED WHERE MANDT = P_MANDT-LOW AND BNAME = USER. PERFORM FILL_TABUSR USING USRFILL. ELSE. REFRESH TABUSR. CLEAR TABUSR. USRFILL = 0. RC = 4. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM : write_vline * *---------------------------------------------------------------------* FORM FILL_TABUSR USING USRFILL. DATA: NRPRO TYPE I, OFF TYPE I. * REFRESH TABUSR. CLEAR TABUSR. USRFILL = 0. OFF = 2. NRPRO = USR04-NRPRO / 12. IF NRPRO > _MAXUSR. NRPRO = 0. ENDIF. DO NRPRO TIMES. ASSIGN USR04-PROFS+OFF(_PROFLNG) TO <TEXT>. WRITE <TEXT> TO TABUSR-PROFILE. APPEND TABUSR. USRFILL = USRFILL + 1. OFF = OFF + _PROFLNG. ENDDO. ENDFORM. *---------------------------------------------------------------------* * FORM : write_vline * *---------------------------------------------------------------------* FORM WRITE_VLINE USING MODE POS. IF MODE NE 'T'. FORMAT INTENSIFIED. ENDIF. POSITION POS. WRITE: SY-VLINE. IF MODE NE 'T'. FORMAT RESET. ENDIF. ENDFORM.