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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Поиск кода в XSLT
СообщениеДобавлено: Вт, июл 31 2018, 17:27 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 02 2006, 11:27
Сообщения: 51
Откуда: Ярославль
Пол: Мужской
Всем доброго дня.
Создал полезную утилиту, может кому пригодится. Ищет вхождение строки в словаре трансформаций ST/XSLT.
Что-то аналогичное программе RS_ABAP_SOURCE_SCAN в стандарте.
Чтобы не изобретать велосипед, поискал в инете, нашел только это: https://blogs.sap.com/2012/01/13/how-to-scan-st-xslt-programs-for-specific-commands/
Сначала создал как отдельную программу, потом скопировал RS_ABAP_SOURCE_SCAN и вставил функционал туда.
Итак, отдельная программа:

Code:
* 2018-07-31 ZlobinYV
* Find text in XSLT.

REPORT zpr010v .

TYPE-POOLS: slis.

TABLES: o2xslttext,
        tadir,
        trdir.

DATA:
* для ALV
  fieldcat                TYPE slis_t_fieldcat_alv WITH HEADER LINE,
  gt_list_top_of_page     TYPE slis_t_listheader,
  g_top_of_page           TYPE slis_formname VALUE 'TOP_OF_PAGE',
  g_end_of_page           TYPE slis_formname VALUE 'END_OF_PAGE',
  g_top_of_list           TYPE slis_formname VALUE 'TOP_OF_LIST',
  g_end_of_list           TYPE slis_formname VALUE 'END_OF_LIST',
  gt_events               TYPE slis_t_event,
  gt_sort                 TYPE slis_t_sortinfo_alv WITH HEADER LINE,
  gt_print                TYPE slis_print_alv,
  gs_layout               TYPE slis_layout_alv,
  grid_title              TYPE  lvc_title,
  g_exit_caused_by_caller,
  gs_exit_caused_by_user
    TYPE slis_exit_by_user,
  g_repid                 LIKE sy-repid,
  g_status_set            TYPE slis_formname VALUE 'PF_STATUS_SET',
  g_user_command          TYPE slis_formname VALUE 'USER_COMMAND',
  gs_variant              LIKE disvariant,
  g_save,
  g_exit.


TYPES:
  BEGIN OF ts_tab,
    name     TYPE o2xslttext-xsltdesc,
    line_num TYPE sy-tabix,
    str(150) TYPE c,
  END OF ts_tab,
  tt_tab TYPE TABLE OF ts_tab.
DATA gt_tab    TYPE tt_tab.
DATA gs_tab    TYPE ts_tab.



SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS     p_srch(255)  TYPE c LOWER CASE OBLIGATORY.
SELECT-OPTIONS name_re FOR o2xslttext-xsltdesc.
*               DEFAULT '/SBIS/*' OPTION CP SIGN I.
SELECT-OPTIONS pckg_re FOR tadir-devclass.
*               DEFAULT '/SBIS/CORE'.
PARAMETERS:    p_vari    LIKE disvariant-variant.
SELECTION-SCREEN  END  OF BLOCK b1.



* ALV вариант
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.
  PERFORM f4_for_variant.

INITIALIZATION.

*  PERFORM eventtab_build USING gt_events[].
  g_repid = sy-repid.
  gs_layout-colwidth_optimize = ''.
*  gt_print-no_print_listinfos = 'X'.
* вариант вывода
  gs_variant-report = g_repid.
  gs_variant-handle = '0001'.
  g_save = 'A'.
  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      i_save     = g_save
    CHANGING
      cs_variant = gs_variant
    EXCEPTIONS
      not_found  = 2.
  IF sy-subrc = 0.
    p_vari = gs_variant-variant.
  ENDIF.



START-OF-SELECTION.


  PERFORM find_text_in_xslt.



END-OF-SELECTION.

  gs_variant-variant = p_vari.
  PERFORM made_fieldcat.
