SAP 代码扫描工具

描述:

ZSCANNER是一个先进的代码分析工具,旨在提供对程序和功能模块内部工作的全面见解。它揭示了代码的技术细节,包括正在创建、读取、更新或删除的数据表(CRUD操作),以及正在调用的类、功能模块和BAPI(业务插件)。为了提高操作效率,ZScanner包括一个快速错误消息定位功能,允许用户直接导航到导致错误的特定代码行。

我们将其用于AS-IS项目研究和快速操作。

ZSCANNER:

*&---------------------------------------------------------------------*
*& Report  ZSCANNER
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zscanner.INCLUDE zscanner_top.
INCLUDE zscanner_s01.
INCLUDE zscanner_f01.
INCLUDE zscanner_f02.AT SELECTION-SCREEN OUTPUT.PERFORM frm_modify_screen.START-OF-SELECTION.IF p_ck1 = abap_true.***GET basic info -- programsPERFORM frm_get_basic_info.***GET PROGRAMS-includingsPERFORM frm_get_devc_pgmna.ELSE.***Get basic info -- functionsPERFORM frm_get_basic_func_info.ENDIF.***GET FUNCTION GROUPS && CLASSPERFORM frm_get_devc_func.***GET CLASSES
*  PERFORM frm_get_devc_class.***GET KEY WORDS.PERFORM frm_key_word_scan.***ALVPERFORM frm_alv_list.

INCLUDE zscanner_top.

*&---------------------------------------------------------------------*
*&  Include           ZSCANNER_TOP
*&---------------------------------------------------------------------*TABLES: tstc, tfdir.CONSTANTS:con_true  TYPE afx_dte_boolean VALUE 'X',con_false TYPE afx_dte_boolean VALUE ' '.DATA: gr_tcode TYPE RANGE OF tstc-tcode,gr_pgmna TYPE RANGE OF tstc-pgmna.DATA: 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.TYPES: BEGIN OF t_str_lines,devclass LIKE tadir-devclass,progname LIKE rs38m-programm,linno    LIKE rslgaxdata-line,line     LIKE abapsource-line,END OF t_str_lines.DATA: BEGIN OF g_tab_lines OCCURS 0,devclass LIKE tadir-devclass,progname LIKE rs38m-programm,linno    LIKE rslgaxdata-line,line     LIKE abapsource-line,END   OF g_tab_lines.TYPES: BEGIN OF ts_result,sel,tcode      TYPE tstc-tcode,    "t-codepgmna      TYPE tstc-pgmna,    "programfname      TYPE rs38l_fnam,    "function moduleinstance   TYPE char100,title      TYPE trdirt-text,spras      TYPE tadir-masterlang,created_on TYPE tadir-created_on,changed_on TYPE tadir-created_on,devclass   TYPE tadir-devclass,devclass_t TYPE tdevct-ctext,component  TYPE tdevc-component,  "package component??select     TYPE char255,insert     TYPE char255,delete     TYPE char255,update     TYPE char255,callfunc   TYPE char255,callbapi   TYPE char255,callrfc    TYPE char255,callclass  TYPE char255,calltran   TYPE char255,submit     TYPE char255,forms      TYPE char255,isalv      TYPE flag,lines      TYPE i,button_t   TYPE char255,END OF ts_result.
TYPES: tt_result TYPE TABLE OF ts_result.
DATA: gt_result TYPE tt_result,gs_result TYPE ts_result.TYPES: BEGIN OF ts_prog,main_name TYPE trdir-name,   "主程序name      TYPE trdir-name,type      TYPE char02,    "01-program, 02-function, 03-class,from      TYPE i,to        TYPE i,lines     TYPE i,END OF ts_prog.
TYPES: tt_prog TYPE TABLE OF ts_prog.
DATA: gt_prog      TYPE tt_prog,gs_prog      TYPE ts_prog,gt_prog_part TYPE tt_prog,      "section for FORMgs_prog_part TYPE ts_prog.TYPES: BEGIN OF ts_function,main_name TYPE trdir-name,   "主程序pname     TYPE trdir-name,   "当前程序name      TYPE rs38l-name,position  TYPE i,            "function所在程序的行type      TYPE char02,    "01-function, 02-BAPI, 03-STD.function, 04-destination RFCEND OF ts_function,tt_function TYPE TABLE OF ts_function.
DATA: gt_function TYPE tt_function,gs_function TYPE ts_function.TYPES: BEGIN OF ts_class,main_name  TYPE trdir-name,   "主程序class_name TYPE eu_lname,        "CLASSinclude    TYPE programm,     "调用CLASS的程序名END OF ts_class,tt_class TYPE TABLE OF ts_class.
DATA: gt_class TYPE tt_class,gs_class TYPE ts_class.TYPES: BEGIN OF ts_key_word,main_name TYPE trdir-name,   "主程序name      TYPE trdir-name,   "程序keyname   TYPE char40,type      TYPE char10,       "position  TYPE i,ddtext   TYPE dd02t-ddtext,END OF ts_key_word,tt_key_word TYPE TABLE OF ts_key_word.
DATA: gs_key_word TYPE ts_key_word,gt_key_word TYPE tt_key_word.
DATA: gs_detail TYPE ts_key_word,gt_detail TYPE tt_key_word.DATA: gr_code_std TYPE RANGE OF rsmptexts-obj_code.
TYPES: BEGIN OF ts_button,main_name TYPE trdir-name,obj_code  TYPE rsmptexts-obj_code,text      TYPE rsmptexts-text,END OF ts_button,tt_button TYPE TABLE OF ts_button.
DATA: gs_button TYPE ts_button,gt_button TYPE tt_button.DEFINE append_to_key_word.gs_key_word-main_name = &1.gs_key_word-name      = &2.gs_key_word-keyname   = &3.gs_key_word-position  = &4.gs_key_word-type      = &5.APPEND gs_key_word TO gt_key_word.CLEAR gs_key_word.
END-OF-DEFINITION.


INCLUDE zscanner_s01.

*&---------------------------------------------------------------------*
*&  Include           ZSCANNER_S01
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b0 WITH FRAME TITLE text-000.
PARAMETERS: p_ck1 RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND u1,p_ck2 RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK b0.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_tcode FOR tstc-tcode MODIF ID m3,s_pgmna FOR tstc-pgmna MODIF ID m3,s_fname   FOR tfdir-funcname MODIF ID m4.
SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: p_prog AS CHECKBOX DEFAULT con_true MODIF ID m1,p_fugr AS CHECKBOX DEFAULT con_true MODIF ID m2,p_cinc AS CHECKBOX DEFAULT con_true.
SELECTION-SCREEN END OF BLOCK b2.


INCLUDE zscanner_f01.

