Текущее время: Пт, апр 19 2024, 02:46

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: CODE_SCANNER
СообщениеДобавлено: Чт, июл 23 2015, 15:29 
Ассистент
Ассистент

Зарегистрирован:
Чт, мар 22 2012, 16:13
Сообщения: 42
Пол: Мужской
Давно заботит вопрос почему такая удобная транзакция как CODE_SCANNER не ищет по текстам неявных расширений, разобрался с логикой работы отчета AFX_CODE_SCANNER, внес модификации и теперь дополнительно можно искать по:
Группам типов
Расширениям
Пользовательским модификациям стандарта

Может кому пригодиться :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Чт, июл 23 2015, 15:38 
Ассистент
Ассистент

Зарегистрирован:
Чт, мар 22 2012, 16:13
Сообщения: 42
Пол: Мужской
Собственно сам исходный код:
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.
*{   INSERT         SAPKXXXXXX                                        1
PARAMETERS: p_type AS CHECKBOX DEFAULT con_true, " Группы типов
            p_enh  AS CHECKBOX DEFAULT con_true, " Расширения
            p_mod  AS CHECKBOX DEFAULT con_true. " Модификации стандарта
*}   INSERT

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.



****************begin package structure explosion
***************************
  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.
****************end package structure explosion
***************************


* Write count of packages into list
**  FORMAT COLOR COL_TOTAL INTENSIFIED ON.
**  WRITE: / 'Anzahl gefundener Pakete:', l_cnt.

* 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
**  FORMAT COLOR COL_GROUP INTENSIFIED ON.
**  SKIP.
**  WRITE: / 'Paket:', u_devc.
**  SKIP.

* 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.
*{   INSERT         SAPKXXXXXX                                        1
  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.
*}   INSERT
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.
  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.

*{   INSERT         SAPKXXXXXX                                        1
  IF p_mod EQ con_true.
    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' 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.
  ENDIF.
*}   INSERT
* 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.
**    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**    WRITE: / 'Keine Programme in Paket',
**             u_devc, 'gefunden'.
    EXIT.
  ENDIF.
**  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**  WRITE: / 'Anzahl gefundener Programme in Paket',
**           u_devc, ':', l_cnt.
**  SKIP.

* 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.
*{   REPLACE        SAPKXXXXXX                                        2
*\      PERFORM scan_prog USING    u_devc
*\                                 l_rep_name
*\                                 u_cnt_line
*\                        CHANGING l_tab_source.     "CB
      PERFORM scan_prog USING    l_str_tadir-devclass
                                 l_rep_name
                                 u_cnt_line
                        CHANGING l_tab_source.     "CB
*}   REPLACE

**    ELSE.
**      FORMAT COLOR COL_NEGATIVE.
**      WRITE: / 'Report', l_rep_name, 'nicht gefunden!'.
    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.
  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.

*{   INSERT         SAPKXXXXXX                                        1
  IF p_mod EQ con_true.
    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' 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.
  ENDIF.
*}   INSERT
* 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.
**    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**    WRITE: / 'Keine Funktionsgruppen in Paket',
**             u_devc, 'gefunden'.
    EXIT.
  ENDIF.
**  SKIP.
**  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**  WRITE: / 'Anzahl gefundener Funktionsgruppen in Paket',
**           u_devc, ':', l_cnt.
**  SKIP.

* 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.
*{   REPLACE        SAPKXXXXXX                                        2
*\        PERFORM scan_prog USING    u_devc
*\                                   l_rep_name
*\                                   u_cnt_line
*\                          CHANGING l_tab_source.       "CB
        PERFORM scan_prog USING    l_str_tadir-devclass
                                   l_rep_name
                                   u_cnt_line
                          CHANGING l_tab_source.       "CB
*}   REPLACE
**      ELSE.
**        FORMAT COLOR COL_NEGATIVE.
**        WRITE: / 'Report', l_rep_name, 'nicht gefunden!'.
      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.
*{   REPLACE        SAPKXXXXXX                                        3
*\          PERFORM scan_prog USING    u_devc
*\                                     l_rep_name
*\                                     u_cnt_line
*\                            CHANGING l_tab_source.     "CB
          PERFORM scan_prog USING    l_str_tadir-devclass
                                     l_rep_name
                                     u_cnt_line
                            CHANGING l_tab_source.     "CB
*}   REPLACE
**        ELSE.
**          FORMAT COLOR COL_NEGATIVE.
**          WRITE: / 'Report', l_rep_name, 'nicht gefunden!'.
        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.
  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.

*{   INSERT         SAPKXXXXXX                                        1
  IF p_mod EQ con_true.
    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' 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.
  ENDIF.
*}   INSERT
* 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.
*    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*    WRITE: / 'Keine Klassen in Entwicklungsklasse',
*             u_devc, 'gefunden'.
*    EXIT.
  ENDIF.
*  SKIP.
*  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*  WRITE: / 'Anzahl gefundener Klassen in Entwicklungsklasse',
*           u_devc, ':', l_cnt.
*  SKIP.

* 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.
*{   REPLACE        SAPKXXXXXX                                        2
*\        PERFORM scan_prog USING    u_devc
*\                                   l_rep_name
*\                                   u_cnt_line
*\                          CHANGING l_tab_source.     "CB
        PERFORM scan_prog USING    l_str_tadir-devclass
                                   l_rep_name
                                   u_cnt_line
                          CHANGING l_tab_source.     "CB
*}   REPLACE
      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.

**      IF l_out_progname IS INITIAL.
**        l_flg_found    = con_true.
**        l_out_progname = con_true.
**        WRITE: / i_objname COLOR COL_KEY.
**
**        HIDE g_line_object.
**        l_line = g_line_number.
**        g_line_number = 1.
**        HIDE g_line_number.
**        g_line_number = l_line.
**
**      ENDIF.

**      IF l_flg_write = con_true.
**        FORMAT COLOR COL_KEY INTENSIFIED OFF.
**        WRITE: / 'Line', g_line_number.
**      ELSE.
**        WRITE: / '    ', g_line_number.
**      ENDIF.
**
**      HIDE g_line_object.
**      HIDE g_line_number.

*      l_modulo = l_cnt_line MOD 2.
*      IF l_modulo = 0.
*        FORMAT COLOR COL_POSITIVE INTENSIFIED ON.
*      ELSE.
**      FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
*      ENDIF.
**      WRITE: l_str_source-line.
**      FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**
**      HIDE g_line_object.
**      HIDE g_line_number.

      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.
**    FORMAT COLOR COL_TOTAL.
**    WRITE: / i_objname, 'verarbeitet. Keine Stellen gefunden...'.
**    HIDE g_line_object.
**    g_line_number = 1.
**    HIDE g_line_number.

    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
*{   INSERT         SAPKXXXXXX                                        1

*&---------------------------------------------------------------------*
*&      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.
    IF u_devc <> c_devc_tmp.
      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

    ELSE.
      SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
        WHERE pgmid    = 'R3TR' AND
              object   = 'TYPE' AND
              devclass = u_devc AND
              author   = sy-uname AND
              obj_name IN s_rest.                "#EC CI_SGLSELECT
    ENDIF.

    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.
*  *    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*  *    WRITE: / 'Keine Programme in Paket',
*  *             u_devc, 'gefunden'.
      EXIT.
    ENDIF.
*  *  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*  *  WRITE: / 'Anzahl gefundener Programme in Paket',
*  *           u_devc, ':', l_cnt.
*  *  SKIP.

*   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.
    IF u_devc <> c_devc_tmp.
      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

    ELSE.
      SELECT * FROM tadir INTO TABLE l_tab_tadir "#EC CI_GENBUFF
        WHERE pgmid    = 'R3TR' AND
              object   = 'ENHO' AND
              devclass = u_devc AND
              author   = sy-uname AND
              obj_name IN s_rest.                "#EC CI_SGLSELECT
    ENDIF.

    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.
      IF u_devc <> c_devc_tmp.
        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.
      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 AND author EQ sy-uname
          WHERE tadir~obj_name IN s_rest ORDER BY enhincinx~enhname.
      ENDIF.
      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
*}   INSERT


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Пт, июл 24 2015, 19:15 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, авг 18 2010, 15:38
Сообщения: 97
может быть и пригодилось бы, но за у нас за модификацию стандарта по головке не погладят. А у вас именно она и предлагается...
Но все равно спасибо за предоставленную возможность.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Вс, июл 26 2015, 14:10 
Ассистент
Ассистент

Зарегистрирован:
Чт, мар 22 2012, 16:13
Сообщения: 42
Пол: Мужской
arcanist написал(а):
может быть и пригодилось бы, но за у нас за модификацию стандарта по головке не погладят...

Данное решение действительно с модификацией стандарта, но ведь ниже приведен полный полный текст CODE_SCANNER и никто не мешает создать ZCODE_SCANNER.

В общем-то можно в CODE_SCANNER весь описанный функционал можно добавить с помощью неявных расширений, но тогда не будет возможности опционально выбирать на селекционном экране что из добавленного должно отработать, а что нет.

Ну и конечно решение опубликовано дабы показать что оно возможно, а так же с тщетной надеждой что сам САП его заметит и дополнит стандарт, всем бы было хорошо и мне приятно вдвойне :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Вт, июл 28 2015, 14:17 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, авг 18 2010, 15:38
Сообщения: 97
тогда, я думаю, форум выбран неправильно)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Вт, авг 25 2020, 15:58 
Ассистент
Ассистент

Зарегистрирован:
Чт, мар 22 2012, 16:13
Сообщения: 42
Пол: Мужской
Прошло 5 лет, понадобилось применить туже доработку на новом месте.

Стал умнее, теперь реализация с использованием только неявного расширения :)

Code:
*&---------------------------------------------------------------------*
*& Report  AFX_CODE_SCANNER                                            *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

REPORT  afx_code_scanner.

...

*---------------------------------------------------------------------*
*       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
**  FORMAT COLOR COL_GROUP INTENSIFIED ON.
**  SKIP.
**  WRITE: / 'Paket:', u_devc.
**  SKIP.

