Текущее время: Ср, июн 20 2018, 03:49

Часовой пояс: 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
Сообщения: 93
может быть и пригодилось бы, но за у нас за модификацию стандарта по головке не погладят. А у вас именно она и предлагается...
Но все равно спасибо за предоставленную возможность.


Принять этот ответ
Вернуться к началу
 Профиль Отправить 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
Сообщения: 93
тогда, я думаю, форум выбран неправильно)


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

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


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

Сейчас этот форум просматривают: BingBot


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

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