REPORT ZFIND_ENHANCEMENT. *&--------------------------------------------------------------------&* *& Report: Z_USEREXIT (V9) &* *& PJA Consultancy Services (www.pjas.com) &* *&--------------------------------------------------------------------&* *& This report attmpts to find Enhancements, Program-Exits, BADIs &* *& and Business Transaction Events in a particular program/tcode. &* *& Last updated: 09 May 2007 &* *&--------------------------------------------------------------------&* *& Selection Texts: *& P_ALV ALV format *& P_AUTH Include authority-check search *& P_BADI Display BADIs *& P_BTE Display business trans events *& P_DEVC Show development class exits *& P_EXIT Display user exits *& P_FUNC Show function modules *& P_LIMIT Limit no. of submits to search *& P_LST Standard list format *& P_PNAME Program name *& P_PROG Display program exits *& P_SUBM Show submits *& P_TCODE Transaction code *& P_TEXT Search for text *& P_WFLOW Display workflow links *&--------------------------------------------------------------------&* *& Text symbols: *& M01 Enter TCode or program *& M02 Enter at least one scope criteria *& S01 Selection data (TCode takes precedence over program name) *& S02 Scope criteria *& S03 Display criteria *&--------------------------------------------------------------------&* *report z_userexit no standard page heading line-size 201 . 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 stokex with header line. 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 ANALYSIS. "#EC ********************************** 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 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 .