* 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.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Form SCAN_DEVC, End                                                                                                                               A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 2  ZENH_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 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
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(2) Include AFX_CODE_SCANNER, End                                                                                                                     S
*$*$-Start: (2)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1  ZENH_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 END   OF BLOCK d.

INITIALIZATION.

  CONCATENATE 'Addition' TEXT-003 INTO title_d SEPARATED BY space.

  text_typ = 'Type Groups'.
  text_enh = 'Enhancements'.
  text_mod = 'Modifications'.

*&---------------------------------------------------------------------*
*&      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.
  IF u_devc <> c_devc_tmp.
    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

  ELSE.
    SELECT * FROM tadir INTO TABLE l_tab_tadir          "#EC CI_GENBUFF
      WHERE pgmid    = 'R3TR' AND
            object   = 'TYPE' AND
            devclass = u_devc AND
            author   = sy-uname AND
            obj_name IN s_rest.                       "#EC CI_SGLSELECT
  ENDIF.

  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 = con_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.
*  *    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*  *    WRITE: / 'Keine Programme in Paket',
*  *             u_devc, 'gefunden'.
    EXIT.
  ENDIF.
*  *  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*  *  WRITE: / 'Anzahl gefundener Programme in Paket',
*  *           u_devc, ':', l_cnt.
*  *  SKIP.

*   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.
    CONCATENATE '%_C' l_str_tadir-obj_name 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.

  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.
  IF u_devc <> c_devc_tmp.
    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

  ELSE.
    SELECT * FROM tadir INTO TABLE l_tab_tadir          "#EC CI_GENBUFF
      WHERE pgmid    = 'R3TR' AND
            object   = 'ENHO' AND
            devclass = u_devc AND
            author   = sy-uname AND
            obj_name IN s_rest.                       "#EC CI_SGLSELECT
  ENDIF.

  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 = con_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.
    IF u_devc <> c_devc_tmp.
      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.
    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 AND author EQ sy-uname
        WHERE tadir~obj_name IN s_rest ORDER BY enhincinx~enhname.
    ENDIF.
    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.
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 = con_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.
**    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**    WRITE: / 'Keine Programme in Paket',
**             u_devc, 'gefunden'.
    EXIT.
  ENDIF.
**  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**  WRITE: / 'Anzahl gefundener Programme in Paket',
**           u_devc, ':', l_cnt.
**  SKIP.

* 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

**    ELSE.
**      FORMAT COLOR COL_NEGATIVE.
**      WRITE: / 'Report', l_rep_name, 'nicht gefunden!'.
    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 = con_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.
**    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**    WRITE: / 'Keine Funktionsgruppen in Paket',
**             u_devc, 'gefunden'.
    EXIT.
  ENDIF.
**  SKIP.
**  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
**  WRITE: / 'Anzahl gefundener Funktionsgruppen in Paket',
**           u_devc, ':', l_cnt.
**  SKIP.

* 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
**        ELSE.
**          FORMAT COLOR COL_NEGATIVE.
**          WRITE: / 'Report', l_rep_name, 'nicht gefunden!'.
        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 = con_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.
*    FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*    WRITE: / 'Keine Klassen in Entwicklungsklasse',
*             u_devc, 'gefunden'.
*    EXIT.
  ENDIF.
*  SKIP.
*  FORMAT COLOR COL_NORMAL INTENSIFIED ON.
*  WRITE: / 'Anzahl gefundener Klassen in Entwicklungsklasse',
*           u_devc, ':', l_cnt.
*  SKIP.

* 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

ENDENHANCEMENT.
*$*$-End:   (2)---------------------------------------------------------------------------------$*$*


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Чт, мар 10 2022, 11:17 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 02 2006, 11:27
Сообщения: 51
Откуда: Ярославль
Пол: Мужской
Спасибо, Andrey.Pyrikov!
Благодаря этой статье доработал RS_ABAP_SOURCE_SCAN, теперь он может искать код не только в PROG, FUGR, CLAS, INTF, DYNPRO, но и в ST/XSLT, CDS, ENHO, TYPE-POOL.
Плюс RS_ABAP_SOURCE_SCAN в том, что он может искать регулярные выражения.
Исправлений много, поэтому скопировал в Z_RS_ABAP_SOURCE_SCAN.

Code:
*----------------------------------------------------------------------*
* Scan a set of source code for a particular string
*----------------------------------------------------------------------*

"  RS_ABAP_SOURCE_SCAN copy,  one more ex is AFX_CODE_SCANNER
"  2018-07-31 Z-search for XSLT
"  2021-04-09 Z-search for CDS
"  2022-03-08 Z-search for Enhancement, type-pool


REPORT Z_RS_ABAP_SOURCE_SCAN MESSAGE-ID eu.

TYPE-POOLS:
  slis,
  sscr.

TABLES:
  seoclasstx,
  tadir,
  tlibt,
  d020s,
  trdir.
*  O2XSLTTEXT  " XSLT
*  ddddlsrc.   " CDS

CLASS:
  lcl_source_scan DEFINITION DEFERRED.

DATA:
  lo_sscan   TYPE REF TO lcl_source_scan,
  lv_sstring TYPE text255,
  lv_appl    TYPE taplt-appl.

SELECTION-SCREEN  BEGIN OF BLOCK: a05 WITH FRAME TITLE a05.
  SELECT-OPTIONS    sstring     FOR lv_sstring NO INTERVALS MODIF ID dsp.
  PARAMETERS        p_regex     TYPE xfeld AS CHECKBOX MODIF ID dsp.
SELECTION-SCREEN: END OF BLOCK a05.

SELECTION-SCREEN  BEGIN OF BLOCK a11 WITH FRAME TITLE a11.
  SELECT-OPTIONS    devclass FOR tadir-devclass.
SELECTION-SCREEN: END OF BLOCK a11.

SELECTION-SCREEN  BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
  SELECT-OPTIONS:   repname  FOR trdir-name MEMORY ID rs_scan_repid,
                    dynnr    FOR d020s-dnum.
*                  subc     FOR trdir-subc,
*                  appl     FOR lv_appl,
*                  cnam     FOR trdir-cnam MATCHCODE OBJECT user_addr,
*                  unam     FOR trdir-unam MATCHCODE OBJECT user_addr.
SELECTION-SCREEN: END OF BLOCK a10.

SELECTION-SCREEN  BEGIN OF BLOCK a12 WITH FRAME TITLE a12.
SELECT-OPTIONS:   funcgrp  FOR tlibt-area.
SELECTION-SCREEN: END OF BLOCK a12,
BEGIN OF BLOCK a13 WITH FRAME TITLE a13.
SELECT-OPTIONS:   p_class  FOR seoclasstx-clsname.
SELECTION-SCREEN: END OF BLOCK a13.

" { 2018-07-31 Z-search in XSLT
DATA ls_o2xslttext TYPE o2xslttext.
DATA ls_ddddlsrc TYPE ddddlsrc.
SELECTION-SCREEN  BEGIN OF BLOCK z01 WITH FRAME.
  SELECT-OPTIONS:   so_xslt  FOR ls_o2xslttext-xsltdesc.
  SELECT-OPTIONS:   so_cdsnm FOR ls_ddddlsrc-ddlname.
SELECTION-SCREEN: END OF BLOCK z01.
" } 2018-07-31 Z-search in XSLT

SELECTION-SCREEN  BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
PARAMETERS: plusminu(2) TYPE n DEFAULT 2,
            inclu       TYPE xfeld AS CHECKBOX DEFAULT 'X',
            modiass     TYPE xfeld AS CHECKBOX USER-COMMAND dummy,
            comment     TYPE xfeld AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK a20,
BEGIN OF BLOCK a30 WITH FRAME TITLE a30.
" { 2018-07-31 Z-search in XSLT, CDS
*PARAMETERS:       rb_code RADIOBUTTON GROUP r10,
*                  rb_dyn  RADIOBUTTON GROUP r10,
*                  rb_all  RADIOBUTTON GROUP r10.
PARAMETERS        x_code TYPE xfeld AS CHECKBOX DEFAULT 'X'.
PARAMETERS        x_dyn  TYPE xfeld AS CHECKBOX.
PARAMETERS        x_xslt TYPE xfeld AS CHECKBOX.
PARAMETERS        x_cds  TYPE xfeld AS CHECKBOX.
PARAMETERS        x_type TYPE xfeld AS CHECKBOX.
" } 2018-07-31 Z-search in XSLT, CDS
PARAMETERS        p_vers   TYPE xfeld AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK a30.

