• SAP中查找增强的可执行程序示例


    一、zexit.abap

    1.选择屏幕展示

    2.查找结果

    3.源码

    *&---------------------------------------------------------------------*
    *& Report  ZEXIT
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    
    REPORT zexit NO STANDARD PAGE HEADING
          LINE-SIZE 201.
    *    *&--------------------------------------------------------------------&*
    *    *& Report:       Z_USEREXIT (V10)                                     &*
    *    *& Last updated: 15 Aug 2008                                          &*
    *    *&--------------------------------------------------------------------&*
    *    *& Selection Texts:
    *    *& P_ALV   ALV format
    *    *& P_AUTH   Include authority-check search
    *    *& P_BADI   Display BADIs
    *    *& P_CUSB   Customer BADIs only
    *    *& 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
    *    *&--------------------------------------------------------------------&*
    
    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 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_cusb  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 WITH ANALYSIS.   "#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
                                     WITH ANALYSIS.
          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
                                     WITH ANALYSIS.
          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
            IF p_cusb = c_x.   "customer BADIs only
              SELECT SINGLE * FROM sxs_attr WHERE exit_name = i_userexit-txt
                                              AND internal <> c_x.
            ELSE.
              SELECT SINGLE * FROM sxs_attr WHERE exit_name = i_userexit-txt.
            ENDIF.
            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.

    二、z_userexit_01.abap

    1.选择屏幕

    2.结果展示

    3.源码

    *&---------------------------------------------------------------------*
    *& Report  Z_USEREXIT_01
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    
    REPORT Z_USEREXIT_01.
    TABLES:tstc,tadir,modsapt,modact,trdir,tfdir,enlfdir,sxs_attrt,tstct.
    
    DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE.
    DATA : field1(30).
    DATA : v_devclass LIKE tadir-devclass.
    
    PARAMETERS : p_tcode LIKE tstc-tcode,
           p_pgmna LIKE tstc-pgmna .
    
    DATA wa_tadir TYPE tadir.
    
    START-OF-SELECTION.
      IF NOT p_tcode IS INITIAL.
    
        select single * from tstc where tcode eq p_tcode.
    
      ELSEIF NOT p_pgmna IS INITIAL.
    
        tstc-pgmna = p_pgmna.
    
      ENDIF.
      IF sy-subrc EQ 0.
    
        select single * from tadir
        where pgmid = 'R3TR'
         and object = 'PROG'
         and obj_name = tstc-pgmna.
    
        MOVE : tadir-devclass TO v_devclass.
    
        IF sy-subrc NE 0.
    
          select single * from trdir
           where name = tstc-pgmna.
    
          IF trdir-subc EQ 'F'.
    
            select single * from tfdir
             where pname = tstc-pgmna.
    
            select single * from enlfdir
             where funcname = tfdir-funcname.
    
            select single * from tadir
             where pgmid = 'R3TR'
             and object = 'FUGR'
             and obj_name eq enlfdir-area.
    
            MOVE : tadir-devclass TO v_devclass.
    
          ENDIF.
    
        ENDIF.
    
        select * from tadir into table jtab where pgmid = 'R3TR' and
         object in ('SMOD', 'SXSD') and
         devclass = v_devclass.
    
        select single * from tstct where sprsl eq sy-langu and
         tcode eq p_tcode.
    
        FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
    
        WRITE:/(19) 'Transaction Code - ',
        20(20) p_tcode,
        45(50) tstct-ttext.
    
        SKIP.
    
        IF NOT jtab[] IS INITIAL.
          WRITE:/(105) sy-uline.
          FORMAT COLOR COL_HEADING INTENSIFIED ON.
          SORT jtab BY object.
    
          DATA : wf_txt(60) TYPE c,
              wf_smod TYPE i ,
              wf_badi TYPE i ,
              wf_object2(30) TYPE c.
    
          CLEAR : wf_smod, wf_badi , wf_object2.
    
          LOOP AT jtab INTO wa_tadir.
    
            AT FIRST.
              FORMAT COLOR COL_HEADING INTENSIFIED ON.
              WRITE:/1 sy-vline,
                2 'Enhancement/ Business Add-in',
                41 sy-vline ,
                42 'Description',
                105 sy-vline.
              WRITE:/(105) sy-uline.
            ENDAT.
    
            CLEAR wf_txt.
    
            AT NEW object.
              IF wa_tadir-object = 'SMOD'.
                wf_object2 = 'Enhancement' .
              ELSEIF wa_tadir-object = 'SXSD'.
                wf_object2 = ' Business Add-in'.
              ENDIF.
    
              FORMAT COLOR COL_GROUP INTENSIFIED ON.
              WRITE:/1 sy-vline,
                 2 wf_object2,
                 105 sy-vline.
            ENDAT.
    
            CASE wa_tadir-object.
              WHEN 'SMOD'.
                wf_smod = wf_smod + 1.
                select single modtext into wf_txt
                 from modsapt
                 where sprsl = sy-langu
                  and name = wa_tadir-obj_name.
                FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
              WHEN 'SXSD'.
    * for badis
                 wf_badi = wf_badi + 1 .
                 select single text into wf_txt
                 from sxs_attrt
                 where sprsl = sy-langu
                  and exit_name = wa_tadir-obj_name.
    
                FORMAT COLOR COL_NORMAL INTENSIFIED ON.
    
            ENDCASE.
    
            WRITE:/1 sy-vline,
               2 wa_tadir-obj_name HOTSPOT ON,
               41 sy-vline ,
               42 wf_txt,
               105 sy-vline.
    
            AT END OF object.
              WRITE : /(105) sy-uline.
            ENDAT.
    
          ENDLOOP.
    
          WRITE:/(105) sy-uline.
    
          SKIP.
    
          FORMAT COLOR COL_TOTAL INTENSIFIED ON.
    
          WRITE:/ 'No.of Exits:' , wf_smod.
          WRITE:/ 'No.of BADis:' , wf_badi.
    
        ELSE.
          FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
          WRITE:/(105) 'No userexits or BADis exist'.
        ENDIF.
      ELSE.
        FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
        WRITE:/(105) 'Transaction does not exist'.
      ENDIF.
    
    AT LINE-SELECTION.
      DATA : wf_object TYPE tadir-object.
      CLEAR wf_object.
      GET CURSOR FIELD field1.
      CHECK field1(8) EQ 'WA_TADIR'.
      READ TABLE jtab WITH KEY obj_name = sy-lisel+1(20).
      MOVE jtab-object TO wf_object.
      CASE wf_object.
        WHEN 'SMOD'.
          SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
          CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
        WHEN 'SXSD'.
          SET PARAMETER ID 'EXN' FIELD sy-lisel+1(20).
          CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
      ENDCASE.
  • 相关阅读:
    MondoDB 之 使用python对MongoDB排序 MondoDB -9
    MondoDB 之 使用python对MongoDB进行文档修改 MondoDB -8
    MondoDB 之 使用python对MongoDB进行查询文档 MondoDB -7
    MondoDB 之 使用python对MongoDB进行插入文档 MondoDB -6
    MondoDB 之 使用python操作MongoDB MondoDB -5
    MondoDB 之 $关键字 及 $修改器 $set $inc $push $pull $pop MondoDB -4
    MondoDB 之 数据类型 MondoDB -3
    MongoDB 之 操作增删改查 MongoDB
    简述常见数据库高可用方案
    关于MySql数据库误操作数据找回的办法
  • 原文地址:https://www.cnblogs.com/ybinlog/p/11201387.html
Copyright © 2020-2023  润新知