獲取標準程序的BADI,用戶出口,增強

 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(70TYPE C.           "ALV grid title

CONSTANTS: C_FMOD(40TYPE C VALUE 'Function modules searched: ',
           C_SUBM(40TYPE C VALUE 'Submit programs searched: ',
           C_DEVC(60TYPE C VALUE 'User-exits from development classes in function modules',
           C_COL1(12TYPE C VALUE 'Enhanmt Type',
           C_COL2(40TYPE C VALUE 'Enhancement',
           C_COL3(30TYPE C VALUE 'Program/Include',
           C_COL4(20TYPE C VALUE 'Enhancement Name',
           C_COL5(40TYPE C VALUE 'Enhancement Description',
           C_COL6(8)  TYPE C VALUE 'Project',
           C_COL7(1)  TYPE C VALUE 'S',
           C_COL8(12TYPE C VALUE 'ChangeName',
           C_COL9(10TYPE C VALUE 'ChangeDate',
           C_X        TYPE C VALUE 'X'.

* Work Areas: ABAP Workbench
DATABEGIN OF WA_D010INC.
DATA: MASTER TYPE D010INC-MASTER.
DATAEND OF WA_D010INC.

DATABEGIN OF WA_TFDIR.
DATA: FUNCNAME TYPE TFDIR-FUNCNAME,
      PNAME    TYPE TFDIR-PNAME,
      INCLUDE  TYPE TFDIR-INCLUDE.
DATAEND OF WA_TFDIR.

DATABEGIN OF WA_TADIR.
DATA: DEVCLASS TYPE TADIR-DEVCLASS.
DATAEND OF WA_TADIR.

DATABEGIN OF WA_TSTC.
DATA: PGMNA TYPE TSTC-PGMNA.
DATAEND OF WA_TSTC.

DATABEGIN OF WA_TSTCP.
DATA: PARAM TYPE TSTCP-PARAM.
DATAEND OF WA_TSTCP.

DATABEGIN OF WA_ENLFDIR.
DATA: AREA TYPE ENLFDIR-AREA.
DATAEND OF WA_ENLFDIR.

* Work Areas: BADIs
DATABEGIN OF WA_SXS_ATTR.
DATA: EXIT_NAME TYPE SXS_ATTR-EXIT_NAME.
DATAEND OF WA_SXS_ATTR.

DATABEGIN OF WA_SXS_ATTRT.
DATATEXT TYPE SXS_ATTRT-TEXT.
DATAEND OF WA_SXS_ATTRT.

* Work Areas: Enhancements
DATABEGIN OF WA_MODSAP.
DATA: MEMBER TYPE MODSAP-MEMBER.
DATAEND OF WA_MODSAP.

DATABEGIN OF WA_MODSAPA.
DATA: NAME TYPE MODSAPA-NAME.
DATAEND OF WA_MODSAPA.

DATABEGIN OF WA_MODSAPT.
DATA: MODTEXT TYPE MODSAPT-MODTEXT.
DATAEND OF WA_MODSAPT.

* Work Areas: Business Transaction Events
DATABEGIN OF WA_TBE01T.
DATA: TEXT1 TYPE TBE01T-TEXT1.
DATAEND OF WA_TBE01T.

DATABEGIN OF WA_TPS01T.
DATA: TEXT1 TYPE TPS01T-TEXT1.
DATAEND 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.

TYPESBEGIN OF T_USEREXIT,
      TYPE(12TYPE C,
      PNAME    LIKE TRDIR-NAME,
      TXT(300),
      LEVEL    TYPE C,
      MODNAME(30TYPE C,
      MODTEXT(60TYPE 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
TYPESBEGIN 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
TYPESBEGIN 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
TYPESBEGIN 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(30000TYPE C.

* Description of an ABAP/4 source analysis token
DATA: I_STOKEN TYPE STANDARD TABLE OF STOKEN WITH HEADER LINE.
DATA WA_STOKEN LIKE I_STOKEN.

* Description of an ABAP/4 source analysis statement
DATA: I_SSTMNT TYPE STANDARD TABLE OF SSTMNT WITH HEADER LINE."#EC NEEDED

* keywords for searching ABAP code
TYPESBEGIN OF T_KEYWORDS,
      WORD(30),
END OF T_KEYWORDS.
DATA: KEYWORDS TYPE STANDARD TABLE OF T_KEYWORDS WITH HEADER LINE.

* function modules within program
TYPESBEGIN 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(4TYPE N DEFAULT 500.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK SELSCR1.

SELECTION-SCREEN BEGIN OF BLOCK SELSCR2 WITH FRAME TITLE TEXT-S02.
PARAMETER: P_BADI  AS CHECKBOX DEFAULT C_X,
           P_BTE   AS CHECKBOX DEFAULT C_X,
           P_EXIT  AS CHECKBOX DEFAULT C_X,
           P_PROG  AS CHECKBOX DEFAULT C_X,
           P_WFLOW AS CHECKBOX,
           P_AUTH  AS CHECKBOX.
SELECTION-SCREEN SKIP.
PARAMETER: P_TEXT(40TYPE 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(ENHANCEMENTWITH P_PNAME RAISING NO_PROGRAM."#EC *
  ENDIF.

  SCAN ABAP-SOURCE SOURCETAB TOKENS     INTO I_STOKEN
                             STATEMENTS INTO I_SSTMNT
                             KEYWORDS   FROM KEYWORDS
                             OVERFLOW INTO C_OVERFLOW
                             WITH INCLUDES.                 "#EC
  IF SY-SUBRC > 0"keine/syntakt. falsche Ablauflog./Fehler im Skanner
    MESSAGE E130(ENHANCEMENTRAISING SYNTAX_ERROR.         "#EC
  ENDIF.

* check I_STOKEN for entries
  CLEAR W_LINNUM.
  DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
  IF W_LINNUM GT 0.
    W_LEVEL = '0'.
    W_PROG = ''.
    W_INCL = ''.
    PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
  ENDIF.

ENDFORM.                        "DATA_SELECT

*&--------------------------------------------------------------------&*
*& Form GET_FM_DATA                              ?                    &*
*&--------------------------------------------------------------------&*
*&                                                                    &*
*&--------------------------------------------------------------------&*
FORM GET_FM_DATA.

* data selection message to sap gui
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    DESTINATION 'SAPGUI'
    KEEPING LOGICAL UNIT OF WORK
    EXPORTING
      TEXT                  = 'Get function module data'    "#EC NOTEXT
    EXCEPTIONS
      SYSTEM_FAILURE
      COMMUNICATION_FAILURE
    .                                                       "#EC *

* Function module data
  SORT I_FMODULE BY NAME.
  DELETE ADJACENT DUPLICATES FROM I_FMODULE COMPARING NAME.

  LOOP AT I_FMODULE WHERE DONE  NE C_X.

    CLEAR:   I_STOKEN, I_SSTMNT, SOURCETAB, WA_TFDIR, W_INCLUDE .
    REFRESH: I_STOKEN, I_SSTMNT, SOURCETAB.

    CLEAR WA_TFDIR.
    SELECT SINGLE FUNCNAME PNAME INCLUDE FROM TFDIR INTO WA_TFDIR
                            WHERE FUNCNAME = I_FMODULE-NAME.
    CHECK SY-SUBRC = 0.

    CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
      EXPORTING
        PROGRAM = WA_TFDIR-PNAME
      IMPORTING
        GROUP   = W_AREA.

    CONCATENATE 'L' W_AREA 'U' WA_TFDIR-INCLUDE INTO W_INCLUDE.
    I_FMODULE-PNAME  = W_INCLUDE.
    I_FMODULE-PNAME2 = WA_TFDIR-PNAME.
    MODIFY I_FMODULE.

    READ REPORT I_FMODULE-PNAME INTO SOURCETAB.
    IF SY-SUBRC = 0.

      SCAN ABAP-SOURCE SOURCETAB TOKENS     INTO I_STOKEN
                                 STATEMENTS INTO I_SSTMNT
                                 KEYWORDS   FROM KEYWORDS
                                 WITH INCLUDES.
      IF SY-SUBRC > 0.
        MESSAGE E130(ENHANCEMENTRAISING SYNTAX_ERROR.
      ENDIF.

* check i_stoken for entries
      CLEAR W_LINNUM.
      DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
      IF W_LINNUM GT 0.
        W_LEVEL = '1'.
        W_PROG  = I_FMODULE-PNAME2.
        W_INCL =  I_FMODULE-PNAME.
        PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
      ENDIF.
    ENDIF.

  ENDLOOP.

* store development classes
  IF P_DEVC = C_X.
    LOOP AT I_FMODULE.
      CLEAR: WA_TADIR, WA_ENLFDIR.

      SELECT SINGLE AREA FROM ENLFDIR INTO WA_ENLFDIR-AREA
                            WHERE FUNCNAME = I_FMODULE-NAME.
      CHECK NOT WA_ENLFDIR-AREA IS INITIAL.

      SELECT SINGLE DEVCLASS INTO WA_TADIR-DEVCLASS
                      FROM TADIR WHERE PGMID    = 'R3TR'
                                   AND OBJECT   = 'FUGR'
                                   AND OBJ_NAME = WA_ENLFDIR-AREA.
      CHECK NOT WA_TADIR-DEVCLASS IS INITIAL.
      MOVE WA_TADIR-DEVCLASS TO I_DEVCLASS-CLAS.
      APPEND I_DEVCLASS.
      I_FMODULE-DONE = C_X.
      MODIFY I_FMODULE.
    ENDLOOP.

    SORT I_DEVCLASS.
    DELETE ADJACENT DUPLICATES FROM I_DEVCLASS.
  ENDIF.

ENDFORM.                        "GET_FM_DATA

*&--------------------------------------------------------------------&*
*& Form GET_SUBMIT_DATA                                               &*
*&--------------------------------------------------------------------&*
*&                                                                    &*
*&--------------------------------------------------------------------&*
FORM GET_SUBMIT_DATA.

* data selection message to sap gui
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    DESTINATION 'SAPGUI'
    KEEPING LOGICAL UNIT OF WORK
    EXPORTING
      TEXT                  = 'Get submit data'             "#EC NOTEXT
    EXCEPTIONS
      SYSTEM_FAILURE
      COMMUNICATION_FAILURE
    .                                                       "#EC *

  SORT I_SUBMIT.
  DELETE ADJACENT DUPLICATES FROM I_SUBMIT COMPARING PNAME.
  W_LEVEL = '0'.

  LOOP AT I_SUBMIT WHERE DONE NE C_X.

    CLEAR:   I_STOKEN, I_SSTMNT, SOURCETAB.
    REFRESH: I_STOKEN, I_SSTMNT, SOURCETAB.

    READ REPORT I_SUBMIT-PNAME INTO SOURCETAB.
    IF SY-SUBRC = 0.

      SCAN ABAP-SOURCE SOURCETAB TOKENS     INTO I_STOKEN
                                 STATEMENTS INTO I_SSTMNT
                                 KEYWORDS   FROM KEYWORDS
                                 WITH INCLUDES.
      IF SY-SUBRC > 0.
*        message e130(enhancement) raising syntax_error.
        CONTINUE.
      ENDIF.

* check i_stoken for entries
      CLEAR W_LINNUM.
      DESCRIBE TABLE I_STOKEN LINES W_LINNUM.
      IF W_LINNUM GT 0.
        W_PROG  = I_SUBMIT-PNAME.
        W_INCL = ''.
        PERFORM DATA_SEARCH TABLES I_STOKEN USING W_LEVEL W_PROG W_INCL.
      ENDIF.
    ENDIF.

* restrict number of submit program selected for processing
    DESCRIBE TABLE I_SUBMIT LINES W_LINNUM.
    IF W_LINNUM GE P_LIMIT.
      W_LEVEL = '1'.
    ENDIF.
    I_SUBMIT-DONE = C_X.
    MODIFY I_SUBMIT.
  ENDLOOP.

ENDFORM.                       "GET_SUBMIT_DATA

*&--------------------------------------------------------------------&*
*& Form DATA_SEARCH                                                   &*
*&--------------------------------------------------------------------&*
*&                                                                    &*
*&--------------------------------------------------------------------&*
FORM DATA_SEARCH TABLES P_STOKEN STRUCTURE STOKEN
                        USING P_LEVEL L_PROG L_INCL.

  LOOP AT P_STOKEN.

    CLEAR I_USEREXIT.

* Workflow
    IF P_WFLOW = C_X.
      IF P_LEVEL EQ '1'.    " do not perform for function modules (2nd pass)
        IF  P_STOKEN-STR+1(16CS 'SWE_EVENT_CREATE'.
          REPLACE ALL OCCURRENCES OF '''' IN P_STOKEN-STR WITH ''.
          I_USEREXIT-TYPE = 'WorkFlow'.
          I_USEREXIT-TXT  = P_STOKEN-STR.
          CONCATENATE L_PROG '/' L_INCL INTO I_USEREXIT-PNAME.
          APPEND I_USEREXIT.
        ENDIF.
      ENDIF.
    ENDIF.

    TABIX = SY-TABIX + 1.
    I_USEREXIT-LEVEL = P_LEVEL.
    IF I_USEREXIT-LEVEL = '0'.
      IF L_INCL IS INITIAL.
        I_USEREXIT-PNAME = P_PNAME.
      ELSE.
        CONCATENATE  P_PNAME '-' L_INCL INTO I_USEREXIT-PNAME.
      ENDIF.
    ELSE.
      IF L_INCL IS INITIAL.
        I_USEREXIT-PNAME = L_PROG.
      ELSE.
        CONCATENATE  L_PROG '-' L_INCL INTO I_USEREXIT-PNAME.
      ENDIF.
    ENDIF.

* AUTHORITY-CHECKS
    IF P_AUTH = C_X.
      IF P_STOKEN-STR EQ 'AUTHORITY-CHECK'.
        CHECK P_LEVEL EQ '0'.    " do not perform for function modules (2nd pass)
        W_INDEX = SY-TABIX + 2.
        READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
        CHECK NOT WA_STOKEN-STR CS 'STRUCTURE'.
        CHECK NOT WA_STOKEN-STR CS 'SYMBOL'.
        READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
        IF SY-SUBRC <> 0.
          I_USEREXIT-PNAME = I_SUBMIT-PNAME.
          I_USEREXIT-TYPE = 'AuthCheck'.
          I_USEREXIT-TXT  = WA_STOKEN-STR.
          REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
          CLEAR TOBJT.
          SELECT SINGLE * FROM TOBJT WHERE OBJECT = I_USEREXIT-TXT
                                       AND LANGU  = SY-LANGU.
          I_USEREXIT-MODNAME = 'AUTHORITY-CHECK'.
          I_USEREXIT-MODTEXT = TOBJT-TTEXT.
          APPEND I_USEREXIT.
        ENDIF.
      ENDIF.
    ENDIF.

* Text searches
    IF NOT P_TEXT IS INITIAL.
      IF P_STOKEN-STR CS P_TEXT.
        I_USEREXIT-PNAME = I_SUBMIT-PNAME.
        I_USEREXIT-TYPE = 'TextSearch'.
        I_USEREXIT-TXT  = WA_STOKEN-STR.
        I_USEREXIT-MODNAME = 'Text Search'.
        I_USEREXIT-MODTEXT = P_STOKEN-STR.
        APPEND I_USEREXIT.
      ENDIF.
    ENDIF.

* Include (SE38)
    IF P_STOKEN-STR EQ 'INCLUDE'.
      CHECK P_LEVEL EQ '0'.    " do not perform for function modules (2nd pass)
      W_INDEX = SY-TABIX + 1.
      READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
      CHECK NOT WA_STOKEN-STR CS 'STRUCTURE'.
      CHECK NOT WA_STOKEN-STR CS 'SYMBOL'.
      READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
      IF SY-SUBRC <> 0.
        I_SUBMIT-PNAME = WA_STOKEN-STR.
        I_SUBMIT-LEVEL = P_LEVEL.
        APPEND I_SUBMIT.
      ENDIF.
    ENDIF.

* Enhancements (SMOD)
    IF P_EXIT = C_X.
      IF P_STOKEN-STR EQ 'CUSTOMER-FUNCTION'.
        CLEAR W_FUNCNAME.
        READ TABLE P_STOKEN INDEX TABIX.
        TRANSLATE P_STOKEN-STR USING ''' '.
        CONDENSE P_STOKEN-STR.
        IF L_PROG IS INITIAL.
          CONCATENATE 'EXIT' P_PNAME P_STOKEN-STR INTO W_FUNCNAME
                       SEPARATED BY '_'.
        ELSE.
          CONCATENATE 'EXIT' L_PROG P_STOKEN-STR INTO W_FUNCNAME
                 SEPARATED BY '_'.
        ENDIF.
        SELECT SINGLE MEMBER FROM MODSAP INTO WA_MODSAP-MEMBER
              WHERE MEMBER = W_FUNCNAME.
        IF SY-SUBRC = 0.   " check for valid enhancement
          I_USEREXIT-TYPE = 'Enhancement'.
          I_USEREXIT-TXT  = W_FUNCNAME.
          APPEND I_USEREXIT.
        ELSE.
          CLEAR WA_D010INC.
          SELECT SINGLE MASTER INTO WA_D010INC-MASTER
                FROM D010INC
                   WHERE INCLUDE = L_PROG.
          CONCATENATE 'EXIT' WA_D010INC-MASTER P_STOKEN-STR INTO W_FUNCNAME
                 SEPARATED BY '_'.
          I_USEREXIT-TYPE = 'Enhancement'.
          I_USEREXIT-TXT  = W_FUNCNAME.
        ENDIF.
      ENDIF.
    ENDIF.

* BADIs (SE18)
    IF P_BADI = C_X.
      IF P_STOKEN-STR CS 'cl_exithandler='.
        W_INDEX = SY-TABIX + 4.
        READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
        I_USEREXIT-TXT = WA_STOKEN-STR.
        REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
        I_USEREXIT-TYPE = 'BADI'.
        CLEAR SXS_ATTR.   " ensure a real BADI
        SELECT SINGLE * FROM SXS_ATTR WHERE EXIT_NAME = I_USEREXIT-TXT.
        IF SY-SUBRC = 0.
          APPEND I_USEREXIT.
        ENDIF.
      ENDIF.
    ENDIF.

* Business transaction events (FIBF)
    IF P_BTE = C_X.
      IF P_STOKEN-STR CS 'OPEN_FI_PERFORM'.
        I_USEREXIT-TYPE = 'BusTrEvent'.
        I_USEREXIT-TXT = P_STOKEN-STR.
        REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
        I_USEREXIT-MODNAME =  I_USEREXIT-TXT+16(8).
        CASE I_USEREXIT-TXT+25(1).
          WHEN 'E'.
            CLEAR WA_TBE01T.
            SELECT SINGLE TEXT1 INTO WA_TBE01T-TEXT1 FROM TBE01T
                             WHERE EVENT = I_USEREXIT-TXT+16(8)
                               AND SPRAS = SY-LANGU.
            IF WA_TBE01T-TEXT1 IS INITIAL.
              I_USEREXIT-MODTEXT = '<Not active>'.          "#EC NOTEXT
            ELSE.
              I_USEREXIT-MODTEXT = WA_TBE01T-TEXT1.
            ENDIF.
            I_USEREXIT-MODNAME+8 = '/P&S'.                  "#EC NOTEXT
          WHEN 'P'.
            CLEAR WA_TPS01T.
            SELECT SINGLE TEXT1 INTO WA_TPS01T-TEXT1 FROM TPS01T
                             WHERE PROCS = I_USEREXIT-TXT+16(8)
                               AND SPRAS = SY-LANGU.
            I_USEREXIT-MODTEXT = WA_TPS01T-TEXT1.
            I_USEREXIT-MODNAME+8 = '/Process'.
        ENDCASE.

        APPEND I_USEREXIT.
      ENDIF.
    ENDIF.

* Program exits (SE38)
    IF P_PROG = C_X.
      IF P_STOKEN-STR CS 'USEREXIT_'.
        CHECK NOT P_STOKEN-STR CS '-'.   " ensure not USEREXIT_XX-XXX
        CHECK NOT P_STOKEN-STR CS '('.   " ensure not SUBMIT_XX(X)
        I_USEREXIT-TYPE = 'Program Exit'.
        I_USEREXIT-TXT = P_STOKEN-STR.
        REPLACE ALL OCCURRENCES OF '''' IN I_USEREXIT-TXT WITH SPACE.
        APPEND I_USEREXIT.
      ENDIF.
    ENDIF.

* Submit programs (SE38)
    IF P_STOKEN-STR CS 'SUBMIT'.
      CHECK P_LEVEL EQ '0'.    " do not perform for function modules (2nd pass)
      CHECK NOT P_STOKEN-STR CS '_'.   " ensure not SUBMIT_XXX
      W_INDEX = SY-TABIX + 1.
      READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
      CHECK NOT WA_STOKEN-STR CS '_'.   " ensure not SUBMIT_XXX
      REPLACE ALL OCCURRENCES OF '''' IN WA_STOKEN-STR WITH SPACE.
      READ TABLE I_SUBMIT WITH KEY PNAME = WA_STOKEN-STR.
      IF SY-SUBRC <> 0.
        I_SUBMIT-PNAME = WA_STOKEN-STR.
        I_SUBMIT-LEVEL = P_LEVEL.
        APPEND I_SUBMIT.
      ENDIF.
    ENDIF.

* Perform routines (which reference external programs)
    IF P_STOKEN-STR CS 'PERFORM'.
      CHECK P_LEVEL EQ '0'.    " do not perform for function modules (2nd pass)
      W_INDEX = SY-TABIX + 1.
      READ TABLE P_STOKEN INDEX W_INDEX INTO WA_STOKEN.
      IF NOT WA_STOKEN-OVFL IS INITIAL.
        W_OFF = WA_STOKEN-OFF1 + 10.
        W_STR = C_OVERFLOW+W_OFF(30).
        FIND ')' IN W_STR MATCH OFFSET W_OFF.
        IF SY-SUBRC = 0.
          W_OFF = W_OFF + 1.
          WA_STOKEN-STR = W_STR(W_OFF).
        ENDIF.
      ENDIF.

      CHECK WA_STOKEN-STR CS '('.
      W_OFF = 0.
      WHILE SY-SUBRC  = 0.
        IF WA_STOKEN-STR+W_OFF(1EQ '('.
          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(56WITH W_LINNUM.

  ELSE.    " Show in alv format

* issue message with number of user-exits displayed
    DESCRIBE TABLE I_USEREXIT LINES W_LINNUM.
    MESSAGE S697(56WITH 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(56WITH 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(8AND RETURN.
            WHEN OTHERS.
              MESSAGE S030(CJ). "Navigation not possible
          ENDCASE.
        WHEN 'T_USEREXIT-MODATTR-NAME'.
          IF NOT I_USEREXIT-MODATTR-NAME IS INITIAL.
            SET PARAMETER ID 'MON_KUN' FIELD I_USEREXIT-MODATTR-NAME.
            CALL TRANSACTION 'CMOD'.
          ELSE.
            MESSAGE S030(CJ)."Navigation not possible
          ENDIF.
        WHEN 'T_USEREXIT-PNAME'.
          CASE I_USEREXIT-TYPE.
            WHEN 'Program Exit'.
              SET PARAMETER ID 'RID' FIELD I_USEREXIT-PNAME.
              CALL TRANSACTION 'SE38'.
          ENDCASE.
        WHEN OTHERS.
          MESSAGE S030(CJ)."Navigation not possible
      ENDCASE.
  ENDCASE.

ENDFORM.                    "user_command

*&--------------------------------------------------------------------&*
*& AT LINE-SELECTION                                                  ?*
*&--------------------------------------------------------------------&*
AT LINE-SELECTION.

  GET CURSOR FIELD W_FSEL.

  CASE W_FSEL.

    WHEN 'I_USEREXIT-MODNAME'.
      CASE I_USEREXIT-TYPE.
        WHEN 'Enhancement'.
          SET PARAMETER ID 'MON' FIELD I_USEREXIT-MODNAME.
          CALL TRANSACTION 'SMOD'.
        WHEN 'BADI'.
          SET PARAMETER ID 'EXN' FIELD I_USEREXIT-MODNAME.
          CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
        WHEN 'BusTrEvent'.
          SUBMIT RFOPFI00 WITH EVENT = I_USEREXIT-MODNAME(8AND 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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章