【运维实用小工具】
1. ABAP代码扫描工具,可扫描ABAP和Dynpro程序,在找不到程序或者需要整个系统批量替换的时候很实用,比如系统税率统一替换等等场景。
2. 可以在第一个程序基础上,再包一个出来,专门扫描WDA Dynpro程序的小工具。
第一个程序代码实现:
*----------------------------------------------------------------------*
* Scan a set of source code for a particular string
*----------------------------------------------------------------------*
REPORT zzrs_abap_source_scan MESSAGE-ID eu.TYPE-POOLS:slis,sscr.TABLES:seoclasstx,tadir,tlibt,d020s,trdir.CLASS:lcl_source_scan DEFINITION DEFERRED.DATA:lo_sscan TYPE REF TO lcl_source_scan,lv_sstring TYPE text255,lv_appl TYPE taplt-appl.SELECTION-SCREEN BEGIN OF BLOCK: a05 WITH FRAME TITLE a05.
SELECT-OPTIONS sstring FOR lv_sstring NO INTERVALS MODIF ID dsp MEMORY ID str.
PARAMETERS p_regex TYPE xfeld AS CHECKBOX MODIF ID dsp.
SELECTION-SCREEN: END OF BLOCK a05,BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
SELECT-OPTIONS: repname FOR trdir-name MEMORY ID rs_scan_repid,dynnr FOR d020s-dnum,subc FOR trdir-subc,appl FOR lv_appl,cnam FOR trdir-cnam MATCHCODE OBJECT user_addr,unam FOR trdir-unam MATCHCODE OBJECT user_addr.
SELECTION-SCREEN: END OF BLOCK a10,BEGIN OF BLOCK a11 WITH FRAME TITLE a11.
SELECT-OPTIONS devclass FOR tadir-devclass.
SELECTION-SCREEN: END OF BLOCK a11,BEGIN OF BLOCK a12 WITH FRAME TITLE a12.
SELECT-OPTIONS: funcgrp FOR tlibt-area.
SELECTION-SCREEN: END OF BLOCK a12,BEGIN OF BLOCK a13 WITH FRAME TITLE a13.
SELECT-OPTIONS: p_class FOR seoclasstx-clsname.
SELECTION-SCREEN: END OF BLOCK a13,BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
PARAMETERS: plusminu(2) TYPE n DEFAULT 2,inclu TYPE xfeld AS CHECKBOX DEFAULT 'X',modiass TYPE xfeld AS CHECKBOX USER-COMMAND dummy,comment TYPE xfeld AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK a20,BEGIN OF BLOCK a30 WITH FRAME TITLE a30.
PARAMETERS: rb_code RADIOBUTTON GROUP r10,rb_dyn RADIOBUTTON GROUP r10,rb_all RADIOBUTTON GROUP r10,p_vers TYPE xfeld AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK a30.*----------------------------------------------------------------------*
* CLASS lcx_scan_exceptions DEFINITION
*----------------------------------------------------------------------*
* Exceptions for source scanning
*----------------------------------------------------------------------*
CLASS lcx_scan_exceptions DEFINITION INHERITING FROM cx_static_check FINAL.
ENDCLASS. "lcx_scan_exceptions DEFINITION*----------------------------------------------------------------------*
* CLASS lcl_source_scan DEFINITION
*----------------------------------------------------------------------*
* ABAP source scanner
*----------------------------------------------------------------------*
CLASS lcl_source_scan DEFINITION FINAL.PUBLIC SECTION.METHODS:constructor,f4_classCHANGINGcv_class_name TYPE clike,f4_function_groupIMPORTINGiv_group_name TYPE clike,f4_repnameCHANGINGcv_repname TYPE clike,pbo,start.PROTECTED SECTION.TYPES:BEGIN OF ty_dynpro,repname LIKE d020s-prog,dynnr LIKE d020s-dnum,END OF ty_dynpro.TYPES:BEGIN OF ty_ls_objname,report TYPE sy-repid,dynnr TYPE sy-dynnr,END OF ty_ls_objname.DATA:go_alv TYPE REF TO cl_salv_hierseq_table,gv_hit_count TYPE i,gv_sstring TYPE string,gv_dynp_found TYPE xfeld,gv_vers_found TYPE xfeld,gt_dynpro TYPE STANDARD TABLE OF ty_dynpro,gt_object TYPE STANDARD TABLE OF tadir-obj_name,gt_vrsd TYPE HASHED TABLE OF vrsdWITH UNIQUE KEY objname versno,gt_source TYPE abaptxt255_tab,gv_report TYPE syrepid,gv_dynpro TYPE sydynnr,BEGIN OF gs_alv_header,repname TYPE tadir-obj_name,dynnr TYPE sy-dynnr,expand TYPE xfeld,versno TYPE vrsd-versno,END OF gs_alv_header,gt_alv_header LIKE STANDARD TABLE OF gs_alv_header,BEGIN OF gs_alv_item,repname TYPE sy-repid,dynnr TYPE sy-dynnr,versno TYPE vrsd-versno,line_no TYPE rsrow,text TYPE text255,hit TYPE xfeld,cell_color TYPE lvc_t_scol,END OF gs_alv_item,gt_alv_item LIKE STANDARD TABLE OF gs_alv_item.CONSTANTS:gc_x TYPE xfeld VALUE 'X'.METHODS:add_to_hitlistIMPORTINGiv_report TYPE clikeiv_dynpro TYPE clike OPTIONALiv_source_line TYPE clikeiv_tabix TYPE sy-tabixiv_hit TYPE xfeldiv_versno TYPE vrsd-versno,call_abap_editorIMPORTINGis_alv_item LIKE gs_alv_item,call_screen_painterIMPORTINGis_alv_item LIKE gs_alv_item,display,display_abap_versionIMPORTINGis_alv_item LIKE gs_alv_item,display_screen_painter_versionIMPORTINGis_alv_item LIKE gs_alv_item,display_version_managementIMPORTINGis_alv_header LIKE gs_alv_header,get_alv_instance,get_dynpro_flow_logicIMPORTINGiv_report TYPE clikeiv_dynpro TYPE clikeRETURNING VALUE(rt_dflow) TYPE abaptxt255_tab,get_hit_setIMPORTINGiv_report TYPE clikeiv_dynpro TYPE clike OPTIONALit_abap TYPE abaptxt255_tabiv_tabix TYPE sy-tabixiv_versno TYPE vrsd-versno,get_version_numbersIMPORTINGiv_report TYPE clikeiv_dynpro TYPE clike OPTIONALRETURNING VALUE(rt_vrsd) LIKE gt_vrsd,get_dynpros,get_source_names,get_source_by_versionIMPORTINGiv_report TYPE clikeiv_dynpro TYPE clike OPTIONALiv_versno TYPE vrsd-versnoRETURNING VALUE(rt_abap) TYPE abaptxt255_tab,get_report_names,get_function_names,get_class_names,get_interface_names,get_includes,search_abap_source RAISING lcx_scan_exceptions,search_dynpro_source RAISING lcx_scan_exceptions,search_source RAISING lcx_scan_exceptions,set_alv_attributes,on_link_clickFOR EVENT link_click OF cl_salv_events_hierseqIMPORTINGsenderlevelrowcolumn.ENDCLASS. "lcl_source_scan DEFINITION*----------------------------------------------------------------------*
* CLASS lcl_source_scan IMPLEMENTATION
*----------------------------------------------------------------------*
* ABAP source scanner
*----------------------------------------------------------------------*
CLASS lcl_source_scan IMPLEMENTATION.METHOD display_screen_painter_version.DATA:lv_object_name TYPE versobjnam,ls_infolna TYPE vrsinfolna,ls_infolnb TYPE vrsinfolnb,ls_vrsd LIKE LINE OF gt_vrsd,ls_object_name TYPE ty_ls_objname.ls_object_name-report = is_alv_item-repname.ls_object_name-dynnr = is_alv_item-dynnr.lv_object_name = ls_object_name.READ TABLE gt_vrsd WITH TABLE KEY objname = lv_object_nameversno = is_alv_item-versnoINTO ls_vrsd.CHECK sy-subrc IS INITIAL.ls_infolna = lv_object_name.MOVE-CORRESPONDING ls_vrsd TO ls_infolnb.CALL FUNCTION 'RS_SCRP_SHOW_VERS'EXPORTINGinfolna = ls_infolnainfolnb = ls_infolnbobjname = lv_object_nameversno = is_alv_item-versnoEXCEPTIONSOTHERS = 0.ENDMETHOD. "display_screen_painter_versionMETHOD display_abap_version.DATA:lt_trdir TYPE STANDARD TABLE OF trdir,lv_object_name TYPE versobjnam,lv_title TYPE sy-title,lt_abap TYPE abaptxt255_tab.lv_object_name = is_alv_item-repname.* Display report versionCALL FUNCTION 'SVRS_GET_REPS_FROM_OBJECT'EXPORTINGobject_name = lv_object_nameobject_type = 'REPS'versno = is_alv_item-versnoiv_no_release_transformation = gc_xTABLESrepos_tab = lt_abaptrdir_tab = lt_trdirEXCEPTIONSno_version = 1OTHERS = 2.CHECK sy-subrc IS INITIAL.CONCATENATE 'Programm:'(004)is_alv_item-repname'Version'(005)is_alv_item-versnoINTO lv_title SEPARATED BY space.EDITOR-CALL FOR lt_abap TITLE lv_title DISPLAY-MODE.ENDMETHOD. "display_abap_versionMETHOD call_screen_painter.CALL FUNCTION 'RS_SCRP'EXPORTINGabl_line = is_alv_item-line_nodynnr = is_alv_item-dynnrprogname = is_alv_item-repnamewanted_mode = 'SHOW'EXCEPTIONSOTHERS = 0.ENDMETHOD. "call_screen_painterMETHOD call_abap_editor.CALL FUNCTION 'EDITOR_PROGRAM'EXPORTINGappid = 'PG'display = gc_xprogram = is_alv_item-repnameline = is_alv_item-line_notopline = is_alv_item-line_noEXCEPTIONSOTHERS = 0.ENDMETHOD. "call_abap_editorMETHOD display_version_management.IF is_alv_header-dynnr IS INITIAL.
* call version management for programsCALL FUNCTION 'RS_PROGRAM_VERSIONS'EXPORTINGprogname = is_alv_header-repnameEXCEPTIONSOTHERS = 0.ELSE.CALL FUNCTION 'RS_SCRP_VERSION'EXPORTINGdynnr = is_alv_header-dynnrprogname = is_alv_header-repnameno_update = gc_x.ENDIF.ENDMETHOD. "display_version_managementMETHOD constructor.DATA:ls_restrict TYPE sscr_restrict,ls_opt_list TYPE sscr_opt_list,ls_association TYPE sscr_ass.ls_opt_list-name = 'RESTRICT'.ls_opt_list-options-cp = gc_x.ls_opt_list-options-eq = gc_x.APPEND ls_opt_list TO ls_restrict-opt_list_tab.ls_association-kind = 'S'.ls_association-name = 'SSTRING'.ls_association-sg_main = 'I'.ls_association-op_main = ls_association-op_addy = 'RESTRICT'.APPEND ls_association TO ls_restrict-ass_tab.CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'EXPORTINGprogram = sy-repidrestriction = ls_restrictEXCEPTIONSOTHERS = 0.ENDMETHOD. "constructorMETHOD get_dynpro_flow_logic.DATA: ls_dhead TYPE d020s,lt_dfield TYPE STANDARD TABLE OF d021s,lt_dflow TYPE STANDARD TABLE OF d022s,lt_dmatch TYPE STANDARD TABLE OF d023s,BEGIN OF ls_dynp_id,prog TYPE d020s-prog,dnum TYPE d020s-dnum,END OF ls_dynp_id.ls_dynp_id-prog = iv_report.ls_dynp_id-dnum = iv_dynpro.IMPORT DYNPRO ls_dhead lt_dfield lt_dflow lt_dmatch ID ls_dynp_id.rt_dflow = lt_dflow.ENDMETHOD. "get_dynpro_flow_logicMETHOD on_link_click.DATA:ls_alv_header LIKE LINE OF gt_alv_header,ls_alv_item LIKE LINE OF gt_alv_item.CASE level.WHEN '1'.READ TABLE gt_alv_header INDEX row INTO ls_alv_header.CHECK sy-subrc IS INITIAL.display_version_management( ls_alv_header ).WHEN '2'.READ TABLE gt_alv_item INDEX row INTO ls_alv_item.CHECK sy-subrc IS INITIAL.IF ls_alv_item-dynnr IS INITIAL.IF ls_alv_item-versno IS INITIAL.call_abap_editor( ls_alv_item ).ELSE.display_abap_version( ls_alv_item ).ENDIF.SET PARAMETER ID 'RID' FIELD sy-repid.ELSE.
* Call screen painterIF ls_alv_item-versno IS INITIAL.call_screen_painter( ls_alv_item ).ELSE.display_screen_painter_version( ls_alv_item ).ENDIF.ENDIF.ENDCASE.ENDMETHOD. "on_link_clickMETHOD set_alv_attributes.DATA:lo_layout TYPE REF TO cl_salv_layout,lo_events TYPE REF TO cl_salv_events_hierseq,lo_functions TYPE REF TO cl_salv_functions_list,lo_level TYPE REF TO cl_salv_hierseq_level,lo_column TYPE REF TO cl_salv_column_hierseq,lo_columns TYPE REF TO cl_salv_columns_hierseq,lt_columns TYPE salv_t_column_ref,ls_columns LIKE LINE OF lt_columns,lo_settings TYPE REF TO cl_salv_display_settings,lv_title TYPE lvc_title,lv_hits TYPE lvc_title,ls_color TYPE lvc_s_colo,ls_layout TYPE salv_s_layout_key,lt_functions TYPE salv_t_ui_func.* Layoutls_layout-report = sy-repid.ls_layout-handle = 'SCAN'.lo_layout = go_alv->get_layout( ).lo_layout->set_key( ls_layout ).lo_layout->set_save_restriction( ).* Function keys/buttonslo_functions = go_alv->get_functions( ).lo_functions->set_all( gc_x ).* exclude the following functions (column paging buttons)lt_functions = lo_functions->get_functions( ).* Display settingslo_settings = go_alv->get_display_settings( ).* Titlelv_hits = gv_hit_count.SHIFT lv_hits LEFT DELETING LEADING space.CONCATENATE lv_hits'Treffer'(001)INTO lv_hits SEPARATED BY space.lv_title = 'Source Scan für String:'(002).CONCATENATE lv_titlegv_sstringINTO lv_title SEPARATED BY space.CONCATENATE lv_titlelv_hitsINTO lv_title SEPARATED BY ' - '.lo_settings->set_list_header( lv_title ).* Event handlinglo_events = go_alv->get_event( ).SET HANDLER on_link_click FOR lo_events.* Field catalogTRY.
* Field catalog/columns - header tablelo_columns = go_alv->get_columns( '1' ).lt_columns = lo_columns->get( ).TRY.lo_columns->set_expand_column( 'EXPAND' ).lo_level = go_alv->get_level( '1' ).lo_level->set_items_expanded( gc_x ).CATCH cx_salv_data_error.ENDTRY.LOOP AT lt_columns INTO ls_columns.CASE ls_columns-columnname.WHEN 'EXPAND'.ls_columns-r_column->set_technical( ).WHEN 'DYNNR'.IF gv_dynp_found IS INITIAL.ls_columns-r_column->set_technical( ).ELSE.ls_columns-r_column->set_output_length( '15' ).ENDIF.WHEN 'VERSNO'.IF gv_vers_found IS INITIAL.ls_columns-r_column->set_technical( ).ELSE.ls_columns-r_column->set_leading_zero( gc_x ).ls_columns-r_column->set_output_length( '15' ).TRY.lo_column ?= ls_columns-r_column.lo_column->set_cell_type( if_salv_c_cell_type=>hotspot ).CATCH cx_sy_move_cast_error.ENDTRY.ENDIF.ENDCASE.ENDLOOP.* Field catalog/columns - item tablelo_columns = go_alv->get_columns( '2' ).TRY.lo_columns->set_color_column( 'CELL_COLOR' ).CATCH cx_salv_data_error.ENDTRY.lt_columns = lo_columns->get( ).LOOP AT lt_columns INTO ls_columns.CASE ls_columns-columnname.WHEN 'REPNAME'.ls_columns-r_column->set_technical( ).WHEN 'DYNNR'.ls_columns-r_column->set_technical( ).WHEN 'VERSNO'.ls_columns-r_column->set_technical( ).WHEN 'CELL_COLOR'.ls_columns-r_column->set_technical( ).WHEN 'HIT'.ls_columns-r_column->set_technical( ).WHEN 'LINE_NO'.ls_color-col = '4'.TRY.lo_column ?= ls_columns-r_column.lo_column->set_color( ls_color ).lo_column->set_leading_zero( gc_x ).CATCH cx_sy_move_cast_error.ENDTRY.WHEN 'TEXT'.TRY.lo_column ?= ls_columns-r_column.lo_column->set_cell_type( if_salv_c_cell_type=>hotspot ).CATCH cx_sy_move_cast_error.ENDTRY.ENDCASE.ENDLOOP.CATCH cx_salv_not_found.ENDTRY.ENDMETHOD. "set_alv_attributesMETHOD get_alv_instance.DATA:lt_alv_bind TYPE salv_t_hierseq_binding,ls_alv_bind LIKE LINE OF lt_alv_bind.ls_alv_bind-master = ls_alv_bind-slave = 'REPNAME'.APPEND ls_alv_bind TO lt_alv_bind.ls_alv_bind-master = ls_alv_bind-slave = 'DYNNR'.APPEND ls_alv_bind TO lt_alv_bind.ls_alv_bind-master = ls_alv_bind-slave = 'VERSNO'.APPEND ls_alv_bind TO lt_alv_bind.TRY.CALL METHOD cl_salv_hierseq_table=>factoryEXPORTINGt_binding_level1_level2 = lt_alv_bindIMPORTINGr_hierseq = go_alvCHANGINGt_table_level1 = gt_alv_headert_table_level2 = gt_alv_item.CATCH cx_salv_data_error.CATCH cx_salv_not_found.ENDTRY.ENDMETHOD. "get_alv_instanceMETHOD f4_repname.CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'EXPORTINGobject_type = 'PROG'object_name = cv_repnamesuppress_selection = 'X'IMPORTINGobject_name_selected = cv_repnameEXCEPTIONScancel = 0.ENDMETHOD. "f4_repnameMETHOD f4_function_group.DATA:lv_fname TYPE dynfnam.lv_fname = iv_group_name.CALL FUNCTION 'RS_HELP_HANDLING'EXPORTINGdynpfield = lv_fnamedynpname = sy-dynnrobject = 'FG 'progname = sy-repidsuppress_selection_screen = 'X'.ENDMETHOD. "f4_function_groupMETHOD f4_class.CALL FUNCTION 'F4_DD_ALLTYPES'EXPORTINGobject = cv_class_namesuppress_selection = gc_xdisplay_only = spaceonly_types_for_clifs = gc_xIMPORTINGresult = cv_class_name.ENDMETHOD. "f4_classMETHOD display.DATA text TYPE c LENGTH 150.IF gv_hit_count IS INITIAL.MESSAGE s326 WITH gv_sstring.RETURN.ENDIF.IF sy-batch IS INITIAL.text = |DISPLAY { gv_hit_count } HITS...|.CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'EXPORTINGtext = text.ENDIF.SORT gt_alv_item BY repname dynnr versno line_no hit DESCENDING.DELETE ADJACENT DUPLICATES FROM gt_alv_item COMPARING repname dynnr versno line_no.SORT GT_ALV_HEADER by repname.delete ADJACENT DUPLICATES FROM gt_alv_header COMPARING ALL FIELDS.get_alv_instance( ).CHECK go_alv IS NOT INITIAL.set_alv_attributes( ).go_alv->display( ).ENDMETHOD. "displayMETHOD add_to_hitlist.DATA:ls_col LIKE LINE OF gs_alv_item-cell_color.gs_alv_item-repname = iv_report.gs_alv_item-dynnr = iv_dynpro.gs_alv_item-line_no = iv_tabix.gs_alv_item-versno = iv_versno.gs_alv_item-text = iv_source_line.IF iv_hit IS NOT INITIAL.gs_alv_item-hit = gc_x.ADD 1 TO gv_hit_count.ls_col-fname = 'TEXT'.ls_col-color-col = '5'.APPEND ls_col TO gs_alv_item-cell_color.ENDIF.APPEND gs_alv_item TO gt_alv_item.CLEAR gs_alv_item.ENDMETHOD. "add_to_hitlistMETHOD get_hit_set.DATA: lv_end TYPE i,lv_start TYPE i,lv_xtabix TYPE sy-tabix,lv_hitline TYPE xfeld.FIELD-SYMBOLS:<lv_abap> TYPE any.lv_start = iv_tabix - plusminu .lv_end = iv_tabix + plusminu.IF lv_start < 1.lv_start = 1.ENDIF.WHILE lv_start <= lv_end.READ TABLE it_abap ASSIGNING <lv_abap> INDEX lv_start.IF sy-subrc IS NOT INITIAL.EXIT.ENDIF.lv_xtabix = sy-tabix.IF lv_start = iv_tabix.lv_hitline = gc_x.ELSE.CLEAR lv_hitline.ENDIF.ADD 1 TO lv_start.IF comment IS NOT INITIAL.IF modiass IS INITIAL.IF <lv_abap>(1) = '*'OR <lv_abap>(1) = '"'.CONTINUE.ENDIF.ELSE.IF <lv_abap>(1) = '*'.IF <lv_abap>(2) = '*{' OR <lv_abap>(2) = '*}'.ELSE.CONTINUE.ENDIF.ENDIF.ENDIF.ENDIF.CALL METHOD add_to_hitlistEXPORTINGiv_report = iv_reportiv_dynpro = iv_dynproiv_source_line = <lv_abap>iv_tabix = lv_xtabixiv_hit = lv_hitlineiv_versno = iv_versno.ENDWHILE.ENDMETHOD. "get_hit_setMETHOD get_source_by_version.DATA:lv_object_name TYPE versobjnam,ls_object_name TYPE ty_ls_objname,lt_trdir TYPE STANDARD TABLE OF trdir,lt_d022s TYPE STANDARD TABLE OF d022s.IF iv_dynpro IS INITIAL.lv_object_name = iv_report.CALL FUNCTION 'SVRS_GET_REPS_FROM_OBJECT'EXPORTINGobject_name = lv_object_nameobject_type = 'REPS'versno = iv_versnoiv_no_release_transformation = 'X'TABLESrepos_tab = rt_abaptrdir_tab = lt_trdirEXCEPTIONSOTHERS = 0.ELSE.ls_object_name-report = iv_report.ls_object_name-dynnr = iv_dynpro.lv_object_name = ls_object_name.CALL FUNCTION 'SVRS_GET_VERSION_DYNP_40'EXPORTINGobject_name = lv_object_nameversno = iv_versnoTABLESd022s_tab = lt_d022sEXCEPTIONSOTHERS = 1.CHECK sy-subrc IS INITIAL AND lt_d022s IS NOT INITIAL.APPEND LINES OF lt_d022s TO rt_abap.ENDIF.ENDMETHOD. "get_source_by_versionMETHOD get_version_numbers.DATA:ls_objname TYPE ty_ls_objname,lv_objtype TYPE vrsd-objtype,lv_objname TYPE versobjnam,lv_versno TYPE versno,lt_vrsn TYPE STANDARD TABLE OF vrsn,lt_vrsd TYPE STANDARD TABLE OF vrsd.ls_objname-report = iv_report.ls_objname-dynnr = iv_dynpro.lv_objname = ls_objname.IF iv_dynpro IS INITIAL.lv_objtype = 'REPS'.ELSE.lv_objtype = 'DYNP'.ENDIF.CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'EXPORTINGobjname = lv_objnameobjtype = lv_objtypeTABLESlversno_list = lt_vrsnversion_list = lt_vrsdEXCEPTIONSOTHERS = 1.CHECK sy-subrc IS INITIAL .SORT lt_vrsd BY objname versno.DELETE ADJACENT DUPLICATES FROM lt_vrsd COMPARING objname versno.rt_vrsd = lt_vrsd.DELETE TABLE rt_vrsd WITH TABLE KEY objname = lv_objnameversno = lv_versno.SORT rt_vrsd.CHECK iv_dynpro IS NOT INITIAL.
* For dynpros we need to save the version information for the version display
* this is not required for source codeINSERT LINES OF rt_vrsd INTO TABLE gt_vrsd.ENDMETHOD. "get_version_NumbersMETHOD search_abap_source.DATA:percentage TYPE i,old_percentage TYPE i VALUE -1,text TYPE c LENGTH 150.LOOP AT gt_object INTO gv_report.IF sy-batch IS INITIAL.percentage = sy-tabix * 100 / lines( gt_object ).text = |SEARCH ABAP SOURCES ({ sy-tabix }/{ lines( gt_object ) })...|.IF old_percentage <> percentage.CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'EXPORTINGpercentage = percentagetext = text.old_percentage = percentage.ENDIF.ENDIF.READ REPORT gv_report INTO gt_source.IF sy-subrc IS NOT INITIAL.CONTINUE.ENDIF.search_source( ).ENDLOOP.FREE gt_object.ENDMETHOD.METHOD search_source.DATA:lt_source_vers TYPE abaptxt255_tab,lv_string_found TYPE xfeld,lt_vrsd TYPE STANDARD TABLE OF vrsd,ls_vrsd LIKE LINE OF lt_vrsd,lv_number TYPE i,lv_index TYPE i,lt_results TYPE match_result_tab,ls_result LIKE LINE OF lt_results,ls_sstring LIKE LINE OF sstring.IF p_vers IS INITIAL.lv_number = 1.ELSE.lt_vrsd = get_version_numbers( iv_report = gv_reportiv_dynpro = gv_dynpro ).lv_number = lines( lt_vrsd ) + 1.ENDIF.DO lv_number TIMES.CLEAR lv_string_found.IF sy-index = 1.CLEAR ls_vrsd.ELSE.lv_index = sy-index - 1.READ TABLE lt_vrsd INDEX lv_index INTO ls_vrsd.CHECK sy-subrc IS INITIAL.lt_source_vers = get_source_by_version( iv_report = gv_reportiv_dynpro = gv_dynproiv_versno = ls_vrsd-versno ).IF lt_source_vers IS NOT INITIAL.gt_source = lt_source_vers.ELSE.CONTINUE.ENDIF.ENDIF.LOOP AT sstring INTO ls_sstring.REFRESH lt_results.IF p_regex IS INITIAL.FIND ALL OCCURRENCES OF ls_sstring-low IN TABLE gt_sourceIN CHARACTER MODEIGNORING CASERESULTS lt_results.ELSE.TRY.FIND ALL OCCURRENCES OF REGEX ls_sstring-low IN TABLE gt_sourceIN CHARACTER MODEIGNORING CASERESULTS lt_results.CATCH cx_sy_regex.
* invalid regex -> stop processingMESSAGE s384 WITH ls_sstring-low DISPLAY LIKE 'E'.RAISE EXCEPTION TYPE lcx_scan_exceptions.ENDTRY.ENDIF.CHECK lt_results IS NOT INITIAL.lv_string_found = gc_x.SORT lt_results BY line.DELETE ADJACENT DUPLICATES FROM lt_results COMPARING line.LOOP AT lt_results INTO ls_result.CALL METHOD get_hit_setEXPORTINGiv_report = gv_reportiv_dynpro = gv_dynproit_abap = gt_sourceiv_tabix = ls_result-lineiv_versno = ls_vrsd-versno.ENDLOOP.ENDLOOP.IF lv_string_found IS NOT INITIAL.
* Add ALV header entryCLEAR gs_alv_header.gs_alv_header-repname = gv_report.gs_alv_header-dynnr = gv_dynpro.gs_alv_header-versno = ls_vrsd-versno.APPEND gs_alv_header TO gt_alv_header.IF gv_dynpro IS NOT INITIAL.gv_dynp_found = gc_x.ENDIF.IF ls_vrsd-versno IS NOT INITIAL.gv_vers_found = gc_x.ENDIF.ENDIF.ENDDO.ENDMETHOD.METHOD search_dynpro_source.DATA ls_dynpro LIKE LINE OF gt_dynpro.IF sy-batch IS INITIAL.CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'EXPORTINGtext = 'SEARCH DYNPRO SOURCES...'.ENDIF.LOOP AT gt_dynpro INTO ls_dynpro.REFRESH gt_source.gv_report = ls_dynpro-repname.gv_dynpro = ls_dynpro-dynnr.gt_source = get_dynpro_flow_logic( iv_report = ls_dynpro-repnameiv_dynpro = ls_dynpro-dynnr ).CHECK gt_source IS NOT INITIAL.search_source( ).ENDLOOP.ENDMETHOD.METHOD get_dynpros.CHECK gt_object IS NOT INITIAL.SELECT prog dnum INTO TABLE gt_dynproFROM d020s FOR ALL ENTRIES IN gt_objectWHERE prog = gt_object-table_lineAND dnum IN dynnr.ENDMETHOD. "get_dynprosMETHOD get_includes.DATA:lt_inc TYPE STANDARD TABLE OF tadir-obj_name,lt_inc_tmp LIKE lt_inc,lv_program TYPE sy-repid,lv_obj TYPE tadir-obj_name,class_name TYPE seoclsname,class_includes TYPE seoincl_t.CHECK inclu IS NOT INITIAL.LOOP AT gt_object INTO lv_obj. "for classes we already have the includesIF lv_obj+30(2) = 'CP'. "Class PoolDELETE gt_object INDEX sy-tabix.class_name = lv_obj(30).TRANSLATE class_name USING '= '.cl_oo_classname_service=>get_all_class_includes(EXPORTING class_name = class_nameRECEIVING result = class_includesEXCEPTIONS OTHERS = 0).DELETE class_includes WHERE table_line+30(2) = 'CS' OR table_line+30(2) = 'CP'.APPEND LINES OF class_includes TO lt_inc.ELSEIF lv_obj+30(2) = 'IP'. "Interface PoolDELETE gt_object INDEX sy-tabix.lv_obj+31(1) = 'U'.APPEND lv_obj TO lt_inc.ENDIF.REFRESH lt_inc_tmp.lv_program = lv_obj.CALL FUNCTION 'RS_GET_ALL_INCLUDES'EXPORTINGprogram = lv_programTABLESincludetab = lt_inc_tmpEXCEPTIONSOTHERS = 0.APPEND LINES OF lt_inc_tmp TO lt_inc.ENDLOOP.SORT lt_inc.DELETE ADJACENT DUPLICATES FROM lt_inc.APPEND LINES OF lt_inc TO gt_object.ENDMETHOD.METHOD get_report_names.SELECT obj_name INTO TABLE gt_objectFROM tadirWHERE pgmid = 'R3TR'AND object = 'PROG'AND devclass IN devclass. "#EC CI_GENBUFFENDMETHOD. "get_report_namesMETHOD get_function_names.DATA:lt_obj TYPE STANDARD TABLE OF tadir-obj_name,lv_obj TYPE tadir-obj_name,lv_fgroup TYPE rs38l-area,lv_program TYPE progname.FIELD-SYMBOLS:<lv_obj> LIKE LINE OF lt_obj.SELECT obj_name INTO TABLE lt_objFROM tadirWHERE pgmid = 'R3TR'AND object = 'FUGR'AND devclass IN devclassAND obj_name IN funcgrp. "#EC CI_GENBUFFLOOP AT lt_obj ASSIGNING <lv_obj>.lv_fgroup = <lv_obj>.CLEAR lv_program.CALL FUNCTION 'FUNCTION_INCLUDE_CONCATENATE'CHANGINGprogram = lv_programcomplete_area = lv_fgroupEXCEPTIONSOTHERS = 1.CHECK sy-subrc IS INITIAL AND lv_program IS NOT INITIAL.lv_obj = lv_program.APPEND lv_obj TO gt_object.ENDLOOP.ENDMETHOD. "get_function_namesMETHOD get_class_names.DATA lt_obj TYPE STANDARD TABLE OF tadir-obj_name.DATA ls_obj TYPE tadir-obj_name.SELECT obj_name INTO TABLE lt_objFROM tadirWHERE pgmid = 'R3TR'AND object = 'CLAS'AND devclass IN devclassAND obj_name IN p_class. "#EC CI_GENBUFFLOOP AT lt_obj INTO ls_obj.APPEND cl_oo_classname_service=>get_classpool_name( |{ ls_obj }| ) TO gt_object.ENDLOOP.ENDMETHOD.METHOD get_interface_names.DATA lt_obj TYPE STANDARD TABLE OF tadir-obj_name.DATA ls_obj TYPE tadir-obj_name.SELECT obj_name INTO TABLE lt_objFROM tadirWHERE pgmid = 'R3TR'AND object = 'INTF'AND devclass IN devclassAND obj_name IN p_class. "#EC CI_GENBUFFLOOP AT lt_obj INTO ls_obj.APPEND cl_oo_classname_service=>get_interfacepool_name( |{ ls_obj }| ) TO gt_object.ENDLOOP.ENDMETHOD.METHOD get_source_names.IF repname[] IS NOT INITIAL ORcnam[] IS NOT INITIAL ORunam[] IS NOT INITIAL ORsubc[] IS NOT INITIAL ORappl[] IS NOT INITIAL.SELECT name APPENDING TABLE gt_objectFROM trdirWHERE name IN repnameAND cnam IN cnamAND unam IN unamAND subc IN subcAND appl IN appl.ENDIF.IF devclass[] IS NOT INITIAL.get_report_names( ).get_function_names( ).get_class_names( ).get_interface_names( ).ENDIF.IF funcgrp[] IS NOT INITIAL.get_function_names( ).ENDIF.IF p_class[] IS NOT INITIAL.get_class_names( ).get_interface_names( ).ENDIF.IF rb_code IS INITIAL.get_dynpros( ).ENDIF.ENDMETHOD. "get_source_namesMETHOD start.DATA:ls_sstring LIKE LINE OF sstring[].IF sstring[] IS INITIAL AND modiass IS INITIAL.
* Please specifiy a search termMESSAGE s385 DISPLAY LIKE 'E'.RETURN.ENDIF.IF NOT modiass IS INITIAL.REFRESH sstring.ls_sstring-sign = 'I'.ls_sstring-option = 'EQ'.ls_sstring-low = '^\*\{'.APPEND ls_sstring TO sstring.ls_sstring-low = '^\*\}'.APPEND ls_sstring TO sstring.p_regex = gc_x.ENDIF.READ TABLE sstring[] INTO ls_sstring INDEX 1.IF lines( sstring[] ) = 1.gv_sstring = ls_sstring-low.ELSE.CONCATENATE ls_sstring-low'...'INTO gv_sstring.ENDIF.IF sy-batch IS INITIAL.CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'EXPORTINGtext = 'GET INCLUDES...'.ENDIF.get_source_names( ).get_includes( ).IF rb_dyn IS INITIAL.TRY.search_abap_source( ).CATCH lcx_scan_exceptions.RETURN.ENDTRY.ENDIF.IF rb_code IS INITIAL.TRY.search_dynpro_source( ).CATCH lcx_scan_exceptions.RETURN.ENDTRY.ENDIF.display( ).ENDMETHOD. "startMETHOD pbo.DATA ls_screen TYPE screen.CHECK modiass IS NOT INITIAL.REFRESH sstring[].CLEAR sstring.CLEAR p_regex.LOOP AT SCREEN INTO ls_screen.CHECK ls_screen-group1 = 'DSP'.ls_screen-input = '0'.MODIFY screen FROM ls_screen.ENDLOOP.ENDMETHOD. "pbo
ENDCLASS. "lcl_source_scan IMPLEMENTATIONINITIALIZATION.CREATE OBJECT lo_sscan.a05 = 'Suchbegriff'(a05).a10 = 'Report/Dynpro Selektion'(a10).a11 = 'Paket Selektion'(a11).a12 = 'Funktionsgruppen Selektion'(a12).a13 = 'Klassen Selektion'(a13).a20 = 'Suchkriterien'(a20).a30 = 'Suchbereich'(a30).AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_class-low.lo_sscan->f4_class( CHANGING cv_class_name = p_class-low ).AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_class-high.lo_sscan->f4_class( CHANGING cv_class_name = p_class-high ).AT SELECTION-SCREEN ON VALUE-REQUEST FOR funcgrp-low.lo_sscan->f4_function_group( 'FUNCGRP-LOW' ).AT SELECTION-SCREEN ON VALUE-REQUEST FOR funcgrp-high.lo_sscan->f4_function_group( 'FUNCGRP-HIGH' ).AT SELECTION-SCREEN ON VALUE-REQUEST FOR repname-low.lo_sscan->f4_repname( CHANGING cv_repname = repname-low ).AT SELECTION-SCREEN ON VALUE-REQUEST FOR repname-high.lo_sscan->f4_repname( CHANGING cv_repname = repname-high ).AT SELECTION-SCREEN OUTPUT.lo_sscan->pbo( ).START-OF-SELECTION.AUTHORITY-CHECK OBJECT 'S_DEVELOP'ID 'DEVCLASS' DUMMYID 'OBJTYPE' DUMMYID 'OBJNAME' DUMMYID 'P_GROUP' DUMMYID 'ACTVT' FIELD '03'.IF sy-subrc <> 0.MESSAGE e516(eu) WITH '03' 'S_DEVELOP'.ENDIF.lo_sscan->start( ).
第二个程序代码实现:
*&---------------------------------------------------------------------*
*& Report ZWD_SOURCE_SCAN
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zwd_source_scan.
TABLES: wdy_wb_geninfo.TABLES:seoclasstx,trdir.DATA:lv_sstring TYPE text255.RANGES: gt_sstring FOR lv_sstring.
SELECTION-SCREEN BEGIN OF BLOCK: a05 WITH FRAME TITLE a05.
SELECT-OPTIONS s_string FOR lv_sstring NO INTERVALS MODIF ID dsp OBLIGATORY MEMORY ID str.
SELECTION-SCREEN: END OF BLOCK a05.SELECT-OPTIONS: s_comp FOR wdy_wb_geninfo-component_name.PARAMETERS: p_wdacls AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_com TYPE xfeld AS CHECKBOX DEFAULT 'X'.START-OF-SELECTION.PERFORM sub_submit.
*&---------------------------------------------------------------------*
*& Form SUB_SUBMIT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM sub_submit .RANGES: s_rename FOR trdir-name.RANGES: s_class FOR seoclasstx-clsname.DATA:lt_wdy_wb_geninfo LIKE wdy_wb_geninfo OCCURS 0 WITH HEADER LINE.SELECT * INTO TABLE lt_wdy_wb_geninfo FROM wdy_wb_geninfoWHERE component_name IN s_comp.CHECK lt_wdy_wb_geninfo[] IS NOT INITIAL.LOOP AT lt_wdy_wb_geninfo.s_rename-sign = 'I'.s_rename-option = 'CP'.CONCATENATE '*' lt_wdy_wb_geninfo-guid '*' INTO s_rename-low.APPEND s_rename.CLEAR: s_rename.ENDLOOP.SUBMIT zzrs_abap_source_scan
* WITH P_CLASS IN P_CLASS "assistance classWITH repname IN s_rename "id of generated programWITH sstring IN s_string "string to search
WITH comment = 'X'AND RETURN.IF p_wdacls = 'X'.SELECT SINGLE *INTO @DATA(ls_wdy_componet)FROM wdy_componentWHERE component_name IN @s_compAND version = 'A'.IF sy-subrc = 0 AND ls_wdy_componet-assistance_class IS NOT INITIAL.s_class-sign = 'I'.s_class-option = 'CP'.CONCATENATE '*' ls_wdy_componet-assistance_class '*' INTO s_class-low.APPEND s_class.CLEAR: s_class.SUBMIT zzrs_abap_source_scanWITH p_class IN s_class "id of generated programWITH sstring IN s_string "string to searchWITH comment = p_comAND RETURN.ENDIF.ENDIF.
ENDFORM.