ZFIND_ENHANCEMENT(找增强点-新)

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

TABLES:
 SXS_ATTR,
 TOBJT,
 TSTCT, "TCode texts
 TRDIRT, "Program texts
 SXC_EXIT. "BADI exits

TYPE-POOLS: SLIS. "Globale Typen fьr generische Listbausteine

DATA:TABIX LIKE  SY-TABIX,
 W_LINNUM TYPE  I ,
 W_OFF TYPE  I ,
 W_INDEX LIKE  SY-TABIX,
 W_INCLUDE LIKE  TRDIR-NAME,
 W_PROG LIKE  TRDIR-NAME,
 W_INCL LIKE  TRDIR-NAME,
 W_AREA LIKE  RS38L-AREA,
 W_LEVEL,
 W_STR(50) TYPE  C ,
 W_CNT(2) TYPE  C ,
 W_FUNCNAME LIKE  TFDIR-FUNCNAME,
 W_FSEL LIKE  SY-UCOMM, " Determination of screen field
 W_GRIDTXT(70) TYPE  C . "ALV grid title

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

* Work Areas: ABAP Workbench
DATA : BEGIN  OF  WA_D010INC.
DATA : MASTER TYPE  D010INC-MASTER.
DATA : END  OF  WA_D010INC.

DATA : BEGIN  OF  WA_TFDIR.
DATA : FUNCNAME TYPE  TFDIR-FUNCNAME,
 PNAME TYPE  TFDIR-PNAME,
INCLUDE  TYPE  TFDIR-INCLUDE .
DATA : END  OF  WA_TFDIR.

DATA : BEGIN  OF  WA_TADIR.
DATA : DEVCLASS TYPE  TADIR-DEVCLASS.
DATA : END  OF  WA_TADIR.

DATA : BEGIN  OF  WA_TSTC.
DATA : PGMNA TYPE  TSTC-PGMNA.
DATA : END  OF  WA_TSTC.

DATA : BEGIN  OF  WA_TSTCP.
DATA : PARAM TYPE  TSTCP-PARAM.
DATA : END  OF  WA_TSTCP.

DATA : BEGIN  OF  WA_ENLFDIR.
DATA : AREA TYPE  ENLFDIR-AREA.
DATA : END  OF  WA_ENLFDIR.

* Work Areas: BADIs
DATA : BEGIN  OF  WA_SXS_ATTR.
DATA : EXIT_NAME TYPE  SXS_ATTR-EXIT_NAME.
DATA : END  OF  WA_SXS_ATTR.

DATA : BEGIN  OF  WA_SXS_ATTRT.
DATA : TEXT  TYPE  SXS_ATTRT-TEXT .
DATA : END  OF  WA_SXS_ATTRT.

* Work Areas: Enhancements
DATA : BEGIN  OF  WA_MODSAP.
DATA : MEMBER TYPE  MODSAP-MEMBER.
DATA : END  OF  WA_MODSAP.

DATA : BEGIN  OF  WA_MODSAPA.
DATA : NAME TYPE  MODSAPA-NAME.
DATA : END  OF  WA_MODSAPA.

DATA : BEGIN  OF  WA_MODSAPT.
DATA : MODTEXT TYPE  MODSAPT-MODTEXT.
DATA : END  OF  WA_MODSAPT.

* Work Areas: Business Transaction Events
DATA : BEGIN  OF  WA_TBE01T.
DATA : TEXT1 TYPE  TBE01T-TEXT1.
DATA : END  OF  WA_TBE01T.

DATA : BEGIN  OF  WA_TPS01T.
DATA : TEXT1 TYPE  TPS01T-TEXT1.
DATA : END  OF  WA_TPS01T.

* user-exits
TYPES : BEGIN  OF  TY_MOD,
 MEMBER LIKE  MODACT-MEMBER,
 NAME LIKE  MODACT-NAME,
 STATUS LIKE  MODATTR-STATUS,
 ANAM LIKE  MODATTR-ANAM,
 ADAT LIKE  MODATTR-ADAT,
END  OF  TY_MOD.
DATA : W_MOD TYPE  TY_MOD.

TYPES : BEGIN  OF  T_USEREXIT,
TYPE(12) TYPE C,
 PNAME LIKE  TRDIR-NAME,
 TXT(300),
 LEVEL TYPE  C ,
 MODNAME(30) TYPE  C ,
 MODTEXT(60) TYPE  C ,
 MODATTR TYPE  TY_MOD,
 COLOUR(4) TYPE  C ,
END  OF  T_USEREXIT.
DATA : I_USEREXIT TYPE  STANDARD  TABLE  OF  T_USEREXIT WITH  HEADER  LINE .

* Function module developmnet classes
TYPES : BEGIN  OF  T_DEVCLASS,
 CLAS LIKE  TRDIR-CLAS,
