8/8/2019 Code for Finding Usr Exits & Badis
1/21
*& 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_userexitno standard page headingline-size 201.
tables: sxs_attr,tobjt,tstct, "TCode textstrdirt, "Program texts
sxc_exit. "BADI exits
type-pools: slis. "Globale Typen fr 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 fieldw_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 fu
nction 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',
8/8/2019 Code for Finding Usr Exits & Badis
2/21
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: BADIsdata: 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: Enhancementsdata: 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 Eventsdata: begin of wa_tbe01t.
data: text1 type tbe01t-text1.data: end of wa_tbe01t.
8/8/2019 Code for Finding Usr Exits & Badis
3/21
data: begin of wa_tps01t.data: text1 type tps01t-text1.data: end of wa_tps01t.
*user-exitstypes: 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 classestypes: 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 programstypes: 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 codetypes: begin of t_sourcetab, "#EC * (SLIN lgt!)
line(200), "#EC * (SLIN lgt!)end of t_sourcetab. "#EC * (SLIN lgt!)
data: sourcetab type standard table of t_sourcetab with header line.data c_overflow(30000) type c.
*Description of an ABAP/4 source analysis tokendata: i_stoken type standard table of stokex with header line.data wa_stoken like i_stoken.
*Description of an ABAP/4 source analysis statementdata: i_sstmnt type standard table of sstmnt with header line."#EC NEEDED
*keywords for searching ABAP codetypes: begin of t_keywords,
word(30),
end of t_keywords.data: keywords type standard table of t_keywords with header line.
8/8/2019 Code for Finding Usr Exits & Badis
4/21
*function modules within programtypes: 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 definitionsdata 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-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.
if p_pname is initial and p_tcode is initial.message i000(g01) with text-m01.stop.
endif.
if p_badi is initial andp_exit is initial andp_bte is initial andp_wflow is initial andp_auth is initial andp_prog is initial.
message i000(g01) with text-m02.stop.
endif.
8/8/2019 Code for Finding Usr Exits & Badis
5/21
*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.
*data selection message to sap guicall function 'SAPGUI_PROGRESS_INDICATOR'destination 'SAPGUI'keeping logical unit of work
EXPORTINGtext = 'Get programs/includes' "#EC NOTEXTEXCEPTIONSsystem_failurecommunication_failure
. "#EC *
*get TCode name for ALV grid titleclear 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 titleif 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 wordskeywords-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 TCodeselect single pgmna from tstc into wa_tstc-pgmna
where tcode eq p_tcode.
8/8/2019 Code for Finding Usr Exits & Badis
6/21
if not wa_tstc-pgmna is initial.p_pname = wa_tstc-pgmna.
*TCode does not include program name, but does have reference TCodeelse.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
NOTEXTstop.
endif.
endif.endif.
*Call customer-function aus Program codingread 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_stokenstatements into i_sstmntkeywords from keywordsoverflow into c_overflowwith includes. "#EC
if sy-subrc > 0. "keine/syntakt. falsche Ablauflog./Fehler im Skannermessage e130(enhancement) raising syntax_error. "#EC
endif.
*check I_STOKEN for entriesclear 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
8/8/2019 Code for Finding Usr Exits & Badis
7/21
form get_fm_data.
*data selection message to sap guicall function 'SAPGUI_PROGRESS_INDICATOR'destination 'SAPGUI'keeping logical unit of workEXPORTING
text = 'Get function module data' "#EC NOTEXTEXCEPTIONSsystem_failurecommunication_failure
. "#EC *
* Function module datasort 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'EXPORTINGprogram = wa_tfdir-pname
IMPORTINGgroup = 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_stokenstatements into i_sstmntkeywords from keywordswith includes.
if sy-subrc > 0.message e130(enhancement) raising syntax_error.
endif.
*check i_stoken for entriesclear 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.
8/8/2019 Code for Finding Usr Exits & Badis
8/21
endloop.
*store development classesif p_devc = c_x.loop at i_fmodule.clear: wa_tadir, wa_enlfdir.
select single area from enlfdir into wa_enlfdir-areawhere funcname = i_fmodule-name.
check not wa_enlfdir-area is initial.
select single devclass into wa_tadir-devclassfrom 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.
*data selection message to sap gui
call function 'SAPGUI_PROGRESS_INDICATOR'destination 'SAPGUI'keeping logical unit of workEXPORTINGtext = 'Get submit data' "#EC NOTEXT
EXCEPTIONSsystem_failurecommunication_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_stokenstatements into i_sstmntkeywords from keywords
with includes.if sy-subrc > 0.
*message e130(enhancement) raising syntax_error.
8/8/2019 Code for Finding Usr Exits & Badis
9/21
continue.endif.
*check i_stoken for entriesclear 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 processingdescribe 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 tables p_stoken structure stokenusing p_level l_prog l_incl.
loop at p_stoken.
clear i_userexit.
*Workflowif 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.
8/8/2019 Code for Finding Usr Exits & Badis
10/21
*AUTHORITY-CHECKSif p_auth = c_x.if p_stoken-str eq 'AUTHORITY-CHECK'.check p_level eq '0'. " do not perform for function modules (2nd p
ass)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 searchesif 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 pas
s)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 ''' '.
8/8/2019 Code for Finding Usr Exits & Badis
11/21
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 enhancementi_userexit-type = 'Enhancement'.i_userexit-txt = w_funcname.append i_userexit.
else.clear wa_d010inc.select single master into wa_d010inc-master
from d010incwhere include = l_prog.
concatenate 'EXIT' wa_d010inc-master p_stoken-str into w_funcnameseparated 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 BADIselect 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 = ''. "#EC NOTEXTelse.i_userexit-modtext = wa_tbe01t-text1.
8/8/2019 Code for Finding Usr Exits & Badis
12/21
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 pas
s)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_XXXreplace 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 pas
s)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.
8/8/2019 Code for Finding Usr Exits & Badis
13/21
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.
*data selection message to sap guicall function 'SAPGUI_PROGRESS_INDICATOR'
8/8/2019 Code for Finding Usr Exits & Badis
14/21
destination 'SAPGUI'keeping logical unit of workEXPORTINGtext = 'Get additional data' "#EC NOTEXT
EXCEPTIONSsystem_failurecommunication_failure
. "#EC *
loop at i_userexit.
*Workflowif 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-nameand sprsl = sy-langu.
i_userexit-modtext = wa_modsapt-modtext.
*Get the CMOD project nameclear w_mod.select single modact~member modact~name modattr~status
modattr~anam modattr~adatinto w_modfrom modactinner join modattron modattr~name = modact~name
where modact~member = wa_modsapa-nameand modact~typ = space.
if sy-subrc = 0.i_userexit-modattr = w_mod.
endif.endif.
*BADI dataif 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
8/8/2019 Code for Finding Usr Exits & Badis
15/21
where exit_name = wa_sxs_attr-exit_nameand sprsl = sy-langu.
i_userexit-modtext = wa_sxs_attrt-text.endif.
*BADI Implementationif 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 useclear 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 packageclear 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-nameand 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 NOTEXTi_userexit-modname = wa_modsapa-name.i_userexit-txt = 'Determined from program DevClass'."#EC NOTEXTi_userexit-pname = 'Unknown'. "#EC NOTEXTappend i_userexit.
endif.endselect.
endif.
*set row colour.loop at i_userexit.case i_userexit-type.
when 'BADI'.i_userexit-colour = 'C601'.
when 'Enhancement'.
8/8/2019 Code for Finding Usr Exits & Badis
16/21
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.
*data selection message to sap guicall function 'SAPGUI_PROGRESS_INDICATOR'destination 'SAPGUI'keeping logical unit of work
EXPORTINGtext = 'Prepare screen for display' "#EC NOTEXTEXCEPTIONSsystem_failurecommunication_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 selectedexit.
endif.
if p_alv = ' '.
*format headingswrite: '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 Typesy-vline,
(40) c_col2, "Enhancementsy-vline,
(30) c_col3, "Program/Includesy-vline,
(20) c_col4, "Enhancement namesy-vline,
(40) c_col5, "Enhancement descriptionsy-vline,
(8) c_col6, "Projectsy-vline,
(1) c_col7, "Ssy-vline,
(12) c_col8, "ChangeName
8/8/2019 Code for Finding Usr Exits & Badis
17/21
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 modulesif 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_modsapawhere devclass = i_devclass-clas.
select single name modtext into corresponding fields of wa_modsapt
8/8/2019 Code for Finding Usr Exits & Badis
18/21
from modsaptwhere name = wa_modsapa-nameand 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 NOTEXTwrite: 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 programwrite /.describe table i_submit lines w_linnum.write: / c_subm , at 35 w_linnum. "#EC NOTEXTwrite: 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 displayeddescribe table i_userexit lines w_linnum.message s697(56) with w_linnum.
8/8/2019 Code for Finding Usr Exits & Badis
19/21
else. " Show in alv format
*issue message with number of user-exits displayeddescribe table i_userexit lines w_linnum.message s697(56) with w_linnum.
*Create field catalogperform create_field_catalog using 'TYPE' 'T_USEREXIT' ' ' 'Typ
e'.perform create_field_catalog using 'PNAME' 'T_USEREXIT' ' ' 'Pro
g?am name'.perform create_field_catalog using 'TXT' 'T_USEREXIT' ' ' 'Enh
ancement'.perform create_field_catalog using 'LEVEL' 'T_USEREXIT' c_x 'Lev
el'.perform create_field_catalog using 'MODNAME' 'T_USEREXIT' ' ' 'Enh
ancement name'.perform create_field_catalog using 'MODTEXT' 'T_USEREXIT' ' ' 'Enh
ancement 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'.
*Sortclear 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'EXPORTINGi_callback_program = sy-cprogi_callback_user_command = 'USER_COMMAND'is_layout = i_layoutit_fieldcat = i_fieldcat[]it_sort = i_sort[]i_default = c_xi_save = 'A'i_grid_title = w_gridtxt
TABLESt_outtab = i_userexit.
endif.
*issue message with number of user-exits displayeddescribe table i_userexit lines w_linnum.
8/8/2019 Code for Finding Usr Exits & Badis
20/21
message s697(56) with w_linnum.
endform. "DATA_DISPLAY
form create_field_catalog using p_fieldnamep_tabnamep_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 user_command using r_ucomm like sy-ucommrs_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.
get cursor field w_fsel.
case w_fsel.
8/8/2019 Code for Finding Usr Exits & Badis
21/21
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 possibleendif.
when others.message s030(cj)."Navigation not possible
endcase.at selection-screen on radiobutton group rad1.
*grey-out checkboxes if ALV selectedat 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....