*----------------------------------------------------------------------*
*       CLASS lcx_scan_exceptions DEFINITION
*----------------------------------------------------------------------*
*       Exceptions for source scanning
*----------------------------------------------------------------------*
CLASS lcx_scan_exceptions DEFINITION INHERITING FROM cx_static_check FINAL.
ENDCLASS.                    "lcx_scan_exceptions DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_source_scan DEFINITION
*----------------------------------------------------------------------*
*       ABAP source scanner
*----------------------------------------------------------------------*
CLASS lcl_source_scan DEFINITION FINAL.
  PUBLIC SECTION.
    METHODS:
      constructor,

      f4_class
        CHANGING
          cv_class_name TYPE clike,

      f4_function_group
        IMPORTING
          iv_group_name TYPE clike,

      f4_repname
        CHANGING
          cv_repname TYPE clike,

      pbo,

      start.

  PROTECTED SECTION.
    TYPES:
      BEGIN OF ty_dynpro,
        repname LIKE d020s-prog,
        dynnr   LIKE d020s-dnum,
      END OF ty_dynpro.

    TYPES:
      BEGIN OF ty_ls_objname,
        report TYPE sy-repid,
        dynnr  TYPE sy-dynnr,
      END OF ty_ls_objname.

    DATA:
      go_alv        TYPE REF TO cl_salv_hierseq_table,
      gv_hit_count  TYPE i,
      gv_sstring    TYPE string,
      gv_dynp_found TYPE xfeld,
      gv_vers_found TYPE xfeld,
      gt_dynpro     TYPE STANDARD TABLE OF ty_dynpro,
      gt_object     TYPE STANDARD TABLE OF tadir-obj_name,
      gt_vrsd       TYPE HASHED TABLE OF vrsd
                      WITH UNIQUE KEY objname versno,
      gt_source     TYPE abaptxt255_tab,
      gv_report     TYPE syrepid,
      gv_dynpro     TYPE sydynnr,

      BEGIN OF gs_alv_header,
        repname TYPE tadir-obj_name,
        dynnr   TYPE sy-dynnr,
        expand  TYPE xfeld,
        versno  TYPE vrsd-versno,
      END OF gs_alv_header,

      gt_alv_header LIKE STANDARD TABLE OF gs_alv_header,

      BEGIN OF gs_alv_item,
        repname    TYPE sy-repid,
        dynnr      TYPE sy-dynnr,
        versno     TYPE vrsd-versno,
        line_no    TYPE rsrow,
        text       TYPE text255,
        hit        TYPE xfeld,
        cell_color TYPE lvc_t_scol,
      END OF gs_alv_item,

      gt_alv_item LIKE STANDARD TABLE OF gs_alv_item.

    CONSTANTS:
      gc_x TYPE xfeld VALUE 'X'.

    METHODS:
      add_to_hitlist
        IMPORTING
          iv_report      TYPE clike
          iv_dynpro      TYPE clike OPTIONAL
          iv_source_line TYPE clike
          iv_tabix       TYPE sy-tabix
          iv_hit         TYPE xfeld
          iv_versno      TYPE vrsd-versno,

      call_abap_editor
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      call_screen_painter
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      display,

      display_abap_version
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      display_screen_painter_version
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      display_version_management
        IMPORTING
          is_alv_header LIKE gs_alv_header,

      get_alv_instance,
      get_dynpro_flow_logic
        IMPORTING
                  iv_report       TYPE clike
                  iv_dynpro       TYPE clike
        RETURNING VALUE(rt_dflow) TYPE abaptxt255_tab,

      get_hit_set
        IMPORTING
          iv_report TYPE clike
          iv_dynpro TYPE clike OPTIONAL
          it_abap   TYPE abaptxt255_tab
          iv_tabix  TYPE sy-tabix
          iv_versno TYPE vrsd-versno,

      get_version_numbers
        IMPORTING
                  iv_report      TYPE clike
                  iv_dynpro      TYPE clike OPTIONAL
        RETURNING VALUE(rt_vrsd) LIKE gt_vrsd,

      get_dynpros,
      get_source_names,

      get_source_by_version
        IMPORTING
                  iv_report      TYPE clike
                  iv_dynpro      TYPE clike OPTIONAL
                  iv_versno      TYPE vrsd-versno
        RETURNING VALUE(rt_abap) TYPE abaptxt255_tab,

      get_report_names,
      get_function_names,
      get_class_names,
      get_interface_names,
      get_includes,

      search_abap_source   RAISING lcx_scan_exceptions,
      search_dynpro_source RAISING lcx_scan_exceptions,
      " { 2018-07-31 Z-search in XSLT
      search_xslt_source   RAISING lcx_scan_exceptions,
      search_cds_source    RAISING lcx_scan_exceptions,
      search_enh_source    RAISING lcx_scan_exceptions,
      search_type_source   RAISING lcx_scan_exceptions,
      " } 2018-07-31 Z-search in XSLT

      search_source        RAISING lcx_scan_exceptions,

      set_alv_attributes,

      on_link_click
        FOR EVENT link_click OF cl_salv_events_hierseq
        IMPORTING
          sender
          level
          row
          column.

ENDCLASS.                    "lcl_source_scan DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_source_scan IMPLEMENTATION
*----------------------------------------------------------------------*
*       ABAP source scanner
*----------------------------------------------------------------------*
CLASS lcl_source_scan IMPLEMENTATION.
**********************************************************************
*
**********************************************************************
  METHOD display_screen_painter_version.
    DATA:
      lv_object_name TYPE versobjnam,
      ls_infolna     TYPE vrsinfolna,
      ls_infolnb     TYPE vrsinfolnb,
      ls_vrsd        LIKE LINE OF gt_vrsd,
      ls_object_name TYPE ty_ls_objname.

    ls_object_name-report = is_alv_item-repname.
    ls_object_name-dynnr  = is_alv_item-dynnr.
    lv_object_name        = ls_object_name.

    READ TABLE gt_vrsd WITH TABLE KEY objname = lv_object_name
                                      versno  = is_alv_item-versno
                                      INTO ls_vrsd.

    CHECK sy-subrc IS INITIAL.

    ls_infolna = lv_object_name.
    MOVE-CORRESPONDING ls_vrsd TO ls_infolnb.

    CALL FUNCTION 'RS_SCRP_SHOW_VERS'
      EXPORTING
        infolna = ls_infolna
        infolnb = ls_infolnb
        objname = lv_object_name
        versno  = is_alv_item-versno
      EXCEPTIONS
        OTHERS  = 0.

  ENDMETHOD.                    "display_screen_painter_version

**********************************************************************
*
**********************************************************************
  METHOD display_abap_version.
    DATA:
      lt_trdir       TYPE STANDARD TABLE OF trdir,
      lv_object_name TYPE versobjnam,
      lv_title       TYPE sy-title,
      lt_abap        TYPE abaptxt255_tab.

    lv_object_name = is_alv_item-repname.

*   Display report version
    CALL FUNCTION 'SVRS_GET_REPS_FROM_OBJECT'
      EXPORTING
        object_name                  = lv_object_name
        object_type                  = 'REPS'
        versno                       = is_alv_item-versno
        iv_no_release_transformation = gc_x
      TABLES
        repos_tab                    = lt_abap
        trdir_tab                    = lt_trdir
      EXCEPTIONS
        no_version                   = 1
        OTHERS                       = 2.

    CHECK sy-subrc IS INITIAL.

    CONCATENATE 'Programm:'(004)
                is_alv_item-repname
                'Version'(005)
                 is_alv_item-versno
                 INTO lv_title SEPARATED BY space.

    EDITOR-CALL FOR lt_abap TITLE lv_title DISPLAY-MODE.

  ENDMETHOD.                    "display_abap_version

**********************************************************************
*
**********************************************************************
  METHOD call_screen_painter.
    CALL FUNCTION 'RS_SCRP'
      EXPORTING
        abl_line    = is_alv_item-line_no
        dynnr       = is_alv_item-dynnr
        progname    = is_alv_item-repname
        wanted_mode = 'SHOW'
      EXCEPTIONS
        OTHERS      = 0.

  ENDMETHOD.                    "call_screen_painter

**********************************************************************
*
**********************************************************************
  METHOD call_abap_editor.
    CALL FUNCTION 'EDITOR_PROGRAM'
      EXPORTING
        appid   = 'PG'
        display = gc_x
        program = is_alv_item-repname
        line    = is_alv_item-line_no
        topline = is_alv_item-line_no
      EXCEPTIONS
        OTHERS  = 0.

  ENDMETHOD.                    "call_abap_editor

**********************************************************************
*
**********************************************************************
  METHOD display_version_management.
    IF is_alv_header-dynnr IS INITIAL.
*     call version management for programs
      CALL FUNCTION 'RS_PROGRAM_VERSIONS'
        EXPORTING
          progname = is_alv_header-repname
        EXCEPTIONS
          OTHERS   = 0.
    ELSE.
      CALL FUNCTION 'RS_SCRP_VERSION'
        EXPORTING
          dynnr     = is_alv_header-dynnr
          progname  = is_alv_header-repname
          no_update = gc_x.
    ENDIF.
  ENDMETHOD.                    "display_version_management


**********************************************************************
*
**********************************************************************
  METHOD constructor.
    DATA:
      ls_restrict    TYPE sscr_restrict,
      ls_opt_list    TYPE sscr_opt_list,
      ls_association TYPE sscr_ass.

    ls_opt_list-name       = 'RESTRICT'.
    ls_opt_list-options-cp = gc_x.
    ls_opt_list-options-eq = gc_x.

    APPEND ls_opt_list TO ls_restrict-opt_list_tab.

    ls_association-kind    = 'S'.
    ls_association-name    = 'SSTRING'.
    ls_association-sg_main = 'I'.
    ls_association-op_main = ls_association-op_addy = 'RESTRICT'.

    APPEND ls_association TO ls_restrict-ass_tab.

    CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
      EXPORTING
        program     = sy-repid
        restriction = ls_restrict
      EXCEPTIONS
        OTHERS      = 0.

  ENDMETHOD.                    "constructor

**********************************************************************
*
**********************************************************************
  METHOD get_dynpro_flow_logic.
    DATA: ls_dhead  TYPE d020s,
          lt_dfield TYPE STANDARD TABLE OF d021s,
          lt_dflow  TYPE STANDARD TABLE OF d022s,
          lt_dmatch TYPE STANDARD TABLE OF d023s,

          BEGIN OF ls_dynp_id,
            prog TYPE d020s-prog,
            dnum TYPE d020s-dnum,
          END OF ls_dynp_id.

    ls_dynp_id-prog = iv_report.
    ls_dynp_id-dnum = iv_dynpro.

    IMPORT DYNPRO ls_dhead lt_dfield lt_dflow lt_dmatch ID ls_dynp_id.

    rt_dflow = lt_dflow.
  ENDMETHOD.                    "get_dynpro_flow_logic

**********************************************************************
*
**********************************************************************
  METHOD on_link_click.
    DATA:
      ls_alv_header LIKE LINE OF gt_alv_header,
      ls_alv_item   LIKE LINE OF gt_alv_item.

    CASE level.
      WHEN '1'.
        READ TABLE gt_alv_header INDEX row INTO ls_alv_header.
        CHECK sy-subrc IS INITIAL.

        display_version_management( ls_alv_header ).

      WHEN '2'.
        READ TABLE gt_alv_item INDEX row INTO ls_alv_item.
        CHECK sy-subrc IS INITIAL.

        IF ls_alv_item-dynnr IS INITIAL.
          IF ls_alv_item-versno IS INITIAL.
            call_abap_editor( ls_alv_item ).
          ELSE.
            display_abap_version( ls_alv_item ).
          ENDIF.

          SET PARAMETER ID 'RID' FIELD sy-repid.
        ELSE.