*&---------------------------------------------------------------------*
*&  Include           ZSCANNER_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_MODIFY_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_modify_screen .LOOP AT SCREEN.IF p_ck1 = abap_true.IF screen-group1 = 'M1'.screen-input = 0.ENDIF.IF screen-group1 = 'M4'.screen-active = 0.ENDIF.ELSE.IF screen-group1 = 'M3'.screen-active = 0.ENDIF.IF screen-group1 = 'M1'.screen-active = 0.ENDIF.IF screen-group1 = 'M2'.screen-input = 0.ENDIF.ENDIF.MODIFY SCREEN.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_BASIC_INFO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_basic_info .DATA: lr_pgmna TYPE RANGE OF trdir-name,lt_tstc  TYPE TABLE OF tstc.DATA: lt_source  TYPE abaptxt255_tab.IF s_tcode IS NOT INITIAL.SELECT * FROM tstcINTO TABLE lt_tstcWHERE tcode IN s_tcode.IF sy-subrc = 0.lr_pgmna = VALUE #( FOR ls_tstc IN lt_tstc( sign = 'I'option = 'EQ'low = ls_tstc-pgmna ) ).ENDIF.ENDIF.***GET programsSELECTtadir~object,tadir~obj_name,tadir~devclass,tadir~masterlang,tadir~component,tadir~created_on,tstc~tcode,reposrc~cnamINTO TABLE @DATA(lt_tadir)FROM tadirINNER JOIN reposrc ON reposrc~progname = tadir~obj_nameLEFT JOIN tstc ON tstc~pgmna = tadir~obj_name             "NO TCODE IN-CASEWHERE reposrc~subc EQ '1'     "Executable programAND obj_name IN @lr_pgmnaAND obj_name IN @s_pgmnaAND pgmid = 'R3TR'AND object = 'PROG'.IF sy-subrc <> 0.MESSAGE s001(00) WITH 'No program found!' DISPLAY LIKE 'E'.LEAVE LIST-PROCESSING.ENDIF.LOOP AT lt_tadir INTO DATA(ls_tadir).APPEND INITIAL LINE TO gt_prog ASSIGNING FIELD-SYMBOL(<ls_prog>).<ls_prog>-main_name = ls_tadir-obj_name.<ls_prog>-name      = ls_tadir-obj_name.<ls_prog>-type      = '01'.READ REPORT ls_tadir-obj_name INTO lt_source.<ls_prog>-from = 1.<ls_prog>-to = lines( lt_source ).<ls_prog>-lines = lines( lt_source ).UNASSIGN <ls_prog>.APPEND INITIAL LINE TO gt_result ASSIGNING FIELD-SYMBOL(<ls_result>)."T-code<ls_result>-tcode = ls_tadir-tcode."Program<ls_result>-pgmna = ls_tadir-obj_name."Language<ls_result>-spras = ls_tadir-masterlang."Create_ON<ls_result>-created_on = ls_tadir-created_on."Package<ls_result>-devclass = ls_tadir-devclass."TitleSELECT SINGLE text INTO <ls_result>-title FROM trdirtWHERE name = <ls_result>-pgmna AND sprsl = <ls_result>-spras."Package Desc.SELECT SINGLE ctext INTO <ls_result>-devclass_t FROM tdevctWHERE devclass = <ls_result>-devclass AND spras = <ls_result>-spras."Package ComponentSELECT SINGLE component FROM tdevc INTO <ls_result>-componentWHERE devclass = <ls_result>-devclass."Last changedSELECT SINGLE udat FROM trdir INTO <ls_result>-changed_onWHERE name = <ls_result>-pgmna.UNASSIGN <ls_result>.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DEVC_PGMNA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_devc_pgmna .DATA: lv_program TYPE sy-repid,lt_inc_tmp TYPE TABLE OF tadir-obj_name.DATA: lt_source  TYPE abaptxt255_tab.***Get includesLOOP AT gt_prog INTO DATA(ls_pgmna).lv_program = ls_pgmna-name.CALL FUNCTION 'RS_GET_ALL_INCLUDES'EXPORTINGprogram    = lv_programTABLESincludetab = lt_inc_tmpEXCEPTIONSOTHERS     = 0.LOOP AT lt_inc_tmp INTO DATA(ls_inc_tmp).gs_prog-main_name = lv_program.       "maings_prog-name = ls_inc_tmp.            "includegs_prog-type = '01'.                  "01-program, 02-function, 03-classREAD REPORT ls_inc_tmp INTO lt_source.gs_prog-from = 1.gs_prog-to = lines( lt_source ).gs_prog-lines = lines( lt_source ).APPEND gs_prog TO gt_prog.CLEAR gs_prog.ENDLOOP.
*    APPEND LINES OF lt_inc_tmp TO gt_prog.ENDLOOP.SORT gt_prog BY main_name name.DELETE ADJACENT DUPLICATES FROM gt_prog COMPARING main_name name.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SEARCH_SOURCE_CALLFUNC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM search_source_callfunc USING it_prog TYPE tt_progCHANGING ct_function TYPE tt_functionct_function_std TYPE tt_functionct_bapis TYPE tt_function .DATA: lt_source  TYPE abaptxt255_tab,lt_results TYPE match_result_tab.DATA: lt_function TYPE tt_function,lv_regex    TYPE string,lv_regex2   TYPE string.PERFORM frm_pattern_call_function USING 'CALL_FUNCTION'CHANGING lv_regexlv_regex2.LOOP AT it_prog INTO gs_prog.IF NOT ( sy-tabix >= gs_prog-from AND sy-tabix <= gs_prog-to ).EXIT.ENDIF.READ REPORT gs_prog-name INTO lt_source.IF sy-subrc <> 0.CONTINUE.ENDIF.FIND ALL OCCURRENCES OF REGEX lv_regex IN TABLE lt_sourceIN CHARACTER MODEIGNORING CASERESULTS lt_results.IF lt_results[] IS NOT INITIAL.
*      lv_found = abap_true.LOOP AT lt_results INTO DATA(ls_results).READ TABLE lt_source INTO DATA(ls_source2) INDEX ls_results-line.IF sy-subrc = 0."是注释行时 continueIF ls_source2-line(1) = '*'.CONTINUE.ENDIF.SEARCH ls_source2-line FOR '"'.IF sy-subrc = 0 AND sy-fdpos <= ls_results-offset.CONTINUE.ENDIF.ENDIF.PERFORM frm_get_hit_set USING lt_sourcegs_prog-namels_results-line.PERFORM frm_get_fm_name USING lt_sourcelv_regexls_results-linegs_prog-main_namegs_prog-nameCHANGING ct_functionct_function_stdct_bapis.ENDLOOP.ENDIF.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DEVC_CLASS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_devc_class .DATA: lt_wbcrossgt TYPE TABLE OF wbcrossgt,lt_class     TYPE tt_class.LOOP AT gt_result INTO gs_result."逐个程序处理DATA(lt_prog) = gt_prog.DELETE lt_prog WHERE main_name NE gs_result-pgmna.WHILE lt_prog[] IS NOT INITIAL.
***Search source"程序里 找出 classPERFORM search_source_class USING lt_progCHANGING lt_wbcrossgt.CLEAR lt_prog.
***class 找出 class程序名(到function)PERFORM get_class_obj USING gs_result-pgmnalt_wbcrossgtCHANGING lt_proglt_class.ENDWHILE.SORT lt_class BY main_name class_name.DELETE ADJACENT DUPLICATES FROM lt_class COMPARING main_name class_name."拼接classLOOP AT lt_class INTO DATA(ls_class).gs_result-callclass =  ls_class-class_name && ',' && gs_result-callclass.CONDENSE gs_result-callclass.append_to_key_word: gs_result-pgmnals_class-class_namels_class-class_name1'CALLCLASS'.         "CALL_CLASSENDLOOP.CLEAR lt_class.MODIFY gt_result FROM gs_result TRANSPORTING callclass.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DEVC_FUNC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_devc_func .DATA: lt_function     TYPE tt_function,lt_function_std TYPE tt_function,lt_bapis        TYPE tt_function,lt_function_all TYPE tt_function,lt_bapis_all    TYPE tt_function.DATA: lt_wbcrossgt TYPE TABLE OF wbcrossgt,lt_class     TYPE tt_class.DATA: lt_prog_next       TYPE tt_prog,lv_start_from_se37.IF p_ck1 = abap_true.lv_start_from_se37 = abap_false.ELSE.lv_start_from_se37 = abap_true.ENDIF.LOOP AT gt_result INTO gs_result."逐个程序处理DATA(lt_prog) = gt_prog.DELETE lt_prog WHERE main_name NE gs_result-pgmna.WHILE lt_prog[] IS NOT INITIAL.IF lv_start_from_se37 = abap_false.
***Search source"程序里 找出 functionPERFORM search_source_callfunc USING lt_progCHANGING lt_functionlt_function_stdlt_bapis.CLEAR lv_start_from_se37.ELSE."初始 functionlt_function = VALUE #(  FOR ls_prog2 IN lt_prog( main_name = ls_prog2-main_namename = ls_prog2-nametype = ls_prog2-type ) ).ENDIF.***get function programs.IF p_fugr = abap_true."function里找出程序名,  继续下一次程序找functionPERFORM get_function_obj  USING gs_result-pgmnalt_functionCHANGING lt_prog_next.    "call function IN call function.ENDIF.CLEAR lt_function.***Search source"程序里 找出 classPERFORM search_source_class USING lt_progCHANGING lt_wbcrossgt.***get class programs.IF p_cinc = abap_true."class 找出 class程序名(到function)PERFORM get_class_obj USING gs_result-pgmnalt_wbcrossgtCHANGING lt_prog_nextlt_class.ENDIF.lt_prog[] = lt_prog_next[].CLEAR: lt_prog_next,lt_wbcrossgt,lt_function,lt_function_std,lt_bapis.ENDWHILE.*    SORT gt_function by type name.LOOP AT gt_function INTO gs_function WHERE main_name = gs_result-pgmna."01-function, 02-BAPI, 03-STD.functionIF gs_function-type = '01'.CONCATENATE gs_function-name gs_result-callfuncINTO gs_result-callfunc SEPARATED BY ','.CONDENSE gs_result-callfunc."append to keyword.append_to_key_word: gs_result-pgmnags_function-pnamegs_function-namegs_function-position'CALLFUNC'.ELSEIF gs_function-type = '04'.CONCATENATE gs_function-name gs_result-callrfcINTO gs_result-callrfc SEPARATED BY ','.CONDENSE gs_result-callrfc."append to keyword.append_to_key_word: gs_result-pgmnags_function-pnamegs_function-namegs_function-position'CALLRFC'.ELSE.CONCATENATE gs_function-name gs_result-callbapiINTO gs_result-callbapi SEPARATED BY ','.CONDENSE gs_result-callbapi."append to keyword.append_to_key_word: gs_result-pgmnags_function-pnamegs_function-namegs_function-position'CALLBAPI'.ENDIF.ENDLOOP.***CLASSSORT lt_class BY main_name class_name.DELETE ADJACENT DUPLICATES FROM lt_class COMPARING main_name class_name.APPEND LINES OF lt_class TO gt_class."拼接classLOOP AT lt_class INTO DATA(ls_class) WHERE main_name = gs_result-pgmna.gs_result-callclass =  ls_class-class_name && ',' && gs_result-callclass.CONDENSE gs_result-callclass."append to keyword.append_to_key_word: gs_result-pgmnals_class-class_namels_class-class_name1'CALLCLASS'.         "CALL_CLASSENDLOOP.CLEAR lt_class.*    MODIFY gt_result FROM gs_result TRANSPORTING callfunc callbapi callclass.MODIFY gt_result FROM gs_result TRANSPORTING callfunc callbapi callrfc callclass.CLEAR: gs_result.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_function_OBJ
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_function  text
*      <--P_GT_prog  text
*----------------------------------------------------------------------*
FORM get_function_obj  USING  iv_main_name TYPE program_idit_function TYPE tt_functionCHANGING ct_prog TYPE tt_prog.DATA: lv_progname TYPE char100,ls_prog     TYPE ts_prog.DATA: lt_source  TYPE abaptxt255_tab.CHECK it_function[] IS NOT INITIAL.SELECT *FROM tfdirINTO TABLE @DATA(lt_tfdir)FOR ALL ENTRIES IN @it_functionWHERE funcname = @it_function-name.IF sy-subrc = 0.LOOP AT lt_tfdir INTO DATA(ls_tfdir).CONCATENATE ls_tfdir-pname 'U' ls_tfdir-include INTO lv_progname."SAPLXXX01--->SAPLXXX01,  /BMW/SAPLXXX02--->/BMW/LXXX02REPLACE 'SAP' IN lv_progname WITH space .CONDENSE lv_progname."CHECK是未处理过的程序--避免相互调用造成的死循环READ TABLE gt_prog INTO gs_prog WITH KEY name = lv_prognamefrom = 1to   = lines( lt_source ).IF sy-subrc NE 0.ls_prog-main_name = iv_main_name.ls_prog-name = lv_progname.ls_prog-type = '02'.READ REPORT lv_progname INTO lt_source.ls_prog-from = 1.ls_prog-to = lines( lt_source ).ls_prog-lines = lines( lt_source ).APPEND ls_prog TO ct_prog.APPEND ls_prog TO gt_prog."遍历当前程序体里的PERFORM调用.PERFORM frm_search_source_form USING ls_progCHANGING ct_prog .CLEAR ls_prog.ENDIF.ENDLOOP.ENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_HIT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_SOURCE  text
*      -->P_gs_prog_NAME  text
*      -->P_LS_RESULTS_LINE  text
*----------------------------------------------------------------------*
FORM frm_get_hit_set  USING    it_abap TYPE abaptxt255_tabiv_pgmna_name TYPE trdir-nameiv_tabix TYPE match_result-line.DATA: lv_end     TYPE i,lv_start   TYPE i,lv_xtabix  TYPE sy-tabix,lv_hitline TYPE xfeld.DATA: gv_hit_count TYPE i.DATA: ls_col LIKE LINE OF gs_alv_item-cell_color.FIELD-SYMBOLS:<lv_abap> TYPE any.lv_start = iv_tabix - 2 .lv_end   = iv_tabix + 2.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 = 'X'.ELSE.CLEAR lv_hitline.ENDIF.ADD 1 TO lv_start.IF <lv_abap>(1) = '*'OR <lv_abap>(1) = '"'.CONTINUE.ENDIF.gs_alv_item-repname = iv_pgmna_name.gs_alv_item-line_no = lv_xtabix.gs_alv_item-text    = <lv_abap>.IF lv_hitline IS NOT INITIAL.gs_alv_item-hit = '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.ENDWHILE.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FM_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_SOURCE  text
*      -->P_LS_RESULTS_LINE  text
*      <--P_LT_function  text
*----------------------------------------------------------------------*
FORM frm_get_fm_name  USING    it_abap TYPE abaptxt255_tabiv_regex TYPE stringiv_tabix TYPE match_result-lineiv_main_name  TYPE trdir-nameiv_pname  TYPE trdir-nameCHANGING ct_function TYPE tt_functionct_function_std TYPE tt_functionct_bapis TYPE tt_function .DATA: lv_exit,lv_character,lv_fname(30),lv_fdpos TYPE i.DATA: ls_function TYPE ts_function.CLEAR lv_exit.LOOP AT it_abap INTO DATA(ls_abap) FROM iv_tabix.DATA(lv_index) = iv_tabix.  "lineFIND REGEX iv_regex IN ls_abap-line IGNORING CASE.IF sy-subrc = 0.DO 10 TIMES.  "search 10 lines at mostREAD TABLE it_abap INTO DATA(ls_abap_curr) INDEX lv_index.SEARCH ls_abap_curr-line FOR '''' .IF sy-subrc = 0.lv_fdpos = sy-fdpos.DO 30 TIMES.lv_fdpos = lv_fdpos + 1.lv_character = ls_abap_curr-line+lv_fdpos(1).IF lv_character = ''''.EXIT.ELSE.lv_fname = lv_fname && lv_character.ENDIF.ENDDO.CONDENSE lv_fname.ls_function-main_name = iv_main_name.ls_function-pname = iv_pname.   "function位置所在的程序ls_function-position = lv_index.   "function位置所在的程序行ls_function-name = lv_fname.SELECT SINGLE funcname INTO lv_fname FROM tfdir WHERE funcname = lv_fname.IF sy-subrc = 0."是当前系统function.IF lv_fname(1) = 'Z' OR lv_fname(5) = '/BMW/'.ls_function-type = '01'.APPEND ls_function TO gt_function.APPEND ls_function TO ct_function.ELSEIF lv_fname(4) = 'BAPI'.ls_function-type = '02'.APPEND ls_function TO gt_function.APPEND ls_function TO ct_bapis.ELSE.ls_function-type = '03'.APPEND ls_function TO gt_function.APPEND ls_function TO ct_function_std.ENDIF.ELSE."是destination系统*            ZSCANNER_F01FIND REGEX 'DESTINATION' IN ls_abap-line IGNORING CASE.IF sy-subrc NE 0.DATA(lv_next) = iv_tabix + 1.LOOP AT it_abap INTO DATA(ls_abap_rfc) FROM lv_next.IF ls_abap_rfc(1) = '*' OR ls_abap_rfc IS INITIAL.CONTINUE.ELSE."非注释行&非空行&非"DEST.行 --- 校验DESTINATION.FIND REGEX 'DESTINATION' IN ls_abap_rfc-line IGNORING CASE.IF sy-subrc = 0.FIND REGEX '"\s+DESTINATION' IN ls_abap_rfc-line IGNORING CASE.IF sy-subrc NE 0.ls_function-type = '04'.      "RFC.APPEND ls_function TO gt_function.ENDIF.ENDIF.EXIT. "检测到非空行即跳出ENDIF.ENDLOOP.ELSE.ls_function-type = '04'.      "RFC.APPEND ls_function TO gt_function.ENDIF.ENDIF.lv_exit = abap_true.EXIT.ELSE."next linelv_index = lv_index + 1.CONTINUE.ENDIF.ENDDO.IF lv_exit = abap_true..EXIT.ENDIF.CLEAR lv_fname.ELSE.ENDIF.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_PATTERN_CALL_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0183   text
*      <--P_LV_REGEX  text
*----------------------------------------------------------------------*
FORM frm_pattern_call_function  USING    iv_type TYPE char20CHANGING cv_regex TYPE stringcv_regex2 TYPE string.CASE iv_type.WHEN 'CALL_FUNCTION'."Start with 'CALL', end with 'FUNCTION'cv_regex = '\<CALL\s+FUNCTION\>'.cv_regex2 = '"\s+\<CALL\s+FUNCTION\>'.WHEN 'CREATE_OBJECT'.WHEN OTHERS.ENDCASE.ENDFORM.*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_prog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_alv_list .CONSTANTS:lc_pf_status    TYPE slis_formname VALUE 'FRM_PF_STATUS',lc_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.DATA: lv_repid    TYPE sy-repid,ls_layout   TYPE lvc_s_layo,lt_fieldcat TYPE lvc_t_fcat.lv_repid = sy-repid.ls_layout-zebra = abap_true.ls_layout-box_fname = 'SEL'.PERFORM frm_set_fieldcat CHANGING lt_fieldcat.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program      = lv_repidis_layout_lvc           = ls_layout
*     i_grid_title            =it_fieldcat_lvc         = lt_fieldcat
*     i_callback_pf_status_set = lc_pf_statusi_callback_user_command = lc_user_commandi_save                  = 'X'TABLESt_outtab                = gt_result[]EXCEPTIONSprogram_error           = 1OTHERS                  = 2..IF sy-subrc <> 0.
* Implement suitable error handling hereENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM frm_set_fieldcat CHANGING ct_fieldcat TYPE lvc_t_fcat.DATA: ls_fieldcat TYPE lvc_s_fcat.DEFINE marco_fieldcat.CLEAR ls_fieldcat.ls_fieldcat-key        = &1.ls_fieldcat-fieldname  = &2.ls_fieldcat-coltext    = &3.ls_fieldcat-col_opt    = &4.ls_fieldcat-hotspot    = &5.ls_fieldcat-ref_field = &6.ls_fieldcat-ref_table = &7.APPEND ls_fieldcat TO ct_fieldcat.END-OF-DEFINITION.marco_fieldcat:'X'  'TCODE'      'T-code'     'X' ''  ''  '','X'  'PGMNA'      'Program'    'X' ''  ''  '',''   'INSTANCE'   'Instance'   'X' ''  ''  '',''   'TITLE'      'Title'      'X' ''  ''  '',''   'SPRAS'      'Language'   'X' ''  ''  '',''   'CREATED_ON' 'Created on' 'X' ''  ''  '',''   'CHANGED_ON' 'Changed on' 'X' ''  ''  '',''   'DEVCLASS'   'Package'    'X' ''  ''  '',''   'DEVCLASS_T' 'Package Desc.'      'X' ''  ''  '',''   'COMPONENT'  'Package Component'  'X' ''  ''  '',''   'SELECT'    'Select table'       'X' 'X'  ''  '',''   'INSERT'    'Insert table'       'X' 'X'  ''  '',''   'DELETE'    'Delete table'       'X' 'X'  ''  '',''   'UPDATE'    'Update table'       'X' 'X'  ''  '',''   'CALLFUNC'   'call Function'      'X' 'X'  ''  '',''   'CALLBAPI'   'call Bapi'          'X' 'X'  ''  '',''   'CALLRFC'    'call RFC'           'X' 'X'  ''  '',''   'CALLCLASS'  'Class/Interface'    'X' 'X'  ''  '',''   'CALLTRAN'   'call TRANSACTION'   'X' 'X'  ''  '',''   'SUBMIT'    'Submit program'     'X' 'X'  ''  '',''   'FORMS'      'Print Form'         'X' 'X'  ''  '',''   'ISALV'      'ALV Display'        'X' ''  ''  '',''   'LINES'      'Coding Line'        'X' ''  ''  '',''   'BUTTON_T'   'Button text'        'X' 'X'  ''  ''.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SEARCH_SOURCE_CLASS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_PROG  text
*      <--P_LT_FUNCTION  text
*      <--P_LT_FUNCTION_STD  text
*      <--P_LT_BAPIS  text
*----------------------------------------------------------------------*
FORM search_source_class  USING    it_prog TYPE tt_progCHANGING ct_wbcrossgt TYPE wbcrossgtt.SELECT *FROM wbcrossgtINTO TABLE ct_wbcrossgtFOR ALL ENTRIES IN it_progWHERE include = it_prog-nameAND otype = 'ME' .     "METHOD
*      AND ( otype = 'TY'    "CLASS
*           OR otype = 'ME' ). "METHOD."删除标准的CLASS.DELETE ct_wbcrossgt WHERE name(1) NE 'Z' AND name(5) NE '/BMW/'.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_CLASS_OBJ
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_WBCROSSGT  text
*      <--P_LT_PROG  text
*----------------------------------------------------------------------*
FORM get_class_obj  USING    iv_main_name TYPE program_idit_wbcrossgt TYPE wbcrossgttCHANGING ct_prog TYPE tt_progct_class TYPE tt_class.DATA: ls_prog  TYPE ts_prog,ls_tmdir TYPE tmdir,lt_tmdir TYPE TABLE OF tmdir.DATA: lv_suffix       TYPE c LENGTH 5,lv_progname(50),lv_flag(30).DATA: lt_source  TYPE abaptxt255_tab.LOOP AT it_wbcrossgt INTO DATA(ls_wbcrossgt) WHERE otype = 'ME'.SPLIT ls_wbcrossgt-name AT '\ME:' INTO ls_tmdir-classname ls_tmdir-methodname.***CLASS namegs_class-main_name = iv_main_name.         "MAIN_NAMEgs_class-class_name = ls_tmdir-classname.  "CLASSAPPEND gs_class TO ct_class.CLEAR gs_class.SELECT * FROM tmdir INTO TABLE lt_tmdirWHERE classname = ls_tmdir-classnameAND methodname = ls_tmdir-methodname.IF sy-subrc = 0.LOOP AT lt_tmdir INTO ls_tmdir.PERFORM convert_numc_35 USING ls_tmdir-methodindxCHANGING lv_suffix."/BMW/XXXXXX====MCNNN 总长度是35.DATA(lv_length) = 30 - strlen( ls_tmdir-classname ).DO lv_length TIMES.lv_flag = lv_flag && '='.CONDENSE lv_flag.ENDDO.lv_progname = ls_tmdir-classname && lv_flag && lv_suffix."CHECK是未处理过的程序--避免相互调用造成的死循环READ TABLE gt_prog INTO gs_prog WITH KEY name = lv_progname.IF sy-subrc NE 0.ls_prog-main_name = iv_main_name.ls_prog-name = lv_progname.ls_prog-type = '03'.READ REPORT lv_progname INTO lt_source.ls_prog-from = 1.ls_prog-to = lines( lt_source ).ls_prog-lines = lines( lt_source ).APPEND ls_prog TO ct_prog.APPEND ls_prog TO gt_prog.CLEAR ls_prog.ENDIF.CLEAR lv_flag.ENDLOOP.ENDIF.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CONVERT_NUMC_35
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_TMDIR_METHODINDX  text
*      <--P_LV_SUFFIX  text
*----------------------------------------------------------------------*
FORM convert_numc_35  USING    iv_methodindxCHANGING cv_suffix TYPE char5.CONSTANTS: lc_character TYPE c LENGTH 36 VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.DATA: lv_mod TYPE numc2,lv_div TYPE numc2.lv_div = iv_methodindx DIV 36.lv_mod = iv_methodindx MOD 36.cv_suffix = 'CM' && lv_div && lc_character+lv_mod(1).ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_KEY_WORD_SCAN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_key_word_scan .DATA: lv_subrc TYPE sy-subrc.DATA: lt_source  TYPE abaptxt255_tab.DATA: lt_keywrd_sel    TYPE abaptxt255_tab,lt_keywrd_ins    TYPE abaptxt255_tab,lt_keywrd_del    TYPE abaptxt255_tab,lt_keywrd_upd    TYPE abaptxt255_tab,lt_keywrd_submit TYPE abaptxt255_tab,lt_keywrd_call   TYPE abaptxt255_tab,lt_stoken        TYPE stoken_tab,lt_sstmnt        TYPE sstmnt_tab.DATA: lr_code_std TYPE RANGE OF rsmptexts-obj_code.lt_keywrd_sel[] = VALUE #( ( line = 'SELECT'  ) ).lt_keywrd_ins[] = VALUE #( ( line = 'INSERT'  ) ).lt_keywrd_del[] = VALUE #( ( line = 'DELETE'  ) ).lt_keywrd_upd[] = VALUE #( ( line = 'UPDATE'  ) ).lt_keywrd_submit[] = VALUE #( ( line = 'SUBMIT'  ) ).lt_keywrd_call[] = VALUE #( ( line = 'CALL'  ) ).LOOP AT gt_prog INTO gs_prog.READ REPORT gs_prog-name INTO lt_source.***SELECTSCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_selTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."select xxx from db."select xxx from db-a join db-b xxxxLOOP AT lt_stoken INTO DATA(ls_stoken) WHERE ( str = 'FROM' OR str = 'JOIN' ).DATA(lv_index) = sy-tabix + 1."FROM 下一行是表名称READ TABLE lt_stoken INTO DATA(ls_stoken1) INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'SELECT'.           "SELECTENDIF.ENDIF.ENDLOOP.***INSERTSCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_insTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."insert db from xxx."insert into db values xxx.LOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'INSERT' OR str = 'INTO' ).lv_index = sy-tabix + 1."下一行是表名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'INSERT'.           "INSERTENDIF.ENDIF.ENDLOOP.***DELETESCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_delTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."delete db from itab xxxx"delete from db where xxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'DELETE' OR str = 'FROM' ).lv_index = sy-tabix + 1."下一行是表名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'DELETE'.           "DELETEENDIF.ENDIF.ENDLOOP.***UPDATESCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_updTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."delete db from xxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'UPDATE' ).lv_index = sy-tabix + 1."下一行是表名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'UPDATE'.           "UPDATEENDIF.ENDIF.ENDLOOP.***SUBMIT.SCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_submitTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."delete db from xxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'SUBMIT' ).lv_index = sy-tabix + 1."下一行是程序名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_progname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'SUBMIT'.           "UPDATEENDIF.ENDIF.ENDLOOP.***CALL TRANSACTIONSCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_callTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."call transaction xxxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'CALL' ).lv_index = sy-tabix + 1."下一行是TRANSACTION.READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.TRANSLATE ls_stoken1-str TO UPPER CASE.CHECK ls_stoken1-str = 'TRANSACTION'.lv_index = lv_index + 1."下一行是TCODE名称READ TABLE lt_stoken INTO DATA(ls_stoken2) INDEX lv_index.IF sy-subrc = 0.PERFORM check_tcode USING ls_stoken2-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken2-strls_stoken2-row'CALL_TRANSACTION'.         "CALL_TRANSACTIONENDIF.ENDIF.ENDIF.ENDLOOP.ENDLOOP.SORT gt_key_word.DELETE ADJACENT DUPLICATES FROM gt_key_word COMPARING ALL FIELDS."standard function-codePERFORM append_code_std CHANGING lr_code_std."更新到result表LOOP AT gt_result INTO gs_result.LOOP AT gt_key_word INTO gs_key_word WHERE main_name = gs_result-pgmna.CASE gs_key_word-type.WHEN 'SELECT'.gs_result-select = gs_key_word-keyname && ',' && gs_result-select.CONDENSE gs_result-select.WHEN 'INSERT'.gs_result-insert = gs_key_word-keyname && ',' && gs_result-insert.CONDENSE gs_result-insert.WHEN 'DELETE'.gs_result-delete = gs_key_word-keyname && ',' && gs_result-delete.CONDENSE gs_result-delete.WHEN 'UPDATE'.gs_result-update = gs_key_word-keyname && ',' && gs_result-update.CONDENSE gs_result-update.WHEN 'SUBMIT'.gs_result-submit = gs_key_word-keyname && ',' && gs_result-submit.CONDENSE gs_result-submit.WHEN 'CALL_TRANSACTION'.gs_result-calltran = gs_key_word-keyname && ',' && gs_result-calltran.CONDENSE gs_result-calltran.ENDCASE.ENDLOOP.***linesLOOP AT gt_prog INTO gs_prog WHERE main_name = gs_result-pgmna.gs_result-lines = gs_result-lines + ( gs_prog-to - gs_prog-from + 1 ).ENDLOOP.***buttonSELECT * FROM rsmptextsINTO TABLE @DATA(lt_rsmptexts)WHERE progname = @gs_result-pgmnaAND obj_type = 'F'AND texttype IN ('Q','M','I')  "I-icon info,  M-Object text, Q-quick info.AND obj_code NOT IN @lr_code_std."优先取icon info,再取Object text, 最后取quick info.SORT lt_rsmptexts BY progname obj_code obj_type texttype.DELETE ADJACENT DUPLICATES FROM lt_rsmptexts COMPARING progname obj_code obj_type .LOOP AT lt_rsmptexts INTO DATA(ls_rsmptexts).gs_result-button_t = ls_rsmptexts-text && ',' && gs_result-button_t.CONDENSE gs_result-button_t.gs_key_word-main_name = gs_result-pgmna.
*      gs_key_word-keyname = ls_rsmptexts-obj_code.gs_key_word-keyname = ls_rsmptexts-text.gs_key_word-type = 'BUTTON_T'.    "插入到key_word表 用于双击分解?APPEND gs_key_word TO gt_key_word.CLEAR gs_key_word.ENDLOOP.***SmartformsREAD TABLE gt_function INTO gs_function WITH KEY type = '03'name = 'SSF_FUNCTION_MODULE_NAME'.IF sy-subrc = 0."存在 调smartforms."----->如何找smartforms名称.ENDIF.MODIFY gt_result FROM gs_result.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEARCH_SOURCE_FORM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_PROG  text
*----------------------------------------------------------------------*
FORM frm_search_source_form  USING  is_prog TYPE ts_progCHANGING ct_prog TYPE tt_prog.DATA: lt_source  TYPE abaptxt255_tab,lt_results TYPE match_result_tab.DATA: lt_function  TYPE tt_function,lv_regex     TYPE string,lv_regex2    TYPE string,lv_regex3    TYPE string,lv_regex4    TYPE string,lv_from_done,lv_to_done.DATA: lt_keywrd  TYPE abaptxt255_tab,lt_keywrd2 TYPE abaptxt255_tab,lt_stoken  TYPE stoken_tab,lt_sstmnt  TYPE sstmnt_tab.DATA: lv_program TYPE sy-repid,lt_inc_tmp TYPE TABLE OF tadir-obj_name.DATA: lt_prog_form TYPE tt_prog,lt_prog_next TYPE tt_prog.TYPES: BEGIN OF ts_form,str TYPE token_str,END OF ts_form.DATA: ls_form TYPE ts_form,lt_form TYPE TABLE OF ts_form.DATA: lv_index TYPE i,lv_from  TYPE i,lv_to    TYPE i.PERFORM frm_pattern_call_function USING 'PERFORM'CHANGING lv_regexlv_regex2.*  READ REPORT is_prog-name INTO lt_source.lt_keywrd[] = VALUE #( ( line = 'PERFORM'  ) ).lt_prog_form = VALUE #( ( main_name = is_prog-main_namename = is_prog-nametype = is_prog-typefrom = is_prog-fromto = is_prog-to ) ).WHILE lt_prog_form[] IS NOT INITIAL.LOOP AT lt_prog_form INTO DATA(ls_prog_form).***读取PERFORMS.READ REPORT ls_prog_form-name INTO lt_source.SCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrdTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."删除范围外的mapping行DELETE lt_stoken WHERE row LT ls_prog_form-from OR row GT ls_prog_form-to.CHECK lt_stoken[] IS NOT INITIAL.CHECK lt_sstmnt[] IS NOT INITIAL.LOOP AT lt_stoken INTO DATA(ls_stoken) WHERE str = 'PERFORM'.lv_index = sy-tabix + 1.READ TABLE lt_stoken INTO ls_stoken INDEX lv_index.IF sy-subrc = 0.ls_form-str = ls_stoken-str.APPEND ls_form TO lt_form.ENDIF.ENDLOOP.CLEAR: lt_stoken, lt_sstmnt."include程序--->main程序SELECT * FROM d010inc INTO TABLE @DATA(lt_d010inc) WHERE include = @is_prog-name.IF sy-subrc = 0.CHECK lines( lt_d010inc[] ) = 1.READ TABLE lt_d010inc INTO DATA(ls_d010inc) INDEX 1."main程序--->所有程序lv_program = ls_d010inc-master.CALL FUNCTION 'RS_GET_ALL_INCLUDES'EXPORTINGprogram    = lv_programTABLESincludetab = lt_inc_tmpEXCEPTIONSOTHERS     = 0."在所有including程序中找出FORM的开始行到结束行.LOOP AT lt_inc_tmp INTO DATA(ls_inc_tmp) .READ REPORT ls_inc_tmp INTO lt_source."逐个perform进行查找.LOOP AT lt_form INTO ls_form."开始行"FORM xxxxx .lv_regex = 'FORM\s+' && ls_form-str && '[\s.]'.       "开始行lv_regex2 = '"\s+FORM\s+' && ls_form-str && '[\s.]'.  "被注释的开始行lv_regex3 = 'ENDFORM' && '[\s.]'.               "结束行lv_regex4 = '"\s+ENDFORM' && '[\s.]'.           "被注释的结束行LOOP AT lt_source INTO DATA(ls_source).CHECK ls_source(1) NE '*'.    "注释行.IF lv_from_done = abap_false."找开始行lv_from = sy-tabix.FIND REGEX lv_regex IN ls_source-line IGNORING CASE.IF sy-subrc = 0."check是否注释的FIND REGEX lv_regex2 IN ls_source-line IGNORING CASE.IF sy-subrc NE 0.CONDENSE ls_source-line.CHECK ls_source-line(4) = 'FORM'. "是FORM开头.lv_from_done = abap_true.ENDIF.ENDIF.ELSE."找结束行.lv_to = sy-tabix.FIND REGEX lv_regex3 IN ls_source-line IGNORING CASE.IF sy-subrc = 0."check是否注释的FIND REGEX lv_regex4 IN ls_source-line IGNORING CASE.IF sy-subrc NE 0.lv_to_done = abap_true.EXIT.ENDIF.ENDIF.ENDIF.ENDLOOP.IF lv_to_done = 'X'."CHECK是未处理过的程序--避免相互调用造成的死循环READ TABLE gt_prog INTO gs_prog WITH KEY name = ls_inc_tmpfrom = lv_fromto   = lv_to.IF sy-subrc NE 0.gs_prog_part-main_name = is_prog-main_name.gs_prog_part-name = ls_inc_tmp.gs_prog_part-type = '02'.   "including programgs_prog_part-from = lv_from.gs_prog_part-to = lv_to.APPEND gs_prog_part TO ct_prog.APPEND gs_prog_part TO gt_prog.APPEND gs_prog_part TO lt_prog_next. "下一个PERFORM.ENDIF.ENDIF.CLEAR: lv_from_done,lv_to_done,lv_from,lv_to.ENDLOOP.ENDLOOP.ENDIF.CLEAR: lt_form.ENDLOOP.lt_prog_form[] = lt_prog_next[].CLEAR: lt_prog_next[].ENDWHILE.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CHECK_TABNAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_STOKEN1_STR  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM check_tabname  USING    iv_tabname TYPE char30CHANGING cv_subrc TYPE syst-subrc.SELECT SINGLE tabnameFROM dd02lINTO @DATA(lv_tname)WHERE tabname = @iv_tabname.cv_subrc = sy-subrc.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CHECK_PROGNAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_STOKEN1_STR  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM check_progname  USING    iv_progname TYPE char30CHANGING cv_subrc TYPE syst-subrc.SELECT SINGLE prognameFROM reposrcINTO @DATA(lv_progname)WHERE progname = @iv_progname.cv_subrc = sy-subrc.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CHECK_TCODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_STOKEN2_STR  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM check_tcode  USING    iv_tcode TYPE char30CHANGING cv_subrc TYPE syst-subrc.DATA: lv_tcode TYPE tstc-tcode.lv_tcode = iv_tcode."去除引号   'FB03'-->FB03.SHIFT lv_tcode RIGHT DELETING TRAILING space.SHIFT lv_tcode RIGHT DELETING TRAILING ''''.CONDENSE lv_tcode.SHIFT lv_tcode LEFT DELETING LEADING ''''.SELECT SINGLE tcodeFROM tstcINTO lv_tcodeWHERE tcode = lv_tcode.cv_subrc = sy-subrc.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_command USING iv_ucomm TYPE sy-ucommis_selfield  TYPE slis_selfield.CASE iv_ucomm.WHEN '&IC1'.READ TABLE gt_result INTO gs_result INDEX is_selfield-tabindex.IF sy-subrc = 0.CASE is_selfield-fieldname.WHEN 'SELECT' OR'DELETE' OR'UPDATE' OR'INSERT' OR'CALLFUNC' OR'CALLBAPI' OR'CALLRFC' OR'CALLCLASS' OR'CALLTRAN' OR'SUBMIT' OR'FORMS' OR'BUTTON_T'.PERFORM show_detail_sql USING is_selfield-fieldnamegs_result.WHEN OTHERS.ENDCASE.ENDIF.WHEN OTHERS.ENDCASE.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SHOW_DETAIL_SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GS_RESULT  text
*----------------------------------------------------------------------*
FORM show_detail_sql  USING iv_fname TYPE char30is_result TYPE ts_result.DATA: lt_structure TYPE lvc_t_fcat,ls_structure TYPE lvc_s_fcat,ls_layout    TYPE lvc_s_layo.DATA: lv_title TYPE lvc_title.CONSTANTS:lc_user_command_sub TYPE slis_formname VALUE 'FRM_USER_COMMAND_SUB'.
***gt_key_wordCLEAR lt_structure.IF iv_fname = 'SELECT' ORiv_fname = 'UPDATE' ORiv_fname = 'INSERT' ORiv_fname = 'DELETE' ORiv_fname = 'CALLFUNC' ORiv_fname = 'CALLBAPI' ORiv_fname = 'CALLRFC' ORiv_fname = 'CALLTRAN' ORiv_fname = 'SUBMIT'.ls_structure-fieldname = 'NAME'.ls_structure-coltext = 'Program'.ls_structure-col_pos = 1.ls_structure-ref_table = ''.ls_structure-ref_field = ''.APPEND ls_structure TO lt_structure.ls_structure-fieldname = 'POSITION'.ls_structure-coltext = 'Position'.ls_structure-hotspot = 'X'.ls_structure-col_pos = 3.ls_structure-datatype = 'INT4'.ls_structure-dd_outlen = '255'.APPEND ls_structure TO lt_structure.CLEAR ls_structure.IF iv_fname = 'SELECT' ORiv_fname = 'UPDATE' ORiv_fname = 'INSERT' ORiv_fname = 'DELETE'.ls_structure-fieldname = 'DDTEXT'.ls_structure-coltext = 'TableName'.ls_structure-col_pos = 4.ls_structure-REF_TABLE = 'DD02T'.ls_structure-REF_FIELD = 'DDTEXT'.APPEND ls_structure TO lt_structure.CLEAR ls_structure.ENDIF.ENDIF.CLEAR ls_structure.ls_structure-fieldname = 'KEYNAME'.ls_structure-coltext = 'Value'.ls_structure-col_pos = 2.ls_structure-datatype = 'CHAR'.ls_structure-dd_outlen = '40'.APPEND ls_structure TO lt_structure.CLEAR ls_structure.****创建dyn_table
*  CALL METHOD cl_alv_table_create=>create_dynamic_table
*    EXPORTING
*      it_fieldcatalog           = lt_structure
*    IMPORTING
*      ep_table                  = dy_table
*    EXCEPTIONS
*      generate_subpool_dir_full = 1
*      OTHERS                    = 2.
*  IF sy-subrc = 0.
*    "table
*    ASSIGN dy_table->* TO <dyn_table>.
*  ENDIF.
*
****dyn_table 赋值
*  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
*  ASSIGN dy_line->* TO <dyn_wa>.DATA: lt_sort TYPE lvc_t_sort.lt_sort = VALUE #( ( fieldname = 'KEYNAME'up = 'X' ) ).gt_detail[] = gt_key_word[].DELETE gt_detail WHERE type <> iv_fname.CHECK gt_detail[] IS NOT INITIAL.LOOP AT gt_detail ASSIGNING FIELD-SYMBOL(<ls_detail>).SELECT SINGLE ddtext FROM dd02t INTO <ls_detail>-ddtextWHERE tabname = <ls_detail>-keynameAND ddlanguage = 'E'.ENDLOOP.lv_title = iv_fname.ls_layout-zebra = abap_true.ls_layout-cwidth_opt = abap_true.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program      = sy-repidis_layout_lvc           = ls_layoutit_fieldcat_lvc         = lt_structureit_sort_lvc             = lt_sorti_callback_user_command = lc_user_command_subi_save                  = 'X'i_grid_title            = lv_titleTABLESt_outtab                = gt_detailEXCEPTIONSprogram_error           = 1OTHERS                  = 2..IF sy-subrc <> 0.
* Implement suitable error handling hereENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_BASIC_FUNC_INFO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_basic_func_info .DATA: lr_pgmna TYPE RANGE OF trdir-name,lt_tstc  TYPE TABLE OF tstc.DATA: lv_progname(50),lt_source  TYPE abaptxt255_tab.***GET programsSELECTtfdir~funcname,tfdir~pname,tfdir~include,tfdir~pname_mainINTO TABLE @DATA(lt_tfdir)FROM tfdirWHERE tfdir~funcname IN @s_fname.IF sy-subrc <> 0.MESSAGE s001(00) WITH 'No functions found!' DISPLAY LIKE 'E'.LEAVE LIST-PROCESSING.ENDIF.LOOP AT lt_tfdir INTO DATA(ls_tfdir).APPEND INITIAL LINE TO gt_prog ASSIGNING FIELD-SYMBOL(<ls_prog>).
*    <ls_prog>-main_name = ls_tfdir-funcname.CONCATENATE ls_tfdir-pname 'U' ls_tfdir-include INTO lv_progname."SAPLXXX01--->LXXX01,  /BMW/SAPLXXX02--->/BMW/LXXX02REPLACE 'SAP' IN lv_progname WITH space .CONDENSE lv_progname.<ls_prog>-main_name = lv_progname.                  "Function对应的程序名<ls_prog>-name      = ls_tfdir-funcname.            "Function name<ls_prog>-type      = '02'.READ REPORT lv_progname INTO lt_source.<ls_prog>-from = 1.<ls_prog>-to = lines( lt_source ).<ls_prog>-lines = lines( lt_source ).UNASSIGN <ls_prog>.APPEND INITIAL LINE TO gt_result ASSIGNING FIELD-SYMBOL(<ls_result>)."Program<ls_result>-pgmna = lv_progname.        "Function对应的程序名<ls_result>-fname = ls_tfdir-funcname.  "Function name"Language"Create_ON"PackageDATA(lv_group) = ls_tfdir-pname.REPLACE 'SAPL' IN lv_group WITH space .CONDENSE lv_group.SELECT SINGLE devclass, masterlang, created_onINTO ( @<ls_result>-devclass,@<ls_result>-spras,@<ls_result>-created_on )FROM tadirWHERE pgmid = 'R3TR' AND object = 'FUGR' AND obj_name = @lv_group."TitleSELECT SINGLE stext INTO <ls_result>-title FROM tftitWHERE funcname = <ls_result>-pgmna AND spras = <ls_result>-spras."Package Desc.SELECT SINGLE ctext INTO <ls_result>-devclass_t FROM tdevctWHERE devclass = <ls_result>-devclass AND spras = <ls_result>-spras."Package ComponentSELECT SINGLE component FROM tdevc INTO <ls_result>-componentWHERE devclass = <ls_result>-devclass."Last changedSELECT SINGLE udat FROM trdir INTO <ls_result>-changed_onWHERE name = <ls_result>-pgmna."Lines<ls_result>-lines = lines( lt_source ).UNASSIGN <ls_result>.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  APPEND_CODE_STD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LR_CODE_STD  text
*----------------------------------------------------------------------*
FORM append_code_std  CHANGING cr_code_std LIKE gr_code_std.DATA: ls_code_std LIKE LINE OF gr_code_std.ls_code_std(3) = 'IEQ'.ls_code_std-low = '%ML'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%PC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%SC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%SC+'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%SL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ABC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ALL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AQW'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AUF'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AVE'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AVR'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CDF'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CFI'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&COUNT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRB'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRE'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRB'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRR'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&DAU'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&DOF'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&DON'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&EB9'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ELP'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ERW'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ETA'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&F03'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&F12'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&F15'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&IC1'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ILD'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ILT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&KOM'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&LFO'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&LIS'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&MAX'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&MIN'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&NFO'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&NTE'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OAD'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ODN'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OL0'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OLX'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OMP'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OPT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OUP'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&RNT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&RNT_PREV'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&SAL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&SUM'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&UMC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&XML'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&XPA'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&XXL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P+'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P++'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P-'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P--'. APPEND ls_code_std TO cr_code_std.ENDFORM.


