TABLES: SXS_ATTR,
TOBJT,
TSTCT, "TCode texts
TRDIRT, "Program texts
SXC_EXIT. "BADI exits
TYPE-POOLS: SLIS. "Globale Typen fьr generische Listbausteine
DATA: TABIX LIKE SY-TABIX,
W_LINNUM TYPE I,
W_OFF TYPE I,
W_INDEX LIKE SY-TABIX,
W_INCLUDE LIKE TRDIR-NAME,
W_PROG LIKE TRDIR-NAME,
W_INCL LIKE TRDIR-NAME,
W_AREA LIKE RS38L-AREA,
W_LEVEL,
W_STR(50) TYPE C,
W_CNT(2) TYPE C,
W_FUNCNAME LIKE TFDIR-FUNCNAME,
W_FSEL LIKE SY-UCOMM, " Determination of screen field
W_GRIDTXT(70) TYPE C. "ALV grid title
CONSTANTS: C_FMOD(40) TYPE C VALUE 'Function modules searched: ',
C_SUBM(40) TYPE C VALUE 'Submit programs searched: ',
C_DEVC(60) TYPE C VALUE 'User-exits from development classes in function modules',
C_COL1(12) TYPE C VALUE 'Enhanmt Type',
C_COL2(40) TYPE C VALUE 'Enhancement',
C_COL3(30) TYPE C VALUE 'Program/Include',
C_COL4(20) TYPE C VALUE 'Enhancement Name',
C_COL5(40) TYPE C VALUE 'Enhancement Description',
C_COL6(8) TYPE C VALUE 'Project',
C_COL7(1) TYPE C VALUE 'S',
C_COL8(12) TYPE C VALUE 'ChangeName',
C_COL9(10) TYPE C VALUE 'ChangeDate',
C_X TYPE C VALUE 'X'.
* Work Areas: ABAP Workbench
DATA: BEGIN OF WA_D010INC.
DATA: MASTER TYPE D010INC-MASTER.
DATA: END OF WA_D010INC.
DATA: BEGIN OF WA_TFDIR.
DATA: FUNCNAME TYPE TFDIR-FUNCNAME,
PNAME TYPE TFDIR-PNAME,
INCLUDE TYPE TFDIR-INCLUDE.
DATA: END OF WA_TFDIR.
DATA: BEGIN OF WA_TADIR.
DATA: DEVCLASS TYPE TADIR-DEVCLASS.
DATA: END OF WA_TADIR.
DATA: BEGIN OF WA_TSTC.
DATA: PGMNA TYPE TSTC-PGMNA.
DATA: END OF WA_TSTC.
DATA: BEGIN OF WA_TSTCP.
DATA: PARAM TYPE TSTCP-PARAM.
DATA: END OF WA_TSTCP.
DATA: BEGIN OF WA_ENLFDIR.
DATA: AREA TYPE ENLFDIR-AREA.
DATA: END OF WA_ENLFDIR.
* Work Areas: BADIs
DATA: BEGIN OF WA_SXS_ATTR.
DATA: EXIT_NAME TYPE SXS_ATTR-EXIT_NAME.
DATA: END OF WA_SXS_ATTR.
DATA: BEGIN OF WA_SXS_ATTRT.
DATA: TEXT TYPE SXS_ATTRT-TEXT.
DATA: END OF WA_SXS_ATTRT.
* Work Areas: Enhancements
DATA: BEGIN OF WA_MODSAP.
DATA: MEMBER TYPE MODSAP-MEMBER.
DATA: END OF WA_MODSAP.
DATA: BEGIN OF WA_MODSAPA.
DATA: NAME TYPE MODSAPA-NAME.
DATA: END OF WA_MODSAPA.
DATA: BEGIN OF WA_MODSAPT.
DATA: MODTEXT TYPE MODSAPT-MODTEXT.
DATA: END OF WA_MODSAPT.
* Work Areas: Business Transaction Events
DATA: BEGIN OF WA_TBE01T.
DATA: TEXT1 TYPE TBE01T-TEXT1.
DATA: END OF WA_TBE01T.
DATA: BEGIN OF WA_TPS01T.
DATA: TEXT1 TYPE TPS01T-TEXT1.
DATA: END OF WA_TPS01T.
* user-exits
TYPES: BEGIN OF TY_MOD,
MEMBER LIKE MODACT-MEMBER,
NAME LIKE MODACT-NAME,
STATUS LIKE MODATTR-STATUS,
ANAM LIKE MODATTR-ANAM,
ADAT LIKE MODATTR-ADAT,
END OF TY_MOD.
DATA: W_MOD TYPE TY_MOD.
TYPES: BEGIN OF T_USEREXIT,
TYPE(12) TYPE C,
PNAME LIKE TRDIR-NAME,
TXT(300),
LEVEL TYPE C,
MODNAME(30) TYPE C,
MODTEXT(60) TYPE C,
MODATTR TYPE TY_MOD,
COLOUR(4) TYPE C,
END OF T_USEREXIT.
DATA: I_USEREXIT TYPE STANDARD TABLE OF T_USEREXIT WITH HEADER LINE.
* Function module developmnet classes
TYPES: BEGIN OF T_DEVCLASS,
CLAS LIKE TRDIR-CLAS,
END OF T_DEVCLASS.
DATA: I_DEVCLASS TYPE STANDARD TABLE OF T_DEVCLASS WITH HEADER LINE.
* Submit programs
TYPES: BEGIN OF T_SUBMIT,
PNAME LIKE TRDIR-NAME,
LEVEL,
DONE,
END OF T_SUBMIT.
DATA: I_SUBMIT TYPE STANDARD TABLE OF T_SUBMIT WITH HEADER LINE.
* Source code
TYPES: BEGIN OF T_SOURCETAB, "#EC * (SLIN lьgt!)
LINE(200), "#EC * (SLIN lьgt!)
END OF T_SOURCETAB. "#EC * (SLIN lьgt!)
DATA: SOURCETAB TYPE STANDARD TABLE OF T_SOURCETAB WITH HEADER LINE.
DATA C_OVERFLOW(30000) TYPE C.
* Description of an ABAP/4 source analysis token
DATA: I_STOKEN TYPE STANDARD TABLE OF STOKEN WITH HEADER LINE.
DATA WA_STOKEN LIKE I_STOKEN.
* Description of an ABAP/4 source analysis statement
DATA: I_SSTMNT TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE."#EC NEEDED
* keywords for searching ABAP code
TYPES: BEGIN OF T_KEYWORDS,
WORD(30),
END OF T_KEYWORDS.
DATA: KEYWORDS TYPE STANDARD TABLE OF T_KEYWORDS WITH HEADER LINE.
* function modules within program
TYPES: BEGIN OF T_FMODULE,
NAME LIKE RS38L-NAME,
PNAME LIKE TRDIR-NAME,
PNAME2 LIKE TRDIR-NAME,
LEVEL,
BAPI,
DONE,
END OF T_FMODULE.
DATA: I_FMODULE TYPE STANDARD TABLE OF T_FMODULE WITH HEADER LINE.
* ALV definitions
DATA I_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.
DATA I_LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA I_SORT TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE.
*&--------------------------------------------------------------------&*
*& Selection Options &*
*&--------------------------------------------------------------------&*
SELECTION-SCREEN BEGIN OF BLOCK SELSCR1 WITH FRAME TITLE TEXT-S01.
PARAMETER: P_PNAME LIKE TRDIR-NAME,
P_TCODE LIKE SYST-TCODE,
P_LIMIT(4) TYPE N DEFAULT 500.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK SELSCR1.
SELECTION-SCREEN BEGIN OF BLOCK SELSCR2 WITH FRAME TITLE TEXT-S02.
PARAMETER: P_BADI AS CHECKBOX DEFAULT C_X,
P_BTE AS CHECKBOX DEFAULT C_X,
P_EXIT AS CHECKBOX DEFAULT C_X,
P_PROG AS CHECKBOX DEFAULT C_X,
P_WFLOW AS CHECKBOX,
P_AUTH AS CHECKBOX.
SELECTION-SCREEN SKIP.
PARAMETER: P_TEXT(40) TYPE C.
SELECTION-SCREEN END OF BLOCK SELSCR2.
SELECTION-SCREEN BEGIN OF BLOCK SELSCR3 WITH FRAME TITLE TEXT-S03.
PARAMETER: P_ALV RADIOBUTTON GROUP RAD1 DEFAULT 'X',
P_LST RADIOBUTTON GROUP RAD1.
SELECTION-SCREEN SKIP.
PARAMETER: P_DEVC LIKE RIHEA-DY_OFN DEFAULT ' ' MODIF ID A01,
P_FUNC LIKE RIHEA-DY_OFN DEFAULT ' ' MODIF ID A01,
P_SUBM LIKE RIHEA-DY_OFN DEFAULT ' ' MODIF ID A01.
SELECTION-SCREEN END OF BLOCK SELSCR3.
*&--------------------------------------------------------------------&*
*& START-OF-SELECTION &*
*&--------------------------------------------------------------------&*
START-OF-SELECTION.
IF P_PNAME IS INITIAL AND P_TCODE IS INITIAL.
MESSAGE I000(G01) WITH TEXT-M01.
STOP.
ENDIF.
IF P_BADI IS INITIAL AND
P_EXIT IS INITIAL AND
P_BTE IS INITIAL AND
P_WFLOW IS INITIAL AND
P_AUTH IS INITIAL AND
P_PROG IS INITIAL.
MESSAGE I000(G01) WITH TEXT-M02.
STOP.
ENDIF.
* ensure P_LIMIT is not zero.
IF P_LIMIT = 0.
P_LIMIT = 1.
ENDIF.
PERFORM DATA_SELECT.
PERFORM GET_SUBMIT_DATA.
PERFORM GET_FM_DATA.
PERFORM GET_ADDITIONAL_DATA.
PERFORM DATA_DISPLAY.
*&--------------------------------------------------------------------&*
*& Form DATA_SELECT &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM DATA_SELECT.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get programs/includes' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
* get TCode name for ALV grid title
CLEAR W_GRIDTXT.
IF NOT P_TCODE IS INITIAL.
SELECT SINGLE * FROM TSTCT WHERE TCODE = P_TCODE
AND SPRSL = SY-LANGU.
CONCATENATE 'TCode:' P_TCODE TSTCT-TTEXT INTO W_GRIDTXT
SEPARATED BY SPACE.
ENDIF.
* get program name for ALV grid title
IF NOT P_PNAME IS INITIAL.
SELECT SINGLE * FROM TRDIRT WHERE NAME = P_PNAME
AND SPRSL = SY-LANGU.
CONCATENATE 'Program:' P_PNAME TSTCT-TTEXT INTO W_GRIDTXT
SEPARATED BY SPACE.
ENDIF.
* determine search words
KEYWORDS-WORD = 'CALL'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'FORM'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'PERFORM'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'SUBMIT'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'INCLUDE'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'AUTHORITY-CHECK'.
APPEND KEYWORDS.
IF NOT P_TCODE IS INITIAL.
* get program name from TCode
SELECT SINGLE PGMNA FROM TSTC INTO WA_TSTC-PGMNA
WHERE TCODE EQ P_TCODE.
IF NOT WA_TSTC-PGMNA IS INITIAL.
P_PNAME = WA_TSTC-PGMNA.
* TCode does not include program name, but does have reference TCode
ELSE.
SELECT SINGLE PARAM FROM TSTCP INTO WA_TSTCP-PARAM
WHERE TCODE EQ P_TCODE.
IF SY-SUBRC = 0.
CHECK WA_TSTCP-PARAM(1) = '/'.
CHECK WA_TSTCP-PARAM+1(1) = '*'.
IF WA_TSTCP-PARAM CA ' '.
ENDIF.
W_OFF = SY-FDPOS + 1.
SUBTRACT 2 FROM SY-FDPOS.
IF SY-FDPOS GT 0.
P_TCODE = WA_TSTCP-PARAM+2(SY-FDPOS).
ENDIF.
SELECT SINGLE PGMNA FROM TSTC INTO WA_TSTC-PGMNA
WHERE TCODE EQ P_TCODE.
P_PNAME = WA_TSTC-PGMNA.
IF SY-SUBRC <> 0.
MESSAGE S110(/SAPTRX/ASC) WITH 'No program found for: ' P_TCODE."#EC NOTEXT
STOP.
ENDIF.
ELSE.
MESSAGE S110(/SAPTRX/ASC) WITH 'No program found for: ' P_TCODE."#EC NOTEXT
STOP.
ENDIF.
ENDIF.
ENDIF.
* Call customer-function aus Program coding
READ REPORT P_PNAME INTO SOURCETAB.
IF SY-SUBRC > 0.
MESSAGE E017(ENHANCEMENT) WITH P_PNAME RAISING NO_PROGRAM."#EC *
ENDIF.
SCAN ABAP-SOURCE SOURCETAB TOKENS INTO I_STOKEN
STATEMENTS INTO I_SSTMNT
KEYWORDS FROM KEYWORDS
OVERFLOW INTO C_OVERFLOW
WITH INCLUDES. "#EC
IF SY-SUBRC > 0. "keine/syntakt. falsche Ablauflog./Fehler im Skanner
MESSAGE E130(ENHANCEMENT) RAISING SYNTAX_ERROR. "#EC
ENDIF.
* check I_STOKEN for entries
CLEAR W_LINNUM.
DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
IF W_LINNUM GT 0.
W_LEVEL = '0'.
W_PROG = ''.
W_INCL = ''.
PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
ENDIF.
ENDFORM. "DATA_SELECT
*&--------------------------------------------------------------------&*
*& Form GET_FM_DATA ? &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM GET_FM_DATA.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get function module data' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
* Function module data
SORT I_FMODULE BY NAME.
DELETE ADJACENT DUPLICATES FROM I_FMODULE COMPARING NAME.
LOOP AT I_FMODULE WHERE DONE NE C_X.
CLEAR: I_STOKEN, I_SSTMNT, SOURCETAB, WA_TFDIR, W_INCLUDE .
REFRESH: I_STOKEN, I_SSTMNT, SOURCETAB.
CLEAR WA_TFDIR.
SELECT SINGLE FUNCNAME PNAME INCLUDE FROM TFDIR INTO WA_TFDIR
WHERE FUNCNAME = I_FMODULE-NAME.
CHECK SY-SUBRC = 0.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
PROGRAM = WA_TFDIR-PNAME
IMPORTING
GROUP = W_AREA.
CONCATENATE 'L' W_AREA 'U' WA_TFDIR-INCLUDE INTO W_INCLUDE.
I_FMODULE-PNAME = W_INCLUDE.
I_FMODULE-PNAME2 = WA_TFDIR-PNAME.
MODIFY I_FMODULE.
READ REPORT I_FMODULE-PNAME INTO SOURCETAB.
IF SY-SUBRC = 0.
SCAN ABAP-SOURCE SOURCETAB TOKENS INTO I_STOKEN
STATEMENTS INTO I_SSTMNT
KEYWORDS FROM KEYWORDS
WITH INCLUDES.
IF SY-SUBRC > 0.
MESSAGE E130(ENHANCEMENT) RAISING SYNTAX_ERROR.
ENDIF.
* check i_stoken for entries
CLEAR W_LINNUM.
DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
IF W_LINNUM GT 0.
W_LEVEL = '1'.
W_PROG = I_FMODULE-PNAME2.
W_INCL = I_FMODULE-PNAME.
PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
ENDIF.
ENDIF.
ENDLOOP.
* store development classes
IF P_DEVC = C_X.
LOOP AT I_FMODULE.
CLEAR: WA_TADIR, WA_ENLFDIR.
SELECT SINGLE AREA FROM ENLFDIR INTO WA_ENLFDIR-AREA
WHERE FUNCNAME = I_FMODULE-NAME.
CHECK NOT WA_ENLFDIR-AREA IS INITIAL.
SELECT SINGLE DEVCLASS INTO WA_TADIR-DEVCLASS
FROM TADIR WHERE PGMID = 'R3TR'
AND OBJECT = 'FUGR'
AND OBJ_NAME = WA_ENLFDIR-AREA.
CHECK NOT WA_TADIR-DEVCLASS IS INITIAL.
MOVE WA_TADIR-DEVCLASS TO I_DEVCLASS-CLAS.
APPEND I_DEVCLASS.
I_FMODULE-DONE = C_X.
MODIFY I_FMODULE.
ENDLOOP.
SORT I_DEVCLASS.
DELETE ADJACENT DUPLICATES FROM I_DEVCLASS.
ENDIF.
ENDFORM. "GET_FM_DATA
*&--------------------------------------------------------------------&*
*& Form GET_SUBMIT_DATA &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM GET_SUBMIT_DATA.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get submit data' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
SORT I_SUBMIT.
DELETE ADJACENT DUPLICATES FROM I_SUBMIT COMPARING PNAME.
W_LEVEL = '0'.
LOOP AT I_SUBMIT WHERE DONE NE C_X.
CLEAR: I_STOKEN, I_SSTMNT, SOURCETAB.
REFRESH: I_STOKEN, I_SSTMNT, SOURCETAB.
READ REPORT I_SUBMIT-PNAME INTO SOURCETAB.
IF SY-SUBRC = 0.
SCAN ABAP-SOURCE SOURCETAB TOKENS INTO I_STOKEN
STATEMENTS INTO I_SSTMNT
KEYWORDS FROM KEYWORDS
WITH INCLUDES.
IF SY-SUBRC > 0.
* message e130(enhancement) raising syntax_error.
CONTINUE.
ENDIF.
* check i_stoken for entries
CLEAR W_LINNUM.
DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
IF W_LINNUM GT 0.
W_PROG = I_SUBMIT-PNAME.
W_INCL = ''.
PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
ENDIF.
ENDIF.
* restrict number of submit program selected for processing
DESCRIBE TABLE I_SUBMIT LINES W_LINNUM.
IF W_LINNUM GE P_LIMIT.
W_LEVEL = '1'.
ENDIF.
I_SUBMIT-DONE = C_X.
MODIFY I_SUBMIT.
ENDLOOP.
ENDFORM. "GET_SUBMIT_DATA
*&--------------------------------------------------------------------&*
*& Form DATA_SEARCH &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM DATA_SEARCH TABLES P_STOKEN STRUCTURE STOKEN
USING P_LEVEL L_PROG L_INCL.
LOOP AT P_STOKEN.
CLEAR I_USEREXIT.
* Workflow
IF P_WFLOW = C_X.
IF P_LEVEL EQ '1'. " do not perform for function modules (2nd pass)
IF P_STOKEN-STR+1(16) CS 'SWE_EVENT_CREATE'.
REPLACE ALL OCCURRENCES OF '''' IN P_STOKEN-STR WITH ''.
I_USEREXIT-TYPE = 'WorkFlow'.
I_USEREXIT-TXT = P_STOKEN-STR.
CONCATENATE L_PROG '/' L_INCL INTO I_USEREXIT-PNAME.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
ENDIF.
TABIX = SY-TABIX + 1.
I_USEREXIT-LEVEL = P_LEVEL.
IF I_USEREXIT-LEVEL = '0'.
IF L_INCL IS INITIAL.
I_USEREXIT-PNAME = P_PNAME.
ELSE.
CONCATENATE P_PNAME '-' L_INCL INTO I_USEREXIT-PNAME.
ENDIF.
ELSE.
IF L_INCL IS INITIAL.
I_USEREXIT-PNAME = L_PROG.
ELSE.
CONCATENATE L_PROG '-' L_INCL INTO I_USEREXIT-PNAME.
ENDIF.
ENDIF.
* AUTHORITY-CHECKS
IF P_AUTH = C_X.
IF P_STOKEN-STR EQ 'AUTHORITY-CHECK'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 2.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
CHECK NOT WA_STOKEN-STR CS 'STRUCTURE'.
CHECK NOT WA_STOKEN-STR CS 'SYMBOL'.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_USEREXIT-PNAME = I_SUBMIT-PNAME.
I_USEREXIT-TYPE = 'AuthCheck'.
I_USEREXIT-TXT = WA_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
CLEAR TOBJT.
SELECT SINGLE * FROM TOBJT WHERE OBJECT = I_USEREXIT-TXT
AND LANGU = SY-LANGU.
I_USEREXIT-MODNAME = 'AUTHORITY-CHECK'.
I_USEREXIT-MODTEXT = TOBJT-TTEXT.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
ENDIF.
* Text searches
IF NOT P_TEXT IS INITIAL.
IF P_STOKEN-STR CS P_TEXT.
I_USEREXIT-PNAME = I_SUBMIT-PNAME.
I_USEREXIT-TYPE = 'TextSearch'.
I_USEREXIT-TXT = WA_STOKEN-STR.
I_USEREXIT-MODNAME = 'Text Search'.
I_USEREXIT-MODTEXT = P_STOKEN-STR.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
* Include (SE38)
IF P_STOKEN-STR EQ 'INCLUDE'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
CHECK NOT WA_STOKEN-STR CS 'STRUCTURE'.
CHECK NOT WA_STOKEN-STR CS 'SYMBOL'.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_SUBMIT-PNAME = WA_STOKEN-STR.
I_SUBMIT-LEVEL = P_LEVEL.
APPEND I_SUBMIT.
ENDIF.
ENDIF.
* Enhancements (SMOD)
IF P_EXIT = C_X.
IF P_STOKEN-STR EQ 'CUSTOMER-FUNCTION'.
CLEAR W_FUNCNAME.
READ TABLE P_STOKEN INDEX TABIX.
TRANSLATE P_STOKEN-STR USING ''' '.
CONDENSE P_STOKEN-STR.
IF L_PROG IS INITIAL.
CONCATENATE 'EXIT' P_PNAME P_STOKEN-STR INTO W_FUNCNAME
SEPARATED BY '_'.
ELSE.
CONCATENATE 'EXIT' L_PROG P_STOKEN-STR INTO W_FUNCNAME
SEPARATED BY '_'.
ENDIF.
SELECT SINGLE MEMBER FROM MODSAP INTO WA_MODSAP-MEMBER
WHERE MEMBER = W_FUNCNAME.
IF SY-SUBRC = 0. " check for valid enhancement
I_USEREXIT-TYPE = 'Enhancement'.
I_USEREXIT-TXT = W_FUNCNAME.
APPEND I_USEREXIT.
ELSE.
CLEAR WA_D010INC.
SELECT SINGLE MASTER INTO WA_D010INC-MASTER
FROM D010INC
WHERE INCLUDE = L_PROG.
CONCATENATE 'EXIT' WA_D010INC-MASTER P_STOKEN-STR INTO W_FUNCNAME
SEPARATED BY '_'.
I_USEREXIT-TYPE = 'Enhancement'.
I_USEREXIT-TXT = W_FUNCNAME.
ENDIF.
ENDIF.
ENDIF.
* BADIs (SE18)
IF P_BADI = C_X.
IF P_STOKEN-STR CS 'cl_exithandler='.
W_INDEX = SY-TABIX + 4.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
I_USEREXIT-TXT = WA_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
I_USEREXIT-TYPE = 'BADI'.
CLEAR SXS_ATTR. " ensure a real BADI
SELECT SINGLE * FROM SXS_ATTR WHERE EXIT_NAME = I_USEREXIT-TXT.
IF SY-SUBRC = 0.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
ENDIF.
* Business transaction events (FIBF)
IF P_BTE = C_X.
IF P_STOKEN-STR CS 'OPEN_FI_PERFORM'.
I_USEREXIT-TYPE = 'BusTrEvent'.
I_USEREXIT-TXT = P_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
I_USEREXIT-MODNAME = I_USEREXIT-TXT+16(8).
CASE I_USEREXIT-TXT+25(1).
WHEN 'E'.
CLEAR WA_TBE01T.
SELECT SINGLE TEXT1 INTO WA_TBE01T-TEXT1 FROM TBE01T
WHERE EVENT = I_USEREXIT-TXT+16(8)
AND SPRAS = SY-LANGU.
IF WA_TBE01T-TEXT1 IS INITIAL.
I_USEREXIT-MODTEXT = '<Not active>'. "#EC NOTEXT
ELSE.
I_USEREXIT-MODTEXT = WA_TBE01T-TEXT1.
ENDIF.
I_USEREXIT-MODNAME+8 = '/P&S'. "#EC NOTEXT
WHEN 'P'.
CLEAR WA_TPS01T.
SELECT SINGLE TEXT1 INTO WA_TPS01T-TEXT1 FROM TPS01T
WHERE PROCS = I_USEREXIT-TXT+16(8)
AND SPRAS = SY-LANGU.
I_USEREXIT-MODTEXT = WA_TPS01T-TEXT1.
I_USEREXIT-MODNAME+8 = '/Process'.
ENDCASE.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
* Program exits (SE38)
IF P_PROG = C_X.
IF P_STOKEN-STR CS 'USEREXIT_'.
CHECK NOT P_STOKEN-STR CS '-'. " ensure not USEREXIT_XX-XXX
CHECK NOT P_STOKEN-STR CS '('. " ensure not SUBMIT_XX(X)
I_USEREXIT-TYPE = 'Program Exit'.
I_USEREXIT-TXT = P_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
* Submit programs (SE38)
IF P_STOKEN-STR CS 'SUBMIT'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
CHECK NOT P_STOKEN-STR CS '_'. " ensure not SUBMIT_XXX
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
CHECK NOT WA_STOKEN-STR CS '_'. " ensure not SUBMIT_XXX
REPLACE ALL OCCURRENCES OF '''' IN WA_STOKEN-STR WITH SPACE.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_SUBMIT-PNAME = WA_STOKEN-STR.
I_SUBMIT-LEVEL = P_LEVEL.
APPEND I_SUBMIT.
ENDIF.
ENDIF.
* Perform routines (which reference external programs)
IF P_STOKEN-STR CS 'PERFORM'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
IF NOT WA_STOKEN-OVFL IS INITIAL.
W_OFF = WA_STOKEN-OFF1 + 10.
W_STR = C_OVERFLOW+W_OFF(30).
FIND ')' IN W_STR MATCH OFFSET W_OFF.
IF SY-SUBRC = 0.
W_OFF = W_OFF + 1.
WA_STOKEN-STR = W_STR(W_OFF).
ENDIF.
ENDIF.
CHECK WA_STOKEN-STR CS '('.
W_OFF = 0.
WHILE SY-SUBRC = 0.
IF WA_STOKEN-STR+W_OFF(1) EQ '('.
REPLACE SECTION OFFSET W_OFF LENGTH 1 OF WA_STOKEN-STR WITH ''.
REPLACE ALL OCCURRENCES OF ')' IN WA_STOKEN-STR WITH SPACE.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_SUBMIT-PNAME = WA_STOKEN-STR.
APPEND I_SUBMIT.
ENDIF.
EXIT.
ELSE.
REPLACE SECTION OFFSET W_OFF LENGTH 1 OF WA_STOKEN-STR WITH ''.
SHIFT WA_STOKEN-STR LEFT DELETING LEADING SPACE.
ENDIF.
ENDWHILE.
ENDIF.
* Function modules (SE37)
IF P_STOKEN-STR CS 'FUNCTION'.
CLEAR I_FMODULE.
IF P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
IF WA_STOKEN-STR CS 'BAPI'.
I_FMODULE-BAPI = C_X.
ENDIF.
REPLACE FIRST OCCURRENCE OF '''' IN WA_STOKEN-STR WITH SPACE.
REPLACE FIRST OCCURRENCE OF '''' IN WA_STOKEN-STR WITH SPACE.
IF SY-SUBRC = 4. " didn't find 2nd quote (ie name truncated)
CLEAR WA_TFDIR.
CONCATENATE WA_STOKEN-STR '%' INTO WA_STOKEN-STR.
SELECT SINGLE FUNCNAME INTO WA_TFDIR-FUNCNAME FROM TFDIR
WHERE FUNCNAME LIKE WA_STOKEN-STR.
IF SY-SUBRC = 0.
I_FMODULE-NAME = WA_TFDIR-FUNCNAME.
ELSE.
CONTINUE.
ENDIF.
ELSE.
I_FMODULE-NAME = WA_STOKEN-STR.
ENDIF.
I_FMODULE-LEVEL = P_LEVEL.
APPEND I_FMODULE.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "DATA_SEARCH
*&--------------------------------------------------------------------&*
*& Form GET_ADDITIONAL_DATA &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM GET_ADDITIONAL_DATA.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get additional data' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
LOOP AT I_USEREXIT.
* Workflow
IF I_USEREXIT-TYPE EQ 'WorkFlow'.
CONTINUE.
ENDIF.
* Enhancement data
IF I_USEREXIT-TYPE CS 'Enh'.
CLEAR: WA_MODSAPA.
SELECT SINGLE NAME INTO WA_MODSAPA-NAME FROM MODSAP
WHERE MEMBER = I_USEREXIT-TXT.
CHECK SY-SUBRC = 0.
I_USEREXIT-MODNAME = WA_MODSAPA-NAME.
CLEAR WA_MODSAPT.
SELECT SINGLE MODTEXT INTO WA_MODSAPT-MODTEXT FROM MODSAPT
WHERE NAME = WA_MODSAPA-NAME
AND SPRSL = SY-LANGU.
I_USEREXIT-MODTEXT = WA_MODSAPT-MODTEXT.
* Get the CMOD project name
CLEAR W_MOD.
SELECT SINGLE MODACT~MEMBER MODACT~NAME MODATTR~STATUS
MODATTR~ANAM MODATTR~ADAT
INTO W_MOD
FROM MODACT
INNER JOIN MODATTR
ON MODATTR~NAME = MODACT~NAME
WHERE MODACT~MEMBER = WA_MODSAPA-NAME
AND MODACT~TYP = SPACE.
IF SY-SUBRC = 0.
I_USEREXIT-MODATTR = W_MOD.
ENDIF.
ENDIF.
* BADI data
IF I_USEREXIT-TYPE EQ 'BADI'.
CLEAR WA_SXS_ATTR.
SELECT SINGLE EXIT_NAME INTO WA_SXS_ATTR-EXIT_NAME FROM SXS_ATTR
WHERE EXIT_NAME = I_USEREXIT-TXT.
IF SY-SUBRC = 0.
I_USEREXIT-MODNAME = I_USEREXIT-TXT.
ELSE.
I_USEREXIT-MODNAME = 'Dynamic call'. "#EC NOTEXT
ENDIF.
CLEAR WA_SXS_ATTRT.
SELECT SINGLE TEXT INTO WA_SXS_ATTRT-TEXT FROM SXS_ATTRT
WHERE EXIT_NAME = WA_SXS_ATTR-EXIT_NAME
AND SPRSL = SY-LANGU.
I_USEREXIT-MODTEXT = WA_SXS_ATTRT-TEXT.
ENDIF.
* BADI Implementation
IF I_USEREXIT-TYPE EQ 'BADI'.
CLEAR SXC_EXIT.
SELECT COUNT( * ) FROM SXC_EXIT WHERE EXIT_NAME = I_USEREXIT-TXT.
W_CNT = SY-DBCNT.
* determine id BADI is for interal or external use
CLEAR SXS_ATTR.
SELECT SINGLE * FROM SXS_ATTR WHERE EXIT_NAME = I_USEREXIT-TXT.
IF SXS_ATTR-INTERNAL = 'X'.
WA_SXS_ATTRT-TEXT = 'SAP '.
ELSE.
WA_SXS_ATTRT-TEXT = 'CUST'.
ENDIF.
* concatenate wa_sxs_attrt-text w_cnt into i_userexit-modattr-name
* separated by space.
WRITE WA_SXS_ATTRT-TEXT TO I_USEREXIT-MODATTR-NAME.
WRITE W_CNT TO I_USEREXIT-MODATTR-NAME+5.
ENDIF.
MODIFY I_USEREXIT.
ENDLOOP.
* get enhancements via program package
CLEAR WA_TADIR.
SELECT SINGLE DEVCLASS INTO WA_TADIR-DEVCLASS FROM TADIR
WHERE PGMID = 'R3TR'
AND OBJECT = 'PROG'
AND OBJ_NAME = P_PNAME.
IF SY-SUBRC = 0.
CLEAR: WA_MODSAPA, WA_MODSAPT.
SELECT NAME FROM MODSAPA INTO WA_MODSAPA-NAME
WHERE DEVCLASS = WA_TADIR-DEVCLASS.
SELECT SINGLE MODTEXT FROM MODSAPT INTO WA_MODSAPT-MODTEXT
WHERE NAME = WA_MODSAPA-NAME
AND SPRSL = SY-LANGU.
CLEAR I_USEREXIT.
READ TABLE I_USEREXIT WITH KEY MODNAME = WA_MODSAPA-NAME.
IF SY-SUBRC <> 0.
I_USEREXIT-MODTEXT = WA_MODSAPT-MODTEXT.
I_USEREXIT-TYPE = 'Enhancement'. "#EC NOTEXT
I_USEREXIT-MODNAME = WA_MODSAPA-NAME.
I_USEREXIT-TXT = 'Determined from program DevClass'."#EC NOTEXT
I_USEREXIT-PNAME = 'Unknown'. "#EC NOTEXT
APPEND I_USEREXIT.
ENDIF.
ENDSELECT.
ENDIF.
* set row colour.
LOOP AT I_USEREXIT.
CASE I_USEREXIT-TYPE.
WHEN 'BADI'.
I_USEREXIT-COLOUR = 'C601'.
WHEN 'Enhancement'.
I_USEREXIT-COLOUR = 'C501'.
WHEN 'Program Exit'.
I_USEREXIT-COLOUR = 'C401'.
WHEN 'WorkFlow'.
I_USEREXIT-COLOUR = 'C301'.
WHEN 'BusTrEvent'.
I_USEREXIT-COLOUR = 'C201'.
ENDCASE.
MODIFY I_USEREXIT.
ENDLOOP.
ENDFORM. "GET_ADDITIONAL_DATA
*&--------------------------------------------------------------------&*
*& Form DATA_DISPLAY &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM DATA_DISPLAY.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Prepare screen for display' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
SORT I_USEREXIT BY TYPE TXT MODNAME.
DELETE ADJACENT DUPLICATES FROM I_USEREXIT COMPARING TXT PNAME MODNAME.
* ensure records selected.
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
IF W_LINNUM = 0.
MESSAGE S003(G00). "No data records were selected
EXIT.
ENDIF.
IF P_ALV = ' '.
* format headings
WRITE: 'Enhancements from main program: ', P_PNAME.
WRITE: 'Enhancements from TCode: ', P_TCODE.
WRITE: 201''.
ULINE.
FORMAT COLOR COL_HEADING.
WRITE: / SY-VLINE,
(12) C_COL1, "Enhanmt Type
SY-VLINE,
(40) C_COL2, "Enhancement
SY-VLINE,
(30) C_COL3, "Program/Include
SY-VLINE,
(20) C_COL4, "Enhancement name
SY-VLINE,
(40) C_COL5, "Enhancement description
SY-VLINE,
(8) C_COL6, "Project
SY-VLINE,
(1) C_COL7, "S
SY-VLINE,
(12) C_COL8, "ChangeName
SY-VLINE,
(10) C_COL9, "ChangeDate
SY-VLINE.
FORMAT RESET.
ULINE.
* format lines
LOOP AT I_USEREXIT.
* set line colour
CASE I_USEREXIT-TYPE.
WHEN 'Enhancement'.
FORMAT COLOR 3 INTENSIFIED OFF.
WHEN 'BADI'.
FORMAT COLOR 4 INTENSIFIED OFF.
WHEN 'BusTrEvent'.
FORMAT COLOR 5 INTENSIFIED OFF.
WHEN 'Program Exit'.
FORMAT COLOR 6 INTENSIFIED OFF.
WHEN OTHERS.
FORMAT RESET.
ENDCASE.
WRITE: / SY-VLINE,
I_USEREXIT-TYPE,
SY-VLINE,
I_USEREXIT-TXT(40),
SY-VLINE,
I_USEREXIT-PNAME(30),
SY-VLINE,
I_USEREXIT-MODNAME(20),
SY-VLINE,
I_USEREXIT-MODTEXT(40),
SY-VLINE.
WRITE: I_USEREXIT-MODATTR-NAME,
SY-VLINE,
I_USEREXIT-MODATTR-STATUS,
SY-VLINE,
I_USEREXIT-MODATTR-ANAM,
SY-VLINE,
I_USEREXIT-MODATTR-ADAT NO-ZERO,
SY-VLINE.
HIDE: I_USEREXIT-MODNAME, I_USEREXIT-TYPE, I_USEREXIT-MODATTR-NAME.
ENDLOOP.
FORMAT RESET.
ULINE.
* user-exits from development class of function modules
IF P_DEVC = C_X.
WRITE: /.
WRITE: / C_DEVC.
WRITE: 201''.
ULINE (90).
WRITE: 201''.
LOOP AT I_DEVCLASS.
CLEAR WA_MODSAPA.
SELECT NAME FROM MODSAPA INTO WA_MODSAPA
WHERE DEVCLASS = I_DEVCLASS-CLAS.
SELECT SINGLE NAME MODTEXT INTO CORRESPONDING FIELDS OF WA_MODSAPT
FROM MODSAPT
WHERE NAME = WA_MODSAPA-NAME
AND SPRSL = SY-LANGU.
FORMAT COLOR 3 INTENSIFIED OFF.
WRITE: / SY-VLINE,
(12) 'Enhancement',
SY-VLINE,
WA_MODSAPA-NAME,
SY-VLINE,
WA_MODSAPT-MODTEXT,
SY-VLINE.
ENDSELECT.
ENDLOOP.
WRITE: 201''.
ULINE (90).
FORMAT RESET.
ENDIF.
* display fuction modules used in program
WRITE /.
DESCRIBE TABLE I_FMODULE LINES W_LINNUM.
WRITE: / C_FMOD , AT 35 W_LINNUM. "#EC NOTEXT
WRITE: 201''.
IF P_FUNC = C_X.
ULINE (38).
WRITE: 201''.
LOOP AT I_FMODULE.
WRITE: SY-VLINE,
I_FMODULE-NAME,
SY-VLINE,
I_FMODULE-BAPI,
SY-VLINE.
WRITE: 201''.
ENDLOOP.
WRITE: 201''.
ULINE (38).
ENDIF.
* display submit programs used in program
WRITE /.
DESCRIBE TABLE I_SUBMIT LINES W_LINNUM.
WRITE: / C_SUBM , AT 35 W_LINNUM. "#EC NOTEXT
WRITE: 201''.
IF P_SUBM = C_X.
ULINE (44).
WRITE: 201''.
LOOP AT I_SUBMIT.
WRITE: SY-VLINE,
I_SUBMIT-PNAME,
SY-VLINE.
WRITE: 201''.
ENDLOOP.
WRITE: 201''.
ULINE (44).
ENDIF.
* issue message with number of user-exits displayed
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
MESSAGE S697(56) WITH W_LINNUM.
ELSE. " Show in alv format
* issue message with number of user-exits displayed
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
MESSAGE S697(56) WITH W_LINNUM.
* Create field catalog
PERFORM CREATE_FIELD_CATALOG USING 'TYPE' 'T_USEREXIT' ' ' 'Type'.
PERFORM CREATE_FIELD_CATALOG USING 'PNAME' 'T_USEREXIT' ' ' 'Prog?am name'.
PERFORM CREATE_FIELD_CATALOG USING 'TXT' 'T_USEREXIT' ' ' 'Enhancement'.
PERFORM CREATE_FIELD_CATALOG USING 'LEVEL' 'T_USEREXIT' C_X 'Level'.
PERFORM CREATE_FIELD_CATALOG USING 'MODNAME' 'T_USEREXIT' ' ' 'Enhancement name'.
PERFORM CREATE_FIELD_CATALOG USING 'MODTEXT' 'T_USEREXIT' ' ' 'Enhancement text'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-MEMBER' 'T_USEREXIT' C_X 'Member'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-NAME' 'T_USEREXIT' ' ' 'Project'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-STATUS' 'T_USEREXIT' ' ' 'Status'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-ANAM' 'T_USEREXIT' ' ' 'Changed by'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-ADAT' 'T_USEREXIT' ' ' 'Change date'.
* Layout
CLEAR I_LAYOUT.
I_LAYOUT-COLWIDTH_OPTIMIZE = C_X.
I_LAYOUT-INFO_FIELDNAME = 'COLOUR'.
* Sort
CLEAR I_SORT.
I_SORT-FIELDNAME = 'TYPE'.
I_SORT-TABNAME = 'T_USEREXIT'.
I_SORT-UP = C_X.
APPEND I_SORT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IS_LAYOUT = I_LAYOUT
IT_FIELDCAT = I_FIELDCAT[]
IT_SORT = I_SORT[]
I_DEFAULT = C_X
I_SAVE = 'A'
I_GRID_TITLE = W_GRIDTXT
TABLES
T_OUTTAB = I_USEREXIT.
ENDIF.
* issue message with number of user-exits displayed
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
MESSAGE S697(56) WITH W_LINNUM.
ENDFORM. "DATA_DISPLAY
*&---------------------------------------------------------------------&*
*& Form CREATE_FIELD_CATALOG &*
*&---------------------------------------------------------------------&*
FORM CREATE_FIELD_CATALOG USING P_FIELDNAME
P_TABNAME
P_HIDE
P_TEXT.
I_FIELDCAT-FIELDNAME = P_FIELDNAME.
I_FIELDCAT-TABNAME = P_TABNAME.
I_FIELDCAT-NO_OUT = P_HIDE.
I_FIELDCAT-SELTEXT_L = P_TEXT.
APPEND I_FIELDCAT.
ENDFORM. " CREATE_FIELD_CATALOG
*&---------------------------------------------------------------------&*
*& Form CREATE_FIELD_CATALOG &*
*&---------------------------------------------------------------------&*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
READ TABLE I_USEREXIT INDEX RS_SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
CASE R_UCOMM.
WHEN '&IC1'.
CASE RS_SELFIELD-SEL_TAB_FIELD.
WHEN 'T_USEREXIT-MODNAME'.
READ TABLE I_USEREXIT INDEX RS_SELFIELD-TABINDEX.
CASE I_USEREXIT-TYPE.
WHEN 'Enhancement'.
SET PARAMETER ID 'MON' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SMOD'.
WHEN 'BADI'.
SET PARAMETER ID 'EXN' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
WHEN 'BusTrEvent'.
SUBMIT RFOPFI00 WITH EVENT = I_USEREXIT-MODNAME(8) AND RETURN.
WHEN OTHERS.
MESSAGE S030(CJ). "Navigation not possible
ENDCASE.
WHEN 'T_USEREXIT-MODATTR-NAME'.
IF NOT I_USEREXIT-MODATTR-NAME IS INITIAL.
SET PARAMETER ID 'MON_KUN' FIELD I_USEREXIT-MODATTR-NAME.
CALL TRANSACTION 'CMOD'.
ELSE.
MESSAGE S030(CJ)."Navigation not possible
ENDIF.
WHEN 'T_USEREXIT-PNAME'.
CASE I_USEREXIT-TYPE.
WHEN 'Program Exit'.
SET PARAMETER ID 'RID' FIELD I_USEREXIT-PNAME.
CALL TRANSACTION 'SE38'.
ENDCASE.
WHEN OTHERS.
MESSAGE S030(CJ)."Navigation not possible
ENDCASE.
ENDCASE.
ENDFORM. "user_command
*&--------------------------------------------------------------------&*
*& AT LINE-SELECTION ?*
*&--------------------------------------------------------------------&*
AT LINE-SELECTION.
GET CURSOR FIELD W_FSEL.
CASE W_FSEL.
WHEN 'I_USEREXIT-MODNAME'.
CASE I_USEREXIT-TYPE.
WHEN 'Enhancement'.
SET PARAMETER ID 'MON' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SMOD'.
WHEN 'BADI'.
SET PARAMETER ID 'EXN' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
WHEN 'BusTrEvent'.
SUBMIT RFOPFI00 WITH EVENT = I_USEREXIT-MODNAME(8) AND RETURN.
WHEN OTHERS.
MESSAGE S030(CJ)."Navigation not possible
ENDCASE.
WHEN 'I_USEREXIT-MODATTR-NAME'.
IF NOT I_USEREXIT-MODATTR-NAME IS INITIAL.
SET PARAMETER ID 'MON_KUN' FIELD I_USEREXIT-MODATTR-NAME.
CALL TRANSACTION 'CMOD'.
ELSE.
MESSAGE S030(CJ)."Navigation not possible
ENDIF.
WHEN OTHERS.
MESSAGE S030(CJ)."Navigation not possible
ENDCASE.
*&--------------------------------------------------------------------&*
*& AT SELECTION-SCREEN &*
*&--------------------------------------------------------------------&*
AT SELECTION-SCREEN ON RADIOBUTTON GROUP RAD1.
* grey-out checkboxes if ALV selected
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF P_ALV = C_X.
IF SCREEN-GROUP1 = 'A01'.
SCREEN-INPUT = '0'.
MODIFY SCREEN.
ENDIF.
ELSE.
IF SCREEN-GROUP1 = 'A01'.
SCREEN-INPUT = '1'.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
TOBJT,
TSTCT, "TCode texts
TRDIRT, "Program texts
SXC_EXIT. "BADI exits
TYPE-POOLS: SLIS. "Globale Typen fьr generische Listbausteine
DATA: TABIX LIKE SY-TABIX,
W_LINNUM TYPE I,
W_OFF TYPE I,
W_INDEX LIKE SY-TABIX,
W_INCLUDE LIKE TRDIR-NAME,
W_PROG LIKE TRDIR-NAME,
W_INCL LIKE TRDIR-NAME,
W_AREA LIKE RS38L-AREA,
W_LEVEL,
W_STR(50) TYPE C,
W_CNT(2) TYPE C,
W_FUNCNAME LIKE TFDIR-FUNCNAME,
W_FSEL LIKE SY-UCOMM, " Determination of screen field
W_GRIDTXT(70) TYPE C. "ALV grid title
CONSTANTS: C_FMOD(40) TYPE C VALUE 'Function modules searched: ',
C_SUBM(40) TYPE C VALUE 'Submit programs searched: ',
C_DEVC(60) TYPE C VALUE 'User-exits from development classes in function modules',
C_COL1(12) TYPE C VALUE 'Enhanmt Type',
C_COL2(40) TYPE C VALUE 'Enhancement',
C_COL3(30) TYPE C VALUE 'Program/Include',
C_COL4(20) TYPE C VALUE 'Enhancement Name',
C_COL5(40) TYPE C VALUE 'Enhancement Description',
C_COL6(8) TYPE C VALUE 'Project',
C_COL7(1) TYPE C VALUE 'S',
C_COL8(12) TYPE C VALUE 'ChangeName',
C_COL9(10) TYPE C VALUE 'ChangeDate',
C_X TYPE C VALUE 'X'.
* Work Areas: ABAP Workbench
DATA: BEGIN OF WA_D010INC.
DATA: MASTER TYPE D010INC-MASTER.
DATA: END OF WA_D010INC.
DATA: BEGIN OF WA_TFDIR.
DATA: FUNCNAME TYPE TFDIR-FUNCNAME,
PNAME TYPE TFDIR-PNAME,
INCLUDE TYPE TFDIR-INCLUDE.
DATA: END OF WA_TFDIR.
DATA: BEGIN OF WA_TADIR.
DATA: DEVCLASS TYPE TADIR-DEVCLASS.
DATA: END OF WA_TADIR.
DATA: BEGIN OF WA_TSTC.
DATA: PGMNA TYPE TSTC-PGMNA.
DATA: END OF WA_TSTC.
DATA: BEGIN OF WA_TSTCP.
DATA: PARAM TYPE TSTCP-PARAM.
DATA: END OF WA_TSTCP.
DATA: BEGIN OF WA_ENLFDIR.
DATA: AREA TYPE ENLFDIR-AREA.
DATA: END OF WA_ENLFDIR.
* Work Areas: BADIs
DATA: BEGIN OF WA_SXS_ATTR.
DATA: EXIT_NAME TYPE SXS_ATTR-EXIT_NAME.
DATA: END OF WA_SXS_ATTR.
DATA: BEGIN OF WA_SXS_ATTRT.
DATA: TEXT TYPE SXS_ATTRT-TEXT.
DATA: END OF WA_SXS_ATTRT.
* Work Areas: Enhancements
DATA: BEGIN OF WA_MODSAP.
DATA: MEMBER TYPE MODSAP-MEMBER.
DATA: END OF WA_MODSAP.
DATA: BEGIN OF WA_MODSAPA.
DATA: NAME TYPE MODSAPA-NAME.
DATA: END OF WA_MODSAPA.
DATA: BEGIN OF WA_MODSAPT.
DATA: MODTEXT TYPE MODSAPT-MODTEXT.
DATA: END OF WA_MODSAPT.
* Work Areas: Business Transaction Events
DATA: BEGIN OF WA_TBE01T.
DATA: TEXT1 TYPE TBE01T-TEXT1.
DATA: END OF WA_TBE01T.
DATA: BEGIN OF WA_TPS01T.
DATA: TEXT1 TYPE TPS01T-TEXT1.
DATA: END OF WA_TPS01T.
* user-exits
TYPES: BEGIN OF TY_MOD,
MEMBER LIKE MODACT-MEMBER,
NAME LIKE MODACT-NAME,
STATUS LIKE MODATTR-STATUS,
ANAM LIKE MODATTR-ANAM,
ADAT LIKE MODATTR-ADAT,
END OF TY_MOD.
DATA: W_MOD TYPE TY_MOD.
TYPES: BEGIN OF T_USEREXIT,
TYPE(12) TYPE C,
PNAME LIKE TRDIR-NAME,
TXT(300),
LEVEL TYPE C,
MODNAME(30) TYPE C,
MODTEXT(60) TYPE C,
MODATTR TYPE TY_MOD,
COLOUR(4) TYPE C,
END OF T_USEREXIT.
DATA: I_USEREXIT TYPE STANDARD TABLE OF T_USEREXIT WITH HEADER LINE.
* Function module developmnet classes
TYPES: BEGIN OF T_DEVCLASS,
CLAS LIKE TRDIR-CLAS,
END OF T_DEVCLASS.
DATA: I_DEVCLASS TYPE STANDARD TABLE OF T_DEVCLASS WITH HEADER LINE.
* Submit programs
TYPES: BEGIN OF T_SUBMIT,
PNAME LIKE TRDIR-NAME,
LEVEL,
DONE,
END OF T_SUBMIT.
DATA: I_SUBMIT TYPE STANDARD TABLE OF T_SUBMIT WITH HEADER LINE.
* Source code
TYPES: BEGIN OF T_SOURCETAB, "#EC * (SLIN lьgt!)
LINE(200), "#EC * (SLIN lьgt!)
END OF T_SOURCETAB. "#EC * (SLIN lьgt!)
DATA: SOURCETAB TYPE STANDARD TABLE OF T_SOURCETAB WITH HEADER LINE.
DATA C_OVERFLOW(30000) TYPE C.
* Description of an ABAP/4 source analysis token
DATA: I_STOKEN TYPE STANDARD TABLE OF STOKEN WITH HEADER LINE.
DATA WA_STOKEN LIKE I_STOKEN.
* Description of an ABAP/4 source analysis statement
DATA: I_SSTMNT TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE."#EC NEEDED
* keywords for searching ABAP code
TYPES: BEGIN OF T_KEYWORDS,
WORD(30),
END OF T_KEYWORDS.
DATA: KEYWORDS TYPE STANDARD TABLE OF T_KEYWORDS WITH HEADER LINE.
* function modules within program
TYPES: BEGIN OF T_FMODULE,
NAME LIKE RS38L-NAME,
PNAME LIKE TRDIR-NAME,
PNAME2 LIKE TRDIR-NAME,
LEVEL,
BAPI,
DONE,
END OF T_FMODULE.
DATA: I_FMODULE TYPE STANDARD TABLE OF T_FMODULE WITH HEADER LINE.
* ALV definitions
DATA I_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.
DATA I_LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA I_SORT TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE.
*&--------------------------------------------------------------------&*
*& Selection Options &*
*&--------------------------------------------------------------------&*
SELECTION-SCREEN BEGIN OF BLOCK SELSCR1 WITH FRAME TITLE TEXT-S01.
PARAMETER: P_PNAME LIKE TRDIR-NAME,
P_TCODE LIKE SYST-TCODE,
P_LIMIT(4) TYPE N DEFAULT 500.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK SELSCR1.
SELECTION-SCREEN BEGIN OF BLOCK SELSCR2 WITH FRAME TITLE TEXT-S02.
PARAMETER: P_BADI AS CHECKBOX DEFAULT C_X,
P_BTE AS CHECKBOX DEFAULT C_X,
P_EXIT AS CHECKBOX DEFAULT C_X,
P_PROG AS CHECKBOX DEFAULT C_X,
P_WFLOW AS CHECKBOX,
P_AUTH AS CHECKBOX.
SELECTION-SCREEN SKIP.
PARAMETER: P_TEXT(40) TYPE C.
SELECTION-SCREEN END OF BLOCK SELSCR2.
SELECTION-SCREEN BEGIN OF BLOCK SELSCR3 WITH FRAME TITLE TEXT-S03.
PARAMETER: P_ALV RADIOBUTTON GROUP RAD1 DEFAULT 'X',
P_LST RADIOBUTTON GROUP RAD1.
SELECTION-SCREEN SKIP.
PARAMETER: P_DEVC LIKE RIHEA-DY_OFN DEFAULT ' ' MODIF ID A01,
P_FUNC LIKE RIHEA-DY_OFN DEFAULT ' ' MODIF ID A01,
P_SUBM LIKE RIHEA-DY_OFN DEFAULT ' ' MODIF ID A01.
SELECTION-SCREEN END OF BLOCK SELSCR3.
*&--------------------------------------------------------------------&*
*& START-OF-SELECTION &*
*&--------------------------------------------------------------------&*
START-OF-SELECTION.
IF P_PNAME IS INITIAL AND P_TCODE IS INITIAL.
MESSAGE I000(G01) WITH TEXT-M01.
STOP.
ENDIF.
IF P_BADI IS INITIAL AND
P_EXIT IS INITIAL AND
P_BTE IS INITIAL AND
P_WFLOW IS INITIAL AND
P_AUTH IS INITIAL AND
P_PROG IS INITIAL.
MESSAGE I000(G01) WITH TEXT-M02.
STOP.
ENDIF.
* ensure P_LIMIT is not zero.
IF P_LIMIT = 0.
P_LIMIT = 1.
ENDIF.
PERFORM DATA_SELECT.
PERFORM GET_SUBMIT_DATA.
PERFORM GET_FM_DATA.
PERFORM GET_ADDITIONAL_DATA.
PERFORM DATA_DISPLAY.
*&--------------------------------------------------------------------&*
*& Form DATA_SELECT &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM DATA_SELECT.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get programs/includes' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
* get TCode name for ALV grid title
CLEAR W_GRIDTXT.
IF NOT P_TCODE IS INITIAL.
SELECT SINGLE * FROM TSTCT WHERE TCODE = P_TCODE
AND SPRSL = SY-LANGU.
CONCATENATE 'TCode:' P_TCODE TSTCT-TTEXT INTO W_GRIDTXT
SEPARATED BY SPACE.
ENDIF.
* get program name for ALV grid title
IF NOT P_PNAME IS INITIAL.
SELECT SINGLE * FROM TRDIRT WHERE NAME = P_PNAME
AND SPRSL = SY-LANGU.
CONCATENATE 'Program:' P_PNAME TSTCT-TTEXT INTO W_GRIDTXT
SEPARATED BY SPACE.
ENDIF.
* determine search words
KEYWORDS-WORD = 'CALL'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'FORM'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'PERFORM'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'SUBMIT'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'INCLUDE'.
APPEND KEYWORDS.
KEYWORDS-WORD = 'AUTHORITY-CHECK'.
APPEND KEYWORDS.
IF NOT P_TCODE IS INITIAL.
* get program name from TCode
SELECT SINGLE PGMNA FROM TSTC INTO WA_TSTC-PGMNA
WHERE TCODE EQ P_TCODE.
IF NOT WA_TSTC-PGMNA IS INITIAL.
P_PNAME = WA_TSTC-PGMNA.
* TCode does not include program name, but does have reference TCode
ELSE.
SELECT SINGLE PARAM FROM TSTCP INTO WA_TSTCP-PARAM
WHERE TCODE EQ P_TCODE.
IF SY-SUBRC = 0.
CHECK WA_TSTCP-PARAM(1) = '/'.
CHECK WA_TSTCP-PARAM+1(1) = '*'.
IF WA_TSTCP-PARAM CA ' '.
ENDIF.
W_OFF = SY-FDPOS + 1.
SUBTRACT 2 FROM SY-FDPOS.
IF SY-FDPOS GT 0.
P_TCODE = WA_TSTCP-PARAM+2(SY-FDPOS).
ENDIF.
SELECT SINGLE PGMNA FROM TSTC INTO WA_TSTC-PGMNA
WHERE TCODE EQ P_TCODE.
P_PNAME = WA_TSTC-PGMNA.
IF SY-SUBRC <> 0.
MESSAGE S110(/SAPTRX/ASC) WITH 'No program found for: ' P_TCODE."#EC NOTEXT
STOP.
ENDIF.
ELSE.
MESSAGE S110(/SAPTRX/ASC) WITH 'No program found for: ' P_TCODE."#EC NOTEXT
STOP.
ENDIF.
ENDIF.
ENDIF.
* Call customer-function aus Program coding
READ REPORT P_PNAME INTO SOURCETAB.
IF SY-SUBRC > 0.
MESSAGE E017(ENHANCEMENT) WITH P_PNAME RAISING NO_PROGRAM."#EC *
ENDIF.
SCAN ABAP-SOURCE SOURCETAB TOKENS INTO I_STOKEN
STATEMENTS INTO I_SSTMNT
KEYWORDS FROM KEYWORDS
OVERFLOW INTO C_OVERFLOW
WITH INCLUDES. "#EC
IF SY-SUBRC > 0. "keine/syntakt. falsche Ablauflog./Fehler im Skanner
MESSAGE E130(ENHANCEMENT) RAISING SYNTAX_ERROR. "#EC
ENDIF.
* check I_STOKEN for entries
CLEAR W_LINNUM.
DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
IF W_LINNUM GT 0.
W_LEVEL = '0'.
W_PROG = ''.
W_INCL = ''.
PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
ENDIF.
ENDFORM. "DATA_SELECT
*&--------------------------------------------------------------------&*
*& Form GET_FM_DATA ? &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM GET_FM_DATA.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get function module data' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
* Function module data
SORT I_FMODULE BY NAME.
DELETE ADJACENT DUPLICATES FROM I_FMODULE COMPARING NAME.
LOOP AT I_FMODULE WHERE DONE NE C_X.
CLEAR: I_STOKEN, I_SSTMNT, SOURCETAB, WA_TFDIR, W_INCLUDE .
REFRESH: I_STOKEN, I_SSTMNT, SOURCETAB.
CLEAR WA_TFDIR.
SELECT SINGLE FUNCNAME PNAME INCLUDE FROM TFDIR INTO WA_TFDIR
WHERE FUNCNAME = I_FMODULE-NAME.
CHECK SY-SUBRC = 0.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
PROGRAM = WA_TFDIR-PNAME
IMPORTING
GROUP = W_AREA.
CONCATENATE 'L' W_AREA 'U' WA_TFDIR-INCLUDE INTO W_INCLUDE.
I_FMODULE-PNAME = W_INCLUDE.
I_FMODULE-PNAME2 = WA_TFDIR-PNAME.
MODIFY I_FMODULE.
READ REPORT I_FMODULE-PNAME INTO SOURCETAB.
IF SY-SUBRC = 0.
SCAN ABAP-SOURCE SOURCETAB TOKENS INTO I_STOKEN
STATEMENTS INTO I_SSTMNT
KEYWORDS FROM KEYWORDS
WITH INCLUDES.
IF SY-SUBRC > 0.
MESSAGE E130(ENHANCEMENT) RAISING SYNTAX_ERROR.
ENDIF.
* check i_stoken for entries
CLEAR W_LINNUM.
DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
IF W_LINNUM GT 0.
W_LEVEL = '1'.
W_PROG = I_FMODULE-PNAME2.
W_INCL = I_FMODULE-PNAME.
PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
ENDIF.
ENDIF.
ENDLOOP.
* store development classes
IF P_DEVC = C_X.
LOOP AT I_FMODULE.
CLEAR: WA_TADIR, WA_ENLFDIR.
SELECT SINGLE AREA FROM ENLFDIR INTO WA_ENLFDIR-AREA
WHERE FUNCNAME = I_FMODULE-NAME.
CHECK NOT WA_ENLFDIR-AREA IS INITIAL.
SELECT SINGLE DEVCLASS INTO WA_TADIR-DEVCLASS
FROM TADIR WHERE PGMID = 'R3TR'
AND OBJECT = 'FUGR'
AND OBJ_NAME = WA_ENLFDIR-AREA.
CHECK NOT WA_TADIR-DEVCLASS IS INITIAL.
MOVE WA_TADIR-DEVCLASS TO I_DEVCLASS-CLAS.
APPEND I_DEVCLASS.
I_FMODULE-DONE = C_X.
MODIFY I_FMODULE.
ENDLOOP.
SORT I_DEVCLASS.
DELETE ADJACENT DUPLICATES FROM I_DEVCLASS.
ENDIF.
ENDFORM. "GET_FM_DATA
*&--------------------------------------------------------------------&*
*& Form GET_SUBMIT_DATA &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM GET_SUBMIT_DATA.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get submit data' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
SORT I_SUBMIT.
DELETE ADJACENT DUPLICATES FROM I_SUBMIT COMPARING PNAME.
W_LEVEL = '0'.
LOOP AT I_SUBMIT WHERE DONE NE C_X.
CLEAR: I_STOKEN, I_SSTMNT, SOURCETAB.
REFRESH: I_STOKEN, I_SSTMNT, SOURCETAB.
READ REPORT I_SUBMIT-PNAME INTO SOURCETAB.
IF SY-SUBRC = 0.
SCAN ABAP-SOURCE SOURCETAB TOKENS INTO I_STOKEN
STATEMENTS INTO I_SSTMNT
KEYWORDS FROM KEYWORDS
WITH INCLUDES.
IF SY-SUBRC > 0.
* message e130(enhancement) raising syntax_error.
CONTINUE.
ENDIF.
* check i_stoken for entries
CLEAR W_LINNUM.
DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
IF W_LINNUM GT 0.
W_PROG = I_SUBMIT-PNAME.
W_INCL = ''.
PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
ENDIF.
ENDIF.
* restrict number of submit program selected for processing
DESCRIBE TABLE I_SUBMIT LINES W_LINNUM.
IF W_LINNUM GE P_LIMIT.
W_LEVEL = '1'.
ENDIF.
I_SUBMIT-DONE = C_X.
MODIFY I_SUBMIT.
ENDLOOP.
ENDFORM. "GET_SUBMIT_DATA
*&--------------------------------------------------------------------&*
*& Form DATA_SEARCH &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM DATA_SEARCH TABLES P_STOKEN STRUCTURE STOKEN
USING P_LEVEL L_PROG L_INCL.
LOOP AT P_STOKEN.
CLEAR I_USEREXIT.
* Workflow
IF P_WFLOW = C_X.
IF P_LEVEL EQ '1'. " do not perform for function modules (2nd pass)
IF P_STOKEN-STR+1(16) CS 'SWE_EVENT_CREATE'.
REPLACE ALL OCCURRENCES OF '''' IN P_STOKEN-STR WITH ''.
I_USEREXIT-TYPE = 'WorkFlow'.
I_USEREXIT-TXT = P_STOKEN-STR.
CONCATENATE L_PROG '/' L_INCL INTO I_USEREXIT-PNAME.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
ENDIF.
TABIX = SY-TABIX + 1.
I_USEREXIT-LEVEL = P_LEVEL.
IF I_USEREXIT-LEVEL = '0'.
IF L_INCL IS INITIAL.
I_USEREXIT-PNAME = P_PNAME.
ELSE.
CONCATENATE P_PNAME '-' L_INCL INTO I_USEREXIT-PNAME.
ENDIF.
ELSE.
IF L_INCL IS INITIAL.
I_USEREXIT-PNAME = L_PROG.
ELSE.
CONCATENATE L_PROG '-' L_INCL INTO I_USEREXIT-PNAME.
ENDIF.
ENDIF.
* AUTHORITY-CHECKS
IF P_AUTH = C_X.
IF P_STOKEN-STR EQ 'AUTHORITY-CHECK'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 2.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
CHECK NOT WA_STOKEN-STR CS 'STRUCTURE'.
CHECK NOT WA_STOKEN-STR CS 'SYMBOL'.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_USEREXIT-PNAME = I_SUBMIT-PNAME.
I_USEREXIT-TYPE = 'AuthCheck'.
I_USEREXIT-TXT = WA_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
CLEAR TOBJT.
SELECT SINGLE * FROM TOBJT WHERE OBJECT = I_USEREXIT-TXT
AND LANGU = SY-LANGU.
I_USEREXIT-MODNAME = 'AUTHORITY-CHECK'.
I_USEREXIT-MODTEXT = TOBJT-TTEXT.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
ENDIF.
* Text searches
IF NOT P_TEXT IS INITIAL.
IF P_STOKEN-STR CS P_TEXT.
I_USEREXIT-PNAME = I_SUBMIT-PNAME.
I_USEREXIT-TYPE = 'TextSearch'.
I_USEREXIT-TXT = WA_STOKEN-STR.
I_USEREXIT-MODNAME = 'Text Search'.
I_USEREXIT-MODTEXT = P_STOKEN-STR.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
* Include (SE38)
IF P_STOKEN-STR EQ 'INCLUDE'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
CHECK NOT WA_STOKEN-STR CS 'STRUCTURE'.
CHECK NOT WA_STOKEN-STR CS 'SYMBOL'.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_SUBMIT-PNAME = WA_STOKEN-STR.
I_SUBMIT-LEVEL = P_LEVEL.
APPEND I_SUBMIT.
ENDIF.
ENDIF.
* Enhancements (SMOD)
IF P_EXIT = C_X.
IF P_STOKEN-STR EQ 'CUSTOMER-FUNCTION'.
CLEAR W_FUNCNAME.
READ TABLE P_STOKEN INDEX TABIX.
TRANSLATE P_STOKEN-STR USING ''' '.
CONDENSE P_STOKEN-STR.
IF L_PROG IS INITIAL.
CONCATENATE 'EXIT' P_PNAME P_STOKEN-STR INTO W_FUNCNAME
SEPARATED BY '_'.
ELSE.
CONCATENATE 'EXIT' L_PROG P_STOKEN-STR INTO W_FUNCNAME
SEPARATED BY '_'.
ENDIF.
SELECT SINGLE MEMBER FROM MODSAP INTO WA_MODSAP-MEMBER
WHERE MEMBER = W_FUNCNAME.
IF SY-SUBRC = 0. " check for valid enhancement
I_USEREXIT-TYPE = 'Enhancement'.
I_USEREXIT-TXT = W_FUNCNAME.
APPEND I_USEREXIT.
ELSE.
CLEAR WA_D010INC.
SELECT SINGLE MASTER INTO WA_D010INC-MASTER
FROM D010INC
WHERE INCLUDE = L_PROG.
CONCATENATE 'EXIT' WA_D010INC-MASTER P_STOKEN-STR INTO W_FUNCNAME
SEPARATED BY '_'.
I_USEREXIT-TYPE = 'Enhancement'.
I_USEREXIT-TXT = W_FUNCNAME.
ENDIF.
ENDIF.
ENDIF.
* BADIs (SE18)
IF P_BADI = C_X.
IF P_STOKEN-STR CS 'cl_exithandler='.
W_INDEX = SY-TABIX + 4.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
I_USEREXIT-TXT = WA_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
I_USEREXIT-TYPE = 'BADI'.
CLEAR SXS_ATTR. " ensure a real BADI
SELECT SINGLE * FROM SXS_ATTR WHERE EXIT_NAME = I_USEREXIT-TXT.
IF SY-SUBRC = 0.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
ENDIF.
* Business transaction events (FIBF)
IF P_BTE = C_X.
IF P_STOKEN-STR CS 'OPEN_FI_PERFORM'.
I_USEREXIT-TYPE = 'BusTrEvent'.
I_USEREXIT-TXT = P_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
I_USEREXIT-MODNAME = I_USEREXIT-TXT+16(8).
CASE I_USEREXIT-TXT+25(1).
WHEN 'E'.
CLEAR WA_TBE01T.
SELECT SINGLE TEXT1 INTO WA_TBE01T-TEXT1 FROM TBE01T
WHERE EVENT = I_USEREXIT-TXT+16(8)
AND SPRAS = SY-LANGU.
IF WA_TBE01T-TEXT1 IS INITIAL.
I_USEREXIT-MODTEXT = '<Not active>'. "#EC NOTEXT
ELSE.
I_USEREXIT-MODTEXT = WA_TBE01T-TEXT1.
ENDIF.
I_USEREXIT-MODNAME+8 = '/P&S'. "#EC NOTEXT
WHEN 'P'.
CLEAR WA_TPS01T.
SELECT SINGLE TEXT1 INTO WA_TPS01T-TEXT1 FROM TPS01T
WHERE PROCS = I_USEREXIT-TXT+16(8)
AND SPRAS = SY-LANGU.
I_USEREXIT-MODTEXT = WA_TPS01T-TEXT1.
I_USEREXIT-MODNAME+8 = '/Process'.
ENDCASE.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
* Program exits (SE38)
IF P_PROG = C_X.
IF P_STOKEN-STR CS 'USEREXIT_'.
CHECK NOT P_STOKEN-STR CS '-'. " ensure not USEREXIT_XX-XXX
CHECK NOT P_STOKEN-STR CS '('. " ensure not SUBMIT_XX(X)
I_USEREXIT-TYPE = 'Program Exit'.
I_USEREXIT-TXT = P_STOKEN-STR.
REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
APPEND I_USEREXIT.
ENDIF.
ENDIF.
* Submit programs (SE38)
IF P_STOKEN-STR CS 'SUBMIT'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
CHECK NOT P_STOKEN-STR CS '_'. " ensure not SUBMIT_XXX
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
CHECK NOT WA_STOKEN-STR CS '_'. " ensure not SUBMIT_XXX
REPLACE ALL OCCURRENCES OF '''' IN WA_STOKEN-STR WITH SPACE.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_SUBMIT-PNAME = WA_STOKEN-STR.
I_SUBMIT-LEVEL = P_LEVEL.
APPEND I_SUBMIT.
ENDIF.
ENDIF.
* Perform routines (which reference external programs)
IF P_STOKEN-STR CS 'PERFORM'.
CHECK P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
IF NOT WA_STOKEN-OVFL IS INITIAL.
W_OFF = WA_STOKEN-OFF1 + 10.
W_STR = C_OVERFLOW+W_OFF(30).
FIND ')' IN W_STR MATCH OFFSET W_OFF.
IF SY-SUBRC = 0.
W_OFF = W_OFF + 1.
WA_STOKEN-STR = W_STR(W_OFF).
ENDIF.
ENDIF.
CHECK WA_STOKEN-STR CS '('.
W_OFF = 0.
WHILE SY-SUBRC = 0.
IF WA_STOKEN-STR+W_OFF(1) EQ '('.
REPLACE SECTION OFFSET W_OFF LENGTH 1 OF WA_STOKEN-STR WITH ''.
REPLACE ALL OCCURRENCES OF ')' IN WA_STOKEN-STR WITH SPACE.
READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
IF SY-SUBRC <> 0.
I_SUBMIT-PNAME = WA_STOKEN-STR.
APPEND I_SUBMIT.
ENDIF.
EXIT.
ELSE.
REPLACE SECTION OFFSET W_OFF LENGTH 1 OF WA_STOKEN-STR WITH ''.
SHIFT WA_STOKEN-STR LEFT DELETING LEADING SPACE.
ENDIF.
ENDWHILE.
ENDIF.
* Function modules (SE37)
IF P_STOKEN-STR CS 'FUNCTION'.
CLEAR I_FMODULE.
IF P_LEVEL EQ '0'. " do not perform for function modules (2nd pass)
W_INDEX = SY-TABIX + 1.
READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
IF WA_STOKEN-STR CS 'BAPI'.
I_FMODULE-BAPI = C_X.
ENDIF.
REPLACE FIRST OCCURRENCE OF '''' IN WA_STOKEN-STR WITH SPACE.
REPLACE FIRST OCCURRENCE OF '''' IN WA_STOKEN-STR WITH SPACE.
IF SY-SUBRC = 4. " didn't find 2nd quote (ie name truncated)
CLEAR WA_TFDIR.
CONCATENATE WA_STOKEN-STR '%' INTO WA_STOKEN-STR.
SELECT SINGLE FUNCNAME INTO WA_TFDIR-FUNCNAME FROM TFDIR
WHERE FUNCNAME LIKE WA_STOKEN-STR.
IF SY-SUBRC = 0.
I_FMODULE-NAME = WA_TFDIR-FUNCNAME.
ELSE.
CONTINUE.
ENDIF.
ELSE.
I_FMODULE-NAME = WA_STOKEN-STR.
ENDIF.
I_FMODULE-LEVEL = P_LEVEL.
APPEND I_FMODULE.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "DATA_SEARCH
*&--------------------------------------------------------------------&*
*& Form GET_ADDITIONAL_DATA &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM GET_ADDITIONAL_DATA.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Get additional data' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
LOOP AT I_USEREXIT.
* Workflow
IF I_USEREXIT-TYPE EQ 'WorkFlow'.
CONTINUE.
ENDIF.
* Enhancement data
IF I_USEREXIT-TYPE CS 'Enh'.
CLEAR: WA_MODSAPA.
SELECT SINGLE NAME INTO WA_MODSAPA-NAME FROM MODSAP
WHERE MEMBER = I_USEREXIT-TXT.
CHECK SY-SUBRC = 0.
I_USEREXIT-MODNAME = WA_MODSAPA-NAME.
CLEAR WA_MODSAPT.
SELECT SINGLE MODTEXT INTO WA_MODSAPT-MODTEXT FROM MODSAPT
WHERE NAME = WA_MODSAPA-NAME
AND SPRSL = SY-LANGU.
I_USEREXIT-MODTEXT = WA_MODSAPT-MODTEXT.
* Get the CMOD project name
CLEAR W_MOD.
SELECT SINGLE MODACT~MEMBER MODACT~NAME MODATTR~STATUS
MODATTR~ANAM MODATTR~ADAT
INTO W_MOD
FROM MODACT
INNER JOIN MODATTR
ON MODATTR~NAME = MODACT~NAME
WHERE MODACT~MEMBER = WA_MODSAPA-NAME
AND MODACT~TYP = SPACE.
IF SY-SUBRC = 0.
I_USEREXIT-MODATTR = W_MOD.
ENDIF.
ENDIF.
* BADI data
IF I_USEREXIT-TYPE EQ 'BADI'.
CLEAR WA_SXS_ATTR.
SELECT SINGLE EXIT_NAME INTO WA_SXS_ATTR-EXIT_NAME FROM SXS_ATTR
WHERE EXIT_NAME = I_USEREXIT-TXT.
IF SY-SUBRC = 0.
I_USEREXIT-MODNAME = I_USEREXIT-TXT.
ELSE.
I_USEREXIT-MODNAME = 'Dynamic call'. "#EC NOTEXT
ENDIF.
CLEAR WA_SXS_ATTRT.
SELECT SINGLE TEXT INTO WA_SXS_ATTRT-TEXT FROM SXS_ATTRT
WHERE EXIT_NAME = WA_SXS_ATTR-EXIT_NAME
AND SPRSL = SY-LANGU.
I_USEREXIT-MODTEXT = WA_SXS_ATTRT-TEXT.
ENDIF.
* BADI Implementation
IF I_USEREXIT-TYPE EQ 'BADI'.
CLEAR SXC_EXIT.
SELECT COUNT( * ) FROM SXC_EXIT WHERE EXIT_NAME = I_USEREXIT-TXT.
W_CNT = SY-DBCNT.
* determine id BADI is for interal or external use
CLEAR SXS_ATTR.
SELECT SINGLE * FROM SXS_ATTR WHERE EXIT_NAME = I_USEREXIT-TXT.
IF SXS_ATTR-INTERNAL = 'X'.
WA_SXS_ATTRT-TEXT = 'SAP '.
ELSE.
WA_SXS_ATTRT-TEXT = 'CUST'.
ENDIF.
* concatenate wa_sxs_attrt-text w_cnt into i_userexit-modattr-name
* separated by space.
WRITE WA_SXS_ATTRT-TEXT TO I_USEREXIT-MODATTR-NAME.
WRITE W_CNT TO I_USEREXIT-MODATTR-NAME+5.
ENDIF.
MODIFY I_USEREXIT.
ENDLOOP.
* get enhancements via program package
CLEAR WA_TADIR.
SELECT SINGLE DEVCLASS INTO WA_TADIR-DEVCLASS FROM TADIR
WHERE PGMID = 'R3TR'
AND OBJECT = 'PROG'
AND OBJ_NAME = P_PNAME.
IF SY-SUBRC = 0.
CLEAR: WA_MODSAPA, WA_MODSAPT.
SELECT NAME FROM MODSAPA INTO WA_MODSAPA-NAME
WHERE DEVCLASS = WA_TADIR-DEVCLASS.
SELECT SINGLE MODTEXT FROM MODSAPT INTO WA_MODSAPT-MODTEXT
WHERE NAME = WA_MODSAPA-NAME
AND SPRSL = SY-LANGU.
CLEAR I_USEREXIT.
READ TABLE I_USEREXIT WITH KEY MODNAME = WA_MODSAPA-NAME.
IF SY-SUBRC <> 0.
I_USEREXIT-MODTEXT = WA_MODSAPT-MODTEXT.
I_USEREXIT-TYPE = 'Enhancement'. "#EC NOTEXT
I_USEREXIT-MODNAME = WA_MODSAPA-NAME.
I_USEREXIT-TXT = 'Determined from program DevClass'."#EC NOTEXT
I_USEREXIT-PNAME = 'Unknown'. "#EC NOTEXT
APPEND I_USEREXIT.
ENDIF.
ENDSELECT.
ENDIF.
* set row colour.
LOOP AT I_USEREXIT.
CASE I_USEREXIT-TYPE.
WHEN 'BADI'.
I_USEREXIT-COLOUR = 'C601'.
WHEN 'Enhancement'.
I_USEREXIT-COLOUR = 'C501'.
WHEN 'Program Exit'.
I_USEREXIT-COLOUR = 'C401'.
WHEN 'WorkFlow'.
I_USEREXIT-COLOUR = 'C301'.
WHEN 'BusTrEvent'.
I_USEREXIT-COLOUR = 'C201'.
ENDCASE.
MODIFY I_USEREXIT.
ENDLOOP.
ENDFORM. "GET_ADDITIONAL_DATA
*&--------------------------------------------------------------------&*
*& Form DATA_DISPLAY &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM DATA_DISPLAY.
* data selection message to sap gui
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
DESTINATION 'SAPGUI'
KEEPING LOGICAL UNIT OF WORK
EXPORTING
TEXT = 'Prepare screen for display' "#EC NOTEXT
EXCEPTIONS
SYSTEM_FAILURE
COMMUNICATION_FAILURE
. "#EC *
SORT I_USEREXIT BY TYPE TXT MODNAME.
DELETE ADJACENT DUPLICATES FROM I_USEREXIT COMPARING TXT PNAME MODNAME.
* ensure records selected.
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
IF W_LINNUM = 0.
MESSAGE S003(G00). "No data records were selected
EXIT.
ENDIF.
IF P_ALV = ' '.
* format headings
WRITE: 'Enhancements from main program: ', P_PNAME.
WRITE: 'Enhancements from TCode: ', P_TCODE.
WRITE: 201''.
ULINE.
FORMAT COLOR COL_HEADING.
WRITE: / SY-VLINE,
(12) C_COL1, "Enhanmt Type
SY-VLINE,
(40) C_COL2, "Enhancement
SY-VLINE,
(30) C_COL3, "Program/Include
SY-VLINE,
(20) C_COL4, "Enhancement name
SY-VLINE,
(40) C_COL5, "Enhancement description
SY-VLINE,
(8) C_COL6, "Project
SY-VLINE,
(1) C_COL7, "S
SY-VLINE,
(12) C_COL8, "ChangeName
SY-VLINE,
(10) C_COL9, "ChangeDate
SY-VLINE.
FORMAT RESET.
ULINE.
* format lines
LOOP AT I_USEREXIT.
* set line colour
CASE I_USEREXIT-TYPE.
WHEN 'Enhancement'.
FORMAT COLOR 3 INTENSIFIED OFF.
WHEN 'BADI'.
FORMAT COLOR 4 INTENSIFIED OFF.
WHEN 'BusTrEvent'.
FORMAT COLOR 5 INTENSIFIED OFF.
WHEN 'Program Exit'.
FORMAT COLOR 6 INTENSIFIED OFF.
WHEN OTHERS.
FORMAT RESET.
ENDCASE.
WRITE: / SY-VLINE,
I_USEREXIT-TYPE,
SY-VLINE,
I_USEREXIT-TXT(40),
SY-VLINE,
I_USEREXIT-PNAME(30),
SY-VLINE,
I_USEREXIT-MODNAME(20),
SY-VLINE,
I_USEREXIT-MODTEXT(40),
SY-VLINE.
WRITE: I_USEREXIT-MODATTR-NAME,
SY-VLINE,
I_USEREXIT-MODATTR-STATUS,
SY-VLINE,
I_USEREXIT-MODATTR-ANAM,
SY-VLINE,
I_USEREXIT-MODATTR-ADAT NO-ZERO,
SY-VLINE.
HIDE: I_USEREXIT-MODNAME, I_USEREXIT-TYPE, I_USEREXIT-MODATTR-NAME.
ENDLOOP.
FORMAT RESET.
ULINE.
* user-exits from development class of function modules
IF P_DEVC = C_X.
WRITE: /.
WRITE: / C_DEVC.
WRITE: 201''.
ULINE (90).
WRITE: 201''.
LOOP AT I_DEVCLASS.
CLEAR WA_MODSAPA.
SELECT NAME FROM MODSAPA INTO WA_MODSAPA
WHERE DEVCLASS = I_DEVCLASS-CLAS.
SELECT SINGLE NAME MODTEXT INTO CORRESPONDING FIELDS OF WA_MODSAPT
FROM MODSAPT
WHERE NAME = WA_MODSAPA-NAME
AND SPRSL = SY-LANGU.
FORMAT COLOR 3 INTENSIFIED OFF.
WRITE: / SY-VLINE,
(12) 'Enhancement',
SY-VLINE,
WA_MODSAPA-NAME,
SY-VLINE,
WA_MODSAPT-MODTEXT,
SY-VLINE.
ENDSELECT.
ENDLOOP.
WRITE: 201''.
ULINE (90).
FORMAT RESET.
ENDIF.
* display fuction modules used in program
WRITE /.
DESCRIBE TABLE I_FMODULE LINES W_LINNUM.
WRITE: / C_FMOD , AT 35 W_LINNUM. "#EC NOTEXT
WRITE: 201''.
IF P_FUNC = C_X.
ULINE (38).
WRITE: 201''.
LOOP AT I_FMODULE.
WRITE: SY-VLINE,
I_FMODULE-NAME,
SY-VLINE,
I_FMODULE-BAPI,
SY-VLINE.
WRITE: 201''.
ENDLOOP.
WRITE: 201''.
ULINE (38).
ENDIF.
* display submit programs used in program
WRITE /.
DESCRIBE TABLE I_SUBMIT LINES W_LINNUM.
WRITE: / C_SUBM , AT 35 W_LINNUM. "#EC NOTEXT
WRITE: 201''.
IF P_SUBM = C_X.
ULINE (44).
WRITE: 201''.
LOOP AT I_SUBMIT.
WRITE: SY-VLINE,
I_SUBMIT-PNAME,
SY-VLINE.
WRITE: 201''.
ENDLOOP.
WRITE: 201''.
ULINE (44).
ENDIF.
* issue message with number of user-exits displayed
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
MESSAGE S697(56) WITH W_LINNUM.
ELSE. " Show in alv format
* issue message with number of user-exits displayed
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
MESSAGE S697(56) WITH W_LINNUM.
* Create field catalog
PERFORM CREATE_FIELD_CATALOG USING 'TYPE' 'T_USEREXIT' ' ' 'Type'.
PERFORM CREATE_FIELD_CATALOG USING 'PNAME' 'T_USEREXIT' ' ' 'Prog?am name'.
PERFORM CREATE_FIELD_CATALOG USING 'TXT' 'T_USEREXIT' ' ' 'Enhancement'.
PERFORM CREATE_FIELD_CATALOG USING 'LEVEL' 'T_USEREXIT' C_X 'Level'.
PERFORM CREATE_FIELD_CATALOG USING 'MODNAME' 'T_USEREXIT' ' ' 'Enhancement name'.
PERFORM CREATE_FIELD_CATALOG USING 'MODTEXT' 'T_USEREXIT' ' ' 'Enhancement text'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-MEMBER' 'T_USEREXIT' C_X 'Member'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-NAME' 'T_USEREXIT' ' ' 'Project'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-STATUS' 'T_USEREXIT' ' ' 'Status'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-ANAM' 'T_USEREXIT' ' ' 'Changed by'.
PERFORM CREATE_FIELD_CATALOG USING 'MODATTR-ADAT' 'T_USEREXIT' ' ' 'Change date'.
* Layout
CLEAR I_LAYOUT.
I_LAYOUT-COLWIDTH_OPTIMIZE = C_X.
I_LAYOUT-INFO_FIELDNAME = 'COLOUR'.
* Sort
CLEAR I_SORT.
I_SORT-FIELDNAME = 'TYPE'.
I_SORT-TABNAME = 'T_USEREXIT'.
I_SORT-UP = C_X.
APPEND I_SORT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IS_LAYOUT = I_LAYOUT
IT_FIELDCAT = I_FIELDCAT[]
IT_SORT = I_SORT[]
I_DEFAULT = C_X
I_SAVE = 'A'
I_GRID_TITLE = W_GRIDTXT
TABLES
T_OUTTAB = I_USEREXIT.
ENDIF.
* issue message with number of user-exits displayed
DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
MESSAGE S697(56) WITH W_LINNUM.
ENDFORM. "DATA_DISPLAY
*&---------------------------------------------------------------------&*
*& Form CREATE_FIELD_CATALOG &*
*&---------------------------------------------------------------------&*
FORM CREATE_FIELD_CATALOG USING P_FIELDNAME
P_TABNAME
P_HIDE
P_TEXT.
I_FIELDCAT-FIELDNAME = P_FIELDNAME.
I_FIELDCAT-TABNAME = P_TABNAME.
I_FIELDCAT-NO_OUT = P_HIDE.
I_FIELDCAT-SELTEXT_L = P_TEXT.
APPEND I_FIELDCAT.
ENDFORM. " CREATE_FIELD_CATALOG
*&---------------------------------------------------------------------&*
*& Form CREATE_FIELD_CATALOG &*
*&---------------------------------------------------------------------&*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
READ TABLE I_USEREXIT INDEX RS_SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
CASE R_UCOMM.
WHEN '&IC1'.
CASE RS_SELFIELD-SEL_TAB_FIELD.
WHEN 'T_USEREXIT-MODNAME'.
READ TABLE I_USEREXIT INDEX RS_SELFIELD-TABINDEX.
CASE I_USEREXIT-TYPE.
WHEN 'Enhancement'.
SET PARAMETER ID 'MON' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SMOD'.
WHEN 'BADI'.
SET PARAMETER ID 'EXN' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
WHEN 'BusTrEvent'.
SUBMIT RFOPFI00 WITH EVENT = I_USEREXIT-MODNAME(8) AND RETURN.
WHEN OTHERS.
MESSAGE S030(CJ). "Navigation not possible
ENDCASE.
WHEN 'T_USEREXIT-MODATTR-NAME'.
IF NOT I_USEREXIT-MODATTR-NAME IS INITIAL.
SET PARAMETER ID 'MON_KUN' FIELD I_USEREXIT-MODATTR-NAME.
CALL TRANSACTION 'CMOD'.
ELSE.
MESSAGE S030(CJ)."Navigation not possible
ENDIF.
WHEN 'T_USEREXIT-PNAME'.
CASE I_USEREXIT-TYPE.
WHEN 'Program Exit'.
SET PARAMETER ID 'RID' FIELD I_USEREXIT-PNAME.
CALL TRANSACTION 'SE38'.
ENDCASE.
WHEN OTHERS.
MESSAGE S030(CJ)."Navigation not possible
ENDCASE.
ENDCASE.
ENDFORM. "user_command
*&--------------------------------------------------------------------&*
*& AT LINE-SELECTION ?*
*&--------------------------------------------------------------------&*
AT LINE-SELECTION.
GET CURSOR FIELD W_FSEL.
CASE W_FSEL.
WHEN 'I_USEREXIT-MODNAME'.
CASE I_USEREXIT-TYPE.
WHEN 'Enhancement'.
SET PARAMETER ID 'MON' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SMOD'.
WHEN 'BADI'.
SET PARAMETER ID 'EXN' FIELD I_USEREXIT-MODNAME.
CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
WHEN 'BusTrEvent'.
SUBMIT RFOPFI00 WITH EVENT = I_USEREXIT-MODNAME(8) AND RETURN.
WHEN OTHERS.
MESSAGE S030(CJ)."Navigation not possible
ENDCASE.
WHEN 'I_USEREXIT-MODATTR-NAME'.
IF NOT I_USEREXIT-MODATTR-NAME IS INITIAL.
SET PARAMETER ID 'MON_KUN' FIELD I_USEREXIT-MODATTR-NAME.
CALL TRANSACTION 'CMOD'.
ELSE.
MESSAGE S030(CJ)."Navigation not possible
ENDIF.
WHEN OTHERS.
MESSAGE S030(CJ)."Navigation not possible
ENDCASE.
*&--------------------------------------------------------------------&*
*& AT SELECTION-SCREEN &*
*&--------------------------------------------------------------------&*
AT SELECTION-SCREEN ON RADIOBUTTON GROUP RAD1.
* grey-out checkboxes if ALV selected
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF P_ALV = C_X.
IF SCREEN-GROUP1 = 'A01'.
SCREEN-INPUT = '0'.
MODIFY SCREEN.
ENDIF.
ELSE.
IF SCREEN-GROUP1 = 'A01'.
SCREEN-INPUT = '1'.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.