Skip to Content
Author's profile photo Yurii Sychov

Searching and downloading Abap Web Dynpro source codes

On scn i found only one way for search in WDA source. It is a Class  CL_WDY_WB_NAMING_SERVICE  Method: GET_CLASSNAME_FOR_COMPONENT

Searching webdynpro programs

For downloading there are several programs like Mass Download  but they can’t download WDA texts.

I have found a link with such program  WDA search

and adapted it. If there is no search criteria, program show all source in ALV list.

REPORT  z_code_scanner.

TYPE-POOLS: abap, rs, slis, wdyrt.

TABLES: wdy_ctlr_compo_key, rsplf_srv, sscrfields.

CONSTANTS: c_fox          TYPE rsplf_srvtypenm VALUE ‘0RSPL_FORMULA’,
            c_type_wdy     TYPE c VALUE ‘1’,
            c_type_fox     TYPE c VALUE ‘2’.

TYPES: BEGIN OF lty_comp,
          component        TYPE wdy_component_name,
        END OF lty_comp.

TYPES: BEGIN OF lty_fox,
          srvnm            TYPE rsplf_srvnm,
        END OF lty_fox.

TYPES: BEGIN OF lty_found,
          type                TYPE char1,
          component_name      TYPE wdy_ctlr_compocomponent_name,
          controller_name     TYPE wdy_ctlr_compocontroller_name,
          cmpname             TYPE wdy_ctlr_compocmpname,
          srvnm               TYPE rsplf_srvsrvnm,
          title               TYPE string,
          line                TYPE string,
          line_num            TYPE i,
        END OF lty_found.

DATA: gt_comp         TYPE TABLE OF lty_comp WITH HEADER LINE,
       gt_fox          TYPE TABLE OF lty_fox WITH HEADER LINE,
       gt_found        TYPE TABLE OF lty_found WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) twdy FOR FIELD s_wdyc.
SELECTION-SCREEN POSITION 30.
SELECT-OPTIONS: s_wdyc          FOR wdy_ctlr_compo_keycomponent_name.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tfox FOR FIELD s_fox.
SELECTION-SCREEN POSITION 30.
SELECT-OPTIONS: s_fox           FOR rsplf_srvsrvnm.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tstr FOR FIELD p_strg.
SELECTION-SCREEN POSITION 30.
PARAMETERS: p_strg(80).
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) twdyp FOR FIELD p_wdyc.
SELECTION-SCREEN POSITION 30.
PARAMETERS: p_wdyc       TYPE char1 AS CHECKBOX DEFAULT ‘X’.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(23) tfoxp FOR FIELD p_fox.
SELECTION-SCREEN POSITION 30.
PARAMETERS: p_fox        TYPE char1 AS CHECKBOX DEFAULT ‘ ‘.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: FUNCTION KEY 1.

* INCLUDE Z79Y_CODE_SCANNER_EX_O01                .  ” PBO-Modules
* INCLUDE Z79Y_CODE_SCANNER_EX_I01                .  ” PAI-Modules
* INCLUDE Z79Y_CODE_SCANNER_EX_F01                .  ” FORM-Routines

INITIALIZATION.

   twdy = ‘Web-Dynpro-Component’.
   tfox = ‘Fox Formulas’.
   tstr = ‘Search string’.
   twdyp = ‘Search in WebDynpro Components’.
   tfoxp = ‘Search in Fox Formulas’.

   ” Set default values
   s_wdycsign   = ‘I’.
   s_wdycoption = ‘CP’.
   s_wdyclow    = ‘Z*’.
   APPEND s_wdyc.

*  s_fox-sign   = ‘I’.
*  s_fox-option = ‘CP’.
*  s_fox-low    = ‘Z*’.
*  APPEND s_fox.

   sscrfieldsfunctxt_01 = ‘Запустить code_scanner’.
*  CALL FUNCTION ‘ICON_CREATE’
*    EXPORTING
*      name                        = ‘ICON_DESELECT_ALL’
*      text                        = ”
*      info                        = ‘Отменить выделение’
**     ADD_STDINF                  = ‘X’
*    IMPORTING
*      RESULT                      = sscrfields-functxt_01
*    EXCEPTIONS
*      icon_not_found              = 1
*      outputfield_too_short       = 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.

AT SELECTION-SCREEN.
   CASE sscrfieldsucomm.
     WHEN ‘FC01’.
       CALL TRANSACTION ‘CODE_SCANNER’.
   ENDCASE.

START-OF-SELECTION.
   PERFORM main.

*&———————————————————————*
*&      Form  get_data
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM get_data CHANGING value(c_rc)   TYPE sysubrc.

   CLEAR c_rc.

   CLEAR: gt_comp, gt_fox, gt_found.
   REFRESH: gt_comp[], gt_fox[], gt_found[].

   IF p_wdyc = abap_true.
     SELECT DISTINCT component_name
       FROM wdy_component
       INTO TABLE gt_comp                                 “#EC CI_BYPASS
       WHERE component_name IN s_wdyc.                 “#EC CI_SGLSELECT
   ENDIF.

   IF p_fox = abap_true.
     SELECT DISTINCT srvnm
       FROM rsplf_srv
       INTO TABLE gt_fox
       WHERE srvnm IN s_fox
         AND objvers = rs_c_objversactive                “#EC CI_BYPASS
         AND srvtypenm = c_fox.                        “#EC CI_SGLSELECT
   ENDIF.

   IF gt_comp[] IS INITIAL AND gt_fox[] IS INITIAL.
     MESSAGE ‘Данные не выбраны’ TYPE ‘S’.
     c_rc = 1.
   ENDIF.
ENDFORM.                    ” get_data
*&———————————————————————*
*&      Form  main
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM main .

   DATA: lv_rc          TYPE sysubrc.

*  IF p_strg IS INITIAL.
*    MESSAGE ‘Fill search string’ TYPE ‘S’ DISPLAY LIKE ‘E’.
*    RETURN.
*  ENDIF.

   PERFORM get_data CHANGING lv_rc.
   IF lv_rc <> 0.
     RETURN.
   ENDIF.

   PERFORM search_wdy.
   PERFORM search_fox.

   PERFORM create_alvlist.
ENDFORM.                    ” main
*&———————————————————————*
*&      Form  search_wdy
*&———————————————————————*
*       Поиск в компонентах WebDynpro
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM search_wdy .

   TYPES: BEGIN OF lty_found_wdy_ex.
   INCLUDE TYPE lty_found.
   TYPES: code_body        TYPE wdy_ctlr_compocode_body,
        END OF lty_found_wdy_ex.

   DATA: lv_search        TYPE string,
         lt_found_wdy_ex  TYPE TABLE OF lty_found_wdy_ex,
         lt_lines         TYPE TABLE OF string,
         ls_lines like line of lt_lines,
         lt_results       TYPE TABLE OF match_result. ” WITH HEADER LINE.

   FIELD-SYMBOLS: <ls_found_wdy_ex>           TYPE lty_found_wdy_ex,
                  <ls_result>                 TYPE match_result.

   CHECK gt_comp[] IS NOT INITIAL.

   SELECT component_name controller_name cmpname code_body
     FROM wdy_ctlr_compo
     INTO CORRESPONDING FIELDS OF TABLE lt_found_wdy_ex
     FOR ALL ENTRIES IN gt_comp
     WHERE component_name = gt_compcomponent.

   LOOP AT lt_found_wdy_ex ASSIGNING <ls_found_wdy_ex>
     WHERE code_body CS p_strg.

     SPLIT <ls_found_wdy_ex>code_body AT cl_abap_char_utilities=>cr_lf
       INTO TABLE lt_lines.

    IF p_strg is not initial.
     FIND ALL OCCURRENCES OF p_strg IN TABLE lt_lines
       IGNORING CASE
       RESULTS lt_results.
     endif.

     IF sysubrc <> 0.
       BREAK-POINT.
       MESSAGE ‘Internal error occured’ TYPE ‘E’.
     ENDIF.