INCLUDE zscanner_f02.

*&---------------------------------------------------------------------*
*&  Include           ZSCANNER_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_MODIFY_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_modify_screen .LOOP AT SCREEN.IF p_ck1 = abap_true.IF screen-group1 = 'M1'.screen-input = 0.ENDIF.IF screen-group1 = 'M4'.screen-active = 0.ENDIF.ELSE.IF screen-group1 = 'M3'.screen-active = 0.ENDIF.IF screen-group1 = 'M1'.screen-active = 0.ENDIF.IF screen-group1 = 'M2'.screen-input = 0.ENDIF.ENDIF.MODIFY SCREEN.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_BASIC_INFO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_basic_info .DATA: lr_pgmna TYPE RANGE OF trdir-name,lt_tstc  TYPE TABLE OF tstc.DATA: lt_source  TYPE abaptxt255_tab.IF s_tcode IS NOT INITIAL.SELECT * FROM tstcINTO TABLE lt_tstcWHERE tcode IN s_tcode.IF sy-subrc = 0.lr_pgmna = VALUE #( FOR ls_tstc IN lt_tstc( sign = 'I'option = 'EQ'low = ls_tstc-pgmna ) ).ENDIF.ENDIF.***GET programsSELECTtadir~object,tadir~obj_name,tadir~devclass,tadir~masterlang,tadir~component,tadir~created_on,tstc~tcode,reposrc~cnamINTO TABLE @DATA(lt_tadir)FROM tadirINNER JOIN reposrc ON reposrc~progname = tadir~obj_nameLEFT JOIN tstc ON tstc~pgmna = tadir~obj_name             "NO TCODE IN-CASEWHERE reposrc~subc EQ '1'     "Executable programAND obj_name IN @lr_pgmnaAND obj_name IN @s_pgmnaAND pgmid = 'R3TR'AND object = 'PROG'.IF sy-subrc <> 0.MESSAGE s001(00) WITH 'No program found!' DISPLAY LIKE 'E'.LEAVE LIST-PROCESSING.ENDIF.LOOP AT lt_tadir INTO DATA(ls_tadir).APPEND INITIAL LINE TO gt_prog ASSIGNING FIELD-SYMBOL(<ls_prog>).<ls_prog>-main_name = ls_tadir-obj_name.<ls_prog>-name      = ls_tadir-obj_name.<ls_prog>-type      = '01'.READ REPORT ls_tadir-obj_name INTO lt_source.<ls_prog>-from = 1.<ls_prog>-to = lines( lt_source ).<ls_prog>-lines = lines( lt_source ).UNASSIGN <ls_prog>.APPEND INITIAL LINE TO gt_result ASSIGNING FIELD-SYMBOL(<ls_result>)."T-code<ls_result>-tcode = ls_tadir-tcode."Program<ls_result>-pgmna = ls_tadir-obj_name."Language<ls_result>-spras = ls_tadir-masterlang."Create_ON<ls_result>-created_on = ls_tadir-created_on."Package<ls_result>-devclass = ls_tadir-devclass."TitleSELECT SINGLE text INTO <ls_result>-title FROM trdirtWHERE name = <ls_result>-pgmna AND sprsl = <ls_result>-spras."Package Desc.SELECT SINGLE ctext INTO <ls_result>-devclass_t FROM tdevctWHERE devclass = <ls_result>-devclass AND spras = <ls_result>-spras."Package ComponentSELECT SINGLE component FROM tdevc INTO <ls_result>-componentWHERE devclass = <ls_result>-devclass."Last changedSELECT SINGLE udat FROM trdir INTO <ls_result>-changed_onWHERE name = <ls_result>-pgmna.UNASSIGN <ls_result>.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DEVC_PGMNA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_devc_pgmna .DATA: lv_program TYPE sy-repid,lt_inc_tmp TYPE TABLE OF tadir-obj_name.DATA: lt_source  TYPE abaptxt255_tab.***Get includesLOOP AT gt_prog INTO DATA(ls_pgmna).lv_program = ls_pgmna-name.CALL FUNCTION 'RS_GET_ALL_INCLUDES'EXPORTINGprogram    = lv_programTABLESincludetab = lt_inc_tmpEXCEPTIONSOTHERS     = 0.LOOP AT lt_inc_tmp INTO DATA(ls_inc_tmp).gs_prog-main_name = lv_program.       "maings_prog-name = ls_inc_tmp.            "includegs_prog-type = '01'.                  "01-program, 02-function, 03-classREAD REPORT ls_inc_tmp INTO lt_source.gs_prog-from = 1.gs_prog-to = lines( lt_source ).gs_prog-lines = lines( lt_source ).APPEND gs_prog TO gt_prog.CLEAR gs_prog.ENDLOOP.
*    APPEND LINES OF lt_inc_tmp TO gt_prog.ENDLOOP.SORT gt_prog BY main_name name.DELETE ADJACENT DUPLICATES FROM gt_prog COMPARING main_name name.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SEARCH_SOURCE_CALLFUNC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM search_source_callfunc USING it_prog TYPE tt_progCHANGING ct_function TYPE tt_functionct_function_std TYPE tt_functionct_bapis TYPE tt_function .DATA: lt_source  TYPE abaptxt255_tab,lt_results TYPE match_result_tab.DATA: lt_function TYPE tt_function,lv_regex    TYPE string,lv_regex2   TYPE string.PERFORM frm_pattern_call_function USING 'CALL_FUNCTION'CHANGING lv_regexlv_regex2.LOOP AT it_prog INTO gs_prog.IF NOT ( sy-tabix >= gs_prog-from AND sy-tabix <= gs_prog-to ).EXIT.ENDIF.READ REPORT gs_prog-name INTO lt_source.IF sy-subrc <> 0.CONTINUE.ENDIF.FIND ALL OCCURRENCES OF REGEX lv_regex IN TABLE lt_sourceIN CHARACTER MODEIGNORING CASERESULTS lt_results.IF lt_results[] IS NOT INITIAL.
*      lv_found = abap_true.LOOP AT lt_results INTO DATA(ls_results).READ TABLE lt_source INTO DATA(ls_source2) INDEX ls_results-line.IF sy-subrc = 0."是注释行时 continueIF ls_source2-line(1) = '*'.CONTINUE.ENDIF.SEARCH ls_source2-line FOR '"'.IF sy-subrc = 0 AND sy-fdpos <= ls_results-offset.CONTINUE.ENDIF.ENDIF.PERFORM frm_get_hit_set USING lt_sourcegs_prog-namels_results-line.PERFORM frm_get_fm_name USING lt_sourcelv_regexls_results-linegs_prog-main_namegs_prog-nameCHANGING ct_functionct_function_stdct_bapis.ENDLOOP.ENDIF.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DEVC_CLASS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_devc_class .DATA: lt_wbcrossgt TYPE TABLE OF wbcrossgt,lt_class     TYPE tt_class.LOOP AT gt_result INTO gs_result."逐个程序处理DATA(lt_prog) = gt_prog.DELETE lt_prog WHERE main_name NE gs_result-pgmna.WHILE lt_prog[] IS NOT INITIAL.
***Search source"程序里 找出 classPERFORM search_source_class USING lt_progCHANGING lt_wbcrossgt.CLEAR lt_prog.
***class 找出 class程序名(到function)PERFORM get_class_obj USING gs_result-pgmnalt_wbcrossgtCHANGING lt_proglt_class.ENDWHILE.SORT lt_class BY main_name class_name.DELETE ADJACENT DUPLICATES FROM lt_class COMPARING main_name class_name."拼接classLOOP AT lt_class INTO DATA(ls_class).gs_result-callclass =  ls_class-class_name && ',' && gs_result-callclass.CONDENSE gs_result-callclass.append_to_key_word: gs_result-pgmnals_class-class_namels_class-class_name1'CALLCLASS'.         "CALL_CLASSENDLOOP.CLEAR lt_class.MODIFY gt_result FROM gs_result TRANSPORTING callclass.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DEVC_FUNC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_devc_func .DATA: lt_function     TYPE tt_function,lt_function_std TYPE tt_function,lt_bapis        TYPE tt_function,lt_function_all TYPE tt_function,lt_bapis_all    TYPE tt_function.DATA: lt_wbcrossgt TYPE TABLE OF wbcrossgt,lt_class     TYPE tt_class.DATA: lt_prog_next       TYPE tt_prog,lv_start_from_se37.IF p_ck1 = abap_true.lv_start_from_se37 = abap_false.ELSE.lv_start_from_se37 = abap_true.ENDIF.LOOP AT gt_result INTO gs_result."逐个程序处理DATA(lt_prog) = gt_prog.DELETE lt_prog WHERE main_name NE gs_result-pgmna.WHILE lt_prog[] IS NOT INITIAL.IF lv_start_from_se37 = abap_false.
***Search source"程序里 找出 functionPERFORM search_source_callfunc USING lt_progCHANGING lt_functionlt_function_stdlt_bapis.CLEAR lv_start_from_se37.ELSE."初始 functionlt_function = VALUE #(  FOR ls_prog2 IN lt_prog( main_name = ls_prog2-main_namename = ls_prog2-nametype = ls_prog2-type ) ).ENDIF.***get function programs.IF p_fugr = abap_true."function里找出程序名,  继续下一次程序找functionPERFORM get_function_obj  USING gs_result-pgmnalt_functionCHANGING lt_prog_next.    "call function IN call function.ENDIF.CLEAR lt_function.***Search source"程序里 找出 classPERFORM search_source_class USING lt_progCHANGING lt_wbcrossgt.***get class programs.IF p_cinc = abap_true."class 找出 class程序名(到function)PERFORM get_class_obj USING gs_result-pgmnalt_wbcrossgtCHANGING lt_prog_nextlt_class.ENDIF.lt_prog[] = lt_prog_next[].CLEAR: lt_prog_next,lt_wbcrossgt,lt_function,lt_function_std,lt_bapis.ENDWHILE.*    SORT gt_function by type name.LOOP AT gt_function INTO gs_function WHERE main_name = gs_result-pgmna."01-function, 02-BAPI, 03-STD.functionIF gs_function-type = '01'.CONCATENATE gs_function-name gs_result-callfuncINTO gs_result-callfunc SEPARATED BY ','.CONDENSE gs_result-callfunc."append to keyword.append_to_key_word: gs_result-pgmnags_function-pnamegs_function-namegs_function-position'CALLFUNC'.ELSEIF gs_function-type = '04'.CONCATENATE gs_function-name gs_result-callrfcINTO gs_result-callrfc SEPARATED BY ','.CONDENSE gs_result-callrfc."append to keyword.append_to_key_word: gs_result-pgmnags_function-pnamegs_function-namegs_function-position'CALLRFC'.ELSE.CONCATENATE gs_function-name gs_result-callbapiINTO gs_result-callbapi SEPARATED BY ','.CONDENSE gs_result-callbapi."append to keyword.append_to_key_word: gs_result-pgmnags_function-pnamegs_function-namegs_function-position'CALLBAPI'.ENDIF.ENDLOOP.***CLASSSORT lt_class BY main_name class_name.DELETE ADJACENT DUPLICATES FROM lt_class COMPARING main_name class_name.APPEND LINES OF lt_class TO gt_class."拼接classLOOP AT lt_class INTO DATA(ls_class) WHERE main_name = gs_result-pgmna.gs_result-callclass =  ls_class-class_name && ',' && gs_result-callclass.CONDENSE gs_result-callclass."append to keyword.append_to_key_word: gs_result-pgmnals_class-class_namels_class-class_name1'CALLCLASS'.         "CALL_CLASSENDLOOP.CLEAR lt_class.*    MODIFY gt_result FROM gs_result TRANSPORTING callfunc callbapi callclass.MODIFY gt_result FROM gs_result TRANSPORTING callfunc callbapi callrfc callclass.CLEAR: gs_result.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_function_OBJ
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_function  text
*      <--P_GT_prog  text
*----------------------------------------------------------------------*
FORM get_function_obj  USING  iv_main_name TYPE program_idit_function TYPE tt_functionCHANGING ct_prog TYPE tt_prog.DATA: lv_progname TYPE char100,ls_prog     TYPE ts_prog.DATA: lt_source  TYPE abaptxt255_tab.CHECK it_function[] IS NOT INITIAL.SELECT *FROM tfdirINTO TABLE @DATA(lt_tfdir)FOR ALL ENTRIES IN @it_functionWHERE funcname = @it_function-name.IF sy-subrc = 0.LOOP AT lt_tfdir INTO DATA(ls_tfdir).CONCATENATE ls_tfdir-pname 'U' ls_tfdir-include INTO lv_progname."SAPLXXX01--->SAPLXXX01,  /BMW/SAPLXXX02--->/BMW/LXXX02REPLACE 'SAP' IN lv_progname WITH space .CONDENSE lv_progname."CHECK是未处理过的程序--避免相互调用造成的死循环READ TABLE gt_prog INTO gs_prog WITH KEY name = lv_prognamefrom = 1to   = lines( lt_source ).IF sy-subrc NE 0.ls_prog-main_name = iv_main_name.ls_prog-name = lv_progname.ls_prog-type = '02'.READ REPORT lv_progname INTO lt_source.ls_prog-from = 1.ls_prog-to = lines( lt_source ).ls_prog-lines = lines( lt_source ).APPEND ls_prog TO ct_prog.APPEND ls_prog TO gt_prog."遍历当前程序体里的PERFORM调用.PERFORM frm_search_source_form USING ls_progCHANGING ct_prog .CLEAR ls_prog.ENDIF.ENDLOOP.ENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_HIT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_SOURCE  text
*      -->P_gs_prog_NAME  text
*      -->P_LS_RESULTS_LINE  text
*----------------------------------------------------------------------*
FORM frm_get_hit_set  USING    it_abap TYPE abaptxt255_tabiv_pgmna_name TYPE trdir-nameiv_tabix TYPE match_result-line.DATA: lv_end     TYPE i,lv_start   TYPE i,lv_xtabix  TYPE sy-tabix,lv_hitline TYPE xfeld.DATA: gv_hit_count TYPE i.DATA: ls_col LIKE LINE OF gs_alv_item-cell_color.FIELD-SYMBOLS:<lv_abap> TYPE any.lv_start = iv_tabix - 2 .lv_end   = iv_tabix + 2.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 = 'X'.ELSE.CLEAR lv_hitline.ENDIF.ADD 1 TO lv_start.IF <lv_abap>(1) = '*'OR <lv_abap>(1) = '"'.CONTINUE.ENDIF.gs_alv_item-repname = iv_pgmna_name.gs_alv_item-line_no = lv_xtabix.gs_alv_item-text    = <lv_abap>.IF lv_hitline IS NOT INITIAL.gs_alv_item-hit = '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.ENDWHILE.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FM_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_SOURCE  text
*      -->P_LS_RESULTS_LINE  text
*      <--P_LT_function  text
*----------------------------------------------------------------------*
FORM frm_get_fm_name  USING    it_abap TYPE abaptxt255_tabiv_regex TYPE stringiv_tabix TYPE match_result-lineiv_main_name  TYPE trdir-nameiv_pname  TYPE trdir-nameCHANGING ct_function TYPE tt_functionct_function_std TYPE tt_functionct_bapis TYPE tt_function .DATA: lv_exit,lv_character,lv_fname(30),lv_fdpos TYPE i.DATA: ls_function TYPE ts_function.CLEAR lv_exit.LOOP AT it_abap INTO DATA(ls_abap) FROM iv_tabix.DATA(lv_index) = iv_tabix.  "lineFIND REGEX iv_regex IN ls_abap-line IGNORING CASE.IF sy-subrc = 0.DO 10 TIMES.  "search 10 lines at mostREAD TABLE it_abap INTO DATA(ls_abap_curr) INDEX lv_index.SEARCH ls_abap_curr-line FOR '''' .IF sy-subrc = 0.lv_fdpos = sy-fdpos.DO 30 TIMES.lv_fdpos = lv_fdpos + 1.lv_character = ls_abap_curr-line+lv_fdpos(1).IF lv_character = ''''.EXIT.ELSE.lv_fname = lv_fname && lv_character.ENDIF.ENDDO.CONDENSE lv_fname.ls_function-main_name = iv_main_name.ls_function-pname = iv_pname.   "function位置所在的程序ls_function-position = lv_index.   "function位置所在的程序行ls_function-name = lv_fname.SELECT SINGLE funcname INTO lv_fname FROM tfdir WHERE funcname = lv_fname.IF sy-subrc = 0."是当前系统function.IF lv_fname(1) = 'Z' OR lv_fname(5) = '/BMW/'.ls_function-type = '01'.APPEND ls_function TO gt_function.APPEND ls_function TO ct_function.ELSEIF lv_fname(4) = 'BAPI'.ls_function-type = '02'.APPEND ls_function TO gt_function.APPEND ls_function TO ct_bapis.ELSE.ls_function-type = '03'.APPEND ls_function TO gt_function.APPEND ls_function TO ct_function_std.ENDIF.ELSE."是destination系统*            ZSCANNER_F01FIND REGEX 'DESTINATION' IN ls_abap-line IGNORING CASE.IF sy-subrc NE 0.DATA(lv_next) = iv_tabix + 1.LOOP AT it_abap INTO DATA(ls_abap_rfc) FROM lv_next.IF ls_abap_rfc(1) = '*' OR ls_abap_rfc IS INITIAL.CONTINUE.ELSE."非注释行&非空行&非"DEST.行 --- 校验DESTINATION.FIND REGEX 'DESTINATION' IN ls_abap_rfc-line IGNORING CASE.IF sy-subrc = 0.FIND REGEX '"\s+DESTINATION' IN ls_abap_rfc-line IGNORING CASE.IF sy-subrc NE 0.ls_function-type = '04'.      "RFC.APPEND ls_function TO gt_function.ENDIF.ENDIF.EXIT. "检测到非空行即跳出ENDIF.ENDLOOP.ELSE.ls_function-type = '04'.      "RFC.APPEND ls_function TO gt_function.ENDIF.ENDIF.lv_exit = abap_true.EXIT.ELSE."next linelv_index = lv_index + 1.CONTINUE.ENDIF.ENDDO.IF lv_exit = abap_true..EXIT.ENDIF.CLEAR lv_fname.ELSE.ENDIF.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_PATTERN_CALL_FUNCTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0183   text
*      <--P_LV_REGEX  text
*----------------------------------------------------------------------*
FORM frm_pattern_call_function  USING    iv_type TYPE char20CHANGING cv_regex TYPE stringcv_regex2 TYPE string.CASE iv_type.WHEN 'CALL_FUNCTION'."Start with 'CALL', end with 'FUNCTION'cv_regex = '\<CALL\s+FUNCTION\>'.cv_regex2 = '"\s+\<CALL\s+FUNCTION\>'.WHEN 'CREATE_OBJECT'.WHEN OTHERS.ENDCASE.ENDFORM.*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_prog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_alv_list .CONSTANTS:lc_pf_status    TYPE slis_formname VALUE 'FRM_PF_STATUS',lc_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.DATA: lv_repid    TYPE sy-repid,ls_layout   TYPE lvc_s_layo,lt_fieldcat TYPE lvc_t_fcat.lv_repid = sy-repid.ls_layout-zebra = abap_true.ls_layout-box_fname = 'SEL'.PERFORM frm_set_fieldcat CHANGING lt_fieldcat.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program      = lv_repidis_layout_lvc           = ls_layout
*     i_grid_title            =it_fieldcat_lvc         = lt_fieldcat
*     i_callback_pf_status_set = lc_pf_statusi_callback_user_command = lc_user_commandi_save                  = 'X'TABLESt_outtab                = gt_result[]EXCEPTIONSprogram_error           = 1OTHERS                  = 2..IF sy-subrc <> 0.
* Implement suitable error handling hereENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM frm_set_fieldcat CHANGING ct_fieldcat TYPE lvc_t_fcat.DATA: ls_fieldcat TYPE lvc_s_fcat.DEFINE marco_fieldcat.CLEAR ls_fieldcat.ls_fieldcat-key        = &1.ls_fieldcat-fieldname  = &2.ls_fieldcat-coltext    = &3.ls_fieldcat-col_opt    = &4.ls_fieldcat-hotspot    = &5.ls_fieldcat-ref_field = &6.ls_fieldcat-ref_table = &7.APPEND ls_fieldcat TO ct_fieldcat.END-OF-DEFINITION.marco_fieldcat:'X'  'TCODE'      'T-code'     'X' ''  ''  '','X'  'PGMNA'      'Program'    'X' ''  ''  '',''   'INSTANCE'   'Instance'   'X' ''  ''  '',''   'TITLE'      'Title'      'X' ''  ''  '',''   'SPRAS'      'Language'   'X' ''  ''  '',''   'CREATED_ON' 'Created on' 'X' ''  ''  '',''   'CHANGED_ON' 'Changed on' 'X' ''  ''  '',''   'DEVCLASS'   'Package'    'X' ''  ''  '',''   'DEVCLASS_T' 'Package Desc.'      'X' ''  ''  '',''   'COMPONENT'  'Package Component'  'X' ''  ''  '',''   'SELECT'    'Select table'       'X' 'X'  ''  '',''   'INSERT'    'Insert table'       'X' 'X'  ''  '',''   'DELETE'    'Delete table'       'X' 'X'  ''  '',''   'UPDATE'    'Update table'       'X' 'X'  ''  '',''   'CALLFUNC'   'call Function'      'X' 'X'  ''  '',''   'CALLBAPI'   'call Bapi'          'X' 'X'  ''  '',''   'CALLRFC'    'call RFC'           'X' 'X'  ''  '',''   'CALLCLASS'  'Class/Interface'    'X' 'X'  ''  '',''   'CALLTRAN'   'call TRANSACTION'   'X' 'X'  ''  '',''   'SUBMIT'    'Submit program'     'X' 'X'  ''  '',''   'FORMS'      'Print Form'         'X' 'X'  ''  '',''   'ISALV'      'ALV Display'        'X' ''  ''  '',''   'LINES'      'Coding Line'        'X' ''  ''  '',''   'BUTTON_T'   'Button text'        'X' 'X'  ''  ''.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SEARCH_SOURCE_CLASS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_PROG  text
*      <--P_LT_FUNCTION  text
*      <--P_LT_FUNCTION_STD  text
*      <--P_LT_BAPIS  text
*----------------------------------------------------------------------*
FORM search_source_class  USING    it_prog TYPE tt_progCHANGING ct_wbcrossgt TYPE wbcrossgtt.SELECT *FROM wbcrossgtINTO TABLE ct_wbcrossgtFOR ALL ENTRIES IN it_progWHERE include = it_prog-nameAND otype = 'ME' .     "METHOD
*      AND ( otype = 'TY'    "CLASS
*           OR otype = 'ME' ). "METHOD."删除标准的CLASS.DELETE ct_wbcrossgt WHERE name(1) NE 'Z' AND name(5) NE '/BMW/'.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_CLASS_OBJ
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_WBCROSSGT  text
*      <--P_LT_PROG  text
*----------------------------------------------------------------------*
FORM get_class_obj  USING    iv_main_name TYPE program_idit_wbcrossgt TYPE wbcrossgttCHANGING ct_prog TYPE tt_progct_class TYPE tt_class.DATA: ls_prog  TYPE ts_prog,ls_tmdir TYPE tmdir,lt_tmdir TYPE TABLE OF tmdir.DATA: lv_suffix       TYPE c LENGTH 5,lv_progname(50),lv_flag(30).DATA: lt_source  TYPE abaptxt255_tab.LOOP AT it_wbcrossgt INTO DATA(ls_wbcrossgt) WHERE otype = 'ME'.SPLIT ls_wbcrossgt-name AT '\ME:' INTO ls_tmdir-classname ls_tmdir-methodname.***CLASS namegs_class-main_name = iv_main_name.         "MAIN_NAMEgs_class-class_name = ls_tmdir-classname.  "CLASSAPPEND gs_class TO ct_class.CLEAR gs_class.SELECT * FROM tmdir INTO TABLE lt_tmdirWHERE classname = ls_tmdir-classnameAND methodname = ls_tmdir-methodname.IF sy-subrc = 0.LOOP AT lt_tmdir INTO ls_tmdir.PERFORM convert_numc_35 USING ls_tmdir-methodindxCHANGING lv_suffix."/BMW/XXXXXX====MCNNN 总长度是35.DATA(lv_length) = 30 - strlen( ls_tmdir-classname ).DO lv_length TIMES.lv_flag = lv_flag && '='.CONDENSE lv_flag.ENDDO.lv_progname = ls_tmdir-classname && lv_flag && lv_suffix."CHECK是未处理过的程序--避免相互调用造成的死循环READ TABLE gt_prog INTO gs_prog WITH KEY name = lv_progname.IF sy-subrc NE 0.ls_prog-main_name = iv_main_name.ls_prog-name = lv_progname.ls_prog-type = '03'.READ REPORT lv_progname INTO lt_source.ls_prog-from = 1.ls_prog-to = lines( lt_source ).ls_prog-lines = lines( lt_source ).APPEND ls_prog TO ct_prog.APPEND ls_prog TO gt_prog.CLEAR ls_prog.ENDIF.CLEAR lv_flag.ENDLOOP.ENDIF.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CONVERT_NUMC_35
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_TMDIR_METHODINDX  text
*      <--P_LV_SUFFIX  text
*----------------------------------------------------------------------*
FORM convert_numc_35  USING    iv_methodindxCHANGING cv_suffix TYPE char5.CONSTANTS: lc_character TYPE c LENGTH 36 VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.DATA: lv_mod TYPE numc2,lv_div TYPE numc2.lv_div = iv_methodindx DIV 36.lv_mod = iv_methodindx MOD 36.cv_suffix = 'CM' && lv_div && lc_character+lv_mod(1).ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_KEY_WORD_SCAN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_key_word_scan .DATA: lv_subrc TYPE sy-subrc.DATA: lt_source  TYPE abaptxt255_tab.DATA: lt_keywrd_sel    TYPE abaptxt255_tab,lt_keywrd_ins    TYPE abaptxt255_tab,lt_keywrd_del    TYPE abaptxt255_tab,lt_keywrd_upd    TYPE abaptxt255_tab,lt_keywrd_submit TYPE abaptxt255_tab,lt_keywrd_call   TYPE abaptxt255_tab,lt_stoken        TYPE stoken_tab,lt_sstmnt        TYPE sstmnt_tab.DATA: lr_code_std TYPE RANGE OF rsmptexts-obj_code.lt_keywrd_sel[] = VALUE #( ( line = 'SELECT'  ) ).lt_keywrd_ins[] = VALUE #( ( line = 'INSERT'  ) ).lt_keywrd_del[] = VALUE #( ( line = 'DELETE'  ) ).lt_keywrd_upd[] = VALUE #( ( line = 'UPDATE'  ) ).lt_keywrd_submit[] = VALUE #( ( line = 'SUBMIT'  ) ).lt_keywrd_call[] = VALUE #( ( line = 'CALL'  ) ).LOOP AT gt_prog INTO gs_prog.READ REPORT gs_prog-name INTO lt_source.***SELECTSCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_selTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."select xxx from db."select xxx from db-a join db-b xxxxLOOP AT lt_stoken INTO DATA(ls_stoken) WHERE ( str = 'FROM' OR str = 'JOIN' ).DATA(lv_index) = sy-tabix + 1."FROM 下一行是表名称READ TABLE lt_stoken INTO DATA(ls_stoken1) INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'SELECT'.           "SELECTENDIF.ENDIF.ENDLOOP.***INSERTSCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_insTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."insert db from xxx."insert into db values xxx.LOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'INSERT' OR str = 'INTO' ).lv_index = sy-tabix + 1."下一行是表名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'INSERT'.           "INSERTENDIF.ENDIF.ENDLOOP.***DELETESCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_delTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."delete db from itab xxxx"delete from db where xxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'DELETE' OR str = 'FROM' ).lv_index = sy-tabix + 1."下一行是表名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'DELETE'.           "DELETEENDIF.ENDIF.ENDLOOP.***UPDATESCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_updTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."delete db from xxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'UPDATE' ).lv_index = sy-tabix + 1."下一行是表名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_tabname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'UPDATE'.           "UPDATEENDIF.ENDIF.ENDLOOP.***SUBMIT.SCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_submitTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."delete db from xxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'SUBMIT' ).lv_index = sy-tabix + 1."下一行是程序名称READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.PERFORM check_progname USING ls_stoken1-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken1-strls_stoken1-row'SUBMIT'.           "UPDATEENDIF.ENDIF.ENDLOOP.***CALL TRANSACTIONSCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrd_callTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."call transaction xxxxxLOOP AT lt_stoken INTO ls_stoken WHERE ( str = 'CALL' ).lv_index = sy-tabix + 1."下一行是TRANSACTION.READ TABLE lt_stoken INTO ls_stoken1 INDEX lv_index.IF sy-subrc = 0.TRANSLATE ls_stoken1-str TO UPPER CASE.CHECK ls_stoken1-str = 'TRANSACTION'.lv_index = lv_index + 1."下一行是TCODE名称READ TABLE lt_stoken INTO DATA(ls_stoken2) INDEX lv_index.IF sy-subrc = 0.PERFORM check_tcode USING ls_stoken2-strCHANGING lv_subrc.IF lv_subrc = 0.append_to_key_word: gs_prog-main_namegs_prog-namels_stoken2-strls_stoken2-row'CALL_TRANSACTION'.         "CALL_TRANSACTIONENDIF.ENDIF.ENDIF.ENDLOOP.ENDLOOP.SORT gt_key_word.DELETE ADJACENT DUPLICATES FROM gt_key_word COMPARING ALL FIELDS."standard function-codePERFORM append_code_std CHANGING lr_code_std."更新到result表LOOP AT gt_result INTO gs_result.LOOP AT gt_key_word INTO gs_key_word WHERE main_name = gs_result-pgmna.CASE gs_key_word-type.WHEN 'SELECT'.gs_result-select = gs_key_word-keyname && ',' && gs_result-select.CONDENSE gs_result-select.WHEN 'INSERT'.gs_result-insert = gs_key_word-keyname && ',' && gs_result-insert.CONDENSE gs_result-insert.WHEN 'DELETE'.gs_result-delete = gs_key_word-keyname && ',' && gs_result-delete.CONDENSE gs_result-delete.WHEN 'UPDATE'.gs_result-update = gs_key_word-keyname && ',' && gs_result-update.CONDENSE gs_result-update.WHEN 'SUBMIT'.gs_result-submit = gs_key_word-keyname && ',' && gs_result-submit.CONDENSE gs_result-submit.WHEN 'CALL_TRANSACTION'.gs_result-calltran = gs_key_word-keyname && ',' && gs_result-calltran.CONDENSE gs_result-calltran.ENDCASE.ENDLOOP.***linesLOOP AT gt_prog INTO gs_prog WHERE main_name = gs_result-pgmna.gs_result-lines = gs_result-lines + ( gs_prog-to - gs_prog-from + 1 ).ENDLOOP.***buttonSELECT * FROM rsmptextsINTO TABLE @DATA(lt_rsmptexts)WHERE progname = @gs_result-pgmnaAND obj_type = 'F'AND texttype IN ('Q','M','I')  "I-icon info,  M-Object text, Q-quick info.AND obj_code NOT IN @lr_code_std."优先取icon info,再取Object text, 最后取quick info.SORT lt_rsmptexts BY progname obj_code obj_type texttype.DELETE ADJACENT DUPLICATES FROM lt_rsmptexts COMPARING progname obj_code obj_type .LOOP AT lt_rsmptexts INTO DATA(ls_rsmptexts).gs_result-button_t = ls_rsmptexts-text && ',' && gs_result-button_t.CONDENSE gs_result-button_t.gs_key_word-main_name = gs_result-pgmna.
*      gs_key_word-keyname = ls_rsmptexts-obj_code.gs_key_word-keyname = ls_rsmptexts-text.gs_key_word-type = 'BUTTON_T'.    "插入到key_word表 用于双击分解?APPEND gs_key_word TO gt_key_word.CLEAR gs_key_word.ENDLOOP.***SmartformsREAD TABLE gt_function INTO gs_function WITH KEY type = '03'name = 'SSF_FUNCTION_MODULE_NAME'.IF sy-subrc = 0."存在 调smartforms."----->如何找smartforms名称.ENDIF.MODIFY gt_result FROM gs_result.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEARCH_SOURCE_FORM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_PROG  text
*----------------------------------------------------------------------*
FORM frm_search_source_form  USING  is_prog TYPE ts_progCHANGING ct_prog TYPE tt_prog.DATA: lt_source  TYPE abaptxt255_tab,lt_results TYPE match_result_tab.DATA: lt_function  TYPE tt_function,lv_regex     TYPE string,lv_regex2    TYPE string,lv_regex3    TYPE string,lv_regex4    TYPE string,lv_from_done,lv_to_done.DATA: lt_keywrd  TYPE abaptxt255_tab,lt_keywrd2 TYPE abaptxt255_tab,lt_stoken  TYPE stoken_tab,lt_sstmnt  TYPE sstmnt_tab.DATA: lv_program TYPE sy-repid,lt_inc_tmp TYPE TABLE OF tadir-obj_name.DATA: lt_prog_form TYPE tt_prog,lt_prog_next TYPE tt_prog.TYPES: BEGIN OF ts_form,str TYPE token_str,END OF ts_form.DATA: ls_form TYPE ts_form,lt_form TYPE TABLE OF ts_form.DATA: lv_index TYPE i,lv_from  TYPE i,lv_to    TYPE i.PERFORM frm_pattern_call_function USING 'PERFORM'CHANGING lv_regexlv_regex2.*  READ REPORT is_prog-name INTO lt_source.lt_keywrd[] = VALUE #( ( line = 'PERFORM'  ) ).lt_prog_form = VALUE #( ( main_name = is_prog-main_namename = is_prog-nametype = is_prog-typefrom = is_prog-fromto = is_prog-to ) ).WHILE lt_prog_form[] IS NOT INITIAL.LOOP AT lt_prog_form INTO DATA(ls_prog_form).***读取PERFORMS.READ REPORT ls_prog_form-name INTO lt_source.SCAN ABAP-SOURCE lt_source KEYWORDS FROM lt_keywrdTOKENS INTO lt_stokenSTATEMENTS INTO lt_sstmnt."删除范围外的mapping行DELETE lt_stoken WHERE row LT ls_prog_form-from OR row GT ls_prog_form-to.CHECK lt_stoken[] IS NOT INITIAL.CHECK lt_sstmnt[] IS NOT INITIAL.LOOP AT lt_stoken INTO DATA(ls_stoken) WHERE str = 'PERFORM'.lv_index = sy-tabix + 1.READ TABLE lt_stoken INTO ls_stoken INDEX lv_index.IF sy-subrc = 0.ls_form-str = ls_stoken-str.APPEND ls_form TO lt_form.ENDIF.ENDLOOP.CLEAR: lt_stoken, lt_sstmnt."include程序--->main程序SELECT * FROM d010inc INTO TABLE @DATA(lt_d010inc) WHERE include = @is_prog-name.IF sy-subrc = 0.CHECK lines( lt_d010inc[] ) = 1.READ TABLE lt_d010inc INTO DATA(ls_d010inc) INDEX 1."main程序--->所有程序lv_program = ls_d010inc-master.CALL FUNCTION 'RS_GET_ALL_INCLUDES'EXPORTINGprogram    = lv_programTABLESincludetab = lt_inc_tmpEXCEPTIONSOTHERS     = 0."在所有including程序中找出FORM的开始行到结束行.LOOP AT lt_inc_tmp INTO DATA(ls_inc_tmp) .READ REPORT ls_inc_tmp INTO lt_source."逐个perform进行查找.LOOP AT lt_form INTO ls_form."开始行"FORM xxxxx .lv_regex = 'FORM\s+' && ls_form-str && '[\s.]'.       "开始行lv_regex2 = '"\s+FORM\s+' && ls_form-str && '[\s.]'.  "被注释的开始行lv_regex3 = 'ENDFORM' && '[\s.]'.               "结束行lv_regex4 = '"\s+ENDFORM' && '[\s.]'.           "被注释的结束行LOOP AT lt_source INTO DATA(ls_source).CHECK ls_source(1) NE '*'.    "注释行.IF lv_from_done = abap_false."找开始行lv_from = sy-tabix.FIND REGEX lv_regex IN ls_source-line IGNORING CASE.IF sy-subrc = 0."check是否注释的FIND REGEX lv_regex2 IN ls_source-line IGNORING CASE.IF sy-subrc NE 0.CONDENSE ls_source-line.CHECK ls_source-line(4) = 'FORM'. "是FORM开头.lv_from_done = abap_true.ENDIF.ENDIF.ELSE."找结束行.lv_to = sy-tabix.FIND REGEX lv_regex3 IN ls_source-line IGNORING CASE.IF sy-subrc = 0."check是否注释的FIND REGEX lv_regex4 IN ls_source-line IGNORING CASE.IF sy-subrc NE 0.lv_to_done = abap_true.EXIT.ENDIF.ENDIF.ENDIF.ENDLOOP.IF lv_to_done = 'X'."CHECK是未处理过的程序--避免相互调用造成的死循环READ TABLE gt_prog INTO gs_prog WITH KEY name = ls_inc_tmpfrom = lv_fromto   = lv_to.IF sy-subrc NE 0.gs_prog_part-main_name = is_prog-main_name.gs_prog_part-name = ls_inc_tmp.gs_prog_part-type = '02'.   "including programgs_prog_part-from = lv_from.gs_prog_part-to = lv_to.APPEND gs_prog_part TO ct_prog.APPEND gs_prog_part TO gt_prog.APPEND gs_prog_part TO lt_prog_next. "下一个PERFORM.ENDIF.ENDIF.CLEAR: lv_from_done,lv_to_done,lv_from,lv_to.ENDLOOP.ENDLOOP.ENDIF.CLEAR: lt_form.ENDLOOP.lt_prog_form[] = lt_prog_next[].CLEAR: lt_prog_next[].ENDWHILE.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CHECK_TABNAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_STOKEN1_STR  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM check_tabname  USING    iv_tabname TYPE char30CHANGING cv_subrc TYPE syst-subrc.SELECT SINGLE tabnameFROM dd02lINTO @DATA(lv_tname)WHERE tabname = @iv_tabname.cv_subrc = sy-subrc.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CHECK_PROGNAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_STOKEN1_STR  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM check_progname  USING    iv_progname TYPE char30CHANGING cv_subrc TYPE syst-subrc.SELECT SINGLE prognameFROM reposrcINTO @DATA(lv_progname)WHERE progname = @iv_progname.cv_subrc = sy-subrc.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  CHECK_TCODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_STOKEN2_STR  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM check_tcode  USING    iv_tcode TYPE char30CHANGING cv_subrc TYPE syst-subrc.DATA: lv_tcode TYPE tstc-tcode.lv_tcode = iv_tcode."去除引号   'FB03'-->FB03.SHIFT lv_tcode RIGHT DELETING TRAILING space.SHIFT lv_tcode RIGHT DELETING TRAILING ''''.CONDENSE lv_tcode.SHIFT lv_tcode LEFT DELETING LEADING ''''.SELECT SINGLE tcodeFROM tstcINTO lv_tcodeWHERE tcode = lv_tcode.cv_subrc = sy-subrc.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_command USING iv_ucomm TYPE sy-ucommis_selfield  TYPE slis_selfield.CASE iv_ucomm.WHEN '&IC1'.READ TABLE gt_result INTO gs_result INDEX is_selfield-tabindex.IF sy-subrc = 0.CASE is_selfield-fieldname.WHEN 'SELECT' OR'DELETE' OR'UPDATE' OR'INSERT' OR'CALLFUNC' OR'CALLBAPI' OR'CALLRFC' OR'CALLCLASS' OR'CALLTRAN' OR'SUBMIT' OR'FORMS' OR'BUTTON_T'.PERFORM show_detail_sql USING is_selfield-fieldnamegs_result.WHEN OTHERS.ENDCASE.ENDIF.WHEN OTHERS.ENDCASE.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SHOW_DETAIL_SQL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GS_RESULT  text
*----------------------------------------------------------------------*
FORM show_detail_sql  USING iv_fname TYPE char30is_result TYPE ts_result.DATA: lt_structure TYPE lvc_t_fcat,ls_structure TYPE lvc_s_fcat,ls_layout    TYPE lvc_s_layo.DATA: lv_title TYPE lvc_title.CONSTANTS:lc_user_command_sub TYPE slis_formname VALUE 'FRM_USER_COMMAND_SUB'.
***gt_key_wordCLEAR lt_structure.IF iv_fname = 'SELECT' ORiv_fname = 'UPDATE' ORiv_fname = 'INSERT' ORiv_fname = 'DELETE' ORiv_fname = 'CALLFUNC' ORiv_fname = 'CALLBAPI' ORiv_fname = 'CALLRFC' ORiv_fname = 'CALLTRAN' ORiv_fname = 'SUBMIT'.ls_structure-fieldname = 'NAME'.ls_structure-coltext = 'Program'.ls_structure-col_pos = 1.ls_structure-ref_table = ''.ls_structure-ref_field = ''.APPEND ls_structure TO lt_structure.ls_structure-fieldname = 'POSITION'.ls_structure-coltext = 'Position'.ls_structure-hotspot = 'X'.ls_structure-col_pos = 3.ls_structure-datatype = 'INT4'.ls_structure-dd_outlen = '255'.APPEND ls_structure TO lt_structure.CLEAR ls_structure.IF iv_fname = 'SELECT' ORiv_fname = 'UPDATE' ORiv_fname = 'INSERT' ORiv_fname = 'DELETE'.ls_structure-fieldname = 'DDTEXT'.ls_structure-coltext = 'TableName'.ls_structure-col_pos = 4.ls_structure-REF_TABLE = 'DD02T'.ls_structure-REF_FIELD = 'DDTEXT'.APPEND ls_structure TO lt_structure.CLEAR ls_structure.ENDIF.ENDIF.CLEAR ls_structure.ls_structure-fieldname = 'KEYNAME'.ls_structure-coltext = 'Value'.ls_structure-col_pos = 2.ls_structure-datatype = 'CHAR'.ls_structure-dd_outlen = '40'.APPEND ls_structure TO lt_structure.CLEAR ls_structure.****创建dyn_table
*  CALL METHOD cl_alv_table_create=>create_dynamic_table
*    EXPORTING
*      it_fieldcatalog           = lt_structure
*    IMPORTING
*      ep_table                  = dy_table
*    EXCEPTIONS
*      generate_subpool_dir_full = 1
*      OTHERS                    = 2.
*  IF sy-subrc = 0.
*    "table
*    ASSIGN dy_table->* TO <dyn_table>.
*  ENDIF.
*
****dyn_table 赋值
*  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
*  ASSIGN dy_line->* TO <dyn_wa>.DATA: lt_sort TYPE lvc_t_sort.lt_sort = VALUE #( ( fieldname = 'KEYNAME'up = 'X' ) ).gt_detail[] = gt_key_word[].DELETE gt_detail WHERE type <> iv_fname.CHECK gt_detail[] IS NOT INITIAL.LOOP AT gt_detail ASSIGNING FIELD-SYMBOL(<ls_detail>).SELECT SINGLE ddtext FROM dd02t INTO <ls_detail>-ddtextWHERE tabname = <ls_detail>-keynameAND ddlanguage = 'E'.ENDLOOP.lv_title = iv_fname.ls_layout-zebra = abap_true.ls_layout-cwidth_opt = abap_true.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_callback_program      = sy-repidis_layout_lvc           = ls_layoutit_fieldcat_lvc         = lt_structureit_sort_lvc             = lt_sorti_callback_user_command = lc_user_command_subi_save                  = 'X'i_grid_title            = lv_titleTABLESt_outtab                = gt_detailEXCEPTIONSprogram_error           = 1OTHERS                  = 2..IF sy-subrc <> 0.
* Implement suitable error handling hereENDIF.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_BASIC_FUNC_INFO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_basic_func_info .DATA: lr_pgmna TYPE RANGE OF trdir-name,lt_tstc  TYPE TABLE OF tstc.DATA: lv_progname(50),lt_source  TYPE abaptxt255_tab.***GET programsSELECTtfdir~funcname,tfdir~pname,tfdir~include,tfdir~pname_mainINTO TABLE @DATA(lt_tfdir)FROM tfdirWHERE tfdir~funcname IN @s_fname.IF sy-subrc <> 0.MESSAGE s001(00) WITH 'No functions found!' DISPLAY LIKE 'E'.LEAVE LIST-PROCESSING.ENDIF.LOOP AT lt_tfdir INTO DATA(ls_tfdir).APPEND INITIAL LINE TO gt_prog ASSIGNING FIELD-SYMBOL(<ls_prog>).
*    <ls_prog>-main_name = ls_tfdir-funcname.CONCATENATE ls_tfdir-pname 'U' ls_tfdir-include INTO lv_progname."SAPLXXX01--->LXXX01,  /BMW/SAPLXXX02--->/BMW/LXXX02REPLACE 'SAP' IN lv_progname WITH space .CONDENSE lv_progname.<ls_prog>-main_name = lv_progname.                  "Function对应的程序名<ls_prog>-name      = ls_tfdir-funcname.            "Function name<ls_prog>-type      = '02'.READ REPORT lv_progname INTO lt_source.<ls_prog>-from = 1.<ls_prog>-to = lines( lt_source ).<ls_prog>-lines = lines( lt_source ).UNASSIGN <ls_prog>.APPEND INITIAL LINE TO gt_result ASSIGNING FIELD-SYMBOL(<ls_result>)."Program<ls_result>-pgmna = lv_progname.        "Function对应的程序名<ls_result>-fname = ls_tfdir-funcname.  "Function name"Language"Create_ON"PackageDATA(lv_group) = ls_tfdir-pname.REPLACE 'SAPL' IN lv_group WITH space .CONDENSE lv_group.SELECT SINGLE devclass, masterlang, created_onINTO ( @<ls_result>-devclass,@<ls_result>-spras,@<ls_result>-created_on )FROM tadirWHERE pgmid = 'R3TR' AND object = 'FUGR' AND obj_name = @lv_group."TitleSELECT SINGLE stext INTO <ls_result>-title FROM tftitWHERE funcname = <ls_result>-pgmna AND spras = <ls_result>-spras."Package Desc.SELECT SINGLE ctext INTO <ls_result>-devclass_t FROM tdevctWHERE devclass = <ls_result>-devclass AND spras = <ls_result>-spras."Package ComponentSELECT SINGLE component FROM tdevc INTO <ls_result>-componentWHERE devclass = <ls_result>-devclass."Last changedSELECT SINGLE udat FROM trdir INTO <ls_result>-changed_onWHERE name = <ls_result>-pgmna."Lines<ls_result>-lines = lines( lt_source ).UNASSIGN <ls_result>.ENDLOOP.ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  APPEND_CODE_STD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LR_CODE_STD  text
*----------------------------------------------------------------------*
FORM append_code_std  CHANGING cr_code_std LIKE gr_code_std.DATA: ls_code_std LIKE LINE OF gr_code_std.ls_code_std(3) = 'IEQ'.ls_code_std-low = '%ML'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%PC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%SC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%SC+'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '%SL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ABC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ALL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AQW'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AUF'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AVE'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&AVR'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CDF'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CFI'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&COUNT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRB'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRE'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRB'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&CRR'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&DAU'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&DOF'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&DON'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&EB9'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ELP'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ERW'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ETA'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&F03'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&F12'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&F15'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&IC1'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ILD'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ILT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&KOM'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&LFO'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&LIS'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&MAX'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&MIN'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&NFO'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&NTE'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OAD'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&ODN'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OL0'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OLX'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OMP'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OPT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&OUP'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&RNT'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&RNT_PREV'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&SAL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&SUM'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&UMC'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&XML'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&XPA'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = '&XXL'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P+'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P++'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P-'. APPEND ls_code_std TO cr_code_std.ls_code_std-low = 'P--'. APPEND ls_code_std TO cr_code_std.ENDFORM.

