REPORT ZR_IT_100.
*&---------------------------------------------------------------------*
*& Report YFIND_USER_EXIT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------
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' USER-COMMAND md1,
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 .
网友评论