APP喵APP喵

贯彻爱与真实的邪恶,可爱又迷人的反派角色

一个功能非常全面的SAP增强出口查找工具

一个功能非常全面的增强出口查找工具


可以查找到BADI,BTE,Enhancement,USEREXIT,很全面
zenhancement.txt
代码如下

    *&---------------------------------------------------------------------*
    *& Report  ZBADI_EXIT_PRO
    *&
    *&---------------------------------------------------------------------*
    *&一个功能非常全面的增强出口查找工具
    *&
    *&---------------------------------------------------------------------*
    
    REPORT zbadi_exit_pro
          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 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 INCLUDES WITH ANALYSIS. "#EC
      IF sy-subrc > 0. "keine/syntakt. falsche Ablauflog./Fehler im Skanner
        MESSAGE e130(enhancement) RAISING syntax_error. "#EC
      ENDIF.
    
    * check I_STOKEN for entries
      CLEAR w_linnum.
      DESCRIBE TABLE i_stoken LINES w_linnum.
      IF w_linnum GT 0.
        w_level = '0'.
        w_prog = ''.
        w_incl = ''.
        PERFORM data_search TABLES i_stoken USING w_level w_prog w_incl.
      ENDIF.
    
    ENDFORM. "DATA_SELECT
    
    *&--------------------------------------------------------------------&*
    *& Form GET_FM_DATA ? &*
    *&--------------------------------------------------------------------&*
    *& &*
    *&--------------------------------------------------------------------&*
    FORM get_fm_data.
    
    * data selection message to sap gui
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        DESTINATION 'SAPGUI'
        KEEPING LOGICAL UNIT OF WORK
        EXPORTING
          text = 'Get function module data' "#EC NOTEXT
                 EXCEPTIONS
                 system_failure
                 communication_failure
        . "#EC *
    
    * Function module data
      SORT i_fmodule BY name.
      DELETE ADJACENT DUPLICATES FROM i_fmodule COMPARING name.
    
      LOOP AT i_fmodule WHERE done NE c_x.
    
        CLEAR: i_stoken, i_sstmnt, sourcetab, wa_tfdir, w_include .
        REFRESH: i_stoken, i_sstmnt, sourcetab.
    
        CLEAR wa_tfdir.
        SELECT SINGLE funcname pname include FROM tfdir INTO wa_tfdir
        WHERE funcname = i_fmodule-name.
        CHECK sy-subrc = 0.
    
        CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
          EXPORTING
            program = wa_tfdir-pname
          IMPORTING
            group   = w_area.
    
        CONCATENATE 'L' w_area 'U' wa_tfdir-include INTO w_include.
        i_fmodule-pname = w_include.
        i_fmodule-pname2 = wa_tfdir-pname.
        MODIFY i_fmodule.
    
        READ REPORT i_fmodule-pname INTO sourcetab.
        IF sy-subrc = 0.
    
          SCAN ABAP-SOURCE sourcetab TOKENS INTO i_stoken
          STATEMENTS INTO i_sstmnt
          KEYWORDS FROM keywords
          WITH INCLUDES WITH ANALYSIS.
          IF sy-subrc > 0.
            MESSAGE e130(enhancement) RAISING syntax_error.
          ENDIF.
    
    * check i_stoken for entries
          CLEAR w_linnum.
          DESCRIBE TABLE i_stoken LINES w_linnum.
          IF w_linnum GT 0.
            w_level = '1'.
            w_prog = i_fmodule-pname2.
            w_incl = i_fmodule-pname.
            PERFORM data_search TABLES i_stoken USING w_level w_prog w_incl.
          ENDIF.
        ENDIF.
    
      ENDLOOP.
    
    * store development classes
      IF p_devc = c_x.
        LOOP AT i_fmodule.
          CLEAR: wa_tadir, wa_enlfdir.
    
          SELECT SINGLE area FROM enlfdir INTO wa_enlfdir-area
          WHERE funcname = i_fmodule-name.
          CHECK NOT wa_enlfdir-area IS INITIAL.
    
          SELECT SINGLE devclass INTO wa_tadir-devclass
          FROM tadir WHERE pgmid = 'R3TR'
          AND object = 'FUGR'
          AND obj_name = wa_enlfdir-area.
          CHECK NOT wa_tadir-devclass IS INITIAL.
          MOVE wa_tadir-devclass TO i_devclass-clas.
          APPEND i_devclass.
          i_fmodule-done = c_x.
          MODIFY i_fmodule.
        ENDLOOP.
    
        SORT i_devclass.
        DELETE ADJACENT DUPLICATES FROM i_devclass.
      ENDIF.
    
    ENDFORM. "GET_FM_DATA
    *&--------------------------------------------------------------------&*
    *& Form GET_SUBMIT_DATA &*
    *&--------------------------------------------------------------------&*
    *& &*
    *&--------------------------------------------------------------------&*
    FORM get_submit_data.
    
    * data selection message to sap gui
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        DESTINATION 'SAPGUI'
        KEEPING LOGICAL UNIT OF WORK
        EXPORTING
          text = 'Get submit data' "#EC NOTEXT
                 EXCEPTIONS
                 system_failure
                 communication_failure
        . "#EC *
    
      SORT i_submit.
      DELETE ADJACENT DUPLICATES FROM i_submit COMPARING pname.
      w_level = '0'.
    
      LOOP AT i_submit WHERE done NE c_x.
    
        CLEAR: i_stoken, i_sstmnt, sourcetab.
        REFRESH: i_stoken, i_sstmnt, sourcetab.
    
        READ REPORT i_submit-pname INTO sourcetab.
        IF sy-subrc = 0.
    
          SCAN ABAP-SOURCE sourcetab TOKENS INTO i_stoken
          STATEMENTS INTO i_sstmnt
          KEYWORDS FROM keywords
          WITH INCLUDES WITH ANALYSIS.
          IF sy-subrc > 0.
    * message e130(enhancement) raising syntax_error.
            CONTINUE.
          ENDIF.
    
    * check i_stoken for entries
          CLEAR w_linnum.
          DESCRIBE TABLE i_stoken LINES w_linnum.
          IF w_linnum GT 0.
            w_prog = i_submit-pname.
            w_incl = ''.
            PERFORM data_search TABLES i_stoken USING w_level w_prog w_incl.
          ENDIF.
        ENDIF.
    
    * restrict number of submit program selected for processing
        DESCRIBE TABLE i_submit LINES w_linnum.
        IF w_linnum GE p_limit.
          w_level = '1'.
        ENDIF.
        i_submit-done = c_x.
        MODIFY i_submit.
      ENDLOOP.
    
    ENDFORM. "GET_SUBMIT_DATA
    
    *&--------------------------------------------------------------------&*
    *& Form DATA_SEARCH &*
    *&--------------------------------------------------------------------&*
    *& &*
    *&--------------------------------------------------------------------&*
    FORM data_search TABLES p_stoken STRUCTURE stoken
    USING p_level l_prog l_incl.
    
      LOOP AT p_stoken.
    
        CLEAR i_userexit.
    
    * Workflow
        IF p_wflow = c_x.
          IF p_level EQ '1'. " do not perform for function modules (2nd pass)
            IF p_stoken-str+1(16) CS 'SWE_EVENT_CREATE'.
              REPLACE ALL OCCURRENCES OF '''' IN p_stoken-str WITH ''.
              i_userexit-type = 'WorkFlow'.
              i_userexit-txt = p_stoken-str.
              CONCATENATE l_prog '/' l_incl INTO i_userexit-pname.
              APPEND i_userexit.
            ENDIF.
          ENDIF.
        ENDIF.
    
        tabix = sy-tabix + 1.
        i_userexit-level = p_level.
        IF i_userexit-level = '0'.
          IF l_incl IS INITIAL.
            i_userexit-pname = p_pname.
          ELSE.
            CONCATENATE p_pname '-' l_incl INTO i_userexit-pname.
          ENDIF.
        ELSE.
          IF l_incl IS INITIAL.
            i_userexit-pname = l_prog.
          ELSE.
            CONCATENATE l_prog '-' l_incl INTO i_userexit-pname.
          ENDIF.
        ENDIF.
    
    * AUTHORITY-CHECKS
        IF p_auth = c_x.
          IF p_stoken-str EQ 'AUTHORITY-CHECK'.
            CHECK p_level EQ '0'. " do not perform for function modules (2nd pass)
            w_index = sy-tabix + 2.
            READ TABLE p_stoken INDEX w_index INTO wa_stoken.
            CHECK NOT wa_stoken-str CS 'STRUCTURE'.
            CHECK NOT wa_stoken-str CS 'SYMBOL'.
            READ TABLE i_submit WITH KEY pname = wa_stoken-str.
            IF sy-subrc <> 0.
              i_userexit-pname = i_submit-pname.
              i_userexit-type = 'AuthCheck'.
              i_userexit-txt = wa_stoken-str.
              REPLACE ALL OCCURRENCES OF '''' IN i_userexit-txt WITH space.
              CLEAR tobjt.
              SELECT SINGLE * FROM tobjt WHERE object = i_userexit-txt
              AND langu = sy-langu.
              i_userexit-modname = 'AUTHORITY-CHECK'.
              i_userexit-modtext = tobjt-ttext.
              APPEND i_userexit.
            ENDIF.
          ENDIF.
        ENDIF.
    
    * Text searches
        IF NOT p_text IS INITIAL.
          IF p_stoken-str CS p_text.
            i_userexit-pname = i_submit-pname.
            i_userexit-type = 'TextSearch'.
            i_userexit-txt = wa_stoken-str.
            i_userexit-modname = 'Text Search'.
            i_userexit-modtext = p_stoken-str.
            APPEND i_userexit.
          ENDIF.
        ENDIF.
    
    * Include (SE38)
        IF p_stoken-str EQ 'INCLUDE'.
          CHECK p_level EQ '0'. " do not perform for function modules (2nd pass)
          w_index = sy-tabix + 1.
          READ TABLE p_stoken INDEX w_index INTO wa_stoken.
          CHECK NOT wa_stoken-str CS 'STRUCTURE'.
          CHECK NOT wa_stoken-str CS 'SYMBOL'.
          READ TABLE i_submit WITH KEY pname = wa_stoken-str.
          IF sy-subrc <> 0.
            i_submit-pname = wa_stoken-str.
            i_submit-level = p_level.
            APPEND i_submit.
          ENDIF.
        ENDIF.
    
    * Enhancements (SMOD)
        IF p_exit = c_x.
          IF p_stoken-str EQ 'CUSTOMER-FUNCTION'.
            CLEAR w_funcname.
            READ TABLE p_stoken INDEX tabix.
            TRANSLATE p_stoken-str USING ''' '.
            CONDENSE p_stoken-str.
            IF l_prog IS INITIAL.
              CONCATENATE 'EXIT' p_pname p_stoken-str INTO w_funcname
              SEPARATED BY '_'.
            ELSE.
              CONCATENATE 'EXIT' l_prog p_stoken-str INTO w_funcname
              SEPARATED BY '_'.
            ENDIF.
            SELECT SINGLE member FROM modsap INTO wa_modsap-member
            WHERE member = w_funcname.
            IF sy-subrc = 0. " check for valid enhancement
              i_userexit-type = 'Enhancement'.
              i_userexit-txt = w_funcname.
              APPEND i_userexit.
            ELSE.
              CLEAR wa_d010inc.
              SELECT SINGLE master INTO wa_d010inc-master
              FROM d010inc
              WHERE include = l_prog.
              CONCATENATE 'EXIT' wa_d010inc-master p_stoken-str INTO w_funcname
              SEPARATED BY '_'.
              i_userexit-type = 'Enhancement'.
              i_userexit-txt = w_funcname.
            ENDIF.
          ENDIF.
        ENDIF.
    
    * BADIs (SE18)
        IF p_badi = c_x.
          IF p_stoken-str CS 'cl_exithandler='.
            w_index = sy-tabix + 4.
            READ TABLE p_stoken INDEX w_index INTO wa_stoken.
            i_userexit-txt = wa_stoken-str.
            REPLACE ALL OCCURRENCES OF '''' IN i_userexit-txt WITH space.
            i_userexit-type = 'BADI'.
            CLEAR sxs_attr. " ensure a real BADI
            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' ' ' 'PROGRAM 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. 
未经允许不得转载:APP喵 » 一个功能非常全面的SAP增强出口查找工具

评论

选择表情