IF p_strg is not initial.
     LOOP AT lt_results ASSIGNING <ls_result>.

       CLEAR gt_found.
       MOVE-CORRESPONDING <ls_found_wdy_ex> TO gt_found.

       gt_foundtype = c_type_wdy.
       gt_foundline_num = <ls_result>line.
       READ TABLE lt_lines INDEX <ls_result>line INTO gt_foundline.

       CONCATENATE gt_foundcomponent_name gt_foundcontroller_name gt_foundcmpname
         INTO gt_foundtitle SEPARATED BY ‘/’.
       CONCATENATE ‘WDY:’ gt_foundtitle INTO gt_foundtitle SEPARATED BY space.

       APPEND gt_found.
     ENDLOOP.
  ELSE.
  LOOP AT lt_lines into ls_lines.

       CLEAR gt_found.
       MOVE-CORRESPONDING <ls_found_wdy_ex> TO gt_found.

       gt_foundtype = c_type_wdy.
       gt_foundline_num = sytabix.“<ls_result>-line.
       “READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
       gt_foundline = ls_lines.
       CONCATENATE gt_foundcomponent_name gt_foundcontroller_name gt_foundcmpname
         INTO gt_foundtitle SEPARATED BY ‘/’.
       CONCATENATE ‘WDY:’ gt_foundtitle INTO gt_foundtitle SEPARATED BY space.

       APPEND gt_found.
     ENDLOOP.
    endif.
   ENDLOOP.
ENDFORM.                    ” search_wdy
*&———————————————————————*
*&      Form  create_alvlist
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM create_alvlist .

   DATA: ls_layout         TYPE slis_layout_alv,
         lt_all_events     TYPE TABLE OF slis_alv_event,
         lt_events         TYPE TABLE OF slis_alv_event,
         ls_event          TYPE slis_alv_event,
         lt_fieldcat       TYPE TABLE OF slis_fieldcat_alv.

   FIELD-SYMBOLS: <ls_fieldcat>        TYPE slis_fieldcat_alv.

* Initialize Layout for activity log
   ls_layoutdetail_popup         = abap_true.
   ls_layoutdetail_initial_lines = abap_true.
   ls_layoutexpand_all           = abap_true.
   ls_layoutcolwidth_optimize    = abap_true.
   ls_layoutzebra                = abap_true.

* Get possible events
   CALL FUNCTION ‘REUSE_ALV_EVENTS_GET’
     EXPORTING
       i_list_type = 0
     IMPORTING
       et_events   = lt_all_events[].

* User-command for activity log
   READ TABLE lt_all_events WITH KEY name = slis_ev_user_command
              INTO ls_event.
   IF sysubrc = 0.
     ls_eventform = ‘ALV_USER_COMMAND’.
     APPEND ls_event TO lt_events.
   ENDIF.

   APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
   <ls_fieldcat>fieldname = ‘TITLE’.
   <ls_fieldcat>outputlen = 70.
   <ls_fieldcat>seltext_l = ‘Address’.

   APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
   <ls_fieldcat>fieldname = ‘LINE_NUM’.
   “<ls_fieldcat>-outputlen = .
   <ls_fieldcat>seltext_s = ‘String №’.

   APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
   <ls_fieldcat>fieldname = ‘LINE’.
   <ls_fieldcat>outputlen = 70.
   <ls_fieldcat>seltext_l = ‘Текст’.

   CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’
     EXPORTING
*   I_INTERFACE_CHECK                 = con_false
*   I_BYPASSING_BUFFER                = con_false
*   I_BUFFER_ACTIVE                   = ‘ ‘
       i_callback_program                = syrepid
*   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                         = ls_layout
       it_fieldcat                       = lt_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                         = lt_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                          = gt_found[]
   EXCEPTIONS
     program_error                     = 1
     OTHERS                            = 2.

   IF sysubrc <> 0.
     MESSAGE ID symsgid TYPE symsgty NUMBER symsgno
             WITH symsgv1 symsgv2 symsgv3 symsgv4.
   ENDIF.
ENDFORM.                    ” create_alvlist

*———————————————————————*
*       FORM ALV_USER_COMMAND                                         *
*———————————————————————*
FORM alv_user_command
      USING i_ucomm TYPE syucomm
            i_selfield TYPE slis_selfield.                   “#EC CALLED

   “FIELD-SYMBOLS: <ls_line>            TYPE lty_found.

   CHECK i_ucomm = ‘&IC1’.
   READ TABLE gt_found INDEX i_selfieldtabindex.
   IF sysubrc = 0.

     CASE gt_foundtype.
       WHEN c_type_wdy.
         PERFORM open_webdynpro USING gt_foundcomponent_name
                                      gt_foundcontroller_name
                                      gt_foundcmpname
                                      gt_foundline_num.
       WHEN c_type_fox.
         PERFORM open_fox_in_browser USING gt_foundsrvnm.
     ENDCASE.
   ENDIF.
*
*  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

*&———————————————————————*
*&      Form  open_webdynpro
*&———————————————————————*
*       text
*———————————————————————-*
*      –>VALUE(U_COMPONENT_NAME)   text
*      –>VALUE(U_CONTROLLER_NAME)  text
*      –>VALUE(U_METHOD)           text
*      –>VALUE(U_LINE)             text
*———————————————————————-*
FORM open_webdynpro USING value(u_component_name) TYPE wdy_ctlr_compocomponent_name
                           value(u_controller_name) TYPE wdy_ctlr_compocontroller_name
                           value(u_method) TYPE wdy_ctlr_compocmpname
                           value(u_line)   TYPE i.

   DATA: ls_cont_key        TYPE wdy_controller_key,
         lv_include         TYPE program,
         lt_map             TYPE wdyrt_line_info_tab_type WITH HEADER LINE,
         lv_line            TYPE i,
         lo_req             TYPE REF TO cl_wb_request,
         lt_request_set     TYPE swbm_wb_request_set.

   ls_cont_keycomponent_name = u_component_name.
   ls_cont_keycontroller_name = u_controller_name.

   CALL METHOD cl_wdy_wb_naming_service=>get_includename_for_controller
     EXPORTING
       p_controller       = ls_cont_key
     RECEIVING
       p_includename      = lv_include
     EXCEPTIONS
       no_generation_info = 1
       OTHERS             = 2.

   IF sysubrc <> 0.
     MESSAGE ID symsgid TYPE symsgty NUMBER symsgno
                WITH symsgv1 symsgv2 symsgv3 symsgv4.
   ENDIF.

   CALL FUNCTION ‘WDY_WB_GET_SOURCECODE_MAPPING’
     EXPORTING
       p_include          = lv_include
     IMPORTING
       p_map              = lt_map[]