*         Call screen painter
          IF ls_alv_item-versno IS INITIAL.
            call_screen_painter( ls_alv_item ).
          ELSE.
            display_screen_painter_version( ls_alv_item ).
          ENDIF.
        ENDIF.
    ENDCASE.
  ENDMETHOD.                    "on_link_click

**********************************************************************
*
**********************************************************************
  METHOD set_alv_attributes.
    DATA:
      lo_layout    TYPE REF TO cl_salv_layout,
      lo_events    TYPE REF TO cl_salv_events_hierseq,
      lo_functions TYPE REF TO cl_salv_functions_list,
      lo_level     TYPE REF TO cl_salv_hierseq_level,
      lo_column    TYPE REF TO cl_salv_column_hierseq,
      lo_columns   TYPE REF TO cl_salv_columns_hierseq,
      lt_columns   TYPE salv_t_column_ref,
      ls_columns   LIKE LINE OF lt_columns,
      lo_settings  TYPE REF TO cl_salv_display_settings,
      lv_title     TYPE lvc_title,
      lv_hits      TYPE lvc_title,
      ls_color     TYPE lvc_s_colo,
      ls_layout    TYPE salv_s_layout_key,
      lt_functions TYPE salv_t_ui_func.

*   Layout
    ls_layout-report = sy-repid.
    ls_layout-handle = 'SCAN'.

    lo_layout = go_alv->get_layout( ).
    lo_layout->set_key( ls_layout ).
    lo_layout->set_save_restriction( ).

*   Function keys/buttons
    lo_functions = go_alv->get_functions( ).
    lo_functions->set_all( gc_x ).

*   exclude the following functions (column paging buttons)
    lt_functions = lo_functions->get_functions( ).

*   Display settings
    lo_settings = go_alv->get_display_settings( ).

*   Title
    lv_hits = gv_hit_count.
    SHIFT lv_hits LEFT DELETING LEADING space.

    CONCATENATE lv_hits
                'Treffer'(001)
                INTO lv_hits SEPARATED BY space.

    lv_title = 'Source Scan für String:'(002).

    CONCATENATE lv_title
                gv_sstring
                INTO lv_title SEPARATED BY space.

    CONCATENATE lv_title
                lv_hits
                INTO lv_title SEPARATED BY ' - '.

    lo_settings->set_list_header( lv_title ).

*   Event handling
    lo_events = go_alv->get_event( ).
    SET HANDLER on_link_click FOR lo_events.

*   Field catalog
    TRY.
*       Field catalog/columns - header table
        lo_columns  = go_alv->get_columns( '1' ).
        lt_columns = lo_columns->get( ).

        TRY.
            lo_columns->set_expand_column( 'EXPAND' ).

            lo_level = go_alv->get_level( '1' ).
            lo_level->set_items_expanded( gc_x ).

          CATCH cx_salv_data_error.
        ENDTRY.

        LOOP AT lt_columns INTO ls_columns.
          CASE ls_columns-columnname.
            WHEN 'EXPAND'.
              ls_columns-r_column->set_technical( ).

            WHEN 'DYNNR'.
              IF gv_dynp_found IS INITIAL.
                ls_columns-r_column->set_technical( ).
              ELSE.
                ls_columns-r_column->set_output_length( '15' ).
              ENDIF.

            WHEN 'VERSNO'.
              IF gv_vers_found IS INITIAL.
                ls_columns-r_column->set_technical( ).
              ELSE.
                ls_columns-r_column->set_leading_zero( gc_x ).
                ls_columns-r_column->set_output_length( '15' ).
                TRY.
                    lo_column ?= ls_columns-r_column.
                    lo_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
                  CATCH cx_sy_move_cast_error.
                ENDTRY.
              ENDIF.
          ENDCASE.
        ENDLOOP.

*       Field catalog/columns - item table
        lo_columns = go_alv->get_columns( '2' ).

        TRY.
            lo_columns->set_color_column( 'CELL_COLOR' ).
          CATCH cx_salv_data_error.
        ENDTRY.

        lt_columns = lo_columns->get( ).

        LOOP AT lt_columns INTO ls_columns.
          CASE ls_columns-columnname.
            WHEN 'REPNAME'.
              ls_columns-r_column->set_technical( ).

            WHEN 'DYNNR'.
              ls_columns-r_column->set_technical( ).

            WHEN 'VERSNO'.
              ls_columns-r_column->set_technical( ).

            WHEN 'CELL_COLOR'.
              ls_columns-r_column->set_technical( ).

            WHEN 'HIT'.
              ls_columns-r_column->set_technical( ).

            WHEN 'LINE_NO'.
              ls_color-col = '4'.
              TRY.
                  lo_column ?= ls_columns-r_column.
                  lo_column->set_color( ls_color ).
                  lo_column->set_leading_zero( gc_x ).
                CATCH cx_sy_move_cast_error.
              ENDTRY.

            WHEN 'TEXT'.
              TRY.
                  lo_column ?= ls_columns-r_column.
                  lo_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
                CATCH cx_sy_move_cast_error.
              ENDTRY.

          ENDCASE.
        ENDLOOP.
      CATCH cx_salv_not_found.
    ENDTRY.

  ENDMETHOD.                    "set_alv_attributes

**********************************************************************
*
**********************************************************************
  METHOD get_alv_instance.
    DATA:
      lt_alv_bind TYPE salv_t_hierseq_binding,
      ls_alv_bind LIKE LINE OF lt_alv_bind.

    ls_alv_bind-master = ls_alv_bind-slave = 'REPNAME'.
    APPEND ls_alv_bind TO lt_alv_bind.

    ls_alv_bind-master = ls_alv_bind-slave = 'DYNNR'.
    APPEND ls_alv_bind TO lt_alv_bind.

    ls_alv_bind-master = ls_alv_bind-slave = 'VERSNO'.
    APPEND ls_alv_bind TO lt_alv_bind.

    TRY.
        CALL METHOD cl_salv_hierseq_table=>factory
          EXPORTING
            t_binding_level1_level2 = lt_alv_bind
          IMPORTING
            r_hierseq               = go_alv
          CHANGING
            t_table_level1          = gt_alv_header
            t_table_level2          = gt_alv_item.

      CATCH cx_salv_data_error.
      CATCH cx_salv_not_found.
    ENDTRY.

  ENDMETHOD.                    "get_alv_instance

**********************************************************************
*
**********************************************************************
  METHOD f4_repname.
    CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
      EXPORTING
        object_type          = 'PROG'
        object_name          = cv_repname
        suppress_selection   = 'X'
      IMPORTING
        object_name_selected = cv_repname
      EXCEPTIONS
        cancel               = 0.
  ENDMETHOD.                                                "f4_repname

**********************************************************************
*
**********************************************************************
  METHOD f4_function_group.
    DATA:
      lv_fname TYPE dynfnam.

    lv_fname = iv_group_name.

    CALL FUNCTION 'RS_HELP_HANDLING'
      EXPORTING
        dynpfield                 = lv_fname
        dynpname                  = sy-dynnr
        object                    = 'FG  '
        progname                  = sy-repid
        suppress_selection_screen = 'X'.

  ENDMETHOD.                    "f4_function_group

**********************************************************************
*
**********************************************************************
  METHOD f4_class.
    CALL FUNCTION 'F4_DD_ALLTYPES'
      EXPORTING
        object               = cv_class_name
        suppress_selection   = gc_x
        display_only         = space
        only_types_for_clifs = gc_x
      IMPORTING
        result               = cv_class_name.
  ENDMETHOD.                                                "f4_class

**********************************************************************
*
**********************************************************************
  METHOD display.

    DATA text TYPE c LENGTH 150.

    IF gv_hit_count IS INITIAL.
      MESSAGE s326 WITH gv_sstring.
      RETURN.
    ENDIF.

    IF sy-batch IS INITIAL.
      text = |DISPLAY { gv_hit_count } HITS...|.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          text = text.
    ENDIF.

    SORT gt_alv_item BY repname dynnr versno line_no hit DESCENDING.
    DELETE ADJACENT DUPLICATES FROM gt_alv_item COMPARING repname dynnr versno line_no.

    get_alv_instance( ).
    CHECK go_alv IS NOT INITIAL.

    set_alv_attributes( ).

    go_alv->display( ).

  ENDMETHOD.                    "display

**********************************************************************
*
**********************************************************************
  METHOD add_to_hitlist.
    DATA:
      ls_col LIKE LINE OF gs_alv_item-cell_color.

    gs_alv_item-repname = iv_report.
    gs_alv_item-dynnr   = iv_dynpro.
    gs_alv_item-line_no = iv_tabix.
    gs_alv_item-versno  = iv_versno.
    gs_alv_item-text    = iv_source_line.

    IF iv_hit IS NOT INITIAL.
      gs_alv_item-hit = gc_x.
      ADD 1 TO gv_hit_count.
      ls_col-fname     = 'TEXT'.
      ls_col-color-col = '5'.
      APPEND ls_col TO gs_alv_item-cell_color.
    ENDIF.

    APPEND gs_alv_item TO gt_alv_item.

    CLEAR gs_alv_item.
  ENDMETHOD.                    "add_to_hitlist

**********************************************************************
*
**********************************************************************
  METHOD get_hit_set.
    DATA: lv_end     TYPE i,
          lv_start   TYPE i,
          lv_xtabix  TYPE sy-tabix,
          lv_hitline TYPE xfeld.

    FIELD-SYMBOLS:
      <lv_abap> TYPE any.

    lv_start = iv_tabix - plusminu .
    lv_end   = iv_tabix + plusminu.

    IF lv_start < 1.
      lv_start = 1.
    ENDIF.

    WHILE lv_start <= lv_end.
      READ TABLE it_abap ASSIGNING <lv_abap> INDEX lv_start.
      IF sy-subrc IS NOT INITIAL.
        EXIT.
      ENDIF.

      lv_xtabix = sy-tabix.

      IF lv_start = iv_tabix.
        lv_hitline = gc_x.
      ELSE.
        CLEAR lv_hitline.
      ENDIF.

      ADD 1 TO lv_start.

      IF comment IS NOT INITIAL.
        IF modiass IS INITIAL.
          IF <lv_abap>(1) = '*'
          OR <lv_abap>(1) = '"'.
            CONTINUE.
          ENDIF.
        ELSE.
          IF <lv_abap>(1) = '*'.
            IF  <lv_abap>(2) = '*{' OR <lv_abap>(2) = '*}'.
            ELSE.
              CONTINUE.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.

      CALL METHOD add_to_hitlist
        EXPORTING
          iv_report      = iv_report
          iv_dynpro      = iv_dynpro
          iv_source_line = <lv_abap>
          iv_tabix       = lv_xtabix
          iv_hit         = lv_hitline
          iv_versno      = iv_versno.

    ENDWHILE.

  ENDMETHOD.                    "get_hit_set

