Posted: Sat Nov 17, 2007 7:26 pm Post subject: List contents of an authorization profile
List contents of an authorization profile with hierarchy, objects and fields; example of recursive calls of form routines
Code:
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: 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.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.