You are on page 1of 24

*&---------------------------------------------------------------------*

*& Report ZUSEREXIT


*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
*REPORT ZUSEREXIT no standard page heading.
*tables : tstc, tadir, modsapt, modact, trdir, tfdir, enlfdir.
*
tables : tstct.
*data : jtab like tadir occurs 0 with header line.
*data : field1(30).
*data : v_devclass like tadir-devclass.
*parameters : p_tcode like tstc-tcode obligatory.
*
*select single * from tstc where tcode eq p_tcode.
*if sy-subrc eq 0.
* select single * from tadir where pgmid = 'R3TR'
*
and object = 'PROG'
*
and obj_name = tstc-pgmna.
* move : tadir-devclass to v_devclass.
*
if sy-subrc ne 0.
*
select single * from trdir where name = tstc-pgmna.
*
if trdir-subc eq 'F'.
*
select single * from tfdir where pname = tstc-pgmna.
*
select single * from enlfdir where funcname =
*
tfdir-funcname.
*
select single * from tadir where pgmid = 'R3TR'
*
and object = 'FUGR'
*
and obj_name eq enlfdir-area.
*
*
move : tadir-devclass to v_devclass.
*
endif.
*
endif.
*
select * from tadir into table jtab
*
where pgmid = 'R3TR'
*
and object = 'SMOD'
*
and devclass = v_devclass.
*
select single * from tstct where sprsl eq sy-langu and
*
tcode eq p_tcode.
*
format color col_positive intensified off.
*
write:/(19) 'Transaction Code - ',
*
20(20) p_tcode,
*
45(50) tstct-ttext.
*
skip.
*
if not jtab[] is initial.
*
write:/(95) sy-uline.
*
format color col_heading intensified on.
*
write:/1 sy-vline,
*
2 'Nombre Exit',
*
21 sy-vline ,
*
22 'Descripcion',
*
95 sy-vline.
*
write:/(95) sy-uline.
*
loop at jtab.
*
select single * from modsapt
*
where sprsl = sy-langu and
*
name = jtab-obj_name.
*
format color col_normal intensified off.

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*at
*
*
*
*

write:/1
2
21
22
95

sy-vline,
jtab-obj_name hotspot on,
sy-vline ,
modsapt-modtext,
sy-vline.

endloop.
write:/(95) sy-uline.
describe table jtab.
skip.
format color col_total intensified on.
write:/ 'Nmero de Exits:' , sy-tfill.
else.
format color col_negative intensified on.
write:/(95) 'No existe ninguna user exit'.
endif.
else.
format color col_negative intensified on.
write:/(95) 'El cdigo de transaccin no existe'.
endif.
line-selection.
get cursor field field1.
check field1(4) eq 'JTAB'.
set parameter id 'MON' field sy-lisel+1(10).
call transaction 'SMOD' and skip first screen.

*&--------------------------------------------------------------------&*
*& Report:
Z_USEREXIT (V10)
&*
*& Last updated: 15 Aug 2008
&*
*&--------------------------------------------------------------------&*
*& Selection Texts:
*& P_ALV ALV format
*& P_AUTH Include authority-check search
*& P_BADI Display BADIs
*& P_CUSB Customer BADIs only
*& P_BTE Display business trans events
*& P_DEVC Show development class exits
*& P_EXIT Display user exits
*& P_FUNC Show function modules
*& P_LIMIT Limit no. of submits to search
*& P_LST Standard list format
*& P_PNAME Program name
*& P_PROG Display program exits
*& P_SUBM Show submits
*& P_TCODE Transaction code
*& P_TEXT Search for text
*& P_WFLOW Display workflow links
*&--------------------------------------------------------------------&*
*& Text symbols:
*& M01 Enter TCode or program
*& M02 Enter at least one scope criteria
*& S01 Selection data (TCode takes precedence over program name)
*& S02 Scope criteria
*& S03 Display criteria
*&--------------------------------------------------------------------&*
report z_userexit
no standard page heading
line-size 201.
tables: sxs_attr,

tobjt,
tstct,
trdirt,
sxc_exit.

"TCode texts
"Program texts
"BADI exits

type-pools: slis.
data: tabix
w_linnum
w_off
w_index
w_include
w_prog
w_incl
w_area
w_level,
w_str(50)
w_cnt(2)
w_funcname
w_fsel
w_gridtxt(70)

"Globale Typen fr generische Listbausteine


like
type
type
like
like
like
like
like

sy-tabix,
i,
i,
sy-tabix,
trdir-name,
trdir-name,
trdir-name,
rs38l-area,