END  OF  T_DEVCLASS.
DATA : I_DEVCLASS TYPE  STANDARD  TABLE  OF  T_DEVCLASS WITH  HEADER  LINE .

* Submit programs
TYPES : BEGIN  OF  T_SUBMIT,
 PNAME LIKE  TRDIR-NAME,
 LEVEL,
 DONE,
END  OF  T_SUBMIT.
DATA : I_SUBMIT TYPE  STANDARD  TABLE  OF  T_SUBMIT WITH  HEADER  LINE .

* Source code
TYPES : BEGIN  OF  T_SOURCETAB,                     "#EC * (SLIN lьgt!)
LINE(200),                                          "#EC * (SLIN lьgt!)
END  OF  T_SOURCETAB.                               "#EC * (SLIN lьgt!)
DATA : SOURCETAB TYPE  STANDARD  TABLE  OF  T_SOURCETAB WITH  HEADER  LINE .
DATA  C_OVERFLOW(30000) TYPE  C .

* Description of an ABAP/4 source analysis token
*data: i_stoken type standard table of stokex with header line.
DATA : I_STOKEN TYPE  STANDARD  TABLE  OF  STOKEN WITH  HEADER  LINE .

DATA  WA_STOKEN LIKE  I_STOKEN.

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

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

* function modules within program
TYPES :
BEGIN  OF  T_FMODULE,
 NAME   LIKE  RS38L-NAME,
 PNAME  LIKE  TRDIR-NAME,
 PNAME2 LIKE  TRDIR-NAME,
 LEVEL,
 BAPI,
 DONE,
END  OF  T_FMODULE.
DATA : I_FMODULE TYPE  STANDARD  TABLE  OF  T_FMODULE WITH  HEADER  LINE .

* ALV definitions
DATA  I_FIELDCAT TYPE  SLIS_T_FIELDCAT_ALV WITH  HEADER  LINE .
DATA  I_LAYOUT TYPE  SLIS_LAYOUT_ALV.
DATA  I_SORT TYPE  SLIS_T_SORTINFO_ALV WITH  HEADER  LINE .

*&--------------------------------------------------------------------&*
*& Selection Options &*
*&--------------------------------------------------------------------&*
SELECTION-SCREEN  BEGIN  OF  BLOCK  SELSCR1 WITH  FRAME  TITLE  TEXT-S01.
PARAMETER : P_PNAME LIKE  TRDIR-NAME,
 P_TCODE LIKE  SYST-TCODE,
 P_LIMIT(4) TYPE  N DEFAULT  500 .
SELECTION-SCREEN  SKIP .
SELECTION-SCREEN  END  OF  BLOCK  SELSCR1.

SELECTION-SCREEN  BEGIN  OF  BLOCK  SELSCR2 WITH  FRAME  TITLE  TEXT-S02.
PARAMETER : P_BADI AS  CHECKBOX  DEFAULT  C_X,
 P_BTE AS  CHECKBOX  DEFAULT  C_X,
 P_EXIT AS  CHECKBOX  DEFAULT  C_X,
 P_PROG AS  CHECKBOX  DEFAULT  C_X,
 P_WFLOW AS  CHECKBOX ,
 P_AUTH AS  CHECKBOX .
SELECTION-SCREEN  SKIP .
PARAMETER : P_TEXT(40) TYPE  C .
SELECTION-SCREEN  END  OF  BLOCK  SELSCR2.

SELECTION-SCREEN  BEGIN  OF  BLOCK  SELSCR3 WITH  FRAME  TITLE  TEXT-S03.
PARAMETER : P_ALV RADIOBUTTON  GROUP  RAD1 DEFAULT  'X' ,
 P_LST RADIOBUTTON  GROUP  RAD1.
SELECTION-SCREEN  SKIP .
PARAMETER : P_DEVC LIKE  RIHEA-DY_OFN DEFAULT  ' '  MODIF ID  A01,
 P_FUNC LIKE  RIHEA-DY_OFN DEFAULT  ' '  MODIF ID  A01,
 P_SUBM LIKE  RIHEA-DY_OFN DEFAULT  ' '  MODIF ID  A01.
SELECTION-SCREEN  END  OF  BLOCK  SELSCR3.

*&--------------------------------------------------------------------&*
*& START-OF-SELECTION &*
*&--------------------------------------------------------------------&*
START-OF-SELECTION.

  IF  P_PNAME IS  INITIAL  AND  P_TCODE IS  INITIAL .
    MESSAGE  I000(G01) WITH  TEXT-M01.
    STOP .
  ENDIF .

  IF  P_BADI IS  INITIAL  AND
   P_EXIT IS  INITIAL  AND
   P_BTE IS  INITIAL  AND
   P_WFLOW IS  INITIAL  AND
   P_AUTH IS  INITIAL  AND
   P_PROG IS  INITIAL .
    MESSAGE  I000(G01) WITH  TEXT-M02.
    STOP .
  ENDIF .

