Чтобы отследить все используемые в программе BAdI, нужно поставить точку прерывания в методе GET_INSTANCE класса CL_EXITHANDLER. Название BadI - в переменной EXIT_NAME.
А выборка в программе по поиску BADI работает очень коряво.
Я как-то делал аналогичную, но всё равно не очень...
Code:
*&---------------------------------------------------------------------*
*& Report ZCA_SMOD_SEARCH *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT zca_smod_search NO STANDARD PAGE HEADING .
TABLES : tadir, modsap, modact, trdir, tfdir, enlfdir, tdevc, taplp.
TABLES : tdevct, trdirt, tftit, tlibt, modsapt, modtext, taplt.
DATA : BEGIN OF tab,
cmodname LIKE modact-name,
smodname LIKE modsap-name,
modmember LIKE tfdir-funcname,
END OF tab.
*data: to input
DATA : jtab LIKE tab OCCURS 0 WITH HEADER LINE.
*data: outputed
DATA : ftab LIKE tab OCCURS 0 WITH HEADER LINE.
DATA : batch_tab_cmod LIKE bdcdata OCCURS 0 WITH HEADER LINE.
batch_tab_cmod-program = 'SAPMSMOD'.
batch_tab_cmod-dynpro = '1010'.
batch_tab_cmod-dynbegin = 'X'.
APPEND batch_tab_cmod.
CLEAR batch_tab_cmod.
batch_tab_cmod-fnam = 'BDC_CURSOR'.
batch_tab_cmod-fval = 'MOD0-NAME'.
APPEND batch_tab_cmod.
CLEAR batch_tab_cmod.
APPEND batch_tab_cmod.
batch_tab_cmod-fnam = 'BDC_OKCODE'.
batch_tab_cmod-fval = '=ENTR'.
APPEND batch_tab_cmod.
DATA : comp_str(40) TYPE c.
DATA : icmod TYPE i,
ismod TYPE i,
imodmember TYPE i.
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS gx RADIOBUTTON GROUP gr1 DEFAULT 'X' USER-COMMAND zus1.
SELECTION-SCREEN COMMENT (22) text-008 FOR FIELD gx.
PARAMETERS p_prjct LIKE modact-name MODIF ID mx.
SELECTION-SCREEN COMMENT (60) commx FOR FIELD p_prjct.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS g0 RADIOBUTTON GROUP gr1.
SELECTION-SCREEN COMMENT (22) text-007 FOR FIELD g0.
PARAMETERS p_enhant LIKE modsap-name MODIF ID m0.
SELECTION-SCREEN COMMENT (60) comm0 FOR FIELD p_enhant.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS g1 RADIOBUTTON GROUP gr1.
SELECTION-SCREEN COMMENT (22) text-006 FOR FIELD g1.
PARAMETERS p_funct LIKE mod0-funcname MODIF ID m1.
SELECTION-SCREEN COMMENT (74) comm1 FOR FIELD p_funct.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS g2 RADIOBUTTON GROUP gr1.
SELECTION-SCREEN COMMENT (22) text-003 FOR FIELD g2.
PARAMETERS p_pgmna LIKE trdir-name MODIF ID m2.
SELECTION-SCREEN COMMENT (70) comm2 FOR FIELD p_pgmna.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS g3 RADIOBUTTON GROUP gr1.
SELECTION-SCREEN COMMENT (22) text-004 FOR FIELD g3.
PARAMETERS p_devks LIKE tdevc-devclass MODIF ID m3.
SELECTION-SCREEN COMMENT (60) comm3 FOR FIELD p_devks.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS g4 RADIOBUTTON GROUP gr1.
SELECTION-SCREEN COMMENT (22) text-002 FOR FIELD g4.
PARAMETERS p_appl LIKE rsahd-appl MODIF ID m4.
SELECTION-SCREEN COMMENT (30) comm4 FOR FIELD p_appl.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK block1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prjct.
CALL FUNCTION 'F4_CUSTOMER_PROJECT'
EXPORTING
object = space
suppress_selection = space
IMPORTING
RESULT = p_prjct.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_enhant.
CALL FUNCTION 'F4_CUSTOMER_EXIT'
EXPORTING
object = space
suppress_selection = space
IMPORTING
RESULT = p_enhant.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_funct.
CALL FUNCTION 'F4_FUNCTIONMODULE'
EXPORTING
object = space
group = space
suppress_selection = space
IMPORTING
RESULT = p_funct.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pgmna.
CALL FUNCTION 'F4_PROGRAM'
EXPORTING
object = space
suppress_selection = space
IMPORTING
RESULT = p_pgmna.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_devks.
CALL FUNCTION 'F4_DEVCLASS'
EXPORTING
object = space
suppress_selection = space
IMPORTING
RESULT = p_devks.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
CASE screen-group1.
WHEN 'MX'.
IF gx IS INITIAL.
screen-input = '0'.
MODIFY SCREEN.
ELSE.
IF p_prjct NE space.
SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND
object = 'CMOD' AND
obj_name = p_prjct.
IF sy-subrc NE 0.
MESSAGE s837(co) WITH p_prjct.
CLEAR commx.
ELSE.
SELECT SINGLE modtext FROM modtext INTO commx WHERE name = p_prjct AND
sprsl = sy-langu.
ENDIF.
ELSE.
CLEAR commx.
ENDIF.
ENDIF.
WHEN 'M0'.
IF g0 IS INITIAL.
screen-input = '0'.
MODIFY SCREEN.
ELSE.
IF p_enhant NE space.
SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND
object = 'SMOD' AND
obj_name = p_enhant.
IF sy-subrc NE 0.
MESSAGE s582(e0) WITH p_enhant.
CLEAR comm0.
ELSE.
SELECT SINGLE modtext FROM modsapt INTO comm0 WHERE name = p_enhant AND
sprsl = sy-langu.
ENDIF.
ELSE.
CLEAR comm0.
ENDIF.
ENDIF.
WHEN 'M1'.
IF g1 IS INITIAL.
screen-input = '0'.
MODIFY SCREEN.
ELSE.
IF p_funct NE space.
comp_str = 'EXIT%'.
SELECT SINGLE * FROM tfdir WHERE funcname = p_funct AND
funcname LIKE comp_str.
IF sy-subrc NE 0.
MESSAGE s524(0m) WITH 'EXIT'.
CLEAR comm1.
ELSE.
SELECT SINGLE stext FROM tftit INTO comm1 WHERE funcname = p_funct AND
spras = sy-langu.
ENDIF.
ELSE.
CLEAR comm1.
ENDIF.
ENDIF.
WHEN 'M2'.
IF g2 IS INITIAL.
screen-input = '0'.
MODIFY SCREEN.
ELSE.
IF p_pgmna NE space.
SELECT SINGLE * FROM trdir WHERE name = p_pgmna.
IF sy-subrc NE 0.
MESSAGE s043(pv).
CLEAR comm2.
ELSE.
IF trdir-subc = 'F'.
CALL FUNCTION 'RS_PROGNAME_SPLIT'
EXPORTING
progname_with_namespace = p_pgmna
IMPORTING
fugr_group = enlfdir-area
EXCEPTIONS
OTHERS = 1.
SELECT SINGLE areat FROM tlibt INTO comm2 WHERE area EQ enlfdir-area AND
spras EQ sy-langu.
ELSE.
SELECT SINGLE text FROM trdirt INTO comm2 WHERE name EQ p_pgmna AND
sprsl EQ sy-langu.
ENDIF.
ENDIF.
ELSE.
CLEAR comm2.
ENDIF.
ENDIF.
WHEN 'M3'.
IF g3 IS INITIAL.
screen-input = '0'.
MODIFY SCREEN.
ELSE.
IF p_devks NE space.
SELECT SINGLE * FROM tdevc WHERE devclass = p_devks.
IF sy-subrc NE 0.
MESSAGE s551(sd).
CLEAR comm3.
ELSE.
SELECT SINGLE ctext FROM tdevct INTO comm3 WHERE devclass = p_devks AND
spras = sy-langu.
ENDIF.
ELSE.
CLEAR comm3.
ENDIF.
ENDIF.
WHEN 'M4'.
IF g4 IS INITIAL.
screen-input = '0'.
MODIFY SCREEN.
ELSE.
IF p_appl NE space.
SELECT SINGLE * FROM taplp WHERE appl = p_appl.
IF sy-subrc NE 0.
MESSAGE s238(so).
CLEAR comm4.
ELSE.
SELECT SINGLE atext FROM taplt INTO comm4 WHERE appl = p_appl AND
sprsl = sy-langu.
ENDIF.
ELSE.
CLEAR comm4.
ENDIF.
ENDIF.
ENDCASE.
ENDLOOP.
START-OF-SELECTION.
* check mandatory fields
IF gx NE space.
SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND
object = 'CMOD' AND
obj_name = p_prjct.
ELSEIF g0 NE space.
SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND
object = 'SMOD' AND
obj_name = p_enhant.
ELSEIF g1 NE space.
comp_str = 'EXIT%'.
SELECT SINGLE * FROM tfdir WHERE funcname = p_funct AND
funcname LIKE comp_str.
ELSEIF g2 NE space.
SELECT SINGLE * FROM trdir WHERE name = p_pgmna.
ELSEIF g3 NE space.
SELECT SINGLE * FROM tdevc WHERE devclass = p_devks.
ELSEIF g4 NE space.
SELECT SINGLE * FROM taplp WHERE appl = p_appl.
ENDIF.
IF sy-subrc NE 0.
MESSAGE s055(00).
EXIT.
ENDIF.
IF gx NE space.
jtab-cmodname = p_prjct.
APPEND jtab.
ELSEIF g0 NE space.
jtab-smodname = p_enhant.
APPEND jtab.
ELSEIF g1 NE space.
jtab-modmember = p_funct.
APPEND jtab.
ELSEIF g2 NE space.
CONCATENATE 'EXIT%' p_pgmna '%' INTO comp_str.
SELECT funcname FROM tfdir INTO jtab-modmember WHERE funcname LIKE comp_str.
APPEND jtab.
ENDSELECT.
ELSEIF g3 NE space.
comp_str = 'EXIT%'.
SELECT * FROM tadir WHERE pgmid = 'R3TR' AND
object = 'FUGS' AND
devclass = p_devks.
SELECT funcname FROM enlfdir INTO jtab-modmember WHERE funcname LIKE comp_str AND area = tadir-obj_name.
APPEND jtab.
ENDSELECT.
ENDSELECT.
ELSEIF g4 NE space.
comp_str = 'EXIT%'.
IF p_appl = '*'.
CLEAR p_appl.
ENDIF.
SELECT funcname FROM tfdir INTO jtab-modmember WHERE funcname LIKE comp_str AND appl = p_appl.
APPEND jtab.
ENDSELECT.
ENDIF.
FORMAT COLOR COL_POSITIVE INTENSIFIED ON.
WRITE:/ 'Поиск дал следующие результаты:'.
SKIP.
IF NOT jtab[] IS INITIAL.
WRITE:/(130) sy-uline.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE:/1 sy-vline,
2 'Компонент',
38 sy-vline,
39 'Прл',
42 sy-vline,
43 'Пакет',
55 sy-vline,
56 'Описание',
130 sy-vline.
WRITE:/(130) sy-uline.
LOOP AT jtab.
IF jtab-modmember NE space.
SELECT SINGLE name FROM modsap INTO jtab-smodname
WHERE member = jtab-modmember AND typ = 'E'.
ENDIF.
IF jtab-smodname NE space.
SELECT SINGLE name FROM modact INTO jtab-cmodname
WHERE member = jtab-smodname.
ENDIF.
MODIFY jtab.
ENDLOOP.
SORT jtab DESCENDING BY cmodname smodname modmember.
CLEAR comp_str.
LOOP AT jtab WHERE cmodname NE space.
IF comp_str EQ jtab-cmodname.
DELETE jtab.
ELSE.
comp_str = jtab-cmodname.
CLEAR jtab-smodname.
CLEAR jtab-modmember.
MODIFY jtab.
ENDIF.
ENDLOOP.
CLEAR comp_str.
LOOP AT jtab WHERE smodname NE space.
IF comp_str EQ jtab-smodname.
DELETE jtab.
ELSE.
comp_str = jtab-smodname.
CLEAR jtab-modmember.
MODIFY jtab.
ENDIF.
ENDLOOP.
LOOP AT jtab.
IF jtab-cmodname NE space.
PERFORM print USING 'CMOD' 0 jtab-cmodname '' '' ''.
ELSEIF jtab-smodname NE space.
PERFORM print USING 'SMOD' 0 jtab-smodname '' '' ''.
ELSEIF jtab-modmember NE space.
PERFORM print USING 'MOD' 0 jtab-modmember '' '' ''.
ENDIF.
ENDLOOP.
WRITE:/(130) sy-uline.
SKIP.
FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WRITE:/ 'Проектов: ', icmod.
WRITE:/ 'Расширений: ', ismod.
WRITE:/ 'Компонент: ', imodmember.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/ 'Ни одного расширения не найдено'.
ENDIF.
AT LINE-SELECTION.
comp_str = sy-lisel+1(36).
CONDENSE comp_str.
LOOP AT ftab.
IF ftab-cmodname = comp_str.
batch_tab_cmod-fnam = 'MOD0-NAME'.
batch_tab_cmod-fval = comp_str.
MODIFY batch_tab_cmod INDEX 3.
CALL TRANSACTION 'CMOD' USING batch_tab_cmod MODE 'E'.
EXIT.
ELSEIF ftab-smodname = comp_str.
SET PARAMETER ID 'MON' FIELD comp_str.
CALL TRANSACTION 'SMOD'.
EXIT.
ELSEIF ftab-modmember = comp_str.
SET PARAMETER ID 'LIB' FIELD comp_str.
CALL TRANSACTION 'SE37'.
EXIT.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form print
*&---------------------------------------------------------------------*
FORM print USING value(id)
value(pref) TYPE i
value(name)
value(appl)
value(devc)
value(text).
CLEAR ftab.
CASE id.
WHEN 'CMOD'.
ftab-cmodname = name.
APPEND ftab.
icmod = icmod + 1.
CLEAR modtext.
SELECT SINGLE * FROM modtext WHERE sprsl = sy-langu AND
name = name.
FORMAT COLOR COL_GROUP INTENSIFIED ON.
PERFORM print USING 'TEXT' pref name '' '' modtext-modtext.
pref = pref + 2.
SELECT * FROM modact WHERE name = name AND member NE space.
PERFORM print USING 'SMOD' pref modact-member '' '' ''.
ENDSELECT.
WHEN 'SMOD'.
ftab-smodname = name.
APPEND ftab.
ismod = ismod + 1.
CLEAR modsapt.
SELECT SINGLE * FROM modsapt WHERE sprsl = sy-langu AND
name = name.
IF pref = 0.
FORMAT COLOR COL_TOTAL INTENSIFIED ON.
ELSE.
FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
ENDIF.
PERFORM print USING 'TEXT' pref name '' '' modsapt-modtext.
pref = pref + 2.
SELECT * FROM modsap WHERE name = name AND typ = 'E'.
PERFORM print USING 'MOD' pref modsap-member '' '' ''.
ENDSELECT.
WHEN 'MOD'.
ftab-modmember = name.
APPEND ftab.
imodmember = imodmember + 1.
CLEAR tftit.
SELECT SINGLE * FROM tftit WHERE spras = sy-langu AND
funcname = name.
SELECT SINGLE * FROM tfdir WHERE funcname = name.
SELECT SINGLE * FROM enlfdir WHERE funcname = name.
SELECT SINGLE * FROM tadir WHERE pgmid = 'R3TR' AND
object = 'FUGS' AND
obj_name = enlfdir-area.
IF pref = 0.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
ELSE.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
ENDIF.
PERFORM print USING 'TEXT' pref name tfdir-appl tadir-devclass tftit-stext.
WHEN 'TEXT'.
pref = 3 + pref.
WRITE:/1 sy-vline.
FORMAT HOTSPOT ON.
WRITE: 2(36) space.
WRITE: AT pref(*) name.
FORMAT HOTSPOT OFF.
WRITE: 38 sy-vline,
40 appl,
42 sy-vline,
43 devc,
55 sy-vline,
56 text,
130 sy-vline.
ENDCASE.
ENDFORM. "print