*   P_HEADER           =
     EXCEPTIONS
       import_error       = 1
       OTHERS             = 2.

   IF sysubrc <> 0.
     MESSAGE ID symsgid TYPE symsgty NUMBER symsgno
             WITH symsgv1 symsgv2 symsgv3 symsgv4.
   ENDIF.

   “READ TABLE lt_map WITH KEY meta-text = u_method.
   “READ TABLE lt_map WITH KEY code-text = u_method.
   LOOP AT lt_map WHERE codetext = u_method.            “#EC CI_SORTSEQ
   ENDLOOP.

   IF sysubrc <> 0.
     MESSAGE ‘Не удалось’ TYPE ‘I’.
     RETURN.
   ENDIF.

   lv_line = lt_mapline + u_line 1.

   CALL FUNCTION ‘WDY_WB_REQUEST_FOR_SOURCEPOS’
     EXPORTING
       p_include             = lv_include
       p_line                = lv_line
       p_operation           = ‘DISPLAY’
     IMPORTING
       p_wb_request          = lo_req
     EXCEPTIONS
       no_corresponding_code = 1
       OTHERS                = 2.
   IF sysubrc <> 0.
     MESSAGE ID symsgid TYPE symsgty NUMBER symsgno
             WITH symsgv1 symsgv2 symsgv3 symsgv4.
   ENDIF.

   APPEND lo_req TO lt_request_set.

   CALL METHOD cl_wb_startup=>start
     EXPORTING
       p_wb_request_set = lt_request_set.
*  IMPORTING
*    p_wb_error          = l_error
*  CHANGING
*    p_wb_data_container = l_container.
ENDFORM.                    “open_webdynpro

*&———————————————————————*
*&      Form  search_fox
*&———————————————————————*
*       Поиск текста в формулах FOX
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM search_fox .

   DATA: lo_srv                  TYPE REF TO cl_rsplfs_srv,
         lt_param_set_rule       TYPE TABLE OF rsplfa_s_param_set_rule,
         lt_param_tab            TYPE TABLE OF REF TO if_rsplfa_param_struc,
         lv_formula_string       TYPE string,
         lo_fline                TYPE REF TO if_rsplfa_param_elem,
         lv_line                 TYPE c LENGTH 60,
         lt_forml                TYPE rspls_ts_forml,
         lt_lines                TYPE TABLE OF string,
         lt_results              TYPE TABLE OF match_result.

   FIELD-SYMBOLS: <ls_param_set_rule>       TYPE rsplfa_s_param_set_rule,
                  <ls_param_tab>            TYPE REF TO if_rsplfa_param_struc,
                  <ls_result>               TYPE match_result,
                  <ls_forml>                TYPE rspls_s_forml.

   LOOP AT gt_fox.

     TRY.
         lo_srv = cl_rsplfs_srv=>factory( gt_foxsrvnm ).
       CATCH cx_rspls_msg_static_check .
         MESSAGE e001(00) WITH ‘Ошибка cl_rsplfs_srv=>factory’ gt_foxsrvnm.
     ENDTRY.

     lt_param_set_rule = lo_srv->if_rsplfa_srv~get_param_set_rules( ).
     SORT lt_param_set_rule BY rulepos.

     LOOP AT lt_param_set_rule ASSIGNING <ls_param_set_rule>.

       ” Get FOX coding from parameters
       lt_param_tab = <ls_param_set_rule>r_param_set->get_tab_param_struc( ‘FORMULATAB’ ).

       CLEAR lv_formula_string.
       LOOP AT lt_param_tab ASSIGNING <ls_param_tab>.
         lo_fline = <ls_param_tab>->get_comp_elem( ‘FLINE’ ).
         lo_fline->get_value( IMPORTING e_value = lv_line ).
         CONCATENATE lv_formula_string lv_line INTO lv_formula_string
           RESPECTING BLANKS.
       ENDLOOP.

       ” Convert FOX coding and get field catalog for parsing
       lt_forml[] cl_rsplfc_formula=>string_to_forml_tab( lv_formula_string ).

       REFRESH lt_lines.
       LOOP AT lt_forml ASSIGNING <ls_forml>.
         APPEND <ls_forml>fline TO lt_lines.
       ENDLOOP.

       ” Find
       FIND ALL OCCURRENCES OF p_strg IN TABLE lt_lines
         IGNORING CASE
         RESULTS lt_results.

       CHECK sysubrc = 0.

       LOOP AT lt_results ASSIGNING <ls_result>.

         CLEAR gt_found.

         gt_foundtype = c_type_fox.
         gt_foundsrvnm = gt_foxsrvnm.
         gt_foundline_num = <ls_result>line.

         READ TABLE lt_lines INDEX <ls_result>line INTO gt_foundline.

         CONCATENATE ‘FOX:’ gt_foxsrvnm INTO gt_foundtitle SEPARATED BY space.
         APPEND gt_found.
       ENDLOOP.
     ENDLOOP.
   ENDLOOP.
ENDFORM.                    ” search_fox
*&———————————————————————*
*&      Form  open_fox_in_browser
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM open_fox_in_browser USING value(u_srvnm)    TYPE rsplf_srvnm.

   DATA: lv_iobjnm         TYPE sobj_name.

   lv_iobjnm = u_srvnm.
   cl_rspls_wdapp=>start_modeler( i_tlogo = rs_c_tlogoplanning_service
                                  i_objnm = lv_iobjnm ).
ENDFORM.                    ” open_fox_in_browser