* ensure P_LIMIT is not zero.
  IF  P_LIMIT = 0 .
    P_LIMIT = 1 .
  ENDIF .

  PERFORM  DATA_SELECT.
  PERFORM  GET_SUBMIT_DATA.
  PERFORM  GET_FM_DATA.
  PERFORM  GET_ADDITIONAL_DATA.
  PERFORM  DATA_DISPLAY.

*&--------------------------------------------------------------------&*
*& Form DATA_SELECT &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM  DATA_SELECT.

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

* get TCode name for ALV grid title
  CLEAR  W_GRIDTXT.
  IF  NOT  P_TCODE IS  INITIAL .
    SELECT  SINGLE  * FROM  TSTCT WHERE  TCODE = P_TCODE
    AND  SPRSL = SY-LANGU.
    CONCATENATE  'TCode:'  P_TCODE TSTCT-TTEXT INTO  W_GRIDTXT
    SEPARATED  BY  SPACE.
  ENDIF .
* get program name for ALV grid title
  IF  NOT  P_PNAME IS  INITIAL .
    SELECT  SINGLE  * FROM  TRDIRT WHERE  NAME = P_PNAME
    AND  SPRSL = SY-LANGU.
    CONCATENATE  'Program:'  P_PNAME TSTCT-TTEXT INTO  W_GRIDTXT
    SEPARATED  BY  SPACE.
  ENDIF .

* determine search words
  KEYWORDS-WORD = 'CALL' .
  APPEND  KEYWORDS.
  KEYWORDS-WORD = 'FORM' .
  APPEND  KEYWORDS.
  KEYWORDS-WORD = 'PERFORM' .
  APPEND  KEYWORDS.
  KEYWORDS-WORD = 'SUBMIT' .
  APPEND  KEYWORDS.
  KEYWORDS-WORD = 'INCLUDE' .
  APPEND  KEYWORDS.
  KEYWORDS-WORD = 'AUTHORITY-CHECK' .
  APPEND  KEYWORDS.

  IF  NOT  P_TCODE IS  INITIAL .
* get program name from TCode
    SELECT  SINGLE  PGMNA FROM  TSTC INTO  WA_TSTC-PGMNA
    WHERE  TCODE EQ  P_TCODE.
    IF  NOT  WA_TSTC-PGMNA IS  INITIAL .
      P_PNAME = WA_TSTC-PGMNA.
* TCode does not include program name, but does have reference TCode
    ELSE .
      SELECT  SINGLE  PARAM FROM  TSTCP INTO  WA_TSTCP-PARAM
      WHERE  TCODE EQ  P_TCODE.
      IF  SY-SUBRC = 0 .
        CHECK  WA_TSTCP-PARAM(1) = '/' .
        CHECK  WA_TSTCP-PARAM+1(1) = '*' .
        IF  WA_TSTCP-PARAM CA  ' ' .
        ENDIF .
        W_OFF = SY-FDPOS + 1 .
        SUBTRACT  2  FROM  SY-FDPOS.
        IF  SY-FDPOS GT  0 .
          P_TCODE = WA_TSTCP-PARAM+2(SY-FDPOS).
        ENDIF .
        SELECT  SINGLE  PGMNA FROM  TSTC INTO  WA_TSTC-PGMNA
        WHERE  TCODE EQ  P_TCODE.
        P_PNAME = WA_TSTC-PGMNA.
        IF  SY-SUBRC <> 0 .
          MESSAGE  S110(/SAPTRX/ASC) WITH  'No program found for: '  P_TCODE. "#EC NOTEXT
          STOP .
        ENDIF .
      ELSE .
        MESSAGE  S110(/SAPTRX/ASC) WITH  'No program found for: '  P_TCODE. "#EC NOTEXT
        STOP .
      ENDIF .

    ENDIF .
  ENDIF .

* Call customer-function aus Program coding
  READ  REPORT  P_PNAME INTO  SOURCETAB.
  IF  SY-SUBRC > 0 .
    MESSAGE  E017(ENHANCEMENT) WITH  P_PNAME RAISING  NO_PROGRAM. "#EC *
  ENDIF .

*scan abap-source sourcetab tokens into i_stoken
*statements into i_sstmnt
*keywords from keywords
*overflow into c_overflow
*with ANALYSIS. "#EC

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

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

ENDFORM . "DATA_SELECT