000    Scanning type
001    Search Criteria
002    Objects to Be Scanned

P_CINC    Class/Interface
P_CK1    Program
P_CK2    Function
P_FUGR    Function
P_PROG    Program
S_FNAME    Function Module
S_PGMNA    Program
S_TCODE    Tcode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21287.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言基础第12节《函数的调用》

c语言基础10 函数 函数的调用 调用方式 ①函数语句&#xff1a; test(); // 对于无返回值的函数&#xff0c;直接调用 int res max(2,4); // 对于有返回值的函数&#xff0c;一般需要再主调函数中接收被调函数的返回值。②函数表达式&#xff1a; 4 max(2,4) scanf(&qu…

C++:iterator迭代器失效

说明&#xff1a;这里拿 vector 举例。 原因一&#xff1a;扩容导致迭代器失效 // 迭代器失效 void insert(iterator pos, const T& x) {assert(pos > _start);assert(pos < _finish);// 满了就扩容if (_finish _end_of_storage){reserve(capacity() 0 ? 4 : ca…

QT之改变鼠标样式

QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标&#xff0c…

用DeepSeek零基础预测《哪吒之魔童闹海》票房——从数据爬取到模型实战

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 **一、为什么要预测票房&#xff1f;****二、准备工作****三、实战步骤详解****Step 1&#xff1a;数据爬取与清洗&am…