*  PERFORM comment_build USING gt_list_top_of_page[].


  DATA lv_lines_amount TYPE char16.
  DESCRIBE TABLE gt_tab LINES lv_lines_amount.
  CONDENSE lv_lines_amount.
  CONCATENATE '"' p_srch(10) '"'
              INTO grid_title.
  CONCATENATE grid_title '-'
              lv_lines_amount
              'Hits'
              INTO grid_title
              SEPARATED BY space.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = g_repid
      i_callback_user_command  = 'G_USER_COMMAND'
      i_callback_pf_status_set = 'PF_STATUS_SET'
      i_grid_title             = grid_title
      is_layout                = gs_layout
      it_fieldcat              = fieldcat[]
      i_default                = 'X'
      i_save                   = 'A'
      is_variant               = gs_variant
      it_events                = gt_events[]
      is_print                 = gt_print
    TABLES
      t_outtab                 = gt_tab[].

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.



*---------------------------------------------------------------------*
*       FORM pf_status_set                                            *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  RT_EXTAB                                                      *
*---------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.
*  SET PF-STATUS '/SBIS/PR0004' EXCLUDING rt_extab.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  made_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM made_fieldcat.

  CLEAR fieldcat[].

*  CLEAR fieldcat.
*  fieldcat-fieldname    = 'CHKBX'.
*  fieldcat-ref_tabname  = ''.
*  fieldcat-tabname      = 'LT_PCUST'.
*  fieldcat-seltext_s    =
*  fieldcat-seltext_m    = 'Выделить'.
*  fieldcat-seltext_l    =
*  fieldcat-reptext_ddic = 'Выделить'.
*  fieldcat-edit         = 'X'.
*  fieldcat-checkbox     = 'X'.
*  APPEND fieldcat.


  CLEAR fieldcat.
  fieldcat-fieldname     = 'NAME'.
  fieldcat-tabname       = 'GT_TAB'.
  fieldcat-seltext_s     =
  fieldcat-seltext_m     = 'XSLT NAME'.
  fieldcat-seltext_l     =
  fieldcat-reptext_ddic  = 'XSLT NAME'.
  fieldcat-outputlen     = '30'.
  APPEND fieldcat.

  CLEAR fieldcat.
  fieldcat-fieldname     = 'LINE_NUM'.
  fieldcat-tabname       = 'GT_TAB'.
  fieldcat-seltext_s     =
  fieldcat-seltext_m     = 'LINE_NUM'.
  fieldcat-seltext_l     =
  fieldcat-reptext_ddic  = 'LINE_NUM'.
  APPEND fieldcat.

  CLEAR fieldcat.
  fieldcat-fieldname     = 'STR'.
  fieldcat-tabname       = 'GT_TAB'.
  fieldcat-seltext_s     =
  fieldcat-seltext_m     = 'SOURCE CODE'.
  fieldcat-seltext_l     =
  fieldcat-reptext_ddic  = 'SOURCE CODE'.
  fieldcat-outputlen     = '100'.
  APPEND fieldcat.

*
*  CLEAR fieldcat.
*  fieldcat-fieldname     = 'ERR'.
*  fieldcat-tabname       = 'GT_TAB'.
*  fieldcat-seltext_s     =
*  fieldcat-seltext_m     = 'Ошибка'.
*  fieldcat-seltext_l     =
*  fieldcat-reptext_ddic  = 'Ошибка'.
*  APPEND fieldcat.

******************************************************
*  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
*    EXPORTING
**"     VALUE(I_PROGRAM_NAME) LIKE  SY-REPID OPTIONAL
**"     VALUE(I_INTERNAL_TABNAME) TYPE  SLIS_TABNAME OPTIONAL
*      i_structure_name       = '/SBIS/S_LIST_DOC'
**"     VALUE(I_CLIENT_NEVER_DISPLAY) TYPE  SLIS_CHAR_1 DEFAULT 'X'
**"     VALUE(I_INCLNAME) LIKE  TRDIR-NAME OPTIONAL
**"     VALUE(I_BYPASSING_BUFFER) TYPE  CHAR01 OPTIONAL
**"     VALUE(I_BUFFER_ACTIVE) TYPE  CHAR01 OPTIONAL
*    CHANGING
*      ct_fieldcat            = fieldcat[]
*    EXCEPTIONS
*      inconsistent_interface = 1
*      program_error          = 2.