*&--------------------------------------------------------------------&*
*& Form GET_FM_DATA # &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM  GET_FM_DATA.

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

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

  LOOP  AT  I_FMODULE WHERE  DONE NE  C_X.

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

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

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

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

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

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

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

  ENDLOOP .

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

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

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

    SORT  I_DEVCLASS.
    DELETE  ADJACENT  DUPLICATES  FROM  I_DEVCLASS.
  ENDIF .

ENDFORM . "GET_FM_DATA

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

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

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

  LOOP  AT  I_SUBMIT WHERE  DONE NE  C_X.

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

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

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

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

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

ENDFORM . "GET_SUBMIT_DATA

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

  LOOP  AT  P_STOKEN.

    CLEAR  I_USEREXIT.

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

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

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

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

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

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

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

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

        APPEND  I_USEREXIT.
      ENDIF .
    ENDIF .

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

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

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

      CHECK  WA_STOKEN-STR CS  '(' .
      W_OFF = 0 .
      WHILE  SY-SUBRC = 0 .
        IF  WA_STOKEN-STR+W_OFF(1) EQ  '(' .
          REPLACE  SECTION  OFFSET W_OFF LENGTH 1  OF  WA_STOKEN-STR WITH  '' .
          REPLACE  ALL  OCCURRENCES  OF  ')'  IN  WA_STOKEN-STR WITH  SPACE.
          READ  TABLE  I_SUBMIT WITH  KEY  PNAME = WA_STOKEN-STR.
          IF  SY-SUBRC <> 0 .
            I_SUBMIT-PNAME = WA_STOKEN-STR.
            APPEND  I_SUBMIT.
          ENDIF .
          EXIT .
        ELSE .
          REPLACE  SECTION  OFFSET W_OFF LENGTH 1  OF  WA_STOKEN-STR WITH  '' .
          SHIFT  WA_STOKEN-STR LEFT  DELETING LEADING  SPACE.
        ENDIF .
      ENDWHILE .
    ENDIF .

* Function modules (SE37)
    IF  P_STOKEN-STR CS  'FUNCTION' .

      CLEAR  I_FMODULE.
      IF  P_LEVEL EQ  '0' . " do not perform for function modules (2nd pass)
        W_INDEX = SY-TABIX + 1 .
        READ  TABLE  P_STOKEN INDEX  W_INDEX INTO  WA_STOKEN.

        IF  WA_STOKEN-STR CS  'BAPI' .
          I_FMODULE-BAPI = C_X.
        ENDIF .

        REPLACE  FIRST  OCCURRENCE OF  ''''  IN  WA_STOKEN-STR WITH  SPACE.
        REPLACE  FIRST  OCCURRENCE OF  ''''  IN  WA_STOKEN-STR WITH  SPACE.
        IF  SY-SUBRC = 4 . " didn't find 2nd quote (ie name truncated)
          CLEAR  WA_TFDIR.
          CONCATENATE  WA_STOKEN-STR '%'  INTO  WA_STOKEN-STR.
          SELECT  SINGLE  FUNCNAME INTO  WA_TFDIR-FUNCNAME FROM  TFDIR
          WHERE  FUNCNAME LIKE  WA_STOKEN-STR.
          IF  SY-SUBRC = 0 .
            I_FMODULE-NAME = WA_TFDIR-FUNCNAME.
          ELSE .
            CONTINUE .
          ENDIF .
        ELSE .
          I_FMODULE-NAME = WA_STOKEN-STR.
        ENDIF .
        I_FMODULE-LEVEL = P_LEVEL.
        APPEND  I_FMODULE.
      ENDIF .
    ENDIF .

  ENDLOOP .

ENDFORM . "DATA_SEARCH

*&--------------------------------------------------------------------&*
*& Form GET_ADDITIONAL_DATA &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM  GET_ADDITIONAL_DATA.

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

  LOOP  AT  I_USEREXIT.

* Workflow
    IF  I_USEREXIT-TYPE  EQ  'WorkFlow' .
      CONTINUE .
    ENDIF .



* Enhancement data
    IF  I_USEREXIT-TYPE  CS  'Enh' .
      CLEAR : WA_MODSAPA.
      SELECT  SINGLE  NAME INTO  WA_MODSAPA-NAME FROM  MODSAP
      WHERE  MEMBER = I_USEREXIT-TXT.
      CHECK  SY-SUBRC = 0 .
      I_USEREXIT-MODNAME = WA_MODSAPA-NAME.

      CLEAR  WA_MODSAPT.
      SELECT  SINGLE  MODTEXT INTO  WA_MODSAPT-MODTEXT FROM  MODSAPT
      WHERE  NAME = WA_MODSAPA-NAME
      AND  SPRSL = SY-LANGU.
      I_USEREXIT-MODTEXT = WA_MODSAPT-MODTEXT.

