zoukankan      html  css  js  c++  java
  • 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 .
  • 相关阅读:
    常用的CSS命名规则 (web标准化设计)
    有哪些概率论和数理统计的深入教材可以推荐?
    CV2X国内现状分析
    隐私计算,新能源汽车“安全上路”的“救命稻草”?
    2022年中国车联网行业全景图谱
    2022年十大AI预测:气候独角兽涌现、中美竞争加剧
    OSEK/VDX介绍
    Adaptive Autosar
    基于我国商密算法的车联网5GV2X通信安全可信体系
    行研篇 | 汽车域控制器研究
  • 原文地址:https://www.cnblogs.com/rainysblog/p/6513812.html
Copyright © 2011-2022 走看看