ENDFORM.                    " made_fieldcat
*---------------------------------------------------------------------*
*       FORM g_user_command                                           *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  R_UCOMM                                                       *
*  -->  RS_SELFIELD                                                   *
*---------------------------------------------------------------------*
FORM g_user_command USING r_ucomm LIKE sy-ucomm
                          rs_selfield TYPE slis_selfield.
  DATA: l_str(30)     TYPE c,
        l_tabname(30) TYPE c,
        l_tabindex    TYPE i.
  DATA lc_me23n TYPE c VALUE ' '.


  MOVE rs_selfield-tabname TO l_tabname.
  TRANSLATE l_tabname TO UPPER CASE.
  MOVE rs_selfield-tabindex TO l_tabindex.
  MOVE rs_selfield-sel_tab_field TO l_str.
  TRANSLATE l_str TO UPPER CASE.
  READ TABLE gt_tab INTO gs_tab INDEX l_tabindex.

  CASE r_ucomm.
    WHEN '&IC1'.

***" error
***      CALL FUNCTION 'EDITOR_PROGRAM'
***        EXPORTING
***          appid   = 'PG'
***          display = 'X' " gc_x
***          program = gs_tab-name      "is_alv_item-repname
***          line    = gs_tab-line_num  "is_alv_item-line_no
***          topline = gs_tab-line_num  "is_alv_item-line_no
***        EXCEPTIONS
***          OTHERS  = 0.

      SET PARAMETER ID 'XSLTNAME' FIELD gs_tab-name.
      CALL TRANSACTION 'STRANS' AND SKIP FIRST SCREEN.

    WHEN OTHERS.
  ENDCASE.

  rs_selfield-refresh    = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM f4_for_variant                                           *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM f4_for_variant.

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant = gs_variant
      i_save     = g_save
    IMPORTING
      e_exit     = g_exit
      es_variant = gs_variant
    EXCEPTIONS
      not_found  = 2.
  IF sy-subrc = 2.
    MESSAGE ID sy-msgid TYPE 'S'      NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    IF g_exit = space.
      p_vari = gs_variant-variant.
    ENDIF.
  ENDIF.

ENDFORM.                    " F4_FOR_VARIANT


FORM eventtab_build USING rt_events TYPE slis_t_event.
*"Registration of events to happen during list display
  DATA: ls_event TYPE slis_alv_event.
*
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      i_list_type = 0
    IMPORTING
      et_events   = rt_events.
  READ TABLE rt_events WITH KEY name = slis_ev_top_of_page
  INTO ls_event.
  IF sy-subrc = 0.
    MOVE g_top_of_page TO ls_event-form.
    APPEND ls_event TO rt_events.
  ENDIF.
*
ENDFORM.


FORM comment_build USING lt_top_of_page TYPE slis_t_listheader.

  DATA ls_line TYPE slis_listheader.
  DATA l_datum(10) TYPE c.

* LIST HEADING LINE: TYPE H
  CLEAR ls_line.
  ls_line-typ  = 'S'.         "HSA
  CONCATENATE ' Отчет выполнен пользователем : ' sy-uname
  ' Дата ' l_datum  INTO ls_line-info.
  APPEND ls_line TO lt_top_of_page.


ENDFORM.

FORM top_of_page.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      i_logo             = 'ENJOYSAP_LOGO'
      it_list_commentary = gt_list_top_of_page.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FIND_TEXT_IN_XSLT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM find_text_in_xslt .

  DATA lv_indx TYPE sy-tabix.
  CLEAR gt_tab[].

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


  LOOP AT lt_xslt_name INTO ls_xslt_name.

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

