Текущее время: Пт, мар 29 2024, 10:13

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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