ABAP和WDA程序代码扫描工具

ops/2024/9/23 6:32:21/

【运维实用小工具】

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.


http://www.ppmy.cn/ops/106653.html

相关文章

JAVA:Spring Boot 整合 Swagger 的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 在现代Web开发中&#xff0c;API文档的生成和维护是非常重要的。Swagger是一款流行的API文档生成工具&#xff0c;它可以帮助开发者自动生成API文档&#xff0c;并提供可视化的接口…

【自用14】C++俄罗斯方块-思路复盘

1.编写主函数 int main(void){welcome();//欢迎函数system("pause");//窗口停留colsegraph();//关闭图画return 0;//返回值 }其中包含有最开始的欢迎&#xff0c;以及基础的窗口停留、图画关闭和返回值语句 2.编写欢迎函数 需求&#xff1a; 欢迎函数中需要包含的…

Kafka-设计原理

ControllerLeader - PartitionRebalance消息发布机制HW与LEO日志分段 Controller Kafka核心总控制器Controller&#xff1a;在Kafka集群中会有一个或者多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controller&#xff09;&#xff0c;它负责管理…

《Java面试题集中营》- Redis

建议阅读《Redis开发与运维》《Redis设计与实现》《Redis深度历险&#xff1a;核心原理和应用实践》 Redis 为什么是单线程? 为什么单线程还能这么快&#xff1f; 单线程能够避免线程切换和竞态产生的消耗&#xff0c;而且单线程可以简化数据结构和算法的实现 至于单线程还快…

Sentinel-1 Level 1数据处理的详细算法定义(十)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

Self-study Python Fish-C Note20 P64to65

类和对象 (part 3) 本节主要介绍 类和对象的多态和鸭子类型、私有变量和 __slots__&#xff08;原视频P64-65)\ 多态 多态是面向对象编程的三大特征之一&#xff0c;另外两个是封装和继承。多态是指同一个运算符、函数或对象&#xff0c;在不同场景下具有不同作用效果的情况…

虚拟机苹果系统MacOS中XCode的安装

1、背景介绍 主机系统Win11&#xff0c;虚拟机VMWare17&#xff0c;苹果系统MacOS 13.6.7 2、Xcode的在线 点击应用市场&#xff0c;输入Xcode搜索&#xff1a; 看来Xcode无法安装在macOS V13上&#xff0c;直接在线安装失败。 3、采用下载安装包的方法进行安装 解决办法参考链…

25版王道数据结构课后习题详细分析 第六章 图 6.4图的应用

一、单项选择题 ———————————————————— ———————————————————— 解析&#xff1a; 当无向连通图存在权值相同的多条边时&#xff0c;最小生成树可能是不唯一的;另外&#xff0c;由于这是一个无向连通图&#xff0c;因此最小生成树必定…