* Get the CMOD project name
      CLEAR  W_MOD.
      SELECT  SINGLE  MODACT~MEMBER MODACT~NAME MODATTR~STATUS
       MODATTR~ANAM MODATTR~ADAT
      INTO  W_MOD
      FROM  MODACT
       INNER JOIN  MODATTR
      ON  MODATTR~NAME = MODACT~NAME
      WHERE  MODACT~MEMBER = WA_MODSAPA-NAME
      AND  MODACT~TYP = SPACE.
      IF  SY-SUBRC = 0 .
        I_USEREXIT-MODATTR = W_MOD.
      ENDIF .
    ENDIF .


* BADI data
    IF  I_USEREXIT-TYPE  EQ  'BADI' .
      CLEAR  WA_SXS_ATTR.
      SELECT  SINGLE  EXIT_NAME INTO  WA_SXS_ATTR-EXIT_NAME FROM  SXS_ATTR
      WHERE  EXIT_NAME = I_USEREXIT-TXT.
      IF  SY-SUBRC = 0 .
        I_USEREXIT-MODNAME = I_USEREXIT-TXT.
      ELSE .
        I_USEREXIT-MODNAME = 'Dynamic call' .               "#EC NOTEXT
      ENDIF .
      CLEAR  WA_SXS_ATTRT.
      SELECT  SINGLE  TEXT  INTO  WA_SXS_ATTRT-TEXT  FROM  SXS_ATTRT
      WHERE  EXIT_NAME = WA_SXS_ATTR-EXIT_NAME
      AND  SPRSL = SY-LANGU.
      I_USEREXIT-MODTEXT = WA_SXS_ATTRT-TEXT .
    ENDIF .

* BADI Implementation
    IF  I_USEREXIT-TYPE  EQ  'BADI' .
      CLEAR  SXC_EXIT.
      SELECT  COUNT( * ) FROM  SXC_EXIT WHERE  EXIT_NAME = I_USEREXIT-TXT.
      W_CNT = SY-DBCNT.
* determine id BADI is for interal or external use
      CLEAR  SXS_ATTR.
      SELECT  SINGLE  * FROM  SXS_ATTR WHERE  EXIT_NAME = I_USEREXIT-TXT.
      IF  SXS_ATTR-INTERNAL = 'X' .
        WA_SXS_ATTRT-TEXT  = 'SAP ' .
      ELSE .
        WA_SXS_ATTRT-TEXT  = 'CUST' .
      ENDIF .
* concatenate wa_sxs_attrt-text w_cnt into i_userexit-modattr-name
* separated by space.
      WRITE  WA_SXS_ATTRT-TEXT  TO  I_USEREXIT-MODATTR-NAME.
      WRITE  W_CNT TO  I_USEREXIT-MODATTR-NAME+5 .
    ENDIF .

    MODIFY  I_USEREXIT.
  ENDLOOP .

* get enhancements via program package
  CLEAR  WA_TADIR.
  SELECT  SINGLE  DEVCLASS INTO  WA_TADIR-DEVCLASS FROM  TADIR
  WHERE  PGMID = 'R3TR'
  AND  OBJECT = 'PROG'
  AND  OBJ_NAME = P_PNAME.
  IF  SY-SUBRC = 0 .
    CLEAR : WA_MODSAPA, WA_MODSAPT.
    SELECT  NAME FROM  MODSAPA INTO  WA_MODSAPA-NAME
    WHERE  DEVCLASS = WA_TADIR-DEVCLASS.
      SELECT  SINGLE  MODTEXT FROM  MODSAPT INTO  WA_MODSAPT-MODTEXT
      WHERE  NAME = WA_MODSAPA-NAME
      AND  SPRSL = SY-LANGU.

      CLEAR  I_USEREXIT.
      READ  TABLE  I_USEREXIT WITH  KEY  MODNAME = WA_MODSAPA-NAME.
      IF  SY-SUBRC <> 0 .
        I_USEREXIT-MODTEXT = WA_MODSAPT-MODTEXT.
        I_USEREXIT-TYPE  = 'Enhancement' .                  "#EC NOTEXT
        I_USEREXIT-MODNAME = WA_MODSAPA-NAME.
        I_USEREXIT-TXT = 'Determined from program DevClass' . "#EC NOTEXT
        I_USEREXIT-PNAME = 'Unknown' .                      "#EC NOTEXT
        APPEND  I_USEREXIT.
      ENDIF .
    ENDSELECT .
  ENDIF .

* set row colour.
  LOOP  AT  I_USEREXIT.
    CASE  I_USEREXIT-TYPE .
      WHEN  'BADI' .
        I_USEREXIT-COLOUR = 'C601' .
      WHEN  'Enhancement' .
        I_USEREXIT-COLOUR = 'C501' .
      WHEN  'Program Exit' .
        I_USEREXIT-COLOUR = 'C401' .
      WHEN  'WorkFlow' .
        I_USEREXIT-COLOUR = 'C301' .
      WHEN  'BusTrEvent' .
        I_USEREXIT-COLOUR = 'C201' .
    ENDCASE .
    MODIFY  I_USEREXIT.
  ENDLOOP .

