前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAP中查找增强的可执行程序示例

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

作者头像
matinal
发布2020-11-27 10:48:42
1.1K0
发布2020-11-27 10:48:42
举报
文章被收录于专栏:SAP Technical

1.选择屏幕展示

2.查找结果

3.源码

代码语言:javascript
复制
*&---------------------------------------------------------------------*
*& 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.源码

代码语言:javascript
复制
*&---------------------------------------------------------------------*
*& 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,
'Enhancement/ Business Add-in',
sy-vline ,
'Description',
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,
wf_object2,
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,
wa_tadir-obj_name HOTSPOT ON,
sy-vline ,
wf_txt,
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.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/01/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档