SAP中查找增强的可执行程序示例详解编程语言

一、zexit.abap

1.选择屏幕展示

SAP中查找增强的可执行程序示例详解编程语言

2.查找结果

SAP中查找增强的可执行程序示例详解编程语言

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.选择屏幕

SAP中查找增强的可执行程序示例详解编程语言

2.结果展示

SAP中查找增强的可执行程序示例详解编程语言

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.

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18588.html

(0)
上一篇 2021年7月19日 21:15
下一篇 2021年7月19日 21:15

相关推荐

发表回复

登录后才能评论