ENDFORM . "GET_ADDITIONAL_DATA

*&--------------------------------------------------------------------&*
*& Form DATA_DISPLAY &*
*&--------------------------------------------------------------------&*
*& &*
*&--------------------------------------------------------------------&*
FORM  DATA_DISPLAY.

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

  SORT  I_USEREXIT BY  TYPE  TXT MODNAME.
  DELETE  ADJACENT  DUPLICATES  FROM  I_USEREXIT COMPARING  TXT PNAME MODNAME.

* ensure records selected.
  DESCRIBE  TABLE  I_USEREXIT LINES  W_LINNUM.
  IF  W_LINNUM = 0 .
    MESSAGE  S003(G00). "No data records were selected
    EXIT .
  ENDIF .

  IF  P_ALV = ' ' .

* format headings
    WRITE : 'Enhancements from main program: ' , P_PNAME.
    WRITE : 'Enhancements from TCode: ' , P_TCODE.
    WRITE : 201'' .
    ULINE .
    FORMAT  COLOR  COL_HEADING.
    WRITE : / SY-VLINE,
     (12) C_COL1, "Enhanmt Type
     SY-VLINE,
     (40) C_COL2, "Enhancement
     SY-VLINE,
     (30) C_COL3, "Program/Include
     SY-VLINE,
     (20) C_COL4, "Enhancement name
     SY-VLINE,
     (40) C_COL5, "Enhancement description
     SY-VLINE,
     (8) C_COL6, "Project
     SY-VLINE,
     (1) C_COL7, "S
     SY-VLINE,
     (12) C_COL8, "ChangeName
     SY-VLINE,
     (10) C_COL9, "ChangeDate
     SY-VLINE.
    FORMAT  RESET .
    ULINE .

* format lines
    LOOP  AT  I_USEREXIT.
* set line colour
      CASE  I_USEREXIT-TYPE .
        WHEN  'Enhancement' .
          FORMAT  COLOR  3  INTENSIFIED  OFF.
        WHEN  'BADI' .
          FORMAT  COLOR  4  INTENSIFIED  OFF.
        WHEN  'BusTrEvent' .
          FORMAT  COLOR  5  INTENSIFIED  OFF.
        WHEN  'Program Exit' .
          FORMAT  COLOR  6  INTENSIFIED  OFF.
        WHEN  OTHERS .
          FORMAT  RESET .
      ENDCASE .
      WRITE : / SY-VLINE,
       I_USEREXIT-TYPE ,
       SY-VLINE,
       I_USEREXIT-TXT(40),
       SY-VLINE,
       I_USEREXIT-PNAME(30),
       SY-VLINE,
       I_USEREXIT-MODNAME(20),
       SY-VLINE,
       I_USEREXIT-MODTEXT(40),
       SY-VLINE.

      WRITE : I_USEREXIT-MODATTR-NAME,
       SY-VLINE,
       I_USEREXIT-MODATTR-STATUS,
       SY-VLINE,
       I_USEREXIT-MODATTR-ANAM,
       SY-VLINE,
       I_USEREXIT-MODATTR-ADAT NO-ZERO,
       SY-VLINE.
      HIDE : I_USEREXIT-MODNAME, I_USEREXIT-TYPE , I_USEREXIT-MODATTR-NAME.

    ENDLOOP .
    FORMAT  RESET .
    ULINE .

* user-exits from development class of function modules
    IF  P_DEVC = C_X.
      WRITE : /.
      WRITE : / C_DEVC.
      WRITE : 201'' .
      ULINE  (90).
      WRITE : 201'' .

      LOOP  AT  I_DEVCLASS.
        CLEAR  WA_MODSAPA.
        SELECT  NAME FROM  MODSAPA INTO  WA_MODSAPA
        WHERE  DEVCLASS = I_DEVCLASS-CLAS.
          SELECT  SINGLE  NAME MODTEXT INTO  CORRESPONDING FIELDS  OF  WA_MODSAPT
          FROM  MODSAPT
          WHERE  NAME = WA_MODSAPA-NAME
          AND  SPRSL = SY-LANGU.
          FORMAT  COLOR  3  INTENSIFIED  OFF.
          WRITE : / SY-VLINE,
           (12) 'Enhancement' ,
           SY-VLINE,
           WA_MODSAPA-NAME,
           SY-VLINE,
           WA_MODSAPT-MODTEXT,
           SY-VLINE.
        ENDSELECT .
      ENDLOOP .
      WRITE : 201'' .
      ULINE  (90).
      FORMAT  RESET .
    ENDIF .