type
type
like
like
type

c,
c,
tfdir-funcname,
sy-ucomm,
" Determination of screen field
c.
"ALV grid title

constants: c_fmod(40)
c_subm(40)
c_devc(60)
ion modules',
c_col1(12)
c_col2(40)
c_col3(30)
c_col4(20)
c_col5(40)
c_col6(8)
c_col7(1)
c_col8(12)
c_col9(10)
c_x

type c value 'Function modules searched: ',


type c value 'Submit programs searched: ',
type c value 'User-exits from development classes in funct
type
type
type
type
type
type
type
type
type
type

c
c
c
c
c
c
c
c
c
c

value
value
value
value
value
value
value
value
value
value

* Work Areas: ABAP Workbench


data: begin of wa_d010inc.
data: master type d010inc-master.
data: end of wa_d010inc.

'Enhanmt Type',
'Enhancement',
'Program/Include',
'Enhancement Name',
'Enhancement Description',
'Project',
'S',
'ChangeName',
'ChangeDate',
'X'.

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,
line(200),
end of t_sourcetab.
data: sourcetab type standard table of t_sourcetab
data c_overflow(30000) type c.

"#EC
"#EC
"#EC
with

* (SLIN lgt!)
* (SLIN lgt!)
* (SLIN lgt!)
header line.

* 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_cusb 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
perform
perform
perform
perform

data_select.
get_submit_data.
get_fm_data.
get_additional_data.
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'
exceptions
system_failure
communication_failure
.

"#EC NOTEXT

"#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 NO
TEXT
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'
exceptions
system_failure
communication_failure
.
* Function module data

"#EC NOTEXT

"#EC *

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'
exceptions
system_failure
communication_failure
.
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.

"#EC NOTEXT

"#EC *

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
i_userexit-type = 'BADI'.
clear sxs_attr. " ensure a real BADI
if p_cusb = c_x. "customer BADIs only
select single * from sxs_attr where exit_name =
and INTERNAL <>
else.
select single * from sxs_attr where exit_name =
endif.
if sy-subrc = 0.
append i_userexit.
endif.
endif.
endif.

with space.

i_userexit-txt
c_x.
i_userexit-txt.

* 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'
exceptions
system_failure
communication_failure
.

"#EC NOTEXT

"#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 =
when 'Enhancement'.
i_userexit-colour =
when 'Program Exit'.
i_userexit-colour =
when 'WorkFlow'.
i_userexit-colour =
when 'BusTrEvent'.
i_userexit-colour =
endcase.
modify i_userexit.
endloop.
endform.

'C601'.
'C501'.
'C401'.
'C301'.
'C201'.

"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,
sy-vline,
(8) c_col6,
sy-vline,
(1) c_col7,
sy-vline,
(12) c_col8,
sy-vline,
(10) c_col9,
sy-vline.
format reset.
uline.

"Enhancement description
"Project
"S
"ChangeName
"ChangeDate

* 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.
write: 201''.

"#EC NOTEXT

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.
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.

"#EC NOTEXT

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
perform create_field_catalog
m name'.
perform create_field_catalog
ement'.
perform create_field_catalog
.
perform create_field_catalog
ement name'.
perform create_field_catalog
ement text'.
perform create_field_catalog
'.
perform create_field_catalog
t'.
perform create_field_catalog
'.
perform create_field_catalog
d by'.
perform create_field_catalog
date'.

using 'TYPE'
using 'PNAME'

'T_USEREXIT' ' ' 'Type'.


'T_USEREXIT' ' ' 'Prog?a

using 'TXT'

'T_USEREXIT' ' ' 'Enhanc

using 'LEVEL'

'T_USEREXIT' c_x 'Level'

using 'MODNAME'

'T_USEREXIT' ' ' 'Enhanc

using 'MODTEXT'

'T_USEREXIT' ' ' 'Enhanc

using 'MODATTR-MEMBER' 'T_USEREXIT' c_x 'Member


using 'MODATTR-NAME'

'T_USEREXIT' ' ' 'Projec

using 'MODATTR-STATUS' 'T_USEREXIT' ' ' 'Status


using 'MODATTR-ANAM'

'T_USEREXIT' ' ' 'Change

using 'MODATTR-ADAT'

'T_USEREXIT' ' ' 'Change

* 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
i_fieldcat-tabname
i_fieldcat-no_out
i_fieldcat-seltext_l

=
=
=
=

p_fieldname.
p_tabname.
p_hide.
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.

You might also like