Текущее время: Ср, авг 15 2018, 03:59

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


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


ВНИМАНИЕ!

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



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

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

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


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

Зарегистрирован:
Чт, мар 22 2012, 17:13
Сообщения: 41
Пол: Мужской
Собственно сам исходный код:
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, 20:15 
Младший специалист
Младший специалист

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


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

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

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

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

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


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

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


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

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


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

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


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

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