高并发下秒杀系统的设计

文章目录 1 业界通用做法1.1 压力分摊1.2 RedisMySQL1.3 Inventory Hint1.4 压力分摊RedisMQ 2 Redis MQ 解决高并发下的秒杀场景2.1 Redis库存预扣减2.1.1 lua脚本执行流程&#xff1a;2.1.2 Lua脚本主要做了几件事&#xff1a; 2.2 MySQL库存扣减2.3 记录操作流水的原因 3 I…

双重差分学习笔记

双重差分适用的研究场景&#xff1a; 研究某项政策或者冲击造成的影响 例如&#xff0c;某某小学在2024.12.12日颁布了小红花激励措施&#xff0c;我们要研究这项措施对学生成绩的影响&#xff0c;此时&#xff0c;就可以使用双重差分模型。 双重差分适用的数据类型&#xf…

深入理解 C++17 中的 std::atomic<T>::is_always_lock_free

文章目录 原子操作与锁无关性&#xff08;Lock-Free&#xff09;锁无关性&#xff08;Lock-Free&#xff09;无锁&#xff08;Lock-Free&#xff09;与无阻塞&#xff08;Wait-Free&#xff09; std::atomic<T>::is_always_lock_free 是什么&#xff1f;truefalse与 is_l…

VSCode 中 Git 添加了多个远端,如何设置默认远端

