Прошло еще 3 года, понадобилось применить туже доработку опять на новом месте.
Стал еще умнее, реализация с использованием только неявного расширения стандарта, плюс поиск по СмартФормам и убрал ограничения на поиск в пакете $TMP

Code:
*&---------------------------------------------------------------------*
*& Report AFX_CODE_SCANNER *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT afx_code_scanner.
INCLUDE afx_global_data_public.
TYPE-POOLS: slis, abap.
TYPES: BEGIN OF t_str_lines,
devclass LIKE tadir-devclass,
progname LIKE rs38m-programm,
linno LIKE rslgaxdata-line,
line LIKE abapsource-line,
END OF t_str_lines.
DATA: BEGIN OF g_tab_lines OCCURS 0,
devclass LIKE tadir-devclass,
progname LIKE rs38m-programm,
linno LIKE rslgaxdata-line,
line LIKE abapsource-line,
END OF g_tab_lines.
* Global data
TABLES: tadir. "#EC NEEDED
CONSTANTS: c_devc_tmp TYPE devclass VALUE '$TMP'.
DATA: g_line_object TYPE sobj_name,
g_line_number TYPE sytabix.
TYPES: BEGIN OF t_abapsource_long, "CB
line TYPE char255,
END OF t_abapsource_long.
TYPES: t_tab_long_lines TYPE STANDARD TABLE OF t_abapsource_long. "CB
*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
SELECTION-SCREEN: BEGIN OF BLOCK a WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_devc FOR tadir-devclass OBLIGATORY MEMORY ID dvc.
SELECT-OPTIONS: s_rest FOR tadir-obj_name. "MEMORY ID dvc.
PARAMETER: p_conpck AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN: SKIP.
PARAMETERS: p_strg1(80) OBLIGATORY,
p_strg2(80).
SELECTION-SCREEN: END OF BLOCK a.
SELECTION-SCREEN: BEGIN OF BLOCK b WITH FRAME TITLE text-002.
PARAMETERS: p_excl1(80),
p_excl2(80),
p_excl3(80).
SELECTION-SCREEN: SKIP.
PARAMETERS: p_lrng(2) TYPE n OBLIGATORY DEFAULT '01'.
SELECTION-SCREEN: SKIP.
PARAMETERS: p_excomm AS CHECKBOX DEFAULT con_false,
p_nohits AS CHECKBOX DEFAULT con_false,
p_edit AS CHECKBOX DEFAULT space.
SELECTION-SCREEN: END OF BLOCK b.
SELECTION-SCREEN: BEGIN OF BLOCK c WITH FRAME TITLE text-003.
PARAMETERS: p_prog AS CHECKBOX DEFAULT con_true,
p_fugr AS CHECKBOX DEFAULT con_true,
p_cinc AS CHECKBOX DEFAULT con_true.
SELECTION-SCREEN: END OF BLOCK c.
*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
START-OF-SELECTION.
PERFORM process_devc.
*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
AT LINE-SELECTION.
PERFORM navigate_to_object USING g_line_object g_line_number p_edit.
*---------------------------------------------------------------------*
* FORM process_devc *
*---------------------------------------------------------------------*
FORM process_devc.
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_tabix TYPE i,
l_flg_process_tmp TYPE xfeld,
l_answer TYPE c,
l_popuptext(200) TYPE c,
l_devclass TYPE devclass.
* Initialization
REFRESH: g_tab_lines,
l_tab_tadir.
* Get all packages on first level...
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'DEVC' AND
devclass IN s_devc. "#EC CI_SGLSELECT
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
* Check if local package $TMP in selection criteria
CLEAR l_flg_process_tmp.
IF c_devc_tmp IN s_devc.
l_flg_process_tmp = con_true.
l_cnt = l_cnt + 1.
ENDIF.
IF p_conpck EQ abap_true.
FIELD-SYMBOLS:
<f_tadir> TYPE tadir,
<f_cumul> TYPE packname,
<l_descendant> TYPE cl_pak_package_queries=>ty_subpackage_info.
DATA: t_descendant TYPE cl_pak_package_queries=>tt_subpackage_info,
t_cumul TYPE scompaknam,
f_tadir TYPE tadir.
CLEAR t_cumul.
LOOP AT l_tab_tadir ASSIGNING <f_tadir>.
CLEAR t_descendant.
CALL METHOD cl_pak_package_queries=>get_all_subpackages
EXPORTING
im_package = <f_tadir>-devclass
IMPORTING
et_subpackages = t_descendant
EXCEPTIONS
OTHERS = 1.
LOOP AT t_descendant ASSIGNING <l_descendant>.
APPEND <l_descendant>-package TO t_cumul.
ENDLOOP.
APPEND <f_tadir>-devclass TO t_cumul.
ENDLOOP.
SORT t_cumul BY table_line ASCENDING.
DELETE ADJACENT DUPLICATES FROM t_cumul.
LOOP AT t_cumul ASSIGNING <f_cumul>.
* is DEVC-TADIR already in L_TAB_TADIR...
READ TABLE l_tab_tadir WITH KEY devclass = <f_cumul> TRANSPORTING
NO FIELDS.
IF sy-subrc EQ 0.
CONTINUE.
ENDIF.
CLEAR f_tadir.
SELECT SINGLE * FROM tadir INTO f_tadir WHERE devclass = <f_cumul>
"#EC CI_GENBUFF
AND pgmid = 'R3TR'
AND object = 'DEVC'.
IF sy-subrc EQ 0.
APPEND f_tadir TO l_tab_tadir.
ENDIF.
ENDLOOP.
ENDIF.
* Write count of packages into list
* Process packages
l_tabix = 0.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix = l_tabix + 1.
l_devclass = l_str_tadir-obj_name.
PERFORM scan_devc USING l_devclass l_tabix l_cnt p_lrng.
ENDLOOP.
* Process local package $TMP
IF l_flg_process_tmp = con_true.
l_tabix = l_tabix + 1.
PERFORM scan_devc USING c_devc_tmp l_tabix l_cnt p_lrng.
ENDIF.
* Display scan result data
PERFORM scan_result_display.
ENDFORM. "process_devc
*&---------------------------------------------------------------------*
*& Form scan_result_display
*&---------------------------------------------------------------------*
FORM scan_result_display.
DATA: l_str_layout TYPE slis_layout_alv,
l_tab_all_events TYPE slis_t_event,
l_tab_events TYPE slis_t_event,
l_str_event TYPE slis_alv_event,
l_repid TYPE syrepid,
l_tab_sort TYPE slis_t_sortinfo_alv,
l_str_sort TYPE slis_sortinfo_alv,
l_tab_fieldcat TYPE slis_t_fieldcat_alv,
l_str_fieldcat TYPE slis_fieldcat_alv.
* Initialzation
CLEAR: l_str_layout,
l_str_event,
l_str_sort,
l_str_fieldcat.
REFRESH: l_tab_all_events,
l_tab_events,
l_tab_sort,
l_tab_fieldcat.
l_repid = sy-repid.
* Initialize Layout for activity log
l_str_layout-detail_popup = con_true.
l_str_layout-detail_initial_lines = con_true.
l_str_layout-expand_all = con_true.
l_str_layout-colwidth_optimize = con_true.
l_str_layout-zebra = con_true.
* Get possible events
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = l_tab_all_events.
** Top-of-Page for activity log
* read table l_tab_events with key name = slis_ev_top_of_page
* into l_str_event.
* if sy-subrc = 0.
* l_str_event-form = g_con_form_top_of_page.
* append l_str_event to c_tab_actvt_events.
* endif.
* User-command for activity log
READ TABLE l_tab_all_events WITH KEY name = slis_ev_user_command
INTO l_str_event.
IF sy-subrc = 0.
l_str_event-form = 'ALV_USER_COMMAND'.
APPEND l_str_event TO l_tab_events.
ENDIF.
** PF-Status-set for activity log
* read table l_tab_all_events with key name = slis_ev_pf_status_set
* into l_str_event.
* if sy-subrc = 0.
* l_str_event-form = g_con_form_pf_status_actvt.
* append l_str_event to l_tab_events.
* endif.
l_str_sort-spos = '01'.
l_str_sort-fieldname = 'DEVCLASS'.
*l_str_sort-tabname = con_false.
l_str_sort-up = con_true.
* down like alvdynp-sortdown,
* group like alvdynp-grouplevel,
* subtot like alvdynp-subtotals,
* comp(1) type c,
* expa(1) type c,
* obligatory(1) type c,
APPEND l_str_sort TO l_tab_sort.
l_str_sort-spos = '02'.
l_str_sort-fieldname = 'PROGNAME'.
l_str_sort-up = con_true.
APPEND l_str_sort TO l_tab_sort.
* l_str_sort-spos = '03'.
* l_str_sort-fieldname = 'LINNO'.
* l_str_sort-up = con_true.
* APPEND l_str_sort TO l_tab_sort.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = l_repid
i_internal_tabname = 'G_TAB_LINES'
* I_STRUCTURE_NAME =
* I_CLIENT_NEVER_DISPLAY = con_true
i_inclname = l_repid
i_bypassing_buffer = con_true
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = l_tab_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
READ TABLE l_tab_fieldcat WITH KEY fieldname = 'LINNO'
INTO l_str_fieldcat.
IF sy-subrc = 0.
l_str_fieldcat-hotspot = con_true.
l_str_fieldcat-just = 'R'.
MODIFY l_tab_fieldcat FROM l_str_fieldcat INDEX sy-tabix.
ENDIF.
READ TABLE l_tab_fieldcat WITH KEY fieldname = 'LINE'
INTO l_str_fieldcat.
IF sy-subrc = 0.
l_str_fieldcat-emphasize = 'C500'.
*'Cxyz'; x=Farbcode entspr. Farbliste
* y=intensified
* z=inverse
l_str_fieldcat-lzero = con_true.
MODIFY l_tab_fieldcat FROM l_str_fieldcat INDEX sy-tabix.
ENDIF.
*** CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = con_false
* I_BYPASSING_BUFFER = con_false
* I_BUFFER_ACTIVE = ' '
i_callback_program = l_repid
* I_CALLBACK_PF_STATUS_SET = con_false
* I_CALLBACK_USER_COMMAND = con_false
* I_CALLBACK_TOP_OF_PAGE = con_false
* I_CALLBACK_HTML_TOP_OF_PAGE = con_false
* I_CALLBACK_HTML_END_OF_LIST = con_false
* i_structure_name = con_false
* I_BACKGROUND_ID = con_false
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = l_str_layout
it_fieldcat = l_tab_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
it_sort = l_tab_sort
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = con_true
i_save = 'A'
* IS_VARIANT =
it_events = l_tab_events
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = g_tab_lines
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " scan_result_display
*---------------------------------------------------------------------*
* FORM scan_devc *
*---------------------------------------------------------------------*
FORM scan_devc USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
* Write current package into list
* Scan sources of current package
IF p_prog = con_true.
PERFORM scan_devc_prog
USING u_devc u_index u_count u_cnt_line.
ENDIF.
IF p_fugr = con_true.
PERFORM scan_devc_fugr
USING u_devc u_index u_count u_cnt_line.
ENDIF.
IF p_cinc = con_true.
PERFORM scan_devc_class
USING u_devc u_index u_count u_cnt_line.
ENDIF.
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1 ZBCENH_AFX_CODE_SCANNER. "active version
PERFORM scan_devc_add USING u_devc u_index u_count u_cnt_line.
ENDENHANCEMENT.
*$*$-End: (1)---------------------------------------------------------------------------------$*$*
ENDFORM. "scan_devc
*&---------------------------------------------------------------------*
*& Form scan_devc_prog
*&---------------------------------------------------------------------*
FORM scan_devc_prog USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
*$*$-Start: (2)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 3 ZBCENH_AFX_CODE_SCANNER. "active version
DATA: c_devc_tmp TYPE devclass VALUE ''.
ENDENHANCEMENT.
*$*$-End: (2)---------------------------------------------------------------------------------$*$*
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE t_tab_long_lines, "CB
l_text TYPE itex132.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get programs of current package
REFRESH l_tab_tadir.
IF u_devc <> c_devc_tmp.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'PROG' AND
devclass = u_devc AND
obj_name IN s_rest. "#EC CI_SGLSELECT
ELSE.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'PROG' AND
devclass = u_devc AND
author = sy-uname AND
obj_name IN s_rest. "#EC CI_SGLSELECT
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of programs into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ENDIF.
* Process all program sources
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'Report'(009) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* Read program source and search for specified strings
* write: / l_str_tadir-obj_name.
l_rep_name = l_str_tadir-obj_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING u_devc
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDLOOP.
ENDFORM. " scan_devc_prog
*&---------------------------------------------------------------------*
*& Form scan_devc_fugr
*&---------------------------------------------------------------------*
FORM scan_devc_fugr USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
*$*$-Start: (3)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 4 ZBCENH_AFX_CODE_SCANNER. "active version
DATA: c_devc_tmp TYPE devclass VALUE ''.
ENDENHANCEMENT.
*$*$-End: (3)---------------------------------------------------------------------------------$*$*
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_tab_e071 TYPE TABLE OF e071,
l_str_e071 TYPE e071,
l_str_tfdir TYPE tfdir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE TABLE OF t_abapsource_long, "CB
l_text TYPE itex132.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get function pools of current package
REFRESH l_tab_tadir.
IF u_devc <> c_devc_tmp.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'FUGR' AND
devclass = u_devc AND
obj_name IN s_rest. "#EC CI_SGLSELECT
ELSE.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'FUGR' AND
devclass = u_devc AND
author = sy-uname AND
obj_name IN s_rest. "#EC CI_SGLSELECT
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of function pools into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ENDIF.
* Process all function pools
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'FuGr'(011) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* Get function pool objects
* write: / l_str_tadir-obj_name.
l_str_e071-pgmid = l_str_tadir-pgmid.
l_str_e071-object = l_str_tadir-object.
l_str_e071-obj_name = l_str_tadir-obj_name.
REFRESH l_tab_e071.
CALL FUNCTION 'STOR_RESOLVE_FUGR'
EXPORTING
is_e071 = l_str_e071
TABLES
tt_e071 = l_tab_e071
EXCEPTIONS
OTHERS = 0.
* Read basis program sources and search for specified strings
LOOP AT l_tab_e071 INTO l_str_e071 WHERE object = 'REPO' .
l_rep_name = l_str_e071-obj_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING u_devc
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDLOOP .
* (A) Keine generierten Dialoge?!? Das sollte man evtl. optional
* anbieten (Zeitpunkt-Routinen!)
* Read function module sources and search for specified strings
LOOP AT l_tab_e071 INTO l_str_e071 WHERE object = 'FUNC' .
IF l_str_e071-obj_name(4) = 'VIEW'. "Keine gen. Dialoge
CONTINUE.
ENDIF.
SELECT SINGLE * FROM tfdir INTO l_str_tfdir
WHERE funcname = l_str_e071-obj_name. "#EC CI_SGLSELECT
IF sy-subrc = 0.
CONCATENATE l_str_tfdir-pname 'U' l_str_tfdir-include
INTO l_rep_name.
REPLACE 'SAPL' WITH 'L' INTO l_rep_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING u_devc
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP .
ENDFORM. " scan_devc_fugr
*&--------------------------------------------------------------------*
*& Form scan_devc_class
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->U_DEVC text
* -->U_INDEX text
* -->U_COUNT text
* -->U_CNT_LINE text
*---------------------------------------------------------------------*
FORM scan_devc_class USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
*$*$-Start: (4)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 5 ZBCENH_AFX_CODE_SCANNER. "active version
DATA: c_devc_tmp TYPE devclass VALUE ''.
ENDENHANCEMENT.
*$*$-End: (4)---------------------------------------------------------------------------------$*$*
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_str_e071 TYPE e071,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE TABLE OF t_abapsource_long,
l_text TYPE itex132,
l_tab_trdir TYPE STANDARD TABLE OF trdir,
l_str_trdir LIKE LINE OF l_tab_trdir,
l_tab_selopt TYPE STANDARD TABLE OF rsdsselopt,
l_str_selopt LIKE LINE OF l_tab_selopt.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get classes of current package
REFRESH l_tab_tadir.
IF u_devc <> c_devc_tmp.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'CLAS' AND
devclass = u_devc AND
obj_name IN s_rest. "#EC CI_SGLSELECT
ELSE.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'CLAS' AND
devclass = u_devc AND
author = sy-uname AND
obj_name IN s_rest. "#EC CI_SGLSELECT
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of function pools into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
ENDIF.
* Process all function pools
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'Klasse'(012) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* get includes for current class
REFRESH l_tab_selopt.
l_str_selopt-sign = 'I'.
l_str_selopt-option = 'CP'.
CONCATENATE l_str_tadir-obj_name '*' INTO
l_str_selopt-low.
APPEND l_str_selopt TO l_tab_selopt.
SELECT * FROM trdir INTO TABLE l_tab_trdir
WHERE name IN l_tab_selopt. "#EC CI_SGLSELECT
LOOP AT l_tab_trdir INTO l_str_trdir.
l_rep_name = l_str_e071-obj_name.
REFRESH l_tab_source.
l_rep_name = l_str_trdir-name.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING u_devc
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ELSE.
FORMAT COLOR COL_NEGATIVE.
WRITE: / 'Report'(009), l_rep_name, 'nicht gefunden!'(013).
ENDIF.
ENDLOOP.
ENDLOOP .
ENDFORM. " scan_devc_class
*&---------------------------------------------------------------------*
*& Form scan_prog
*&---------------------------------------------------------------------*
FORM scan_prog USING i_devclass TYPE devclass
i_objname TYPE sobj_name
i_cnt_line TYPE n
CHANGING i_tab_source TYPE t_tab_long_lines.
DATA: l_str_source TYPE t_abapsource_long,
* l_line TYPE sytabix,
* l_out_progname TYPE xfeld, "EC NEEDED
l_flg_found TYPE xfeld,
l_flg_write TYPE xfeld,
l_cnt_line TYPE i,
* l_modulo TYPE i,
l_str_lines TYPE t_str_lines.
* Initialization
* CLEAR l_out_progname.
CLEAR l_flg_found.
g_line_object = i_objname.
l_cnt_line = 1000.
CLEAR l_str_lines.
l_str_lines-devclass = i_devclass.
l_str_lines-progname = i_objname.
* Search source for selection criteria
LOOP AT i_tab_source INTO l_str_source.
g_line_number = sy-tabix.
CLEAR l_flg_write.
IF l_str_source-line CS p_strg1 AND
( p_strg2 IS INITIAL OR l_str_source-line CS p_strg2 ).
IF ( p_excl1 IS INITIAL OR
NOT l_str_source-line CS p_excl1 ) AND
( p_excl2 IS INITIAL OR
NOT l_str_source-line CS p_excl2 ) AND
( p_excl3 IS INITIAL OR
NOT l_str_source-line CS p_excl3 ) AND
( p_excomm IS INITIAL OR
l_str_source-line(1) <> '*' ).
l_flg_write = con_true.
l_cnt_line = 0.
ENDIF.
ENDIF.
IF l_flg_write = con_true OR l_cnt_line < i_cnt_line.
l_cnt_line = l_cnt_line + 1.
l_flg_found = con_true.
l_str_lines-linno = g_line_number.
l_str_lines-line = l_str_source-line.
APPEND l_str_lines TO g_tab_lines.
ENDIF.
ENDLOOP.
* No hits found
IF p_nohits = con_true AND l_flg_found IS INITIAL.
l_str_lines-linno = 1.
l_str_lines-line = 'Keine Treffer'(014).
APPEND l_str_lines TO g_tab_lines.
ENDIF.
ENDFORM. " scan_prog
*&---------------------------------------------------------------------*
*& Form navigate_to_object
*&---------------------------------------------------------------------*
FORM navigate_to_object USING i_objname TYPE sobj_name
i_position TYPE sytabix
i_edit TYPE xfeld.
DATA: l_operation(5).
* Check object name: object name is filled via HIDE and
* event AT LINE-SELECTION
IF i_objname IS INITIAL.
EXIT.
ENDIF.
* Set edit mode
l_operation = 'EDIT'.
IF i_edit <> con_true.
l_operation = 'SHOW'.
ENDIF.
* Navigation to current object
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = l_operation
object_name = i_objname
object_type = 'REPS'
* ENCLOSING_OBJECT =
* POSITION = con_false
position = i_position
* DEVCLASS =
* INCLUDE =
* VERSION = con_false
* MONITOR_ACTIVATION = con_true
* WB_MANAGER =
* IN_NEW_WINDOW =
* WITH_OBJECTLIST = con_false
* IMPORTING
* NEW_NAME =
* WB_TODO_REQUEST =
* TABLES
* OBJLIST =
EXCEPTIONS
not_executed = 0
invalid_object_type = 0
OTHERS = 0.
ENDFORM. " navigate_to_object
*---------------------------------------------------------------------*
* FORM ALV_USER_COMMAND *
*---------------------------------------------------------------------*
FORM alv_user_command
USING i_ucomm TYPE syucomm
i_selfield TYPE slis_selfield. "#EC CALLED
DATA: l_str_lines TYPE t_str_lines,
l_position TYPE sytabix.
l_position = 1.
READ TABLE g_tab_lines INTO l_str_lines INDEX i_selfield-tabindex.
IF sy-subrc = 0.
l_position = l_str_lines-linno.
ENDIF.
* BREAK-POINT.
CASE i_ucomm.
WHEN '&IC1'.
PERFORM navigate_to_object USING l_str_lines-progname
l_position
p_edit.
ENDCASE.
* Do refresh always col- and row-stable
IF i_selfield-refresh = con_true.
i_selfield-col_stable = con_true.
i_selfield-row_stable = con_true.
ENDIF.
ENDFORM. "alv_user_command
*$*$-Start: (5)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 2 ZBCENH_AFX_CODE_SCANNER. "active version
SELECTION-SCREEN BEGIN OF BLOCK d WITH FRAME TITLE title_d.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_type AS CHECKBOX DEFAULT con_true.
SELECTION-SCREEN COMMENT (20) text_typ FOR FIELD p_type.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_enh AS CHECKBOX DEFAULT con_true.
SELECTION-SCREEN COMMENT (20) text_enh FOR FIELD p_enh.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_mod AS CHECKBOX DEFAULT con_true.
SELECTION-SCREEN COMMENT (20) text_mod FOR FIELD p_mod.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_smf AS CHECKBOX DEFAULT con_true.
SELECTION-SCREEN COMMENT (20) text_smf FOR FIELD p_mod.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK d.
INITIALIZATION.
title_d = |Addition { TEXT-003 }|.
text_typ = |Type Groups|.
text_enh = |Enhancements|.
text_mod = |Modifications|.
text_smf = |Smart Forms|.
*&---------------------------------------------------------------------*
*& Form scan_devc_type
*&---------------------------------------------------------------------*
FORM scan_devc_type USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE t_tab_long_lines, "CB
l_text TYPE itex132.
DATA: BEGIN OF ls_enhincinx,
enhname TYPE enhname,
enhinclude TYPE progname,
END OF ls_enhincinx,
lt_enhincinx LIKE STANDARD TABLE OF ls_enhincinx.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get programs of current package
REFRESH: l_tab_tadir, lt_enhincinx.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'TYPE' AND
devclass = u_devc AND
obj_name IN s_rest. "#EC CI_SGLSELECT
IF p_mod EQ con_true.
STATICS: sv_type TYPE flag.
DATA: lt_obj_name TYPE STANDARD TABLE OF tadir-obj_name.
IF sv_type IS INITIAL.
SELECT DISTINCT obj_name INTO TABLE lt_obj_name FROM smodilog
WHERE obj_type EQ 'TYPE' AND
operation NE 'NOTE' ORDER BY obj_name.
IF lt_obj_name IS NOT INITIAL.
SELECT * APPENDING TABLE l_tab_tadir FROM tadir
FOR ALL ENTRIES IN lt_obj_name
WHERE pgmid EQ 'R3TR' AND object EQ 'TYPE' AND
obj_name EQ lt_obj_name-table_line.
IF sy-subrc EQ 0.
SORT l_tab_tadir BY pgmid object obj_name.
DELETE ADJACENT DUPLICATES FROM l_tab_tadir
COMPARING pgmid object obj_name.
ENDIF.
ENDIF.
sv_type = abap_true.
ENDIF.
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of programs into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ENDIF.
* Process all program sources
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'Report'(009) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* Read program source and search for specified strings
* write: / l_str_tadir-obj_name.
l_rep_name = |%_C{ l_str_tadir-obj_name }|.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING l_str_tadir-devclass
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDLOOP.
ENDFORM. " scan_devc_type
*&---------------------------------------------------------------------*
*& Form scan_devc_enh
*&---------------------------------------------------------------------*
FORM scan_devc_enh USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE t_tab_long_lines, "CB
l_text TYPE itex132.
DATA: BEGIN OF ls_enhincinx,
enhname TYPE enhname,
enhinclude TYPE progname,
END OF ls_enhincinx,
lt_enhincinx LIKE STANDARD TABLE OF ls_enhincinx.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get programs of current package
REFRESH: l_tab_tadir, lt_enhincinx.
SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
WHERE pgmid = 'R3TR' AND
object = 'ENHO' AND
devclass = u_devc AND
obj_name IN s_rest. "#EC CI_SGLSELECT
IF p_mod EQ con_true.
STATICS: sv_enh TYPE flag.
DATA: lt_obj_name TYPE STANDARD TABLE OF tadir-obj_name.
IF sv_enh IS INITIAL.
SELECT DISTINCT obj_name INTO TABLE lt_obj_name FROM smodilog
WHERE obj_type EQ 'ENHO' AND
operation NE 'NOTE' ORDER BY obj_name.
IF lt_obj_name IS NOT INITIAL.
SELECT * APPENDING TABLE l_tab_tadir FROM tadir
FOR ALL ENTRIES IN lt_obj_name
WHERE pgmid EQ 'R3TR' AND object EQ 'ENHO' AND
obj_name EQ lt_obj_name-table_line.
IF sy-subrc EQ 0.
SORT l_tab_tadir BY pgmid object obj_name.
DELETE ADJACENT DUPLICATES FROM l_tab_tadir
COMPARING pgmid object obj_name.
ENDIF.
ENDIF.
sv_enh = abap_true.
ENDIF.
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of programs into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ELSE.
SELECT DISTINCT enhincinx~enhname enhincinx~enhinclude
INTO TABLE lt_enhincinx FROM enhincinx
INNER JOIN tadir ON tadir~obj_name EQ enhincinx~enhname AND
tadir~pgmid EQ 'R3TR' AND tadir~object EQ 'ENHO' AND
tadir~devclass EQ u_devc
WHERE tadir~obj_name IN s_rest ORDER BY enhincinx~enhname.
IF lt_enhincinx IS NOT INITIAL.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
READ TABLE lt_enhincinx TRANSPORTING NO FIELDS
WITH KEY enhname = l_str_tadir-obj_name BINARY SEARCH.
IF sy-subrc NE 0.
DELETE l_tab_tadir INDEX l_tabix_str.
ENDIF.
ENDLOOP.
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDIF.
* Process all program sources
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'Report'(009) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
READ TABLE lt_enhincinx INTO ls_enhincinx
WITH KEY enhname = l_str_tadir-obj_name BINARY SEARCH.
IF sy-subrc EQ 0.
l_rep_name = ls_enhincinx-enhinclude.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING l_str_tadir-devclass
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " scan_devc_enh
*&---------------------------------------------------------------------*
*& Form scan_devc_add
*&---------------------------------------------------------------------*
FORM scan_devc_add USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
IF p_type EQ con_true.
PERFORM scan_devc_type
USING u_devc u_index u_count u_cnt_line.
ENDIF.
IF p_enh EQ con_true.
PERFORM scan_devc_enh
USING u_devc u_index u_count u_cnt_line.
ENDIF.
IF p_mod EQ con_true.
IF p_prog EQ con_true.
PERFORM scan_devc_prog_mod
USING u_devc u_index u_count u_cnt_line.
ENDIF.
IF p_fugr EQ con_true.
PERFORM scan_devc_fugr_mod
USING u_devc u_index u_count u_cnt_line.
ENDIF.
IF p_cinc EQ con_true.
PERFORM scan_devc_class_mod
USING u_devc u_index u_count u_cnt_line.
ENDIF.
ENDIF.
IF p_smf EQ con_true.
PERFORM scan_devc_smf
USING u_devc u_index u_count u_cnt_line.
ENDIF.
ENDFORM. " scan_devc_add
*&---------------------------------------------------------------------*
*& Form scan_devc_prog_mod
*&---------------------------------------------------------------------*
FORM scan_devc_prog_mod USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE t_tab_long_lines, "CB
l_text TYPE itex132.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get programs of current package
REFRESH l_tab_tadir.
STATICS: sv_prog TYPE flag.
DATA: lt_obj_name TYPE STANDARD TABLE OF tadir-obj_name.
IF sv_prog IS INITIAL.
SELECT DISTINCT obj_name INTO TABLE lt_obj_name FROM smodilog
WHERE obj_type EQ 'PROG'
AND operation NE 'NOTE'
AND obj_name IN s_rest
ORDER BY obj_name.
IF lt_obj_name IS NOT INITIAL.
SELECT * APPENDING TABLE l_tab_tadir FROM tadir
FOR ALL ENTRIES IN lt_obj_name
WHERE pgmid EQ 'R3TR' AND object EQ 'PROG' AND
obj_name EQ lt_obj_name-table_line.
IF sy-subrc EQ 0.
SORT l_tab_tadir BY pgmid object obj_name.
DELETE ADJACENT DUPLICATES FROM l_tab_tadir
COMPARING pgmid object obj_name.
ENDIF.
ENDIF.
sv_prog = abap_true.
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of programs into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ENDIF.
* Process all program sources
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'Report'(009) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* Read program source and search for specified strings
* write: / l_str_tadir-obj_name.
l_rep_name = l_str_tadir-obj_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING l_str_tadir-devclass
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDLOOP.
ENDFORM. " scan_devc_prog_mod
*&---------------------------------------------------------------------*
*& Form scan_devc_fugr_mod
*&---------------------------------------------------------------------*
FORM scan_devc_fugr_mod USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_tab_e071 TYPE TABLE OF e071,
l_str_e071 TYPE e071,
l_str_tfdir TYPE tfdir,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE TABLE OF t_abapsource_long, "CB
l_text TYPE itex132.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get function pools of current package
REFRESH l_tab_tadir.
STATICS: sv_fugr TYPE flag.
DATA: lt_obj_name TYPE STANDARD TABLE OF tadir-obj_name.
IF sv_fugr IS INITIAL.
SELECT DISTINCT obj_name INTO TABLE lt_obj_name FROM smodilog
WHERE obj_type EQ 'FUGR'
AND operation NE 'NOTE'
AND obj_name IN s_rest
ORDER BY obj_name.
IF lt_obj_name IS NOT INITIAL.
SELECT * APPENDING TABLE l_tab_tadir FROM tadir
FOR ALL ENTRIES IN lt_obj_name
WHERE pgmid EQ 'R3TR'
AND object EQ 'FUGR'
AND obj_name EQ lt_obj_name-table_line.
IF sy-subrc EQ 0.
SORT l_tab_tadir BY pgmid object obj_name.
DELETE ADJACENT DUPLICATES FROM l_tab_tadir COMPARING pgmid object obj_name.
ENDIF.
ENDIF.
sv_fugr = abap_true.
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of function pools into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
EXIT.
ENDIF.
* Process all function pools
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'FuGr'(011) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* Get function pool objects
* write: / l_str_tadir-obj_name.
l_str_e071-pgmid = l_str_tadir-pgmid.
l_str_e071-object = l_str_tadir-object.
l_str_e071-obj_name = l_str_tadir-obj_name.
REFRESH l_tab_e071.
CALL FUNCTION 'STOR_RESOLVE_FUGR'
EXPORTING
is_e071 = l_str_e071
TABLES
tt_e071 = l_tab_e071
EXCEPTIONS
OTHERS = 0.
* Read basis program sources and search for specified strings
LOOP AT l_tab_e071 INTO l_str_e071 WHERE object = 'REPO' .
l_rep_name = l_str_e071-obj_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING l_str_tadir-devclass
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDLOOP .
* (A) Keine generierten Dialoge?!? Das sollte man evtl. optional
* anbieten (Zeitpunkt-Routinen!)
* Read function module sources and search for specified strings
LOOP AT l_tab_e071 INTO l_str_e071 WHERE object = 'FUNC' .
IF l_str_e071-obj_name(4) = 'VIEW'. "Keine gen. Dialoge
CONTINUE.
ENDIF.
SELECT SINGLE * FROM tfdir INTO l_str_tfdir
WHERE funcname = l_str_e071-obj_name. "#EC CI_SGLSELECT
IF sy-subrc = 0.
CONCATENATE l_str_tfdir-pname 'U' l_str_tfdir-include
INTO l_rep_name.
REPLACE 'SAPL' WITH 'L' INTO l_rep_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING l_str_tadir-devclass
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP .
ENDFORM. " scan_devc_fugr_mod
*&--------------------------------------------------------------------*
*& Form scan_devc_class_mod
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->U_DEVC text
* -->U_INDEX text
* -->U_COUNT text
* -->U_CNT_LINE text
*---------------------------------------------------------------------*
FORM scan_devc_class_mod USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
DATA: l_tab_tadir TYPE TABLE OF tadir,
l_str_tadir TYPE tadir,
l_str_e071 TYPE e071,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_percentage TYPE p,
l_tabix_str(10) TYPE c,
l_rep_name TYPE sobj_name,
l_tab_source TYPE TABLE OF t_abapsource_long,
l_text TYPE itex132,
l_tab_trdir TYPE STANDARD TABLE OF trdir,
l_str_trdir LIKE LINE OF l_tab_trdir,
l_tab_selopt TYPE STANDARD TABLE OF rsdsselopt,
l_str_selopt LIKE LINE OF l_tab_selopt.
* Initialization
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
* Get classes of current package
REFRESH l_tab_tadir.
STATICS: sv_clas TYPE flag.
DATA: lt_obj_name TYPE STANDARD TABLE OF tadir-obj_name.
IF sv_clas IS INITIAL.
SELECT DISTINCT obj_name INTO TABLE lt_obj_name FROM smodilog
WHERE obj_type EQ 'CLAS'
AND operation NE 'NOTE'
AND obj_name IN s_rest
ORDER BY obj_name.
IF lt_obj_name IS NOT INITIAL.
SELECT * APPENDING TABLE l_tab_tadir FROM tadir
FOR ALL ENTRIES IN lt_obj_name
WHERE pgmid EQ 'R3TR'
AND object EQ 'CLAS'
AND obj_name EQ lt_obj_name-table_line.
IF sy-subrc EQ 0.
SORT l_tab_tadir BY pgmid object obj_name.
DELETE ADJACENT DUPLICATES FROM l_tab_tadir COMPARING pgmid object obj_name.
ENDIF.
ENDIF.
sv_clas = abap_true.
ENDIF.
* Ignore invalid TADIR entries.
DELETE l_tab_tadir WHERE obj_name IS INITIAL.
* Write count of function pools into list
DESCRIBE TABLE l_tab_tadir LINES l_cnt.
IF l_cnt = 0.
ENDIF.
* Process all function pools
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT l_tab_tadir INTO l_str_tadir.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
* Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc
'(' 'Klasse'(012) l_tabix_str 'von'(010) l_cnt_str ')'
INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* get includes for current class
REFRESH l_tab_selopt.
l_str_selopt-sign = 'I'.
l_str_selopt-option = 'CP'.
CONCATENATE l_str_tadir-obj_name '*' INTO
l_str_selopt-low.
APPEND l_str_selopt TO l_tab_selopt.
SELECT * FROM trdir INTO TABLE l_tab_trdir
WHERE name IN l_tab_selopt. "#EC CI_SGLSELECT
LOOP AT l_tab_trdir INTO l_str_trdir.
l_rep_name = l_str_e071-obj_name.
REFRESH l_tab_source.
l_rep_name = l_str_trdir-name.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING l_str_tadir-devclass
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ELSE.
FORMAT COLOR COL_NEGATIVE.
WRITE: / 'Report'(009), l_rep_name, 'nicht gefunden!'(013).
ENDIF.
ENDLOOP.
ENDLOOP .
ENDFORM. " scan_devc_class_mod
*&---------------------------------------------------------------------*
*& Form scan_devc_smf
*&---------------------------------------------------------------------*
FORM scan_devc_smf USING u_devc TYPE devclass
u_index TYPE i
u_count TYPE i
u_cnt_line TYPE n.
DATA: lt_tadir TYPE STANDARD TABLE OF stxfadmi-formname,
lt_stxfadmi TYPE STANDARD TABLE OF stxfadmi,
ls_stxfadmi TYPE stxfadmi.
DATA: l_idx_devc(10) TYPE c,
l_cnt_devc(10) TYPE c,
l_aux_devc(20) TYPE c,
l_cnt TYPE i,
l_cnt_str(10) TYPE c,
l_tabix_str(10) TYPE c,
l_percentage TYPE p,
l_text TYPE itex132,
l_str_e071 TYPE e071,
l_tab_e071 TYPE TABLE OF e071,
l_rep_name TYPE sobj_name,
l_tab_source TYPE TABLE OF t_abapsource_long,
l_str_tfdir TYPE tfdir.
FREE: lt_tadir.
SELECT obj_name FROM tadir INTO TABLE lt_tadir
WHERE pgmid = 'R3TR' AND
object = 'SSFO' AND
devclass = u_devc AND
obj_name IN s_rest.
* Ignore invalid TADIR entries.
DELETE lt_tadir WHERE table_line IS INITIAL.
IF lt_tadir IS NOT INITIAL.
SELECT *
INTO TABLE lt_stxfadmi FROM stxfadmi
FOR ALL ENTRIES IN lt_tadir
WHERE stxfadmi~formname EQ lt_tadir-table_line.
ENDIF.
" Initialization
DESCRIBE TABLE lt_stxfadmi LINES l_cnt.
l_idx_devc = u_index.
l_cnt_devc = u_count.
CONCATENATE l_idx_devc '/' l_cnt_devc INTO l_aux_devc.
CONDENSE l_aux_devc.
" Process all function pools
l_cnt_str = l_cnt.
CONDENSE l_cnt_str.
LOOP AT lt_stxfadmi INTO ls_stxfadmi.
l_tabix_str = sy-tabix.
CONDENSE l_tabix_str.
" Display progress indicator
l_percentage = 100 * ( sy-tabix / l_cnt ).
CONCATENATE 'Scanne Paket'(008) u_devc l_aux_devc '(' 'FuGr'(011) l_tabix_str 'von'(010) l_cnt_str ')' INTO l_text SEPARATED BY space.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = l_percentage
text = l_text.
* Get function pool objects
l_str_e071-pgmid = 'R3TR'.
l_str_e071-object = 'FUGR'.
CONCATENATE '/1BCDWB/SF' ls_stxfadmi-fmnumb INTO l_str_e071-obj_name.
REFRESH l_tab_e071.
CALL FUNCTION 'STOR_RESOLVE_FUGR'
EXPORTING
is_e071 = l_str_e071
TABLES
tt_e071 = l_tab_e071
EXCEPTIONS
OTHERS = 0.
* Read basis program sources and search for specified strings
LOOP AT l_tab_e071 INTO l_str_e071 WHERE object = 'REPO' .
l_rep_name = l_str_e071-obj_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING u_devc
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDLOOP .
LOOP AT l_tab_e071 INTO l_str_e071 WHERE object = 'FUNC' .
IF l_str_e071-obj_name(4) = 'VIEW'. "Keine gen. Dialoge
CONTINUE.
ENDIF.
SELECT SINGLE * FROM tfdir INTO l_str_tfdir WHERE funcname = l_str_e071-obj_name. "#EC CI_SGLSELECT
IF sy-subrc = 0.
CONCATENATE l_str_tfdir-pname 'U' l_str_tfdir-include INTO l_rep_name.
REPLACE 'SAPL' WITH 'L' INTO l_rep_name.
REFRESH l_tab_source.
READ REPORT l_rep_name INTO l_tab_source STATE 'I'.
IF sy-subrc NE 0.
READ REPORT l_rep_name INTO l_tab_source.
ENDIF.
IF sy-subrc = 0.
PERFORM scan_prog USING u_devc
l_rep_name
u_cnt_line
CHANGING l_tab_source. "CB
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM. " scan_devc_smf
ENDENHANCEMENT.