*    LOOP AT lt_source INTO ls_source.
*      lv_indx = sy-tabix.
*      IF ls_source-line CS p_srch.
*        CLEAR gs_tab.
*        gs_tab-name     = ls_xslt_name-xsltdesc(40).
*        gs_tab-str      = ls_source-line.
*        gs_tab-line_num = lv_indx.
*        APPEND gs_tab TO gt_tab.
*      ENDIF.
*    ENDLOOP. " lt_source[]

    DATA lt_results      TYPE match_result_tab.
    DATA ls_result       TYPE match_result.

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

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

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

  ENDLOOP. " lt_xslt_name[]

  FREE lr_xslt.

ENDFORM.




Программа Z_RS_ABAP_SOURCE_SCAN , копия стандартной RS_ABAP_SOURCE_SCAN .
Code:
*----------------------------------------------------------------------*
* Scan a set of source code for a particular string
*----------------------------------------------------------------------*

"  2018-07-31 ZlobinYV. Add Z-search in XSLT.

REPORT zpr010w MESSAGE-ID eu.

TYPE-POOLS:
  slis,
  sscr.

TABLES:
  seoclasstx,
  tadir,
  tlibt,
  d020s,
  trdir.

CLASS:
  lcl_source_scan DEFINITION DEFERRED.

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

SELECTION-SCREEN  BEGIN OF BLOCK: a05 WITH FRAME TITLE a05.
SELECT-OPTIONS    sstring     FOR lv_sstring NO INTERVALS MODIF ID dsp.
PARAMETERS        p_regex     TYPE xfeld AS CHECKBOX MODIF ID dsp.
SELECTION-SCREEN: END OF BLOCK a05,
                  BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
SELECT-OPTIONS:   repname  FOR trdir-name MEMORY ID rs_scan_repid,
                  dynnr    FOR d020s-dnum,
                  subc     FOR trdir-subc,
                  appl     FOR lv_appl,
                  cnam     FOR trdir-cnam MATCHCODE OBJECT user_addr,
                  unam     FOR trdir-unam MATCHCODE OBJECT user_addr.
SELECTION-SCREEN: END OF BLOCK a10,
                  BEGIN OF BLOCK a11 WITH FRAME TITLE a11.
SELECT-OPTIONS    devclass FOR tadir-devclass.
SELECTION-SCREEN: END OF BLOCK a11,
                  BEGIN OF BLOCK a12 WITH FRAME TITLE a12.
SELECT-OPTIONS:   funcgrp  FOR tlibt-area.
SELECTION-SCREEN: END OF BLOCK a12,
                  BEGIN OF BLOCK a13 WITH FRAME TITLE a13.
SELECT-OPTIONS:   p_class  FOR seoclasstx-clsname.
SELECTION-SCREEN: END OF BLOCK a13.

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

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

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

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

      f4_class
        CHANGING
          cv_class_name TYPE clike,

      f4_function_group
        IMPORTING
          iv_group_name TYPE clike,

      f4_repname
        CHANGING
          cv_repname TYPE clike,

      pbo,

      start.

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

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

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

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

      gt_alv_header LIKE STANDARD TABLE OF gs_alv_header,

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

      gt_alv_item LIKE STANDARD TABLE OF gs_alv_item.

    CONSTANTS:
      gc_x TYPE xfeld VALUE 'X'.

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

      call_abap_editor
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      call_screen_painter
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      display,

      display_abap_version
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      display_screen_painter_version
        IMPORTING
          is_alv_item LIKE gs_alv_item,

      display_version_management
        IMPORTING
          is_alv_header LIKE gs_alv_header,

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

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

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

      get_dynpros,
      get_source_names,

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

      get_report_names,
      get_function_names,
      get_class_names,
      get_interface_names,
      get_includes,

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

      search_source        RAISING lcx_scan_exceptions,

      set_alv_attributes,

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