VSCode 中 Git 添加了多个远端&#xff0c;如何设置默认远端 查看分支&#xff1a;设置默认远端手动指定远端 查看分支&#xff1a; * 表示当前默认远端 git branch -vv* master a1b2c3d [origin/main] Fix typo dev d4e5f6g [upstream/dev] Add feature设置默认远端 将本…

一文讲清 AIO BIO NIO的区别

引言 在 Java 编程中&#xff0c;BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;和 AIO&#xff08;Asynchronous I/O&#xff09;是三种不同的 I/O 模型&#xff0c;它们在处理输入输出操作时有着不同的机制和特点&#xff0c;但是市…

使用(xshell+xftp)将前端项目部署到服务器

一.以vue项目为例 将项目打包生成dist文件 二.下载载安装xshell和xftp 下载地址&#xff1a;家庭/学校免费 - NetSarang Website 三.连接服务器 在xshell新建会话&#xff08;需要用到服务器、用户名、密码、端口号&#xff09;正确输入后连接到服务器 使用命令连接&#x…

硬件岗位是否适合你?

在当今科技飞速发展的时代,硬件行业作为技术创新的基石,始终扮演着至关重要的角色。无论是智能手机、自动驾驶汽车,还是人工智能服务器,硬件都是这些技术的核心支撑。然而,硬件岗位是否适合你?作为一名硬件专家,我将从多个角度为你分析,帮助你判断自己是否适合从事硬件…