**********************************************************************
*
**********************************************************************
  METHOD get_source_by_version.
    DATA:
      lv_object_name TYPE versobjnam,
      ls_object_name TYPE ty_ls_objname,
      lt_trdir       TYPE STANDARD TABLE OF trdir,
      lt_d022s       TYPE STANDARD TABLE OF d022s.

    IF iv_dynpro IS INITIAL.
      lv_object_name = iv_report.

      CALL FUNCTION 'SVRS_GET_REPS_FROM_OBJECT'
        EXPORTING
          object_name                  = lv_object_name
          object_type                  = 'REPS'
          versno                       = iv_versno
          iv_no_release_transformation = 'X'
        TABLES
          repos_tab                    = rt_abap
          trdir_tab                    = lt_trdir
        EXCEPTIONS
          no_version                   = 1
          OTHERS                       = 2.
    ELSE.
      ls_object_name-report = iv_report.
      ls_object_name-dynnr  = iv_dynpro.

      lv_object_name = ls_object_name.

      CALL FUNCTION 'SVRS_GET_VERSION_DYNP_40'
        EXPORTING
          object_name = lv_object_name
          versno      = iv_versno
        TABLES
          d022s_tab   = lt_d022s
        EXCEPTIONS
          OTHERS      = 1.

      CHECK sy-subrc IS INITIAL AND lt_d022s IS NOT INITIAL.

      APPEND LINES OF lt_d022s TO rt_abap.

    ENDIF.
  ENDMETHOD.                    "get_source_by_version

**********************************************************************
*
**********************************************************************
  METHOD get_version_numbers.
    DATA:
      ls_objname TYPE ty_ls_objname,
      lv_objtype TYPE vrsd-objtype,
      lv_objname TYPE versobjnam,
      lv_versno  TYPE versno,
      lt_vrsn    TYPE STANDARD TABLE OF vrsn,
      lt_vrsd    TYPE STANDARD TABLE OF vrsd.

    ls_objname-report = iv_report.
    ls_objname-dynnr  = iv_dynpro.
    lv_objname        = ls_objname.

    IF iv_dynpro IS INITIAL.
      lv_objtype = 'REPS'.
    ELSE.
      lv_objtype = 'DYNP'.
    ENDIF.

    CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'
      EXPORTING
        objname      = lv_objname
        objtype      = lv_objtype
      TABLES
        lversno_list = lt_vrsn
        version_list = lt_vrsd
      EXCEPTIONS
        OTHERS       = 1.

    CHECK sy-subrc IS INITIAL .

    SORT lt_vrsd BY objname versno.
    DELETE ADJACENT DUPLICATES FROM lt_vrsd COMPARING objname versno.

    rt_vrsd = lt_vrsd.

    DELETE TABLE rt_vrsd WITH TABLE KEY objname = lv_objname
                                        versno  = lv_versno.

    SORT rt_vrsd.

    CHECK iv_dynpro IS NOT INITIAL.
*   For dynpros we need to save the version information for the version display
*   this is not required for source code
    INSERT LINES OF rt_vrsd INTO TABLE gt_vrsd.

  ENDMETHOD.                    "get_version_Numbers

**********************************************************************
*
**********************************************************************
  METHOD search_abap_source.
    DATA:
      percentage     TYPE i,
      old_percentage TYPE i VALUE -1,
      text           TYPE c LENGTH 150.

    DATA(lv_lines_rep) = lines( gt_object ).

    LOOP AT gt_object INTO gv_report.

      IF sy-batch IS INITIAL.
        percentage = sy-tabix * 100 / lv_lines_rep.
        text = |SEARCH ABAP SOURCES ({ sy-tabix }/{ lv_lines_rep })...|.

        IF old_percentage <> percentage.
          CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
            EXPORTING
              percentage = percentage
              text       = text.
          old_percentage = percentage.
        ENDIF.
      ENDIF.

      CLEAR gt_source[].

      READ REPORT gv_report INTO gt_source.
      IF sy-subrc IS NOT INITIAL.
        CONTINUE.
      ENDIF.

      search_source( ).

    ENDLOOP.

    FREE gt_object.

  ENDMETHOD.

**********************************************************************
*
**********************************************************************
  METHOD search_source.
    DATA:
      lt_source_vers  TYPE abaptxt255_tab,
      lv_string_found TYPE xfeld,
      lt_vrsd         TYPE STANDARD TABLE OF vrsd,
      ls_vrsd         LIKE LINE OF lt_vrsd,
      lv_number       TYPE i,
      lv_index        TYPE i,
      lt_results      TYPE match_result_tab,
      ls_result       LIKE LINE OF lt_results,
      ls_sstring      LIKE LINE OF sstring.

    IF p_vers IS INITIAL.
      lv_number = 1.
    ELSE.
      lt_vrsd = get_version_numbers( iv_report = gv_report
                                     iv_dynpro = gv_dynpro ).

      lv_number = lines( lt_vrsd ) + 1.
    ENDIF.

    DO lv_number TIMES.
      CLEAR lv_string_found.

      IF sy-index = 1.
        CLEAR ls_vrsd.
      ELSE.
        lv_index = sy-index - 1.
        READ TABLE lt_vrsd INDEX lv_index INTO ls_vrsd.
        CHECK sy-subrc IS INITIAL.

        lt_source_vers = get_source_by_version( iv_report = gv_report
                                                iv_dynpro = gv_dynpro
                                                iv_versno = ls_vrsd-versno ).

        IF lt_source_vers IS NOT INITIAL.
          gt_source = lt_source_vers.
        ELSE.
          CONTINUE.
        ENDIF.
      ENDIF.

      LOOP AT sstring INTO ls_sstring.
        REFRESH lt_results.

        IF p_regex IS INITIAL.
          FIND ALL OCCURRENCES OF ls_sstring-low IN TABLE gt_source
            IN CHARACTER MODE
            IGNORING CASE
            RESULTS lt_results.
        ELSE.
          TRY.
              FIND ALL OCCURRENCES OF REGEX ls_sstring-low IN TABLE gt_source
                IN CHARACTER MODE
                IGNORING CASE
                RESULTS lt_results.
            CATCH cx_sy_regex.
*             invalid regex -> stop processing
              MESSAGE s384 WITH ls_sstring-low DISPLAY LIKE 'E'.
              RAISE EXCEPTION TYPE lcx_scan_exceptions.
          ENDTRY.
        ENDIF.

        CHECK lt_results IS NOT INITIAL.

        lv_string_found = gc_x.

        SORT lt_results BY line.
        DELETE ADJACENT DUPLICATES FROM lt_results COMPARING line.

        LOOP AT lt_results INTO ls_result.
          CALL METHOD get_hit_set
            EXPORTING
              iv_report = gv_report
              iv_dynpro = gv_dynpro
              it_abap   = gt_source
              iv_tabix  = ls_result-line
              iv_versno = ls_vrsd-versno.
        ENDLOOP.

      ENDLOOP.
      IF lv_string_found IS NOT INITIAL.
*       Add ALV header entry
        CLEAR gs_alv_header.

        gs_alv_header-repname = gv_report.
        gs_alv_header-dynnr   = gv_dynpro.
        gs_alv_header-versno  = ls_vrsd-versno.
        APPEND gs_alv_header TO gt_alv_header.

        IF gv_dynpro IS NOT INITIAL.
          gv_dynp_found = gc_x.
        ENDIF.

        IF ls_vrsd-versno IS NOT INITIAL.
          gv_vers_found = gc_x.
        ENDIF.
      ENDIF.
    ENDDO.

  ENDMETHOD.

**********************************************************************
*
**********************************************************************
  METHOD search_dynpro_source.

    DATA ls_dynpro LIKE LINE OF gt_dynpro.

    IF sy-batch IS INITIAL.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          text = 'SEARCH DYNPRO SOURCES...'.
    ENDIF.

    LOOP AT gt_dynpro INTO ls_dynpro.
      REFRESH gt_source.

      gv_report = ls_dynpro-repname.
      gv_dynpro = ls_dynpro-dynnr.

      gt_source = get_dynpro_flow_logic( iv_report =  ls_dynpro-repname
                                         iv_dynpro  = ls_dynpro-dynnr ).

      CHECK gt_source IS NOT INITIAL.

      search_source( ).

    ENDLOOP.

  ENDMETHOD.


**********************************************************************
*
**********************************************************************
  " { 2021-04-09 Z-search in CDS
  METHOD search_cds_source.

*  cl_ddic_wb_ddls_object_data...cl_ddic_adt_ddls_utility

    DATA ls_sstring LIKE LINE OF sstring.
    DATA lv_string_found TYPE xfeld.
    DATA:
      percentage     TYPE i,
      old_percentage TYPE i VALUE -1,
      text           TYPE c LENGTH 150.

    IF devclass[] IS INITIAL AND so_cdsnm[] IS INITIAL.
      RETURN.
    ENDIF.

    " CDS data
    DATA lt_ddddlsrc TYPE STANDARD TABLE OF ddddlsrc.
    DATA ls_ddddlsrc TYPE ddddlsrc.
    SELECT ddlname
           source
    FROM   ddddlsrc
    INNER  JOIN tadir ON ddddlsrc~ddlname = tadir~obj_name
    INTO   CORRESPONDING FIELDS OF TABLE lt_ddddlsrc
    WHERE  ddddlsrc~ddlname    IN so_cdsnm
    AND    tadir~devclass      IN devclass
    AND    tadir~object        = 'DDLS'.

    LOOP AT lt_ddddlsrc INTO ls_ddddlsrc.

      CLEAR lv_string_found.

      IF sy-batch IS INITIAL.
        percentage = sy-tabix * 100 / lines( lt_ddddlsrc ).
        text = |SEARCH ABAP SOURCES ({ sy-tabix }/{ lines( lt_ddddlsrc ) })...|.

        IF old_percentage <> percentage.
          CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
            EXPORTING
              percentage = percentage
              text       = text.
          old_percentage = percentage.
        ENDIF.
      ENDIF.

      DATA lt_source TYPE o2pageline_table.
      DATA ls_source TYPE o2pageline.
      CLEAR lt_source[].