* display fuction modules used in program
    WRITE  /.
    DESCRIBE  TABLE  I_FMODULE LINES  W_LINNUM.
    WRITE : / C_FMOD , AT  35  W_LINNUM.                    "#EC NOTEXT
    WRITE : 201'' .

    IF  P_FUNC = C_X.
      ULINE  (38).
      WRITE : 201'' .
      LOOP  AT  I_FMODULE.
        WRITE : SY-VLINE,
         I_FMODULE-NAME,
         SY-VLINE,
         I_FMODULE-BAPI,
         SY-VLINE.
        WRITE : 201'' .
      ENDLOOP .
      WRITE : 201'' .
      ULINE  (38).
    ENDIF .

* display submit programs used in program
    WRITE  /.
    DESCRIBE  TABLE  I_SUBMIT LINES  W_LINNUM.
    WRITE : / C_SUBM , AT  35  W_LINNUM.                    "#EC NOTEXT
    WRITE : 201'' .
    IF  P_SUBM = C_X.
      ULINE  (44).
      WRITE : 201'' .
      LOOP  AT  I_SUBMIT.
        WRITE : SY-VLINE,
         I_SUBMIT-PNAME,
         SY-VLINE.
        WRITE : 201'' .
      ENDLOOP .
      WRITE : 201'' .
      ULINE  (44).
    ENDIF .

* issue message with number of user-exits displayed
    DESCRIBE  TABLE  I_USEREXIT LINES  W_LINNUM.
    MESSAGE  S697(56) WITH  W_LINNUM.

  ELSE . " Show in alv format

* issue message with number of user-exits displayed
    DESCRIBE  TABLE  I_USEREXIT LINES  W_LINNUM.
    MESSAGE  S697(56) WITH  W_LINNUM.

* Create field catalog
    PERFORM  CREATE_FIELD_CATALOG USING  'TYPE'  'T_USEREXIT'  ' '  'Type' .
    PERFORM  CREATE_FIELD_CATALOG USING  'PNAME'  'T_USEREXIT'  ' '  'Prog#am name' .
    PERFORM  CREATE_FIELD_CATALOG USING  'TXT'  'T_USEREXIT'  ' '  'Enhancement' .
    PERFORM  CREATE_FIELD_CATALOG USING  'LEVEL'  'T_USEREXIT'  C_X 'Level' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODNAME'  'T_USEREXIT'  ' '  'Enhancement name' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODTEXT'  'T_USEREXIT'  ' '  'Enhancement text' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODATTR-MEMBER'  'T_USEREXIT'  C_X 'Member' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODATTR-NAME'  'T_USEREXIT'  ' '  'Project' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODATTR-STATUS'  'T_USEREXIT'  ' '  'Status' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODATTR-ANAM'  'T_USEREXIT'  ' '  'Changed by' .
    PERFORM  CREATE_FIELD_CATALOG USING  'MODATTR-ADAT'  'T_USEREXIT'  ' '  'Change date' .

* Layout
    CLEAR  I_LAYOUT.
    I_LAYOUT-COLWIDTH_OPTIMIZE = C_X.
    I_LAYOUT-INFO_FIELDNAME = 'COLOUR' .

* Sort
    CLEAR  I_SORT.
    I_SORT-FIELDNAME = 'TYPE' .
    I_SORT-TABNAME = 'T_USEREXIT' .
    I_SORT-UP  = C_X.
    APPEND  I_SORT.

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_CALLBACK_PROGRAM      = SY-CPROG
        I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
        IS_LAYOUT               = I_LAYOUT
        IT_FIELDCAT             = I_FIELDCAT[]
        IT_SORT                 = I_SORT[]
        I_DEFAULT               = C_X
        I_SAVE                  = 'A'
        I_GRID_TITLE            = W_GRIDTXT
      TABLES
        T_OUTTAB                = I_USEREXIT.

  ENDIF .

* issue message with number of user-exits displayed
  DESCRIBE  TABLE  I_USEREXIT LINES  W_LINNUM.
  MESSAGE  S697(56) WITH  W_LINNUM.

ENDFORM . "DATA_DISPLAY

*&---------------------------------------------------------------------&*
*& Form CREATE_FIELD_CATALOG &*
*&---------------------------------------------------------------------&*
FORM  CREATE_FIELD_CATALOG USING  P_FIELDNAME
 P_TABNAME
 P_HIDE
 P_TEXT.

  I_FIELDCAT-FIELDNAME = P_FIELDNAME.
  I_FIELDCAT-TABNAME = P_TABNAME.
  I_FIELDCAT-NO_OUT = P_HIDE.
  I_FIELDCAT-SELTEXT_L = P_TEXT.

  APPEND  I_FIELDCAT.