ENDCLASS.                    "lcl_source_scan DEFINITION

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

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

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

    CHECK sy-subrc IS INITIAL.

    ls_infolna = lv_object_name.
    MOVE-CORRESPONDING ls_vrsd TO ls_infolnb.

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

  ENDMETHOD.                    "display_screen_painter_version

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

    lv_object_name = is_alv_item-repname.

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

    CHECK sy-subrc IS INITIAL.

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

    EDITOR-CALL FOR lt_abap TITLE lv_title DISPLAY-MODE.

  ENDMETHOD.                    "display_abap_version

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

  ENDMETHOD.                    "call_screen_painter

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

  ENDMETHOD.                    "call_abap_editor

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

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

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

    APPEND ls_opt_list TO ls_restrict-opt_list_tab.

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

    APPEND ls_association TO ls_restrict-ass_tab.

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

  ENDMETHOD.                    "constructor

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

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

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

    IMPORT DYNPRO ls_dhead lt_dfield lt_dflow lt_dmatch ID ls_dynp_id.

    rt_dflow = lt_dflow.
  ENDMETHOD.                    "get_dynpro_flow_logic

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

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

        display_version_management( ls_alv_header ).

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

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

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

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

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

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

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

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

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

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

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

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

    CONCATENATE lv_title
                gv_sstring
                INTO lv_title SEPARATED BY space.

    CONCATENATE lv_title
                lv_hits
                INTO lv_title SEPARATED BY ' - '.

    lo_settings->set_list_header( lv_title ).

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

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

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

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

          CATCH cx_salv_data_error.
        ENDTRY.

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

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

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

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

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

        lt_columns = lo_columns->get( ).

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

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

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

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

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

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

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

          ENDCASE.
        ENDLOOP.
      CATCH cx_salv_not_found.
    ENDTRY.

  ENDMETHOD.                    "set_alv_attributes

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

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

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

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

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

      CATCH cx_salv_data_error.
      CATCH cx_salv_not_found.
    ENDTRY.

  ENDMETHOD.                    "get_alv_instance

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

  METHOD f4_function_group.
    DATA:
      lv_fname TYPE dynfnam.

    lv_fname = iv_group_name.

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

  ENDMETHOD.                    "f4_function_group

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

  METHOD display.

    DATA text TYPE c LENGTH 150.

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

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

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

    get_alv_instance( ).
    CHECK go_alv IS NOT INITIAL.

    set_alv_attributes( ).

    go_alv->display( ).

  ENDMETHOD.                    "display

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

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

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

    APPEND gs_alv_item TO gt_alv_item.

    CLEAR gs_alv_item.
  ENDMETHOD.                    "add_to_hitlist

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

    FIELD-SYMBOLS:
      <lv_abap> TYPE any.

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

    IF lv_start < 1.
      lv_start = 1.
    ENDIF.

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

      lv_xtabix = sy-tabix.

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

      ADD 1 TO lv_start.

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

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

    ENDWHILE.

  ENDMETHOD.                    "get_hit_set

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

    IF iv_dynpro IS INITIAL.
      lv_object_name = iv_report.

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

      lv_object_name = ls_object_name.

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

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

      APPEND LINES OF lt_d022s TO rt_abap.

    ENDIF.
  ENDMETHOD.                    "get_source_by_version

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

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

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

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

    CHECK sy-subrc IS INITIAL .

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

    rt_vrsd = lt_vrsd.

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

    SORT rt_vrsd.

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

  ENDMETHOD.                    "get_version_Numbers

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

    LOOP AT gt_object INTO gv_report.

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

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

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

      search_source( ).

    ENDLOOP.

    FREE gt_object.

  ENDMETHOD.

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

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

      lv_number = lines( lt_vrsd ) + 1.
    ENDIF.

    DO lv_number TIMES.
      CLEAR lv_string_found.

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

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

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

      LOOP AT sstring INTO ls_sstring.
        REFRESH lt_results.

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

        CHECK lt_results IS NOT INITIAL.

        lv_string_found = gc_x.

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

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

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

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

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

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

  ENDMETHOD.

  METHOD search_dynpro_source.

    DATA ls_dynpro LIKE LINE OF gt_dynpro.

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

    LOOP AT gt_dynpro INTO ls_dynpro.
      REFRESH gt_source.

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

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

      CHECK gt_source IS NOT INITIAL.

      search_source( ).

    ENDLOOP.

  ENDMETHOD.

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

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

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

    LOOP AT lt_xslt_name INTO ls_xslt_name.

      CLEAR lv_string_found.

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

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

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

      LOOP AT sstring INTO ls_sstring.

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

        CHECK lt_results IS NOT INITIAL.

        lv_string_found = gc_x.

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

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

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

        ENDLOOP. " lt_results[]

      ENDLOOP. "  sstring[]-low

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

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

    ENDLOOP. " lt_xslt_name[]

    FREE lr_xslt.

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


  METHOD get_dynpros.
    CHECK gt_object IS NOT INITIAL.

    SELECT prog dnum INTO TABLE gt_dynpro
      FROM d020s FOR ALL ENTRIES IN gt_object
      WHERE prog = gt_object-table_line
      AND   dnum IN dynnr.
  ENDMETHOD.                    "get_dynpros

  METHOD get_includes.
    DATA:
      lt_inc         TYPE STANDARD TABLE OF tadir-obj_name,
      lt_inc_tmp     LIKE lt_inc,
      lv_program     TYPE sy-repid,
      lv_obj         TYPE tadir-obj_name,
      class_name     TYPE seoclsname,
      class_includes TYPE seoincl_t.

    CHECK inclu IS NOT INITIAL.

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

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

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

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

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

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

      REFRESH lt_inc_tmp.
      lv_program = lv_obj.

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

      APPEND LINES OF lt_inc_tmp TO lt_inc.
    ENDLOOP.

    SORT lt_inc.
    DELETE ADJACENT DUPLICATES FROM lt_inc.

    APPEND LINES OF lt_inc TO gt_object.

  ENDMETHOD.

  METHOD get_report_names.
    SELECT obj_name INTO TABLE gt_object
      FROM tadir
      WHERE pgmid  = 'R3TR'
      AND   object = 'PROG'
      AND   devclass IN devclass.                       "#EC CI_GENBUFF
  ENDMETHOD.                    "get_report_names

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

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

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

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

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

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

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

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

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

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

  ENDMETHOD.

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

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

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

  ENDMETHOD.

  METHOD get_source_names.
    IF repname[] IS NOT INITIAL OR
       cnam[]    IS NOT INITIAL OR
       unam[]    IS NOT INITIAL OR
       subc[]    IS NOT INITIAL OR
       appl[]    IS NOT INITIAL.

      SELECT name APPENDING TABLE gt_object
        FROM trdir
        WHERE name IN repname
        AND   cnam IN cnam
        AND   unam IN unam
        AND   subc IN subc
        AND   appl IN appl.
    ENDIF.

    IF devclass[] IS NOT INITIAL.
      get_report_names( ).
      get_function_names( ).
      get_class_names( ).
      get_interface_names( ).
    ENDIF.

    IF funcgrp[] IS NOT INITIAL.
      get_function_names( ).
    ENDIF.

    IF p_class[] IS NOT INITIAL.
      get_class_names( ).
      get_interface_names( ).
    ENDIF.

*    IF rb_code IS INITIAL. " 2018-07-31 Z-search in XSLT
    IF NOT x_dyn IS INITIAL.   " 2018-07-31 Z-search in XSLT
      get_dynpros( ).
    ENDIF.

  ENDMETHOD.                    "get_source_names

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

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

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

      p_regex = gc_x.
    ENDIF.

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

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

    get_source_names( ).
    get_includes( ).

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

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

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

    display( ).
  ENDMETHOD.                    "start

  METHOD pbo.
    DATA ls_screen TYPE screen.

    CHECK modiass IS NOT INITIAL.

    REFRESH sstring[].
    CLEAR   sstring.
    CLEAR   p_regex.

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

INITIALIZATION.
  CREATE OBJECT lo_sscan.

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

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

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

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

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

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

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

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

START-OF-SELECTION.
  lo_sscan->start( ).


Кто дочитал до конца - молодец!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Поиск кода в XSLT
СообщениеДобавлено: Вт, июл 31 2018, 18:27 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 02 2006, 11:27
Сообщения: 51
Откуда: Ярославль
Пол: Мужской
Версионность XSLT тоже можно смотреть при помощи ФМ 'SVRS_GET_VERSION_XSLT_40', но пока не стал.


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

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


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

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


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

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