*      SPLIT  ls_ddddlsrc-source AT cl_abap_char_utilities=>cr_lf INTO TABLE lt_source.

* ToDo: Split (ls_ddddlsrc-source) into table of char255.
*          APPEND VALUE #( line = ls_ddddlsrc-source  ) TO lt_source.
      DATA lt_source0 TYPE TABLE OF swastrtab.
      CALL FUNCTION 'SWA_STRING_SPLIT'
        EXPORTING
          input_string         = ls_ddddlsrc-source    "string to be split
          max_component_length = 255
        TABLES
          string_components    = lt_source0.
      LOOP AT lt_source0 ASSIGNING FIELD-SYMBOL(<ls_source0>).
        APPEND VALUE #( line = <ls_source0>-str ) TO lt_source.
      ENDLOOP.

      LOOP AT sstring INTO ls_sstring.

        DATA lt_results      TYPE match_result_tab.
        DATA ls_result       TYPE match_result.
        CLEAR lt_results[].
        IF p_regex IS INITIAL.
          FIND ALL OCCURRENCES OF ls_sstring-low IN TABLE lt_source " ls_ddddlsrc-source
            IN CHARACTER MODE
            IGNORING CASE
            RESULTS lt_results.
** line offset length submatches
** 3    14     6      Standard Table[0x2(8)]
        ELSE.
          TRY.
              FIND ALL OCCURRENCES OF REGEX ls_sstring-low IN TABLE lt_source " ls_ddddlsrc-source
                IN CHARACTER MODE
                IGNORING CASE
                RESULTS lt_results.
            CATCH cx_sy_regex.
*             invalid regex -> stop processing
              MESSAGE s384 WITH ls_sstring-low DISPLAY LIKE 'E'.
              RAISE EXCEPTION TYPE lcx_scan_exceptions.
          ENDTRY.
        ENDIF.

        CHECK lt_results IS NOT INITIAL.

        lv_string_found = gc_x.

        SORT lt_results BY line.
        DELETE ADJACENT DUPLICATES FROM lt_results COMPARING line.

        LOOP AT lt_results INTO ls_result.

          CALL METHOD get_hit_set
            EXPORTING
              iv_report = ls_ddddlsrc-ddlname "gv_report
*             iv_dynpro = gv_dynpro
              it_abap   = lt_source[]
              iv_tabix  = ls_result-line
              iv_versno = '00000'. "ls_vrsd-versno.

        ENDLOOP. " lt_results[]

      ENDLOOP.  "  sstring

      IF lv_string_found IS NOT INITIAL.
*       Add ALV header entry
        CLEAR gs_alv_header.
        gs_alv_header-repname = ls_ddddlsrc-ddlname. "gv_report.
*        gs_alv_header-dynnr   = gv_dynpro.
*        gs_alv_header-versno  = ls_vrsd-versno.
        APPEND gs_alv_header TO gt_alv_header.

*        IF gv_dynpro IS NOT INITIAL.
*          gv_dynp_found = gc_x.
*        ENDIF.
*        IF ls_vrsd-versno IS NOT INITIAL.
*          gv_vers_found = gc_x.
*        ENDIF.
      ENDIF.

    ENDLOOP.  " lt_ddddlsrc

  ENDMETHOD.
  " } 2021-04-09 Z-search in CDS

**********************************************************************
*
**********************************************************************
  " { 2018-07-31 Z-search in XSLT
  METHOD search_xslt_source.

    DATA ls_sstring LIKE LINE OF sstring.
    DATA lv_string_found TYPE xfeld.
    DATA:
      percentage     TYPE i,
      old_percentage TYPE i VALUE -1,
      text           TYPE c LENGTH 150.

    IF devclass[] IS INITIAL AND so_xslt[] IS INITIAL.
      RETURN.
    ENDIF.

    " NAMES OF XSLT
    DATA lt_xslt_name TYPE STANDARD TABLE OF o2xslttext.
    DATA ls_xslt_name TYPE o2xslttext.
    SELECT DISTINCT xsltdesc
    FROM   o2xslttext
    INNER  JOIN tadir ON o2xslttext~xsltdesc = tadir~obj_name
    INTO   CORRESPONDING FIELDS OF TABLE lt_xslt_name
    WHERE  o2xslttext~xsltdesc IN so_xslt
    AND    tadir~devclass      IN devclass
    AND    tadir~object        = 'XSLT'.

    DATA(lv_lines_xslt) = lines( lt_xslt_name ).

    LOOP AT lt_xslt_name INTO ls_xslt_name.

      CLEAR lv_string_found.

      IF sy-batch IS INITIAL.
        percentage = sy-tabix * 100 / lv_lines_xslt.
        text = |SEARCH ABAP SOURCES ({ sy-tabix }/{ lv_lines_xslt })...|.

        IF old_percentage <> percentage.
          CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
            EXPORTING
              percentage = percentage
              text       = text.
          old_percentage = percentage.
        ENDIF.
      ENDIF.

      " GET XSLT CODE
      DATA lr_xslt   TYPE REF TO   cl_o2_api_xsltdesc.
      DATA lt_source TYPE o2pageline_table.
      DATA ls_source TYPE o2pageline.
      CLEAR lt_source[].
      FREE lr_xslt.
      CALL METHOD cl_o2_api_xsltdesc=>load
        EXPORTING
          p_xslt_desc        = ls_xslt_name-xsltdesc " '/SBIS/DOC301'
        IMPORTING
          p_obj              = lr_xslt
          p_source           = lt_source[]
        EXCEPTIONS
          error_occured      = 1
          not_existing       = 2
          permission_failure = 3
          version_not_found  = 4
          OTHERS             = 5.

      LOOP AT sstring INTO ls_sstring.

        DATA lt_results      TYPE match_result_tab.
        DATA ls_result       TYPE match_result.
        CLEAR lt_results[].
        IF p_regex IS INITIAL.
          FIND ALL OCCURRENCES OF ls_sstring-low IN TABLE lt_source
            IN CHARACTER MODE
            IGNORING CASE
            RESULTS lt_results.
** line offset length submatches
** 3    14     6      Standard Table[0x2(8)]
        ELSE.
          TRY.
              FIND ALL OCCURRENCES OF REGEX ls_sstring-low IN TABLE lt_source
                IN CHARACTER MODE
                IGNORING CASE
                RESULTS lt_results.
            CATCH cx_sy_regex.
*             invalid regex -> stop processing
              MESSAGE s384 WITH ls_sstring-low DISPLAY LIKE 'E'.
              RAISE EXCEPTION TYPE lcx_scan_exceptions.
          ENDTRY.
        ENDIF.

        CHECK lt_results IS NOT INITIAL.

        lv_string_found = gc_x.

        SORT lt_results BY line.
        DELETE ADJACENT DUPLICATES FROM lt_results COMPARING line.

        LOOP AT lt_results INTO ls_result.
**        READ TABLE lt_source INTO ls_source INDEX ls_result-line.
**        CLEAR gs_tab.
**        gs_tab-name     = ls_xslt_name-xsltdesc(40).
**        gs_tab-str      = ls_source-line.
**        gs_tab-line_num = ls_result-line.
**        APPEND gs_tab TO gt_tab.

          CALL METHOD get_hit_set
            EXPORTING
              iv_report = ls_xslt_name-xsltdesc "gv_report
*             iv_dynpro = gv_dynpro
              it_abap   = lt_source[]
              iv_tabix  = ls_result-line
              iv_versno = '00000'. "ls_vrsd-versno.

        ENDLOOP. " lt_results[]

      ENDLOOP. "  sstring

      IF lv_string_found IS NOT INITIAL.
*       Add ALV header entry
        CLEAR gs_alv_header.
        gs_alv_header-repname = ls_xslt_name-xsltdesc. "gv_report.
*        gs_alv_header-dynnr   = gv_dynpro.
*        gs_alv_header-versno  = ls_vrsd-versno.
        APPEND gs_alv_header TO gt_alv_header.

*        IF gv_dynpro IS NOT INITIAL.
*          gv_dynp_found = gc_x.
*        ENDIF.
*        IF ls_vrsd-versno IS NOT INITIAL.
*          gv_vers_found = gc_x.
*        ENDIF.
      ENDIF.

    ENDLOOP. " lt_xslt_name[]

    FREE lr_xslt.

  ENDMETHOD.
  " } 2018-07-31 Z-search in XSLT


**********************************************************************
*
**********************************************************************
  " { 2022-03-08 Z-search
  METHOD search_enh_source.
    RETURN.