Linux基本指令(二)

文章目录 基本指令echocat&#xff08;输入重定向&#xff09;history日志moretail和headmv&#xff08;重要&#xff09;时间相关的指令查找的命令 知识点Linux下一切皆文件为什么计算机关机了&#xff0c;开机后还能准确地记录时间呢&#xff1f; 基本指令 echo 1. echo&…

【Blender】二、建模篇--05,阵列修改器与晶格形变

阵列修改器是bender里面一个比较常用的修改器,所以我们单独开口来讲,我们会先从几片树叶出发,然后我们用阵列修改器把这几片树叶变成这样的造型和这样的造型。这两个造型分别就代表着阵列修改器最常用的两种偏移方法,我们现在就开始我们先来做几个树叶。 1.树叶建模 首先…

fpga助教面试题

第一题 module sfp_pwm( input wire clk, //clk is 200M input wire rst_n, input wire clk_10M_i, input wire PPS_i, output reg pwm ) reg [6:0] cunt ;always (posedge clk ) beginif(!rst_n)cunt<0;else if(cunt19) //200M是10M的20倍cunt<0;elsecunt<cunt1;…

SpringAI系列 - ToolCalling篇(二) - 如何设置应用侧工具参数ToolContext(有坑)

目录 一、引言二、集成ToolContext示例步骤1: 在`@Tool`标注的工具方法中集成`ToolConext`参数步骤2:`ChatClient`运行时动态设置`ToolContext`参数三、填坑一、引言 在使用AI大模型的工具调用机制时,工具参数都是由大模型解析用户输入上下文获取的,由大模型提供参数给本地…

Jest单元测试

由于格式和图片解析问题&#xff0c;可前往 阅读原文 前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分&#xff0c;可以帮助开发团队构建可靠、高质量的应用程序 单元测试&#xff08;Unit Testi…

pyside6学习专栏(二):程序图像资源的加载方式

pyside6中的QLabel控件可以加载图像和gif动画&#xff0c;可以直接从外部文件加载&#xff0c;也可以从QRC类型的文件(实际是一脚本文件)经编绎生成对应的资源.PY模块文件(就是将qrc文本中指定的资源文件的16制内容写入.py文件)来使用&#xff0c;本文对两种方式作了一简单的示…

Nginx--日志(介绍、配置、日志轮转)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式&#xff0c;每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…

cs106x-lecture12(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture12 (以下皆使用SPL实现&#xff0c;非STL库&#xff0c;后续课程结束会使用STL实现) travel Write a recursive function named travel that accepts integers x and y as parameters and uses recursive backtracking to print all solution…

了解随机振动疲劳分析中 Ansys nCode DesignLife 的平均应力校正

概括 在本篇博文中&#xff0c;我们将探讨 Ansys nCode 在分析随机振动引起的疲劳方面的重要性。我们将了解 nCode 如何帮助校正平均应力并预测受随机振动影响的结构的寿命和耐久性。 什么是疲劳寿命以及了解平均应力对疲劳寿命的影响 疲劳寿命是指结构在重复载荷作用下发生…