Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *&---------------------------------------------------------------------*
- *& Report Z_DEVTOOLS_FIND_TEXT
- *&---------------------------------------------------------------------*
- *& Find text fragments
- *&---------------------------------------------------------------------*
- *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- *
- * Required Text Elements:
- * -----------------------
- * B00 Scope
- * B01 Search pattern
- * H01 Type
- * H02 Name
- * H03 Key
- * H04 Match
- *
- * Required Selection Texts:
- * -------------------------
- * P_CASE Case-sensitive
- * P_DEVC Package
- * P_LANGU Language
- * P_MESS Messages
- * P_OTR OTR Texts
- * P_PATT Pattern
- * P_REGEX Regular expression
- * P_SOURCE ABAP sources
- * P_TPOOL Textpools
- * P_WILDC Wildcard pattern
- *
- *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- REPORT z_devtools_find_text LINE-SIZE 255 LINE-COUNT 0.
- *----------------------------------------------------------------------*
- * CLASS abap_repository DEFINITION
- *----------------------------------------------------------------------*
- *
- *----------------------------------------------------------------------*
- "! <p class="shorttext synchronized" lang="en">ABAP Repository</p>
- CLASS abap_repository DEFINITION.
- PUBLIC SECTION.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Classes (Range)</p>
- t_class_range TYPE RANGE OF seoclsname.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Classe categories (Range)</p>
- t_class_category_range TYPE RANGE OF seocategry.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Languages (Range)</p>
- t_language_range TYPE RANGE OF langu.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Packages (Range)</p>
- t_package_range TYPE RANGE OF devclass.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Programs (Range)</p>
- t_program_range TYPE RANGE OF progname.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Languages (Table of language IDs)</p>
- t_languages TYPE STANDARD TABLE OF langu WITH DEFAULT KEY.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Classes (Table of class names)</p>
- t_classes TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Packages (Table of package names)</p>
- t_packages TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY.
- TYPES:
- "! <p class="shorttext synchronized" lang="en">Programs (Table of program names)</p>
- t_programs TYPE STANDARD TABLE OF progname WITH DEFAULT KEY.
- "! <p class="shorttext synchronized" lang="en">Find ABAP classes</p>
- "!
- "! @parameter class_range | <p class="shorttext synchronized" lang="en">Classes (Range)</p>
- "! @parameter class_category_range | <p class="shorttext synchronized" lang="en">Classe categories (Range)</p>
- "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
- "! @parameter classes | <p class="shorttext synchronized" lang="en">ABAP class names</p>
- METHODS find_classes
- IMPORTING
- !class_range TYPE t_class_range OPTIONAL
- !class_category_range TYPE t_class_category_range OPTIONAL
- !package_range TYPE t_package_range OPTIONAL
- RETURNING
- VALUE(classes) TYPE t_classes.
- "! <p class="shorttext synchronized" lang="en">Find ABAP interfaces</p>
- "!
- "! @parameter interface_range | <p class="shorttext synchronized" lang="en">Interfaces (Range)</p>
- "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
- "! @parameter interfaces | <p class="shorttext synchronized" lang="en">ABAP interface names</p>
- METHODS find_interfaces
- IMPORTING
- !interface_range TYPE t_class_range OPTIONAL
- !package_range TYPE t_package_range OPTIONAL
- RETURNING
- VALUE(interfaces) TYPE t_classes.
- "! <p class="shorttext synchronized" lang="en">Find known languages</p>
- "!
- "! @parameter language_range | <p class="shorttext synchronized" lang="en">Languages (Range)</p>
- "! @parameter languages | <p class="shorttext synchronized" lang="en">Languages</p>
- METHODS find_languages
- IMPORTING
- !language_range TYPE t_language_range OPTIONAL
- RETURNING
- VALUE(languages) TYPE t_languages.
- "! <p class="shorttext synchronized" lang="en">Find ABAP sources</p>
- "!
- "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
- "! @parameter packages | <p class="shorttext synchronized" lang="en">Packages</p>
- METHODS find_packages
- IMPORTING
- !package_range TYPE t_package_range OPTIONAL
- RETURNING
- VALUE(packages) TYPE t_packages.
- "! <p class="shorttext synchronized" lang="en">Find ABAP sources</p>
- "!
- "! @parameter program_range | <p class="shorttext synchronized" lang="en">Programs (Range)</p>
- "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
- "! @parameter programs | <p class="shorttext synchronized" lang="en">ABAP program names</p>
- METHODS find_programs
- IMPORTING
- !program_range TYPE t_program_range OPTIONAL
- !package_range TYPE t_package_range OPTIONAL
- RETURNING
- VALUE(programs) TYPE t_programs.
- "! <p class="shorttext synchronized" lang="en">Find TADIR objects</p>
- "!
- "! @parameter package_range | <p class="shorttext synchronized" lang="en">Packages (Range)</p>
- "! @parameter objects | <p class="shorttext synchronized" lang="en">TADIR objects</p>
- METHODS find_tadir_objects
- IMPORTING
- !package_range TYPE t_package_range OPTIONAL
- RETURNING
- VALUE(objects) TYPE cts_objects.
- "! <p class="shorttext synchronized" lang="en">Get program for TADIR/CTS object</p>
- "!
- "! @parameter pgmid | <p class="shorttext synchronized" lang="en">Program ID in Requests and Tasks</p>
- "! @parameter object | <p class="shorttext synchronized" lang="en">Object Type</p>
- "! @parameter obj_name | <p class="shorttext synchronized" lang="en">Object Name in Object List</p>
- "! @parameter program | <p class="shorttext synchronized" lang="en">Program</p>
- METHODS get_program
- IMPORTING
- !pgmid TYPE pgmid
- !object TYPE trobjtype
- !obj_name TYPE trobj_name
- RETURNING
- VALUE(program) TYPE progname.
- "! <p class="shorttext synchronized" lang="en">Get includes of a specific program</p>
- "!
- "! @parameter program | <p class="shorttext synchronized" lang="en">Program</p>
- "! @parameter includes | <p class="shorttext synchronized" lang="en">Includes</p>
- METHODS get_program_includes
- IMPORTING
- !program TYPE progname
- RETURNING
- VALUE(includes) TYPE t_programs.
- PROTECTED SECTION.
- PRIVATE SECTION.
- ENDCLASS.
- CLASS abap_repository IMPLEMENTATION.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->FIND_CLASSES
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] CLASS_RANGE TYPE T_CLASS_RANGE(optional)
- * | [--->] CLASS_CATEGORY_RANGE TYPE T_CLASS_CATEGORY_RANGE(optional)
- * | [--->] PACKAGE_RANGE TYPE T_PACKAGE_RANGE(optional)
- * | [<-()] CLASSES TYPE T_CLASSES
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD find_classes.
- TYPES: BEGIN OF lt_class_info,
- clsname TYPE seoclassdf-clsname,
- version TYPE seoclassdf-version,
- category TYPE seoclassdf-category,
- END OF lt_class_info.
- DATA: l_class_info TYPE HASHED TABLE OF lt_class_info WITH UNIQUE KEY clsname version.
- FIELD-SYMBOLS: <l_class> LIKE LINE OF classes,
- <l_class_info> LIKE LINE OF l_class_info.
- * Find classes matching the search criteria
- IF package_range IS INITIAL.
- SELECT clsname
- FROM seoclass
- INTO TABLE classes
- WHERE clsname IN class_range "#EC CI_GENBUFF
- AND clstype = '0'. "#EC CI_SUBRC
- ELSE.
- SELECT clsname
- FROM seoclass INNER JOIN tadir
- ON tadir~pgmid = 'R3TR' AND
- tadir~object = 'CLAS' AND
- tadir~obj_name = seoclass~clsname
- INTO TABLE classes
- WHERE devclass IN package_range
- AND clsname IN class_range "#EC CI_BUFFJOIN
- AND clstype = '0'. "#EC CI_SUBRC
- ENDIF.
- IF classes IS NOT INITIAL AND class_category_range IS NOT INITIAL.
- SELECT clsname version category
- FROM seoclassdf
- INTO TABLE l_class_info
- FOR ALL ENTRIES IN classes
- WHERE clsname = classes-table_line. "#EC CI_SUBRC
- LOOP AT classes ASSIGNING <l_class>.
- READ TABLE l_class_info
- WITH TABLE KEY clsname = <l_class>
- version = '1' ASSIGNING <l_class_info>. "Try to use active version
- IF sy-subrc <> 0.
- READ TABLE l_class_info
- WITH TABLE KEY clsname = <l_class>
- version = '0' ASSIGNING <l_class_info>. "Use inactive if there is no active version
- ENDIF.
- IF sy-subrc <> 0 OR <l_class_info>-category NOT IN class_category_range.
- DELETE classes.
- ENDIF.
- ENDLOOP.
- ENDIF.
- * Sort result
- SORT classes.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->FIND_INTERFACES
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] INTERFACE_RANGE TYPE T_CLASS_RANGE(optional)
- * | [--->] PACKAGE_RANGE TYPE T_PACKAGE_RANGE(optional)
- * | [<-()] INTERFACES TYPE T_CLASSES
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD find_interfaces.
- * Find classes matching the search criteria
- IF package_range IS INITIAL.
- SELECT clsname
- FROM seoclass
- INTO TABLE interfaces
- WHERE clsname IN interface_range "#EC CI_GENBUFF
- AND clstype = '1'. "#EC CI_SUBRC
- ELSE.
- SELECT clsname
- FROM seoclass INNER JOIN tadir
- ON tadir~pgmid = 'R3TR' AND
- tadir~object = 'INTF' AND
- tadir~obj_name = seoclass~clsname
- INTO TABLE interfaces
- WHERE devclass IN package_range
- AND clsname IN interface_range "#EC CI_BUFFJOIN
- AND clstype = '1'. "#EC CI_SUBRC
- ENDIF.
- * Sort result
- SORT interfaces.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->FIND_LANGUAGES
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] LANGUAGE_RANGE TYPE T_LANGUAGE_RANGE(optional)
- * | [<-()] LANGUAGES TYPE T_LANGUAGES
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD find_languages.
- * Find known languages matching selection criteria
- SELECT spras
- FROM t002
- INTO TABLE languages
- WHERE spras IN language_range. "#EC CI_SUBRC
- * Sort result
- SORT languages.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->FIND_PACKAGES
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] PACKAGE_RANGE TYPE T_PACKAGE_RANGE(optional)
- * | [<-()] PACKAGES TYPE T_PACKAGES
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD find_packages.
- SELECT devclass
- FROM tdevc
- INTO TABLE packages "#EC CI_GENBUFF
- WHERE devclass IN package_range. "#EC CI_SUBRC
- SORT packages.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->FIND_PROGRAMS
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] PROGRAM_RANGE TYPE T_PROGRAM_RANGE(optional)
- * | [--->] PACKAGE_RANGE TYPE T_PACKAGE_RANGE(optional)
- * | [<-()] PROGRAMS TYPE T_PROGRAMS
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD find_programs.
- DATA l_wa_e071 TYPE e071.
- DATA l_tadir TYPE tadir.
- FIELD-SYMBOLS <l_program> LIKE LINE OF programs.
- * Build list of matching program names
- SELECT name
- FROM trdir
- INTO TABLE programs
- WHERE name IN program_range. "#EC CI_SUBRC
- * Restrict by package
- IF package_range IS NOT INITIAL.
- l_wa_e071-pgmid = 'LIMU'.
- l_wa_e071-object = 'REPS'.
- LOOP AT programs ASSIGNING <l_program>.
- l_wa_e071-obj_name = <l_program>.
- CALL FUNCTION 'TR_CHECK_TYPE'
- EXPORTING
- wi_e071 = l_wa_e071
- IMPORTING
- we_tadir = l_tadir.
- SELECT SINGLE devclass
- FROM tadir
- INTO l_tadir
- WHERE pgmid = l_tadir-pgmid
- AND object = l_tadir-object
- AND obj_name = l_tadir-obj_name.
- CHECK sy-subrc <> 0
- OR l_tadir-devclass NOT IN package_range.
- DELETE programs. "#EC CI_SUBRC
- ENDLOOP.
- ENDIF.
- * Sort result
- SORT programs.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->FIND_TADIR_OBJECTS
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] PACKAGE_RANGE TYPE T_PACKAGE_RANGE(optional)
- * | [<-()] OBJECTS TYPE CTS_OBJECTS
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD find_tadir_objects.
- * Select TADIR objects
- SELECT pgmid object obj_name
- FROM tadir
- INTO TABLE objects "#EC CI_SUBRC
- WHERE devclass IN package_range. "#EC CI_GENBUFF
- * Sort result
- SORT objects.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->GET_PROGRAM
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] PGMID TYPE PGMID
- * | [--->] OBJECT TYPE TROBJTYPE
- * | [--->] OBJ_NAME TYPE TROBJ_NAME
- * | [<-()] PROGRAM TYPE PROGNAME
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD get_program.
- DATA: l_namespace TYPE namespace,
- l_function_group TYPE rs38l_area,
- l_class TYPE seocpdkey-clsname,
- l_method TYPE seocpdkey-cpdname,
- l_function_pool TYPE pname,
- l_include_no TYPE includenr,
- l_offset TYPE i,
- l_incl_naming TYPE REF TO if_oo_class_incl_naming,
- l_cifref TYPE REF TO if_oo_clif_incl_naming.
- CASE pgmid.
- WHEN 'R3TR'.
- CASE object.
- WHEN 'CLAS'.
- l_class = obj_name(30).
- cl_oo_include_naming=>get_instance_by_name( EXPORTING name = l_class
- RECEIVING cifref = l_cifref
- EXCEPTIONS OTHERS = 1 ).
- IF sy-subrc = 0 AND l_cifref IS NOT INITIAL.
- l_incl_naming ?= l_cifref.
- program = l_incl_naming->class_pool.
- ENDIF.
- WHEN 'FUGR'.
- l_function_group = obj_name.
- CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
- EXPORTING
- complete_area = l_function_group
- IMPORTING
- namespace = l_namespace
- group = l_function_group
- EXCEPTIONS
- OTHERS = 1.
- IF sy-subrc = 0.
- CONCATENATE l_namespace 'SAPL' l_function_group INTO program.
- ENDIF.
- WHEN 'PROG'.
- program = obj_name.
- WHEN OTHERS.
- CLEAR program. "Currently not supported.
- ENDCASE.
- WHEN 'LIMU'.
- CASE object.
- WHEN 'CPRI' OR 'CPRO' OR 'CPUB'.
- l_class = obj_name(30).
- cl_oo_include_naming=>get_instance_by_name( EXPORTING name = l_class
- RECEIVING cifref = l_cifref
- EXCEPTIONS OTHERS = 1 ).
- IF sy-subrc = 0 AND l_cifref IS NOT INITIAL.
- l_incl_naming ?= l_cifref.
- program = l_incl_naming->get_include_by_section( object ).
- ENDIF.
- WHEN 'FUNC'.
- SELECT SINGLE pname include
- FROM tfdir
- INTO (l_function_pool,
- l_include_no)
- WHERE funcname = obj_name.
- IF sy-subrc = 0.
- WHILE l_function_pool+l_offset CA '/'.
- l_offset = l_offset + sy-fdpos + 1.
- ENDWHILE.
- IF l_function_pool+l_offset CP 'SAPL*'.
- SHIFT l_function_pool+l_offset LEFT BY 3 PLACES.
- CONCATENATE l_function_pool 'U' l_include_no INTO program.
- ENDIF.
- ENDIF.
- WHEN 'METH'.
- l_class = obj_name(30).
- cl_oo_include_naming=>get_instance_by_name( EXPORTING name = l_class
- RECEIVING cifref = l_cifref
- EXCEPTIONS OTHERS = 1 ).
- IF sy-subrc = 0 AND l_cifref IS NOT INITIAL.
- l_incl_naming ?= l_cifref.
- l_method = obj_name+30.
- program = l_incl_naming->get_include_by_mtdname( l_method ).
- ENDIF.
- WHEN 'REPO' OR 'REPS' OR 'REPT'.
- program = obj_name.
- WHEN OTHERS.
- CLEAR program. "Currently not supported.
- ENDCASE.
- WHEN OTHERS.
- CLEAR program. "Currently not supported.
- ENDCASE.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Instance Public Method abap_repository->GET_PROGRAM_INCLUDES
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] PROGRAM TYPE PROGNAME
- * | [<-()] INCLUDES TYPE T_PROGRAMS
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD get_program_includes.
- CALL FUNCTION 'RS_GET_ALL_INCLUDES'
- EXPORTING
- program = program
- TABLES
- includetab = includes
- EXCEPTIONS
- OTHERS = 0.
- ENDMETHOD.
- ENDCLASS.
- CLASS regex DEFINITION.
- PUBLIC SECTION.
- TYPE-POOLS abap .
- CLASS-METHODS abap_wildcard_to_regex
- IMPORTING
- !input TYPE csequence
- !omit_anchors TYPE abap_bool DEFAULT abap_false
- RETURNING
- VALUE(result) TYPE string .
- CLASS-METHODS escape
- IMPORTING
- !input TYPE csequence
- RETURNING
- VALUE(result) TYPE string .
- CLASS-METHODS sql_wildcard_to_regex
- IMPORTING
- !input TYPE csequence
- RETURNING
- VALUE(result) TYPE string .
- PROTECTED SECTION.
- PRIVATE SECTION.
- ENDCLASS.
- CLASS regex IMPLEMENTATION.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Static Public Method regex=>ABAP_WILDCARD_TO_REGEX
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] INPUT TYPE CSEQUENCE
- * | [--->] OMIT_ANCHORS TYPE ABAP_BOOL (default =ABAP_FALSE)
- * | [<-()] RESULT TYPE STRING
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD abap_wildcard_to_regex.
- result = input.
- REPLACE ALL OCCURRENCES OF REGEX `([.?^${}()|\[\]\/\\])` IN result WITH `\\$1`.
- REPLACE ALL OCCURRENCES OF `*` IN result WITH `.*`.
- REPLACE ALL OCCURRENCES OF `+` IN result WITH `.`.
- IF omit_anchors = abap_false.
- CONCATENATE `^` result `\s*$` INTO result.
- ELSEIF result IS INITIAL.
- result = `.*`.
- ENDIF.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Static Public Method regex=>ESCAPE
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] INPUT TYPE CSEQUENCE
- * | [<-()] RESULT TYPE STRING
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD escape.
- result = input.
- REPLACE ALL OCCURRENCES OF REGEX `([.*+?^${}()|\[\]\/\\])` IN result WITH `\\$1`.
- ENDMETHOD.
- * <SIGNATURE>---------------------------------------------------------------------------------------+
- * | Static Public Method regex=>SQL_WILDCARD_TO_REGEX
- * +-------------------------------------------------------------------------------------------------+
- * | [--->] INPUT TYPE CSEQUENCE
- * | [<-()] RESULT TYPE STRING
- * +--------------------------------------------------------------------------------------</SIGNATURE>
- METHOD sql_wildcard_to_regex.
- result = input.
- REPLACE ALL OCCURRENCES OF REGEX `([.*+?^${}()|\[\]\/\\])` IN result WITH `\\$1`.
- REPLACE ALL OCCURRENCES OF `%` IN result WITH `.*`.
- REPLACE ALL OCCURRENCES OF `_` IN result WITH `.`.
- ENDMETHOD.
- ENDCLASS.
- TYPE-POOLS abap.
- TYPE-POOLS swbm.
- TABLES t002.
- TABLES tdevc.
- DATA BEGIN OF g_cts_object. "#EC NEEDED
- INCLUDE TYPE cts_object.
- DATA position TYPE eu_name.
- DATA END OF g_cts_object.
- SELECTION-SCREEN BEGIN OF BLOCK b00 WITH FRAME TITLE TEXT-b00.
- SELECT-OPTIONS p_devc FOR tdevc-devclass.
- SELECT-OPTIONS p_langu FOR t002-spras DEFAULT sy-langu.
- SELECTION-SCREEN SKIP.
- PARAMETERS p_mess AS CHECKBOX DEFAULT abap_true.
- PARAMETERS p_otr AS CHECKBOX DEFAULT abap_true.
- PARAMETERS p_source AS CHECKBOX DEFAULT abap_true.
- PARAMETERS p_tpool AS CHECKBOX DEFAULT abap_true.
- SELECTION-SCREEN END OF BLOCK b00.
- SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-b01.
- PARAMETERS p_wildc RADIOBUTTON GROUP ptyp.
- PARAMETERS p_regex RADIOBUTTON GROUP ptyp. "#EC NEEDED
- SELECTION-SCREEN SKIP.
- PARAMETERS p_patt TYPE string LOWER CASE.
- SELECTION-SCREEN SKIP.
- PARAMETERS p_case AS CHECKBOX.
- SELECTION-SCREEN END OF BLOCK b01.
- START-OF-SELECTION.
- PERFORM main USING p_devc[] p_langu[] p_patt p_wildc p_case.
- AT LINE-SELECTION.
- PERFORM navigate.
- *&---------------------------------------------------------------------*
- *& Form main
- *&---------------------------------------------------------------------*
- * Main logic
- *----------------------------------------------------------------------*
- FORM main USING p_package_range TYPE abap_repository=>t_package_range
- p_language_range TYPE abap_repository=>t_language_range
- p_pattern TYPE string
- p_is_wildcard TYPE abap_bool
- p_case_sensitive TYPE abap_bool.
- DATA l_repository TYPE REF TO abap_repository.
- DATA l_languages TYPE abap_repository=>t_languages.
- DATA l_tadir_objects TYPE cts_objects.
- DATA l_regex TYPE string.
- * Check display authority
- AUTHORITY-CHECK OBJECT 'S_DEVELOP'
- ID 'ACTVT' FIELD '03'
- ID 'OBJTYPE' DUMMY
- ID 'OBJNAME' DUMMY
- ID 'DEVCLASS' DUMMY
- ID 'P_GROUP' DUMMY.
- IF sy-subrc <> 0.
- MESSAGE e676(00).
- ENDIF.
- * Convert pattern to regular expression
- IF p_is_wildcard = abap_true.
- l_regex = regex=>abap_wildcard_to_regex( input = p_pattern
- omit_anchors = abap_true ).
- ELSEIF p_pattern IS NOT INITIAL.
- l_regex = p_pattern.
- ELSE.
- l_regex = `.*`.
- ENDIF.
- * Prepare repository access
- CREATE OBJECT l_repository.
- * Find matching languages
- l_languages = l_repository->find_languages( language_range = p_language_range ).
- IF l_languages IS INITIAL.
- RETURN.
- ENDIF.
- * Find matching TADIR objects
- l_tadir_objects = l_repository->find_tadir_objects( package_range = p_package_range ).
- * Write list header
- ULINE /(223).
- WRITE: / sy-vline, (10) TEXT-h01, "#EC NUMBER_OK
- sy-vline, (60) TEXT-h02, "#EC NUMBER_OK
- sy-vline, (40) TEXT-h03, "#EC NUMBER_OK
- sy-vline, (100) TEXT-h04, "#EC NUMBER_OK
- sy-vline.
- ULINE /(223).
- * Find text in messages
- IF p_mess = abap_true.
- PERFORM find_message_short_texts USING l_tadir_objects l_languages l_regex p_case_sensitive.
- ENDIF.
- * Find OTR short texts
- IF p_otr = abap_true.
- PERFORM find_otr_short_texts USING p_package_range l_languages l_regex p_case_sensitive.
- ENDIF.
- * Find text in ABAP sources
- IF p_source = abap_true.
- PERFORM find_abap_source USING l_repository l_tadir_objects l_regex p_case_sensitive.
- ENDIF.
- * Find text in text pools
- IF p_tpool = abap_true.
- PERFORM find_textpool_texts USING l_repository l_tadir_objects l_languages l_regex p_case_sensitive.
- ENDIF.
- * Write list footer
- ULINE /(223).
- * Initialize navigation
- CLEAR g_cts_object.
- ENDFORM. "main
- *&---------------------------------------------------------------------*
- *& Form find_message_short_texts
- *&---------------------------------------------------------------------*
- * Find message short texts
- *----------------------------------------------------------------------*
- FORM find_message_short_texts USING p_tadir_objects TYPE cts_objects
- p_languages TYPE abap_repository=>t_languages
- p_regex TYPE string
- p_case_sensitive TYPE abap_bool.
- DATA l_message_number TYPE msgnr.
- DATA l_message_text TYPE natxt.
- FIELD-SYMBOLS <l_tadir_object> LIKE LINE OF p_tadir_objects.
- FIELD-SYMBOLS <l_language> LIKE LINE OF p_languages.
- LOOP AT p_tadir_objects ASSIGNING <l_tadir_object> WHERE pgmid = 'R3TR' AND object = 'MSAG'.
- LOOP AT p_languages ASSIGNING <l_language>.
- SELECT msgnr text
- FROM t100
- INTO (l_message_number, l_message_text)
- WHERE sprsl = <l_language>
- AND arbgb = <l_tadir_object>-obj_name "#EC CI_BYPASS
- ORDER BY msgnr. "#EC CI_GENBUFF
- g_cts_object-pgmid = 'LIMU'.
- g_cts_object-object = 'MESS'.
- CONCATENATE <l_tadir_object>-obj_name l_message_number INTO g_cts_object-obj_name.
- CLEAR g_cts_object-position.
- PERFORM process_line USING `Message` <l_tadir_object>-obj_name l_message_number l_message_text p_regex p_case_sensitive. "#EC NOTEXT
- ENDSELECT. "#EC CI_SUBRC
- ENDLOOP.
- ENDLOOP.
- ENDFORM. "find_message_short_texts
- *&---------------------------------------------------------------------*
- *& Form find_otr_short_texts
- *&---------------------------------------------------------------------*
- * Find OTR short texts
- *----------------------------------------------------------------------*
- FORM find_otr_short_texts USING p_package_range TYPE abap_repository=>t_package_range
- p_languages TYPE abap_repository=>t_languages
- p_regex TYPE string
- p_case_sensitive TYPE abap_bool.
- DATA l_concept TYPE sotr_conc.
- DATA l_type TYPE string.
- DATA l_pgmid TYPE pgmid.
- DATA l_object TYPE trobjtype.
- DATA l_obj_name TYPE trobj_name.
- DATA l_text TYPE string.
- FIELD-SYMBOLS <l_language> LIKE LINE OF p_languages.
- LOOP AT p_languages ASSIGNING <l_language>.
- SELECT sotr_head~concept sotr_use~pgmid sotr_use~object sotr_use~obj_name sotr_text~text
- FROM sotr_head
- INNER JOIN sotr_text
- ON sotr_text~concept = sotr_head~concept
- AND sotr_text~flag_cntxt = 'X'
- INNER JOIN sotr_use
- ON sotr_use~concept = sotr_head~concept
- INTO (l_concept, l_pgmid, l_object, l_obj_name, l_text)
- WHERE paket IN p_package_range
- AND langu = <l_language>
- AND flag_com = space
- ORDER BY sotr_use~pgmid sotr_use~object sotr_use~obj_name. "#EC CI_BUFFJOIN
- CONCATENATE `OTR (` l_object `)` INTO l_type. "#EC NOTEXT
- g_cts_object-pgmid = l_pgmid.
- g_cts_object-object = l_object.
- g_cts_object-obj_name = l_obj_name.
- g_cts_object-position = l_concept.
- PERFORM process_line USING l_type l_obj_name l_concept l_text p_regex p_case_sensitive.
- ENDSELECT. "#EC CI_SUBRC
- ENDLOOP.
- ENDFORM. "find_otr_short_texts
- *&---------------------------------------------------------------------*
- *& Form find_textpool_texts
- *&---------------------------------------------------------------------*
- * Find textpool texts
- *----------------------------------------------------------------------*
- FORM find_abap_source USING p_repository TYPE REF TO abap_repository
- p_tadir_objects TYPE cts_objects
- p_regex TYPE string
- p_case_sensitive TYPE abap_bool.
- DATA l_program TYPE progname.
- DATA l_programs TYPE abap_repository=>t_programs.
- DATA l_includes TYPE abap_repository=>t_programs.
- DATA l_source_lines TYPE string_table.
- FIELD-SYMBOLS <l_tadir_object> LIKE LINE OF p_tadir_objects.
- FIELD-SYMBOLS <l_program> LIKE LINE OF l_programs.
- FIELD-SYMBOLS <l_source_line> LIKE LINE OF l_source_lines.
- LOOP AT p_tadir_objects ASSIGNING <l_tadir_object>.
- l_program = p_repository->get_program( pgmid = <l_tadir_object>-pgmid
- object = <l_tadir_object>-object
- obj_name = <l_tadir_object>-obj_name ).
- CHECK l_program IS NOT INITIAL.
- INSERT l_program INTO TABLE l_programs.
- l_includes = p_repository->get_program_includes( l_program ).
- INSERT LINES OF l_includes INTO TABLE l_programs.
- ENDLOOP.
- SORT l_programs.
- DELETE ADJACENT DUPLICATES FROM l_programs.
- LOOP AT l_programs ASSIGNING <l_program>.
- READ REPORT <l_program> INTO l_source_lines.
- CHECK sy-subrc = 0.
- LOOP AT l_source_lines ASSIGNING <l_source_line>.
- g_cts_object-pgmid = 'LIMU'.
- g_cts_object-object = 'REPS'.
- g_cts_object-obj_name = <l_program>.
- g_cts_object-position = sy-tabix.
- PERFORM process_line USING `ABAP` <l_program> `` <l_source_line> p_regex p_case_sensitive. "#EC NOTEXT
- ENDLOOP.
- ENDLOOP.
- ENDFORM. "find_textpool_texts
- *&---------------------------------------------------------------------*
- *& Form find_textpool_texts
- *&---------------------------------------------------------------------*
- * Find textpool texts
- *----------------------------------------------------------------------*
- FORM find_textpool_texts USING p_repository TYPE REF TO abap_repository
- p_tadir_objects TYPE cts_objects
- p_languages TYPE abap_repository=>t_languages
- p_regex TYPE string
- p_case_sensitive TYPE abap_bool.
- DATA l_program TYPE progname.
- DATA l_textpool TYPE STANDARD TABLE OF textpool.
- DATA l_key TYPE string.
- DATA l_text TYPE string.
- FIELD-SYMBOLS <l_tadir_object> LIKE LINE OF p_tadir_objects.
- FIELD-SYMBOLS <l_language> LIKE LINE OF p_languages.
- FIELD-SYMBOLS <l_text> LIKE LINE OF l_textpool.
- LOOP AT p_tadir_objects ASSIGNING <l_tadir_object>.
- LOOP AT p_languages ASSIGNING <l_language>.
- l_program = p_repository->get_program( pgmid = <l_tadir_object>-pgmid
- object = <l_tadir_object>-object
- obj_name = <l_tadir_object>-obj_name ).
- CHECK l_program IS NOT INITIAL.
- READ TEXTPOOL l_program INTO l_textpool LANGUAGE <l_language>.
- IF sy-subrc = 0.
- LOOP AT l_textpool ASSIGNING <l_text>.
- CASE <l_text>-id.
- WHEN 'H'.
- CONCATENATE `HEADER` <l_text>-key(3) INTO l_key SEPARATED BY `-`.
- l_text = <l_text>-entry.
- WHEN 'I'.
- CONCATENATE `TEXT` <l_text>-key(3) INTO l_key SEPARATED BY `-`.
- l_text = <l_text>-entry.
- WHEN 'R'.
- l_key = `PROGRAM TITLE`.
- l_text = <l_text>-entry.
- WHEN 'S'.
- IF <l_text>-entry(1) <> 'D'.
- l_key = <l_text>-key.
- l_text = <l_text>-entry+8.
- ELSE.
- CONTINUE. "Text from dictionary
- ENDIF.
- WHEN 'T'.
- l_key = `LIST HEADER`.
- l_text = <l_text>-entry.
- WHEN OTHERS.
- l_key = `UNKNOWN`.
- l_text = <l_text>-entry.
- ENDCASE.
- g_cts_object-pgmid = 'LIMU'.
- g_cts_object-object = 'REPT'.
- g_cts_object-obj_name = l_program.
- CONCATENATE <l_text>-id <l_text>-key INTO g_cts_object-position.
- PERFORM process_line USING `Textpol` l_program l_key l_text p_regex p_case_sensitive. "#EC NOTEXT
- ENDLOOP.
- ENDIF.
- ENDLOOP.
- ENDLOOP.
- ENDFORM. "find_textpool_texts
- *&---------------------------------------------------------------------*
- *& Form process_line
- *&---------------------------------------------------------------------*
- FORM process_line USING p_type TYPE csequence
- p_name TYPE csequence
- p_key TYPE csequence
- p_text TYPE csequence
- p_regex TYPE string
- p_case_sensitive TYPE abap_bool.
- CONSTANTS lc_max_text_width TYPE i VALUE 100.
- CONSTANTS lc_min_prefix_length TYPE i VALUE 5.
- CONSTANTS lc_min_match_length TYPE i VALUE 10.
- CONSTANTS lc_min_postfix_length TYPE i VALUE 5.
- DATA l_original_prefix_length TYPE i.
- DATA l_original_match_length TYPE i.
- DATA l_original_postfix_length TYPE i.
- DATA l_original_total_length TYPE i.
- DATA l_display_prefix_length TYPE i.
- DATA l_display_match_length TYPE i.
- DATA l_display_postfix_length TYPE i.
- DATA l_display_total_length TYPE i.
- DATA l_display_gap_length TYPE i.
- DATA l_min_prefix_length TYPE i.
- DATA l_min_match_length TYPE i.
- DATA l_min_postfix_length TYPE i.
- DATA l_temp_length TYPE i.
- DATA l_temp_offset TYPE i.
- DATA l_text TYPE string.
- * Ignore initial texts
- IF p_text IS INITIAL.
- RETURN.
- ENDIF.
- l_text = p_text.
- * Check if text matches the pattern
- IF p_case_sensitive = abap_true.
- FIND FIRST OCCURRENCE OF REGEX p_regex IN l_text RESPECTING CASE MATCH OFFSET l_original_prefix_length MATCH LENGTH l_original_match_length.
- ELSE.
- FIND FIRST OCCURRENCE OF REGEX p_regex IN l_text IGNORING CASE MATCH OFFSET l_original_prefix_length MATCH LENGTH l_original_match_length.
- ENDIF.
- IF sy-subrc <> 0.
- RETURN.
- ENDIF.
- * Calculate display length of prefix, postfix and match
- l_original_total_length = strlen( l_text ).
- l_original_postfix_length = l_original_total_length - l_original_prefix_length - l_original_match_length.
- DO.
- * Calculate minimum part length
- IF l_original_prefix_length > lc_min_prefix_length.
- l_min_prefix_length = lc_min_prefix_length.
- ELSE.
- l_min_prefix_length = l_original_prefix_length.
- ENDIF.
- IF l_original_match_length > lc_min_match_length.
- l_min_match_length = lc_min_match_length.
- ELSE.
- l_min_match_length = l_original_match_length.
- ENDIF.
- IF l_original_postfix_length > lc_min_postfix_length.
- l_min_postfix_length = lc_min_postfix_length.
- ELSE.
- l_min_postfix_length = l_original_postfix_length.
- ENDIF.
- * Check if full text can be displayed
- IF l_original_total_length <= lc_max_text_width.
- l_display_prefix_length = l_original_prefix_length.
- l_display_match_length = l_original_match_length.
- l_display_postfix_length = l_original_postfix_length.
- l_display_total_length = l_original_total_length.
- EXIT.
- ENDIF.
- * Check if text can be displayed with abbreviated postfix
- l_temp_length = l_original_prefix_length + l_original_match_length + l_min_postfix_length.
- IF l_temp_length <= lc_max_text_width.
- l_display_prefix_length = l_original_prefix_length.
- l_display_match_length = l_original_match_length.
- l_display_postfix_length = lc_max_text_width - l_original_prefix_length - l_original_match_length.
- l_display_total_length = lc_max_text_width.
- EXIT.
- ENDIF.
- * Check if text can be displayed with abbreviated prefix and postfix
- l_temp_length = l_min_prefix_length + l_original_match_length + l_min_postfix_length.
- IF l_temp_length <= lc_max_text_width.
- l_display_prefix_length = lc_max_text_width - l_original_match_length - l_min_postfix_length.
- l_display_match_length = l_original_match_length.
- l_display_postfix_length = l_min_postfix_length.
- l_display_total_length = lc_max_text_width.
- EXIT.
- ENDIF.
- * Prefix, postfix and match need to be abbreviated
- l_temp_length = l_min_prefix_length + l_min_match_length + l_min_postfix_length.
- IF l_temp_length <= lc_max_text_width.
- l_display_prefix_length = l_min_prefix_length.
- l_display_match_length = lc_max_text_width - l_min_prefix_length - l_min_postfix_length.
- l_display_postfix_length = l_min_postfix_length.
- l_display_total_length = lc_max_text_width.
- EXIT.
- ENDIF.
- * No possible layout due to inconsistent setting of constants
- RETURN.
- ENDDO.
- * Write object details
- WRITE: / sy-vline, (10) p_type, "#EC NUMBER_OK
- sy-vline, (60) p_name, "#EC NUMBER_OK
- sy-vline, (40) p_key, "#EC NUMBER_OK
- sy-vline NO-GAP.
- * Write leading gap (in order to avoid early change fo color)
- WRITE space NO-GAP.
- * Write prefix
- IF l_display_prefix_length < l_original_prefix_length.
- l_temp_length = l_display_prefix_length - 3.
- l_temp_offset = l_original_prefix_length - l_temp_length.
- WRITE `...` NO-GAP.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- ELSEIF l_display_prefix_length > 0.
- l_temp_length = l_display_prefix_length.
- l_temp_offset = 0.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- ENDIF.
- * Write match
- FORMAT COLOR COL_KEY.
- IF l_display_match_length < l_original_match_length.
- l_temp_length = ( l_display_match_length - 3 ) / 2.
- l_temp_offset = l_original_prefix_length.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- WRITE `...` NO-GAP.
- l_temp_length = l_display_match_length - 3 - l_temp_length.
- l_temp_offset = l_original_prefix_length + l_original_match_length - l_temp_length.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- ELSEIF l_display_match_length > 0.
- l_temp_length = l_display_match_length.
- l_temp_offset = l_original_prefix_length.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- ENDIF.
- FORMAT COLOR COL_BACKGROUND.
- * Write postfix
- IF l_display_postfix_length < l_original_postfix_length.
- l_temp_length = l_display_postfix_length - 3.
- l_temp_offset = l_original_prefix_length + l_original_match_length.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- WRITE `...` NO-GAP.
- ELSEIF l_display_postfix_length > 0.
- l_temp_length = l_display_postfix_length.
- l_temp_offset = l_original_prefix_length + l_original_match_length.
- WRITE l_text+l_temp_offset(l_temp_length) NO-GAP.
- ENDIF.
- * Write trailing gap
- l_display_gap_length = lc_max_text_width - l_display_total_length.
- IF l_display_gap_length > 0.
- WRITE AT (l_display_gap_length) space.
- ELSE.
- WRITE space NO-GAP.
- ENDIF.
- WRITE sy-vline.
- * Hide navigation data
- HIDE g_cts_object-pgmid.
- HIDE g_cts_object-object.
- HIDE g_cts_object-obj_name.
- HIDE g_cts_object-position.
- ENDFORM. "process_line
- *&---------------------------------------------------------------------*
- *& Form navigate
- *&---------------------------------------------------------------------*
- * Navigation handler
- *----------------------------------------------------------------------*
- FORM navigate.
- DATA l_obj_name TYPE seu_objkey.
- DATA l_wb_request TYPE REF TO cl_wb_request.
- DATA l_wb_requests LIKE STANDARD TABLE OF l_wb_request.
- DATA l_wb_textpool_state TYPE REF TO cl_wb_textpool_state.
- IF g_cts_object IS NOT INITIAL.
- CASE g_cts_object-object.
- WHEN 'REPS'.
- CALL FUNCTION 'RS_TOOL_ACCESS'
- EXPORTING
- operation = 'SHOW'
- object_type = g_cts_object-object
- object_name = g_cts_object-obj_name
- position = g_cts_object-position
- EXCEPTIONS
- OTHERS = 0.
- WHEN 'REPT'.
- CREATE OBJECT l_wb_textpool_state.
- l_wb_textpool_state->textkey = g_cts_object-position+1.
- l_wb_textpool_state->texttype = g_cts_object-position(1).
- l_obj_name = g_cts_object-obj_name.
- CREATE OBJECT l_wb_request
- EXPORTING
- p_object_type = 'PX'
- p_object_name = l_obj_name
- p_operation = swbm_c_op_display
- p_object_state = l_wb_textpool_state.
- INSERT l_wb_request INTO TABLE l_wb_requests.
- cl_wb_startup=>start( EXPORTING p_wb_request_set = l_wb_requests ).
- WHEN OTHERS.
- CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL'
- EXPORTING
- iv_pgmid = g_cts_object-pgmid
- iv_object = g_cts_object-object
- iv_obj_name = g_cts_object-obj_name
- EXCEPTIONS
- OTHERS = 0.
- ENDCASE.
- CLEAR g_cts_object.
- ENDIF.
- ENDFORM. "navigate
Add Comment
Please, Sign In to add comment