**   SEARCH IN ENHANCEMENT
*
*    DATA:
*      percentage     TYPE i,
*      old_percentage TYPE i VALUE -1,
*      text           TYPE c LENGTH 150.
*
*    IF devclass[] IS NOT INITIAL.
**    IF ( devclass[] IS NOT INITIAL OR repname[]  IS NOT INITIAL )
**    AND funcgrp[]  IS INITIAL
**    AND p_class[]  IS INITIAL.
*
*      SELECT DISTINCT
*             enhinclude
*      FROM   enhincinx
*      INNER  JOIN tadir
*      ON     enhincinx~enhname = tadir~obj_name
*      INTO   TABLE @DATA(lt_enh_name)
*      WHERE  tadir~pgmid    = 'R3TR'
*      AND    tadir~object   = 'ENHO'
*      AND    tadir~devclass IN @devclass.
**      AND    tadir~obj_name IN @repname.
*
**"?????????????????????? class???
*
**table ENHINCINX:
**  ENHNAME             PROGRAMNAME                         ENHINCLUDE
**  ENCH_IT_ISU A       CL_EDOC_MAP_IT================CP    ENCH_IT_ISU===================E
*
**table TADIR:
**  PGMID   OBJECT  OBJ_NAME      DEVCLASS
**  R3TR    ENHO    ENCH_IT_ISU   GLO-EDO-IT-ISU
*
**CL_EDOC_MAP_IT -> GET_SOURCE_DOCUMENT_DATA:
**    ENHANCEMENT-POINT EDOC_IT_ISU01 SPOTS ES_EDOCUMENT_IT_ISU STATIC .
**    ENHANCEMENT 1  ENCH_IT_ISU.    "active version
**     INCLUDE INCL_EDO_IT_SOURCE.
**    ENDENHANCEMENT.
*
*
*
*      DATA(lv_lines_enh) = lines( lt_enh_name ).
*
*      LOOP AT lt_enh_name ASSIGNING FIELD-SYMBOL(<ls_enh_name>).
*
*        IF sy-batch IS INITIAL.
*          percentage = sy-tabix * 100 / lv_lines_enh.
*          text = |SEARCH ABAP SOURCES ({ sy-tabix }/{ lv_lines_enh })...|.
*
*          IF old_percentage <> percentage.
*            CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
*              EXPORTING
*                percentage = percentage
*                text       = text.
*            old_percentage = percentage.
*          ENDIF.
*        ENDIF.
*
*        gv_report = <ls_enh_name>-enhinclude.
*        CLEAR gt_source[].
*
*        READ REPORT gv_report INTO gt_source.
*        IF sy-subrc IS NOT INITIAL.
*          CONTINUE.
*        ENDIF.
*
*        search_source( ).
*      ENDLOOP.
*
*      FREE lt_enh_name.
*
*    ENDIF.

  ENDMETHOD.
  " } 2022-03-08 Z-search


**********************************************************************
*
**********************************************************************
  " { 2022-03-08 Z-search
  METHOD search_type_source.

* TYPE-POOL search

    DATA:
      percentage     TYPE i,
      old_percentage TYPE i VALUE -1,
      text           TYPE c LENGTH 150.

    IF devclass[] IS INITIAL AND repname[] IS INITIAL.
      RETURN.
    ENDIF.

    SELECT obj_name
    INTO   TABLE @DATA(lt_type_name)
    FROM   tadir
    WHERE  pgmid    = 'R3TR'
    AND    object   = 'TYPE'
    AND    devclass IN @devclass
    AND    obj_name IN @repname.                        "#EC CI_GENBUFF

    DATA(lv_lines_type) = lines( lt_type_name ).

    LOOP AT lt_type_name ASSIGNING FIELD-SYMBOL(<ls_type_name>).

      IF sy-batch IS INITIAL.
        percentage = sy-tabix * 100 / lv_lines_type.
        text = |SEARCH ABAP SOURCES ({ sy-tabix }/{ lv_lines_type })...|.

        IF old_percentage <> percentage.
          CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
            EXPORTING
              percentage = percentage
              text       = text.
          old_percentage = percentage.
        ENDIF.
      ENDIF.


      gv_report = |%_C{ <ls_type_name>-obj_name }|. "%_CZR433
      CLEAR gt_source[].

      READ REPORT gv_report INTO gt_source.
      IF sy-subrc IS NOT INITIAL.
        CONTINUE.
      ENDIF.

      search_source( ).

    ENDLOOP.

    FREE lt_type_name.

  ENDMETHOD.
  " } 2022-03-08 Z-search


**********************************************************************
*
**********************************************************************
  METHOD get_dynpros.
    CHECK gt_object IS NOT INITIAL.

    SELECT prog dnum
    INTO   TABLE gt_dynpro
    FROM   d020s
    FOR    ALL ENTRIES IN gt_object
    WHERE  prog = gt_object-table_line
    AND    dnum IN dynnr.
  ENDMETHOD.                    "get_dynpros
**********************************************************************
*
**********************************************************************
  METHOD get_includes.
    DATA:
      lt_inc         TYPE STANDARD TABLE OF tadir-obj_name,
      lt_inc_tmp     LIKE lt_inc,
      lv_program     TYPE sy-repid,
      lv_obj         TYPE tadir-obj_name,
      class_name     TYPE seoclsname,
      class_includes TYPE seoincl_t.

    CHECK inclu IS NOT INITIAL.

    LOOP AT gt_object INTO lv_obj.    "for classes we already have the includes

      IF lv_obj+30(2) = 'CP'. "Class Pool
        DELETE gt_object INDEX sy-tabix.

        class_name = lv_obj(30).
        TRANSLATE class_name USING '= '.

        cl_oo_classname_service=>get_all_class_includes(
          EXPORTING class_name = class_name
          RECEIVING result     = class_includes
          EXCEPTIONS OTHERS    = 0
        ).
        DELETE class_includes WHERE table_line+30(2) = 'CS' OR table_line+30(2) = 'CP'.
        APPEND LINES OF class_includes TO lt_inc.

      ELSEIF lv_obj+30(2) = 'IP'. "Interface Pool
        DELETE gt_object INDEX sy-tabix.

        lv_obj+31(1) = 'U'.
        APPEND lv_obj TO lt_inc.
      ENDIF.

      REFRESH lt_inc_tmp.
      lv_program = lv_obj.

      CALL FUNCTION 'RS_GET_ALL_INCLUDES'
        EXPORTING
          program    = lv_program
        TABLES
          includetab = lt_inc_tmp
        EXCEPTIONS
          OTHERS     = 0.

      APPEND LINES OF lt_inc_tmp TO lt_inc.
    ENDLOOP.

    SORT lt_inc.
    DELETE ADJACENT DUPLICATES FROM lt_inc.

    APPEND LINES OF lt_inc TO gt_object.

  ENDMETHOD.


**********************************************************************
*
**********************************************************************
  METHOD get_report_names.
** { 2018-07-31 commented
**    SELECT obj_name INTO TABLE gt_object
**      FROM tadir
**      WHERE pgmid  = 'R3TR'
**      AND   object = 'PROG'
**      AND   devclass IN devclass.                "#EC CI_GENBUFF
** } 2018-07-31 commented

* { 2018-07-31 Z-search
    SELECT obj_name
    INTO   TABLE gt_object
    FROM   tadir
    WHERE  pgmid    = 'R3TR'
    AND    object   = 'PROG'
    AND    devclass IN devclass
    AND    obj_name IN repname.                         "#EC CI_GENBUFF

*   append lines of Enhancements to GT_OBJECT
    SELECT DISTINCT
           enhinclude
    FROM   enhincinx
    INNER  JOIN tadir
    ON     enhincinx~enhname = tadir~obj_name
    INTO   TABLE @DATA(lt_enh_name)
    WHERE  tadir~pgmid    = 'R3TR'
    AND    tadir~object   = 'ENHO'
    AND    tadir~devclass IN @devclass
    AND    tadir~obj_name IN @repname."ZESR2RE464_RFEKAXML

    LOOP AT lt_enh_name ASSIGNING FIELD-SYMBOL(<ls_enh_name>).
      APPEND <ls_enh_name>-enhinclude TO gt_object."ZESR2RE464_RFEKAXML===========E
    ENDLOOP.

**table TADIR:
**  PGMID   OBJECT  OBJ_NAME              DEVCLASS
**  R3TR    ENHO    ZESR2RE464_RFEKAXML   ZR2RE464
**
**table ENHINCINX:
**  ENHNAME              PROGRAMNAME   ENHINCLUDE
**  ZESR2RE464_RFEKAXML  RFEKAXML      ZESR2RE464_RFEKAXML===========E
**
**ENHANCEMENT 1  ZESR2RE464_RFEKAXML.    "active version
**  IMPORT xml = xml[] FROM MEMORY ID 'ZR2RE464_XML'.
**  CLEAR GT_ZR2R464_FIEB_SAVE[].
**ENDENHANCEMENT.

* } 2018-07-31 Z-search
  ENDMETHOD.                    "get_report_names

**********************************************************************
*
**********************************************************************
  METHOD get_function_names.
    DATA:
      lt_obj     TYPE STANDARD TABLE OF tadir-obj_name,
      lv_obj     TYPE tadir-obj_name,
      lv_fgroup  TYPE rs38l-area,
      lv_program TYPE progname.

    FIELD-SYMBOLS:
      <lv_obj> LIKE LINE OF lt_obj.

    SELECT obj_name INTO TABLE lt_obj
      FROM tadir
      WHERE pgmid  = 'R3TR'
      AND   object = 'FUGR'
      AND   devclass IN devclass
      AND   obj_name IN funcgrp.                        "#EC CI_GENBUFF

    LOOP AT lt_obj ASSIGNING <lv_obj>.
      lv_fgroup = <lv_obj>.
      CLEAR lv_program.

      CALL FUNCTION 'FUNCTION_INCLUDE_CONCATENATE'
        CHANGING
          program       = lv_program
          complete_area = lv_fgroup
        EXCEPTIONS
          OTHERS        = 1.

      CHECK sy-subrc IS INITIAL AND lv_program IS NOT INITIAL.

      lv_obj = lv_program.
      APPEND lv_obj TO gt_object.
    ENDLOOP.
  ENDMETHOD.                    "get_function_names

**********************************************************************
*
**********************************************************************
  METHOD get_class_names.
    DATA lt_obj TYPE STANDARD TABLE OF tadir-obj_name.
    DATA ls_obj TYPE tadir-obj_name.

    SELECT obj_name INTO TABLE lt_obj
      FROM tadir
      WHERE pgmid  = 'R3TR'
      AND   object = 'CLAS'
      AND   devclass IN devclass
      AND   obj_name IN p_class.                        "#EC CI_GENBUFF

    LOOP AT lt_obj INTO ls_obj.
      APPEND cl_oo_classname_service=>get_classpool_name( |{ ls_obj }| ) TO gt_object.
    ENDLOOP.