ENDFORM . " CREATE_FIELD_CATALOG

*&---------------------------------------------------------------------&*
*& Form CREATE_FIELD_CATALOG &*
*&---------------------------------------------------------------------&*
FORM  USER_COMMAND USING  R_UCOMM LIKE  SY-UCOMM
 RS_SELFIELD TYPE  SLIS_SELFIELD.
  READ  TABLE  I_USEREXIT INDEX  RS_SELFIELD-TABINDEX.
  CHECK  SY-SUBRC = 0 .
  CASE  R_UCOMM.
    WHEN  '&IC1' .
      CASE  RS_SELFIELD-SEL_TAB_FIELD.
        WHEN  'T_USEREXIT-MODNAME' .
          READ  TABLE  I_USEREXIT INDEX  RS_SELFIELD-TABINDEX.
          CASE  I_USEREXIT-TYPE .
            WHEN  'Enhancement' .
              SET  PARAMETER  ID  'MON'  FIELD  I_USEREXIT-MODNAME.
              CALL  TRANSACTION  'SMOD' .
            WHEN  'BADI' .
              SET  PARAMETER  ID  'EXN'  FIELD  I_USEREXIT-MODNAME.
              CALL  TRANSACTION  'SE18'  AND  SKIP  FIRST  SCREEN .
            WHEN  'BusTrEvent' .
              SUBMIT  RFOPFI00 WITH  EVENT  = I_USEREXIT-MODNAME(8) AND  RETURN .
            WHEN  OTHERS .
              MESSAGE  S030(CJ). "Navigation not possible
          ENDCASE .
        WHEN  'T_USEREXIT-MODATTR-NAME' .
          IF  NOT  I_USEREXIT-MODATTR-NAME IS  INITIAL .
            SET  PARAMETER  ID  'MON_KUN'  FIELD  I_USEREXIT-MODATTR-NAME.
            CALL  TRANSACTION  'CMOD' .
          ELSE .
            MESSAGE  S030(CJ)."Navigation not possible
          ENDIF .
        WHEN  OTHERS .
          MESSAGE  S030(CJ)."Navigation not possible
      ENDCASE .
  ENDCASE .

ENDFORM . "user_command

*&--------------------------------------------------------------------&*
*& AT LINE-SELECTION #*
*&--------------------------------------------------------------------&*
AT  LINE-SELECTION.

  GET  CURSOR  FIELD  W_FSEL.

  CASE  W_FSEL.

    WHEN  'I_USEREXIT-MODNAME' .
      CASE  I_USEREXIT-TYPE .
        WHEN  'Enhancement' .
          SET  PARAMETER  ID  'MON'  FIELD  I_USEREXIT-MODNAME.
          CALL  TRANSACTION  'SMOD' .
        WHEN  'BADI' .
          SET  PARAMETER  ID  'EXN'  FIELD  I_USEREXIT-MODNAME.
          CALL  TRANSACTION  'SE18'  AND  SKIP  FIRST  SCREEN .
        WHEN  'BusTrEvent' .
          SUBMIT  RFOPFI00 WITH  EVENT  = I_USEREXIT-MODNAME(8) AND  RETURN .
        WHEN  OTHERS .
          MESSAGE  S030(CJ)."Navigation not possible
      ENDCASE .

    WHEN  'I_USEREXIT-MODATTR-NAME' .
      IF  NOT  I_USEREXIT-MODATTR-NAME IS  INITIAL .
        SET  PARAMETER  ID  'MON_KUN'  FIELD  I_USEREXIT-MODATTR-NAME.
        CALL  TRANSACTION  'CMOD' .
      ELSE .
        MESSAGE  S030(CJ)."Navigation not possible
      ENDIF .

    WHEN  OTHERS .
      MESSAGE  S030(CJ)."Navigation not possible

  ENDCASE .

*&--------------------------------------------------------------------&*
*& AT SELECTION-SCREEN &*
*&--------------------------------------------------------------------&*
AT  SELECTION-SCREEN  ON  RADIOBUTTON  GROUP  RAD1.

* grey-out checkboxes if ALV selected
AT  SELECTION-SCREEN  OUTPUT .
  LOOP  AT  SCREEN .
    IF  P_ALV = C_X.
      IF  SCREEN-GROUP1 = 'A01' .
        SCREEN-INPUT  = '0' .
        MODIFY  SCREEN .
      ENDIF .
    ELSE .
      IF  SCREEN-GROUP1 = 'A01' .
        SCREEN-INPUT  = '1' .
        MODIFY  SCREEN .
      ENDIF .
    ENDIF .
  ENDLOOP .
原文地址:https://www.cnblogs.com/rainysblog/p/6513812.html