Assigned Tags

      2 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Sandra Rossi
      Sandra Rossi

      If anyone wants to try the code in the blog post, here's same code but without syntax errors (invalid quote characters and so on) - compiles in ABAP 7.50 - Just to say, it doesn't search as I want - Not in Enhancements of standard code:

      REPORT  z_code_scanner.
      
      TYPE-POOLS: abap, rs, slis, wdyrt.
      
      TABLES: wdy_ctlr_compo_key, rsplf_srv, sscrfields.
      
      CONSTANTS: c_fox          TYPE rsplf_srvtypenm VALUE '0RSPL_FORMULA',
                  c_type_wdy     TYPE c VALUE '1',
                  c_type_fox     TYPE c VALUE '2'.
      
      TYPES: BEGIN OF lty_comp,
                component        TYPE wdy_component_name,
              END OF lty_comp.
      
      TYPES: BEGIN OF lty_fox,
                srvnm            TYPE rsplf_srvnm,
              END OF lty_fox.
      
      TYPES: BEGIN OF lty_found,
                type                TYPE char1,
                component_name      TYPE wdy_ctlr_compo-component_name,
                controller_name     TYPE wdy_ctlr_compo-controller_name,
                cmpname             TYPE wdy_ctlr_compo-cmpname,
                srvnm               TYPE rsplf_srv-srvnm,
                title               TYPE string,
                line                TYPE string,
                line_num            TYPE i,
              END OF lty_found.
      
      DATA: gt_comp         TYPE TABLE OF lty_comp WITH HEADER LINE,
             gt_fox          TYPE TABLE OF lty_fox WITH HEADER LINE,
             gt_found        TYPE TABLE OF lty_found WITH HEADER LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT 1(23) twdy FOR FIELD s_wdyc.
      SELECTION-SCREEN POSITION 30.
      SELECT-OPTIONS: s_wdyc          FOR wdy_ctlr_compo_key-component_name.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT 1(23) tfox FOR FIELD s_fox.
      SELECTION-SCREEN POSITION 30.
      SELECT-OPTIONS: s_fox           FOR rsplf_srv-srvnm.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT 1(23) tstr FOR FIELD p_strg.
      SELECTION-SCREEN POSITION 30.
      PARAMETERS: p_strg(80).
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT 1(23) twdyp FOR FIELD p_wdyc.
      SELECTION-SCREEN POSITION 30.
      PARAMETERS: p_wdyc       TYPE char1 AS CHECKBOX DEFAULT 'X'.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
      SELECTION-SCREEN COMMENT 1(23) tfoxp FOR FIELD p_fox.
      SELECTION-SCREEN POSITION 30.
      PARAMETERS: p_fox        TYPE char1 AS CHECKBOX DEFAULT ' '.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN: FUNCTION KEY 1.
      
      * INCLUDE Z79Y_CODE_SCANNER_EX_O01                .  " PBO-Modules
      * INCLUDE Z79Y_CODE_SCANNER_EX_I01                .  " PAI-Modules
      * INCLUDE Z79Y_CODE_SCANNER_EX_F01                .  " FORM-Routines
      
      INITIALIZATION.
      
         twdy = 'Web-Dynpro-Component'.
         tfox = 'Fox Formulas'.
         tstr = 'Search string'.
         twdyp = 'Search in WebDynpro Components'.
         tfoxp = 'Search in Fox Formulas'.
      
         " Set default values
         s_wdyc-sign   = 'I'.
         s_wdyc-option = 'CP'.
         s_wdyc-low    = 'Z*'.
         APPEND s_wdyc.
      
      *  s_fox-sign   = 'I'.
      *  s_fox-option = 'CP'.
      *  s_fox-low    = 'Z*'.
      *  APPEND s_fox.
      
         sscrfields-functxt_01 = 'Запустить code_scanner'.
      *  CALL FUNCTION 'ICON_CREATE'
      *    EXPORTING
      *      name                        = 'ICON_DESELECT_ALL'
      *      text                        = "
      *      info                        = 'Отменить выделение'
      **     ADD_STDINF                  = 'X'
      *    IMPORTING
      *      RESULT                      = sscrfields-functxt_01
      *    EXCEPTIONS
      *      icon_not_found              = 1
      *      outputfield_too_short       = 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.
      
      AT SELECTION-SCREEN.
         CASE sscrfields-ucomm.
           WHEN 'FC01'.
             CALL TRANSACTION 'CODE_SCANNER'.
         ENDCASE.
      
      START-OF-SELECTION.
         PERFORM main.
      
      *&———————————————————————*
      *&      Form  get_data
      *&———————————————————————*
      *       text
      *———————————————————————-*
      *  ->  p1        text
      *  <-  p2        text
      *———————————————————————-*
      FORM get_data CHANGING value(c_rc)   TYPE sysubrc.
      
         CLEAR c_rc.
      
         CLEAR: gt_comp, gt_fox, gt_found.
         REFRESH: gt_comp[], gt_fox[], gt_found[].
      
         IF p_wdyc = abap_true.
           SELECT DISTINCT component_name
             FROM wdy_component
             INTO TABLE gt_comp                                 "#EC CI_BYPASS
             WHERE component_name IN s_wdyc.                 "#EC CI_SGLSELECT
         ENDIF.
      
         IF p_fox = abap_true.
           SELECT DISTINCT srvnm
             FROM rsplf_srv
             INTO TABLE gt_fox
             WHERE srvnm IN s_fox
               AND objvers = rs_c_objvers-active                "#EC CI_BYPASS
               AND srvtypenm = c_fox.                        "#EC CI_SGLSELECT
         ENDIF.
      
         IF gt_comp[] IS INITIAL AND gt_fox[] IS INITIAL.
           MESSAGE 'Данные не выбраны' TYPE 'S'.
           c_rc = 1.
         ENDIF.
      ENDFORM.                    " get_data
      *&———————————————————————*
      *&      Form  main
      *&———————————————————————*
      *       text
      *———————————————————————-*
      *  ->  p1        text
      *  <-  p2        text
      *———————————————————————-*
      FORM main .
      
         DATA: lv_rc          TYPE sysubrc.
      
      *  IF p_strg IS INITIAL.
      *    MESSAGE 'Fill search string' TYPE 'S' DISPLAY LIKE 'E'.
      *    RETURN.
      *  ENDIF.
      
         PERFORM get_data CHANGING lv_rc.
         IF lv_rc <> 0.
           RETURN.
         ENDIF.
      
         PERFORM search_wdy.
         PERFORM search_fox.
      
         PERFORM create_alvlist.
      ENDFORM.                    " main
      *&———————————————————————*
      *&      Form  search_wdy
      *&———————————————————————*
      *       Поиск в компонентах WebDynpro
      *———————————————————————-*
      *  ->  p1        text
      *  <-  p2        text
      *———————————————————————-*
      FORM search_wdy .
      
         TYPES: BEGIN OF lty_found_wdy_ex.
         INCLUDE TYPE lty_found.
         TYPES: code_body        TYPE wdy_ctlr_compo-code_body,
              END OF lty_found_wdy_ex.
      
         DATA: lv_search        TYPE string,
               lt_found_wdy_ex  TYPE TABLE OF lty_found_wdy_ex,
               lt_lines         TYPE TABLE OF string,
               ls_lines like line of lt_lines,
               lt_results       TYPE TABLE OF match_result. " WITH HEADER LINE.
      
         FIELD-SYMBOLS: <ls_found_wdy_ex>           TYPE lty_found_wdy_ex,
                        <ls_result>                 TYPE match_result.
      
         CHECK gt_comp[] IS NOT INITIAL.
      
         SELECT component_name controller_name cmpname code_body
           FROM wdy_ctlr_compo
           INTO CORRESPONDING FIELDS OF TABLE lt_found_wdy_ex
           FOR ALL ENTRIES IN gt_comp
           WHERE component_name = gt_comp-component.
      
         LOOP AT lt_found_wdy_ex ASSIGNING <ls_found_wdy_ex>
           WHERE code_body CS p_strg.
      
           SPLIT <ls_found_wdy_ex>-code_body AT cl_abap_char_utilities=>cr_lf
             INTO TABLE lt_lines.
      
          IF p_strg is not initial.
           FIND ALL OCCURRENCES OF p_strg IN TABLE lt_lines
             IGNORING CASE
             RESULTS lt_results.
           endif.
      
           IF sy-subrc <> 0.
             BREAK-POINT.
             MESSAGE 'Internal error occured' TYPE 'E'.
           ENDIF.
      IF p_strg is not initial.
           LOOP AT lt_results ASSIGNING <ls_result>.
      
             CLEAR gt_found.
             MOVE-CORRESPONDING <ls_found_wdy_ex> TO gt_found.
      
             gt_found-type = c_type_wdy.
             gt_found-line_num = <ls_result>-line.
             READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
      
             CONCATENATE gt_found-component_name gt_found-controller_name gt_found-cmpname
               INTO gt_found-title SEPARATED BY '/'.
             CONCATENATE 'WDY:' gt_found-title INTO gt_found-title SEPARATED BY space.
      
             APPEND gt_found.
           ENDLOOP.
        ELSE.
        LOOP AT lt_lines into ls_lines.
      
             CLEAR gt_found.
             MOVE-CORRESPONDING <ls_found_wdy_ex> TO gt_found.
      
             gt_found-type = c_type_wdy.
             gt_found-line_num = sy-tabix."<ls_result>-line.
             "READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
             gt_found-line = ls_lines.
             CONCATENATE gt_found-component_name gt_found-controller_name gt_found-cmpname
               INTO gt_found-title SEPARATED BY '/'.
             CONCATENATE 'WDY:' gt_found-title INTO gt_found-title SEPARATED BY space.
      
             APPEND gt_found.
           ENDLOOP.
          endif.
         ENDLOOP.
      ENDFORM.                    " search_wdy
      *&———————————————————————*
      *&      Form  create_alvlist
      *&———————————————————————*
      *       text
      *———————————————————————-*
      *  ->  p1        text
      *  <-  p2        text
      *———————————————————————-*
      FORM create_alvlist .
      
         DATA: ls_layout         TYPE slis_layout_alv,
               lt_all_events     TYPE TABLE OF slis_alv_event,
               lt_events         TYPE TABLE OF slis_alv_event,
               ls_event          TYPE slis_alv_event,
               lt_fieldcat       TYPE TABLE OF slis_fieldcat_alv.
      
         FIELD-SYMBOLS: <ls_fieldcat>        TYPE slis_fieldcat_alv.
      
      * Initialize Layout for activity log
         ls_layout-detail_popup         = abap_true.
         ls_layout-detail_initial_lines = abap_true.
         ls_layout-expand_all           = abap_true.
         ls_layout-colwidth_optimize    = abap_true.
         ls_layout-zebra                = abap_true.
      
      * Get possible events
         CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
           EXPORTING
             i_list_type = 0
           IMPORTING
             et_events   = lt_all_events[].
      
      * User-command for activity log
         READ TABLE lt_all_events WITH KEY name = slis_ev_user_command
                    INTO ls_event.
         IF sy-subrc = 0.
           ls_event-form = 'ALV_USER_COMMAND'.
           APPEND ls_event TO lt_events.
         ENDIF.
      
         APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
         <ls_fieldcat>-fieldname = 'TITLE'.
         <ls_fieldcat>-outputlen = 70.
         <ls_fieldcat>-seltext_l = 'Address'.
      
         APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
         <ls_fieldcat>-fieldname = 'LINE_NUM'.
         "<ls_fieldcat>-outputlen = .
         <ls_fieldcat>-seltext_s = 'String №'.
      
         APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
         <ls_fieldcat>-fieldname = 'LINE'.
         <ls_fieldcat>-outputlen = 70.
         <ls_fieldcat>-seltext_l = 'Текст'.
      
         CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
           EXPORTING
      *   I_INTERFACE_CHECK                 = con_false
      *   I_BYPASSING_BUFFER                = con_false
      *   I_BUFFER_ACTIVE                   = ' '
             i_callback_program                = sy-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                         = ls_layout
             it_fieldcat                       = lt_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                         = lt_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                          = gt_found[]
         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.                    " create_alvlist
      
      *———————————————————————*
      *       FORM ALV_USER_COMMAND                                         *
      *———————————————————————*
      FORM alv_user_command
            USING i_ucomm TYPE syucomm
                  i_selfield TYPE slis_selfield.                   "#EC CALLED
      
         "FIELD-SYMBOLS: <ls_line>            TYPE lty_found.
      
         CHECK i_ucomm = '&IC1'.
         READ TABLE gt_found INDEX i_selfield-tabindex.
         IF sy-subrc = 0.
      
           CASE gt_found-type.
             WHEN c_type_wdy.
               PERFORM open_webdynpro USING gt_found-component_name
                                            gt_found-controller_name
                                            gt_found-cmpname
                                            gt_found-line_num.
             WHEN c_type_fox.
               PERFORM open_fox_in_browser USING gt_found-srvnm.
           ENDCASE.
         ENDIF.
      *
      *  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
      
      *&———————————————————————*
      *&      Form  open_webdynpro
      *&———————————————————————*
      *       text
      *———————————————————————-*
      *      ->VALUE(U_COMPONENT_NAME)   text
      *      ->VALUE(U_CONTROLLER_NAME)  text
      *      ->VALUE(U_METHOD)           text
      *      ->VALUE(U_LINE)             text
      *———————————————————————-*
      FORM open_webdynpro USING value(u_component_name) TYPE wdy_ctlr_compo-component_name
                                 value(u_controller_name) TYPE wdy_ctlr_compo-controller_name
                                 value(u_method) TYPE wdy_ctlr_compo-cmpname
                                 value(u_line)   TYPE i.
      
         DATA: ls_cont_key        TYPE wdy_controller_key,
               lv_include         TYPE program,
               lt_map             TYPE wdyrt_line_info_tab_type WITH HEADER LINE,
               lv_line            TYPE i,
               lo_req             TYPE REF TO cl_wb_request,
               lt_request_set     TYPE swbm_wb_request_set.
      
         ls_cont_key-component_name = u_component_name.
         ls_cont_key-controller_name = u_controller_name.
      
         CALL METHOD cl_wdy_wb_naming_service=>get_includename_for_controller
           EXPORTING
             p_controller       = ls_cont_key
           RECEIVING
             p_includename      = lv_include
           EXCEPTIONS
             no_generation_info = 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.
      
         CALL FUNCTION 'WDY_WB_GET_SOURCECODE_MAPPING'
           EXPORTING
             p_include          = lv_include
           IMPORTING
             p_map              = lt_map[]
      *   P_HEADER           =
           EXCEPTIONS
             import_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.
      
         "READ TABLE lt_map WITH KEY meta-text = u_method.
         "READ TABLE lt_map WITH KEY code-text = u_method.
         LOOP AT lt_map WHERE code-text = u_method.            "#EC CI_SORTSEQ
         ENDLOOP.
      
         IF sy-subrc <> 0.
           MESSAGE 'Не удалось' TYPE 'I'.
           RETURN.
         ENDIF.
      
         lv_line = lt_map-line + u_line - 1.
      
         CALL FUNCTION 'WDY_WB_REQUEST_FOR_SOURCEPOS'
           EXPORTING
             p_include             = lv_include
             p_line                = lv_line
             p_operation           = 'DISPLAY'
           IMPORTING
             p_wb_request          = lo_req
           EXCEPTIONS
             no_corresponding_code = 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.
      
         APPEND lo_req TO lt_request_set.
      
         CALL METHOD cl_wb_startup=>start
           EXPORTING
             p_wb_request_set = lt_request_set.
      *  IMPORTING
      *    p_wb_error          = l_error
      *  CHANGING
      *    p_wb_data_container = l_container.
      ENDFORM.                    "open_webdynpro
      
      *&———————————————————————*
      *&      Form  search_fox
      *&———————————————————————*
      *       Поиск текста в формулах FOX
      *———————————————————————-*
      *  ->  p1        text
      *  <-  p2        text
      *———————————————————————-*
      FORM search_fox .
      
         DATA: lo_srv                  TYPE REF TO cl_rsplfs_srv,
               lt_param_set_rule       TYPE TABLE OF rsplfa_s_param_set_rule,
               lt_param_tab            TYPE TABLE OF REF TO if_rsplfa_param_struc,
               lv_formula_string       TYPE string,
               lo_fline                TYPE REF TO if_rsplfa_param_elem,
               lv_line                 TYPE c LENGTH 60,
               lt_forml                TYPE rspls_ts_forml,
               lt_lines                TYPE TABLE OF string,
               lt_results              TYPE TABLE OF match_result.
      
         FIELD-SYMBOLS: <ls_param_set_rule>       TYPE rsplfa_s_param_set_rule,
                        <ls_param_tab>            TYPE REF TO if_rsplfa_param_struc,
                        <ls_result>               TYPE match_result,
                        <ls_forml>                TYPE rspls_s_forml.
      
         LOOP AT gt_fox.
      
           TRY.
               lo_srv = cl_rsplfs_srv=>factory( gt_fox-srvnm ).
             CATCH cx_rspls_msg_static_check .
               MESSAGE e001(00) WITH 'Ошибка cl_rsplfs_srv=>factory' gt_fox-srvnm.
           ENDTRY.
      
           lt_param_set_rule = lo_srv->if_rsplfa_srv~get_param_set_rules( ).
           SORT lt_param_set_rule BY rulepos.
      
           LOOP AT lt_param_set_rule ASSIGNING <ls_param_set_rule>.
      
             " Get FOX coding from parameters
             lt_param_tab = <ls_param_set_rule>-r_param_set->get_tab_param_struc( 'FORMULATAB' ).
      
             CLEAR lv_formula_string.
             LOOP AT lt_param_tab ASSIGNING <ls_param_tab>.
               lo_fline = <ls_param_tab>->get_comp_elem( 'FLINE' ).
               lo_fline->get_value( IMPORTING e_value = lv_line ).
               CONCATENATE lv_formula_string lv_line INTO lv_formula_string
                 RESPECTING BLANKS.
             ENDLOOP.
      
             " Convert FOX coding and get field catalog for parsing
             lt_forml[] =  cl_rsplfc_formula=>string_to_forml_tab( lv_formula_string ).
      
             REFRESH lt_lines.
             LOOP AT lt_forml ASSIGNING <ls_forml>.
               APPEND <ls_forml>-fline TO lt_lines.
             ENDLOOP.
      
             " Find
             FIND ALL OCCURRENCES OF p_strg IN TABLE lt_lines
               IGNORING CASE
               RESULTS lt_results.
      
             CHECK sy-subrc = 0.
      
             LOOP AT lt_results ASSIGNING <ls_result>.
      
               CLEAR gt_found.
      
               gt_found-type = c_type_fox.
               gt_found-srvnm = gt_fox-srvnm.
               gt_found-line_num = <ls_result>-line.
      
               READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
      
               CONCATENATE 'FOX:' gt_fox-srvnm INTO gt_found-title SEPARATED BY space.
               APPEND gt_found.
             ENDLOOP.
           ENDLOOP.
         ENDLOOP.
      ENDFORM.                    " search_fox
      *&———————————————————————*
      *&      Form  open_fox_in_browser
      *&———————————————————————*
      *       text
      *———————————————————————-*
      *  ->  p1        text
      *  <-  p2        text
      *———————————————————————-*
      FORM open_fox_in_browser USING value(u_srvnm)    TYPE rsplf_srvnm.
      
         DATA: lv_iobjnm         TYPE sobj_name.
      
         lv_iobjnm = u_srvnm.
         cl_rspls_wdapp=>start_modeler( i_tlogo = rs_c_tlogo-planning_service
                                        i_objnm = lv_iobjnm ).
      ENDFORM.                    " open_fox_in_browser
      Author's profile photo Sandra Rossi
      Sandra Rossi

      Same code but translations Russian into English + ABAP Objects:

      REPORT  z_code_scanner.
      
      TYPE-POOLS: abap, rs, slis, wdyrt.
      
      TABLES: wdy_ctlr_compo_key, rsplf_srv, sscrfields.
      
      CONSTANTS: c_fox      TYPE rsplf_srvtypenm VALUE '0RSPL_METHODULA',
                 c_type_wdy TYPE c VALUE '1',
                 c_type_fox TYPE c VALUE '2'.
      
      TYPES: BEGIN OF lty_comp,
               component TYPE wdy_component_name,
             END OF lty_comp.
      
      TYPES: BEGIN OF lty_fox,
               srvnm TYPE rsplf_srvnm,
             END OF lty_fox.
      
      TYPES: BEGIN OF lty_found,
               type            TYPE char1,
               component_name  TYPE wdy_ctlr_compo-component_name,
               controller_name TYPE wdy_ctlr_compo-controller_name,
               cmpname         TYPE wdy_ctlr_compo-cmpname,
               srvnm           TYPE rsplf_srv-srvnm,
               title           TYPE string,
               line            TYPE string,
               line_num        TYPE i,
             END OF lty_found.
      
      DATA: gt_comp  TYPE TABLE OF lty_comp WITH HEADER LINE,
            gt_fox   TYPE TABLE OF lty_fox WITH HEADER LINE,
            gt_found TYPE TABLE OF lty_found WITH HEADER LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
        SELECTION-SCREEN COMMENT 1(23) twdy FOR FIELD s_wdyc.
        SELECTION-SCREEN POSITION 30.
        SELECT-OPTIONS: s_wdyc          FOR wdy_ctlr_compo_key-component_name DEFAULT 'Z*' SIGN I OPTION CP.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
        SELECTION-SCREEN COMMENT 1(23) tfox FOR FIELD s_fox.
        SELECTION-SCREEN POSITION 30.
        SELECT-OPTIONS: s_fox           FOR rsplf_srv-srvnm.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
        SELECTION-SCREEN COMMENT 1(23) tstr FOR FIELD p_strg.
        SELECTION-SCREEN POSITION 30.
        PARAMETERS: p_strg(80).
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
        SELECTION-SCREEN COMMENT 1(23) twdyp FOR FIELD p_wdyc.
        SELECTION-SCREEN POSITION 30.
        PARAMETERS: p_wdyc       TYPE char1 AS CHECKBOX DEFAULT 'X'.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN BEGIN OF LINE.
        SELECTION-SCREEN COMMENT 1(23) tfoxp FOR FIELD p_fox.
        SELECTION-SCREEN POSITION 30.
        PARAMETERS: p_fox        TYPE char1 AS CHECKBOX DEFAULT ' '.
      SELECTION-SCREEN END OF LINE.
      
      SELECTION-SCREEN: FUNCTION KEY 1.
      
      CLASS lcl_app DEFINITION DEFERRED.
      DATA app TYPE REF TO lcl_app.
      
      LOAD-OF-PROGRAM.
        CREATE OBJECT app TYPE ('LCL_APP').
      
      INITIALIZATION.
        CALL METHOD app->('INITIALIZATION').
      
      AT SELECTION-SCREEN.
        CALL METHOD app->('AT_SELECTION_SCREEN').
      
      START-OF-SELECTION.
        CALL METHOD app->('START_OF_SELECTION').
      
      CLASS lcl_app DEFINITION.
        PUBLIC SECTION.
          METHODS initialization.
          METHODS at_selection_screen.
          METHODS start_of_selection.
          METHODS alv_user_command IMPORTING
                                     i_ucomm    TYPE syucomm
                                     i_selfield TYPE slis_selfield. "#EC CALLED
        PRIVATE SECTION.
          METHODS get_data CHANGING VALUE(c_rc)   TYPE sysubrc.
          "! Search in Web Dynpro components
          METHODS search_wdy.
          METHODS create_alvlist .
          METHODS open_webdynpro IMPORTING VALUE(u_component_name)  TYPE wdy_ctlr_compo-component_name
                                           VALUE(u_controller_name) TYPE wdy_ctlr_compo-controller_name
                                           VALUE(u_method)          TYPE wdy_ctlr_compo-cmpname
                                           VALUE(u_line)            TYPE i.
          "! Find text in formulas FOX
          METHODS search_fox .
          METHODS open_fox_in_browser IMPORTING VALUE(u_srvnm)    TYPE rsplf_srvnm.
      ENDCLASS.
      
      FORM alv_user_command
            USING i_ucomm TYPE syucomm
                  i_selfield TYPE slis_selfield.                  "#EC CALLED
        app->alv_user_command(
          i_ucomm    = i_ucomm
          i_selfield = i_selfield ).
      ENDFORM.
      
      CLASS lcl_app IMPLEMENTATION.
      
        METHOD at_selection_screen.
          CASE sscrfields-ucomm.
            WHEN 'FC01'.
              CALL TRANSACTION 'CODE_SCANNER'.
              CLEAR sscrfields-ucomm.
          ENDCASE.
        ENDMETHOD.
      
        METHOD initialization.
          twdy = 'Web Dynpro Component'.
          tfox = 'Fox formulas'.
          tstr = 'Search string'.
          twdyp = 'Search in WebDynpro Components'.
          tfoxp = 'Search in Fox formulas'.
      
          sscrfields-functxt_01 = 'Run code_scanner'.
        ENDMETHOD.
      
        METHOD start_of_selection.
          DATA: lv_rc          TYPE sysubrc.
      
          get_data( CHANGING c_rc = lv_rc ).
          IF lv_rc <> 0.
            RETURN.
          ENDIF.
      
          search_wdy( ).
          search_fox( ).
      
          create_alvlist( ).
        ENDMETHOD.
      
        METHOD get_data.
      
          CLEAR c_rc.
      
          CLEAR: gt_comp, gt_fox, gt_found.
          REFRESH: gt_comp[], gt_fox[], gt_found[].
      
          IF p_wdyc = abap_true.
            SELECT DISTINCT component_name
              FROM wdy_component
              INTO TABLE gt_comp                               "#EC CI_BYPASS
              WHERE component_name IN s_wdyc.               "#EC CI_SGLSELECT
          ENDIF.
      
          IF p_fox = abap_true.
            SELECT DISTINCT srvnm
              FROM rsplf_srv
              INTO TABLE gt_fox
              WHERE srvnm IN s_fox
                AND objvers = rs_c_objvers-active              "#EC CI_BYPASS
                AND srvtypenm = c_fox.                      "#EC CI_SGLSELECT
          ENDIF.
      
          IF gt_comp[] IS INITIAL AND gt_fox[] IS INITIAL.
            MESSAGE 'Data not selected' TYPE 'S'.
            c_rc = 1.
          ENDIF.
        ENDMETHOD.                    " get_data
      
        METHOD search_wdy .
      
          TYPES: BEGIN OF lty_found_wdy_ex.
                   INCLUDE TYPE lty_found.
          TYPES:   code_body TYPE wdy_ctlr_compo-code_body,
                 END OF lty_found_wdy_ex.
      
          DATA: lv_search       TYPE string,
                lt_found_wdy_ex TYPE TABLE OF lty_found_wdy_ex,
                lt_lines        TYPE TABLE OF string,
                ls_lines        LIKE LINE OF lt_lines,
                lt_results      TYPE TABLE OF match_result. " WITH HEADER LINE.
      
          FIELD-SYMBOLS: <ls_found_wdy_ex> TYPE lty_found_wdy_ex,
                         <ls_result>       TYPE match_result.
      
          CHECK gt_comp[] IS NOT INITIAL.
      
          SELECT component_name controller_name cmpname code_body
            FROM wdy_ctlr_compo
            INTO CORRESPONDING FIELDS OF TABLE lt_found_wdy_ex
            FOR ALL ENTRIES IN gt_comp
            WHERE component_name = gt_comp-component.
      
          LOOP AT lt_found_wdy_ex ASSIGNING <ls_found_wdy_ex>
            WHERE code_body CS p_strg.
      
            SPLIT <ls_found_wdy_ex>-code_body AT cl_abap_char_utilities=>cr_lf
              INTO TABLE lt_lines.
      
            IF p_strg IS NOT INITIAL.
              FIND ALL OCCURRENCES OF p_strg IN TABLE lt_lines
                IGNORING CASE
                RESULTS lt_results.
            ENDIF.
      
            IF sy-subrc <> 0.
              BREAK-POINT.
              MESSAGE 'Internal error has occurred' TYPE 'E'.
            ENDIF.
            IF p_strg IS NOT INITIAL.
              LOOP AT lt_results ASSIGNING <ls_result>.
      
                CLEAR gt_found.
                MOVE-CORRESPONDING <ls_found_wdy_ex> TO gt_found.
      
                gt_found-type = c_type_wdy.
                gt_found-line_num = <ls_result>-line.
                READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
      
                CONCATENATE gt_found-component_name gt_found-controller_name gt_found-cmpname
                  INTO gt_found-title SEPARATED BY '/'.
                CONCATENATE 'WDY:' gt_found-title INTO gt_found-title SEPARATED BY space.
      
                APPEND gt_found TO gt_found.
              ENDLOOP.
            ELSE.
              LOOP AT lt_lines INTO ls_lines.
      
                CLEAR gt_found.
                MOVE-CORRESPONDING <ls_found_wdy_ex> TO gt_found.
      
                gt_found-type = c_type_wdy.
                gt_found-line_num = sy-tabix."<ls_result>-line.
                "READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
                gt_found-line = ls_lines.
                CONCATENATE gt_found-component_name gt_found-controller_name gt_found-cmpname
                  INTO gt_found-title SEPARATED BY '/'.
                CONCATENATE 'WDY:' gt_found-title INTO gt_found-title SEPARATED BY space.
      
                APPEND gt_found TO gt_found.
              ENDLOOP.
            ENDIF.
          ENDLOOP.
        ENDMETHOD.                    " search_wdy
      
        METHOD create_alvlist .
      
          DATA: ls_layout     TYPE slis_layout_alv,
                lt_all_events TYPE TABLE OF slis_alv_event,
                lt_events     TYPE TABLE OF slis_alv_event,
                ls_event      TYPE slis_alv_event,
                lt_fieldcat   TYPE TABLE OF slis_fieldcat_alv.
      
          FIELD-SYMBOLS: <ls_fieldcat>        TYPE slis_fieldcat_alv.
      
      * Initialize Layout for activity log
          ls_layout-detail_popup         = abap_true.
          ls_layout-detail_initial_lines = abap_true.
          ls_layout-expand_all           = abap_true.
          ls_layout-colwidth_optimize    = abap_true.
          ls_layout-zebra                = abap_true.
      
      * Get possible events
          CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
            EXPORTING
              i_list_type = 0
            IMPORTING
              et_events   = lt_all_events[].
      
      * User-command for activity log
          READ TABLE lt_all_events WITH KEY name = slis_ev_user_command
                     INTO ls_event.
          IF sy-subrc = 0.
            ls_event-form = 'ALV_USER_COMMAND'.
            APPEND ls_event TO lt_events.
          ENDIF.
      
          APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
          <ls_fieldcat>-fieldname = 'TITLE'.
          <ls_fieldcat>-outputlen = 70.
          <ls_fieldcat>-seltext_l = 'Address'.
      
          APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
          <ls_fieldcat>-fieldname = 'LINE_NUM'.
          "<ls_fieldcat>-outputlen = .
          <ls_fieldcat>-seltext_s = 'String Number'.
      
          APPEND INITIAL LINE TO lt_fieldcat ASSIGNING <ls_fieldcat>.
          <ls_fieldcat>-fieldname = 'LINE'.
          <ls_fieldcat>-outputlen = 70.
          <ls_fieldcat>-seltext_l = 'Text'.
      
          CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
            EXPORTING
              i_callback_program = sy-repid
              is_layout          = ls_layout
              it_fieldcat        = lt_fieldcat
              i_save             = 'A'
              it_events          = lt_events
            TABLES
              t_outtab           = gt_found[]
            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.
        ENDMETHOD.                    " create_alvlist
      
        METHOD alv_user_command.
      
          "FIELD-SYMBOLS: <ls_line>            TYPE lty_found.
      
          CHECK i_ucomm = '&IC1'.
          READ TABLE gt_found INTO gt_found INDEX i_selfield-tabindex.
          IF sy-subrc = 0.
      
            CASE gt_found-type.
              WHEN c_type_wdy.
                open_webdynpro(
                  u_component_name  = gt_found-component_name
                  u_controller_name = gt_found-controller_name
                  u_method          = gt_found-cmpname
                  u_line            = gt_found-line_num ).
              WHEN c_type_fox.
                open_fox_in_browser( u_srvnm = gt_found-srvnm ).
            ENDCASE.
          ENDIF.
      
        ENDMETHOD.                    "alv_user_command
      
        METHOD open_webdynpro.
      
          DATA: ls_cont_key    TYPE wdy_controller_key,
                lv_include     TYPE program,
                lt_map         TYPE wdyrt_line_info_tab_type, " WITH HEADER LINE,
                lv_line        TYPE i,
                lo_req         TYPE REF TO cl_wb_request,
                lt_request_set TYPE swbm_wb_request_set.
      
          ls_cont_key-component_name = u_component_name.
          ls_cont_key-controller_name = u_controller_name.
      
          CALL METHOD cl_wdy_wb_naming_service=>get_includename_for_controller
            EXPORTING
              p_controller       = ls_cont_key
            RECEIVING
              p_includename      = lv_include
            EXCEPTIONS
              no_generation_info = 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.
      
          CALL FUNCTION 'WDY_WB_GET_SOURCECODE_MAPPING'
            EXPORTING
              p_include    = lv_include
            IMPORTING
              p_map        = lt_map[]
            EXCEPTIONS
              import_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.
      
          LOOP AT lt_map INTO DATA(ls_map) WHERE code-text = u_method. "#EC CI_SORTSEQ
          ENDLOOP.
      
          IF sy-subrc <> 0.
            MESSAGE 'Method not found' TYPE 'I'.
            RETURN.
          ENDIF.
      
          lv_line = ls_map-line + u_line - 1.
      
          CALL FUNCTION 'WDY_WB_REQUEST_FOR_SOURCEPOS'
            EXPORTING
              p_include             = lv_include
              p_line                = lv_line
              p_operation           = 'DISPLAY'
            IMPORTING
              p_wb_request          = lo_req
            EXCEPTIONS
              no_corresponding_code = 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.
      
          APPEND lo_req TO lt_request_set.
      
          CALL METHOD cl_wb_startup=>start
            EXPORTING
              p_wb_request_set = lt_request_set.
      
        ENDMETHOD.                    "open_webdynpro
      
        METHOD search_fox .
      
          DATA: lo_srv              TYPE REF TO cl_rsplfs_srv,
                lt_param_set_rule   TYPE TABLE OF rsplfa_s_param_set_rule,
                lt_param_tab        TYPE TABLE OF REF TO if_rsplfa_param_struc,
                lv_methodula_string TYPE string,
                lo_fline            TYPE REF TO if_rsplfa_param_elem,
                lv_line             TYPE c LENGTH 60,
                lt_forml            TYPE rspls_ts_forml,
                lt_lines            TYPE TABLE OF string,
                lt_results          TYPE TABLE OF match_result.
      
          FIELD-SYMBOLS: <ls_param_set_rule> TYPE rsplfa_s_param_set_rule,
                         <ls_param_tab>      TYPE REF TO if_rsplfa_param_struc,
                         <ls_result>         TYPE match_result,
                         <ls_forml>          TYPE rspls_s_forml.
      
          LOOP AT gt_fox INTO gt_fox.
      
            TRY.
                lo_srv = cl_rsplfs_srv=>factory( gt_fox-srvnm ).
              CATCH cx_rspls_msg_static_check .
                MESSAGE e001(00) WITH 'Error cl_rsplfs_srv=>factory' gt_fox-srvnm.
            ENDTRY.
      
            lt_param_set_rule = lo_srv->if_rsplfa_srv~get_param_set_rules( ).
            SORT lt_param_set_rule BY rulepos.
      
            LOOP AT lt_param_set_rule ASSIGNING <ls_param_set_rule>.
      
              " Get FOX coding from parameters
              lt_param_tab = <ls_param_set_rule>-r_param_set->get_tab_param_struc( 'FORMULATAB' ).
      
              CLEAR lv_methodula_string.
              LOOP AT lt_param_tab ASSIGNING <ls_param_tab>.
                lo_fline = <ls_param_tab>->get_comp_elem( 'FLINE' ).
                lo_fline->get_value( IMPORTING e_value = lv_line ).
                CONCATENATE lv_methodula_string lv_line INTO lv_methodula_string
                  RESPECTING BLANKS.
              ENDLOOP.
      
              " Convert FOX coding and get field catalog for parsing
              lt_forml[] =  cl_rsplfc_formula=>string_to_forml_tab( lv_methodula_string ).
      
              REFRESH lt_lines.
              LOOP AT lt_forml ASSIGNING <ls_forml>.
                APPEND <ls_forml>-fline TO lt_lines.
              ENDLOOP.
      
              " Find
              FIND ALL OCCURRENCES OF p_strg IN TABLE lt_lines
                IGNORING CASE
                RESULTS lt_results.
      
              CHECK sy-subrc = 0.
      
              LOOP AT lt_results ASSIGNING <ls_result>.
      
                CLEAR gt_found.
      
                gt_found-type = c_type_fox.
                gt_found-srvnm = gt_fox-srvnm.
                gt_found-line_num = <ls_result>-line.
      
                READ TABLE lt_lines INDEX <ls_result>-line INTO gt_found-line.
      
                CONCATENATE 'FOX:' gt_fox-srvnm INTO gt_found-title SEPARATED BY space.
                APPEND gt_found TO gt_found.
              ENDLOOP.
            ENDLOOP.
          ENDLOOP.
        ENDMETHOD.
      
        METHOD open_fox_in_browser.
      
          DATA: lv_iobjnm         TYPE sobj_name.
      
          lv_iobjnm = u_srvnm.
          cl_rspls_wdapp=>start_modeler( i_tlogo = rs_c_tlogo-planning_service
                                         i_objnm = lv_iobjnm ).
        ENDMETHOD.                    " open_fox_in_browser
      
      ENDCLASS.