*{ 2022-03-08 Z-search
*   append lines of Enhancements to GT_OBJECT
    IF gt_object[] IS NOT INITIAL.
      SELECT DISTINCT
             enhinclude
      FROM   enhincinx
      INNER  JOIN tadir
      ON     enhincinx~enhname = tadir~obj_name
      INTO   TABLE @DATA(lt_enh_name)
      FOR    ALL ENTRIES IN @gt_object
      WHERE  tadir~pgmid           =  'R3TR'
      AND    tadir~object          =  'ENHO'
      AND    tadir~devclass        IN @devclass
      AND    enhincinx~programname =  @gt_object-table_line."CL_EDOC_MAP_IT================CP
    ENDIF.

    LOOP AT lt_enh_name ASSIGNING FIELD-SYMBOL(<ls_enh_name>).
      APPEND <ls_enh_name>-enhinclude TO gt_object. "ENCH_IT_ISU===================E
    ENDLOOP.


**table TADIR:
**  PGMID   OBJECT  OBJ_NAME      DEVCLASS
**  R3TR    ENHO    ENCH_IT_ISU   GLO-EDO-IT-ISU
**
**table ENHINCINX:
**  ENHNAME             PROGRAMNAME                         ENHINCLUDE
**  ENCH_IT_ISU A       CL_EDOC_MAP_IT================CP    ENCH_IT_ISU===================E
**
**CL_EDOC_MAP_IT -> GET_SOURCE_DOCUMENT_DATA:
**    ENHANCEMENT-POINT EDOC_IT_ISU01 SPOTS ES_EDOCUMENT_IT_ISU STATIC .
**    ENHANCEMENT 1  ENCH_IT_ISU.    "active version
**     INCLUDE INCL_EDO_IT_SOURCE.
**    ENDENHANCEMENT.

*} 2022-03-08 Z-search
  ENDMETHOD.


**********************************************************************
*
**********************************************************************
  METHOD get_interface_names.
    DATA lt_obj TYPE STANDARD TABLE OF tadir-obj_name.
    DATA ls_obj TYPE tadir-obj_name.

    SELECT obj_name INTO TABLE lt_obj
      FROM tadir
      WHERE pgmid  = 'R3TR'
      AND   object = 'INTF'
      AND   devclass IN devclass
      AND   obj_name IN p_class.                        "#EC CI_GENBUFF

    LOOP AT lt_obj INTO ls_obj.
      APPEND cl_oo_classname_service=>get_interfacepool_name( |{ ls_obj }| ) TO gt_object.
    ENDLOOP.

  ENDMETHOD.


**********************************************************************
*
**********************************************************************
  METHOD get_source_names.

    IF  devclass[] IS INITIAL
    AND repname[]  IS INITIAL
    AND funcgrp[]  IS INITIAL
    AND p_class[]  IS INITIAL
    AND so_xslt[]  IS INITIAL
    AND so_cdsnm[] IS INITIAL
    .
      MESSAGE i000(su) WITH 'Please, fill in parameters'(z01).
      RETURN.
    ENDIF.


*'PROG'
    IF ( devclass[] IS NOT INITIAL OR repname[]  IS NOT INITIAL )
    AND funcgrp[]  IS INITIAL
    AND p_class[]  IS INITIAL.
      IF x_code IS NOT INITIAL
      OR x_dyn  IS NOT INITIAL.
        get_report_names( ).
      ENDIF.
    ENDIF.

*'FUGR'
    IF ( devclass[] IS NOT INITIAL OR funcgrp[]  IS NOT INITIAL )
    AND repname[]  IS INITIAL
    AND p_class[]  IS INITIAL.
      IF x_code IS NOT INITIAL
      OR x_dyn  IS NOT INITIAL.
        get_function_names( ).
      ENDIF.
    ENDIF.

*'CLAS', 'INTF'
    IF ( devclass[] IS NOT INITIAL OR p_class[]  IS NOT INITIAL )
    AND repname[]  IS INITIAL
    AND funcgrp[]  IS INITIAL.
      IF x_code IS NOT INITIAL.
        get_class_names( ).
        get_interface_names( ).
      ENDIF.
    ENDIF.

*DYNPROS FOR 'PROG' AND 'FUGR'
    IF p_class[] IS INITIAL.
      IF NOT x_dyn IS INITIAL.   " 2018-07-31 Z-search
*     IF rb_code IS INITIAL.
        get_dynpros( ).
      ENDIF.
    ENDIF.

    SORT gt_object.
    DELETE ADJACENT DUPLICATES FROM gt_object.

  ENDMETHOD.                    "get_source_names


**********************************************************************
*
**********************************************************************
  METHOD start.
    DATA:
     ls_sstring LIKE LINE OF sstring[].

    IF sstring[] IS INITIAL AND modiass IS INITIAL.
*     Please specifiy a search term
      MESSAGE s385 DISPLAY LIKE 'E'.
      RETURN.
    ENDIF.

    IF NOT modiass IS INITIAL.
      REFRESH sstring.
      ls_sstring-sign    = 'I'.
      ls_sstring-option  = 'EQ'.
      ls_sstring-low     = '^\*\{'.
      APPEND ls_sstring TO sstring.
      ls_sstring-low     = '^\*\}'.
      APPEND ls_sstring TO sstring.

      p_regex = gc_x.
    ENDIF.

    READ TABLE sstring[] INTO ls_sstring INDEX 1.
    IF lines( sstring[] ) = 1.
      gv_sstring = ls_sstring-low.
    ELSE.
      CONCATENATE ls_sstring-low
                  '...'
                  INTO gv_sstring.
    ENDIF.

    IF sy-batch IS INITIAL.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          text = 'GET INCLUDES...'.
    ENDIF.

    get_source_names( ).
    get_includes( ).

*    IF rb_dyn IS INITIAL. " 2018-07-31 Z-search
    IF NOT x_code IS INITIAL. " 2018-07-31 Z-search
      TRY.
          search_abap_source( ).
        CATCH lcx_scan_exceptions.
          RETURN.
      ENDTRY.
    ENDIF.

*    IF rb_code IS INITIAL. " 2018-07-31 Z-search
    IF NOT x_dyn IS INITIAL. " 2018-07-31 Z-search
      TRY.
          search_dynpro_source( ).
        CATCH lcx_scan_exceptions.
          RETURN.
      ENDTRY.
    ENDIF.

* { 2018-07-31 Z-search in XSLT
    IF NOT x_xslt IS INITIAL.
      TRY.
          search_xslt_source( ).
        CATCH lcx_scan_exceptions.
          RETURN.
      ENDTRY.
    ENDIF.
* } 2018-07-31 Z-search in XSLT

* { 2021-04-09 Z-search in CDS
    IF NOT x_cds IS INITIAL.
      TRY.
          search_cds_source( ).
        CATCH lcx_scan_exceptions.
          RETURN.
      ENDTRY.
    ENDIF.
* } 2021-04-09 Z-search in CDS

*** { 2022-03-08 Z-search in ENHANCEMENT
**    IF NOT x_code IS INITIAL.
**      TRY.
**          search_enh_source( ).
**        CATCH lcx_scan_exceptions.
**          RETURN.
**      ENDTRY.
**    ENDIF.
*** } 2022-03-08 Z-search in ENHANCEMENT

* { 2022-03-08 Z-search in TYPE-POOL
    IF NOT x_type IS INITIAL.
      TRY.
          search_type_source( ).
        CATCH lcx_scan_exceptions.
          RETURN.
      ENDTRY.
    ENDIF.
* } 2022-03-08 Z-search in TYPE-POOL

    display( ).

  ENDMETHOD.                    "start


**********************************************************************
*
**********************************************************************
  METHOD pbo.
    DATA ls_screen TYPE screen.

    CHECK modiass IS NOT INITIAL.

    REFRESH sstring[].
    CLEAR   sstring.
    CLEAR   p_regex.

    LOOP AT SCREEN INTO ls_screen.
      CHECK ls_screen-group1 = 'DSP'.
      ls_screen-input = '0'.
      MODIFY SCREEN FROM ls_screen.
    ENDLOOP.
  ENDMETHOD.                    "pbo
ENDCLASS.                    "lcl_source_scan IMPLEMENTATION




Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CODE_SCANNER
СообщениеДобавлено: Чт, мар 10 2022, 11:19 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 02 2006, 11:27
Сообщения: 51
Откуда: Ярославль
Пол: Мужской
Code:

**********************************************************************
*
**********************************************************************
INITIALIZATION.
  CREATE OBJECT lo_sscan.

  a05 = 'Suchbegriff'(a05).
  a10 = 'Report/Dynpro Selektion'(a10).
  a11 = 'Paket Selektion'(a11).
  a12 = 'Funktionsgruppen Selektion'(a12).
  a13 = 'Klassen Selektion'(a13).
  a20 = 'Suchkriterien'(a20).
  a30 = 'Suchbereich'(a30).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_class-low.
  lo_sscan->f4_class( CHANGING cv_class_name = p_class-low ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_class-high.
  lo_sscan->f4_class( CHANGING cv_class_name = p_class-high ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR funcgrp-low.
  lo_sscan->f4_function_group( 'FUNCGRP-LOW' ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR funcgrp-high.
  lo_sscan->f4_function_group( 'FUNCGRP-HIGH' ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR repname-low.
  lo_sscan->f4_repname( CHANGING cv_repname = repname-low ).

AT SELECTION-SCREEN ON VALUE-REQUEST FOR repname-high.
  lo_sscan->f4_repname( CHANGING cv_repname = repname-high ).

AT SELECTION-SCREEN OUTPUT.
  lo_sscan->pbo( ).


**********************************************************************
*
**********************************************************************
START-OF-SELECTION.

  AUTHORITY-CHECK OBJECT 'S_DEVELOP'
    ID 'DEVCLASS' DUMMY
    ID 'OBJTYPE'  DUMMY
    ID 'OBJNAME'  DUMMY
    ID 'P_GROUP'  DUMMY
    ID 'ACTVT'    FIELD '03'.
  IF sy-subrc <> 0.
    MESSAGE e516(eu) WITH '03' 'S_DEVELOP'.
  ENDIF.

  lo_sscan->start( ).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB