如何在abap中查找程序流。

2020-09-26 16:52发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)我的代码中有几千行,所以除了调试...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我的代码中有几千行,所以除了调试之外,我还需要知道程序的流程,如果可以的话,我该如何实现。

5条回答
callcenter油条
2020-09-26 17:12

你好,

在这个原始示例中,您可能会发现一些想法。 该程序以递归方式读取包含在源代码中的源代码,并调用功能模块(尚无方法浏览器),在该模块中,它搜索一些语句关键字以按级别创建块。

只需复制粘贴到新的本地测试程序中即可:)

报告ztest_code_reader。

 * -------------------------------------------------  --------------------- *
 * CLASS lcl_code_reader定义
 * -------------------------------------------------  --------------------- *
 *
 * -------------------------------------------------  --------------------- *
 CLASS lcl_code_reader定义。
   公共部分。
     类型:开始于tt_count,
     报告TYPE程序
     算TYPE I,
   结束于tt_count。


     引用到cl_demo_output_stream的数据类型。
     tt_count的数据t_count类型表。
     数据max_level TYPE i。
     数据级别TYPE i。
     数据display_include TYPE c。
     数据stop_detail。  "当为TRUE时:无需详细说明(直到FALSE)


     方法 :
                     分析导入报告类型程序,
                     check_statement IMPORTING行TYPE字符串,
                     显示。
     方法构造函数导入maxlvl TYPE i。




 ENDCLASS。  " lcl_code_reader定义


 * -------------------------------------------------  --------------------- *
 * CLASS lcl_code_reader的实现
 * -------------------------------------------------  --------------------- *
 *
 * -------------------------------------------------  --------------------- *
 CLASS lcl_code_reader IMPLEMENTATION。
   METHOD构造函数。
     oref = cl_demo_output_stream => open()。
     设置处理程序cl_demo_output_html => handle_output FOR oref。
     cl_demo_output_html => set_display(abap_true)。
     max_level = maxlvl。
     等级= 1。
     display_include = abap_false。
   终结法。  "建设者


   方法分析。


     DATA t_code TYPE TABLE OF字符串。
     FIELD-SYMBOLS 类似于t_code的行。
     DATA w_s TYPE字符串。
     DATA w_level LIKE级别。
     如果级别是INITIAL。
       w_level = 1。
     其他。
       w_level =等级。
     万一。




     FIELD-SYMBOLS 类似于t_count的行。
     读取带有键的表t_count report =报告分配。
     如果sy-subrc不是INITIAL。
       将初始行追加到t_count ASSIGNING  -report =报告。
        -count = 1。


       读取报告报告到t_code。
       循环t_code ASSIGNING 。
         检查不是INITIAL。
         check_statement(EXPORTING line = )。
       结局。
     其他。
       将1添加到 -count。
       w_s = <计数>-计数。
       CONCATENATE'(n°'w_s')'报告INTO w_s由空格分隔。
       oref-> write_text(iv_text = w_s
                           iv_format = if_demo_output_formats => nonprop)。
     万一。
   终结法。  "分析


   方法check_statement。
     数据w_line(1023)。
     w_line =线。
     CONDENSE w_line。
     将w_line转换为大写。
     DATA w_next_prog TYPE程序。
     数据w_fin TYPE i。
     DATA w_s TYPE字符串。


 * -------------------------------------------------  ------------------- *
 *分析包括
     如果w_line(8)='INCLUDE'
     和w_line(18)<>'INCLUDE STRUCTURE'。
       w_next_prog = w_line + 8。
       找 '。' 在w_next_prog中匹配w_fin。
       w_next_prog = w_next_prog(w_fin)。


       IF等级 write_text(iv_text = w_s
                             iv_format = if_demo_output_formats => nonprop)。
         万一。
       万一。


 * -------------------------------------------------  ------------------- *
 *分析通话功能
     ELSEIF w_line(14)='CALL FUNCTION'并且stop_detail = abap_false。
       w_next_prog = w_line + 14。
       用w替换w_next_prog中的所有''''事件。


       IF等级 write_text(iv_text = w_s
                           iv_format = if_demo_output_formats => heading)。
         通话功能" FUNCTION_INCLUDE_INFO"
          输入
            PNAME = w_next_prog
          改变
            包含= w_INCLUDE
          例外情况
            FUNCTION_NOT_EXISTS = 1
            INCLUDE_NOT_EXISTS = 2
            GROUP_NOT_EXISTS = 3
            NO_SELECTIONS = 4
            NO_FUNCTION_INCLUDE = 5
            其他= 6。
         analyse(导出报告= w_INCLUDE)。
         从级别减去1。
       其他。
         w_s = max_level +1。
         CONCATENATE w_s')调用函数'w_next_prog INTO w_s由空格分隔。
         oref-> write_text(iv_text = w_s
                           iv_format = if_demo_output_formats => nonprop)。
       万一。


 * -------------------------------------------------  ------------------- *
 *分析通话方式
     ELSEIF w_line(14)='调用方法'并且stop_detail = abap_false。
       w_s = w_line。
       oref-> write_text(iv_text = w_s
                         iv_format = if_demo_output_formats => nonprop)。


 * -------------------------------------------------  ------------------- *
 *分析执行
     ELSEIF w_line(8)='PERFORM'并且stop_detail = abap_false。
       w_s = w_line。
       oref-> write_text(iv_text = w_s
                         iv_format = if_demo_output_formats => nonprop)。


 * -------------------------------------------------  ------------------- *
 *检测集团
     ELSEIF w_line(15)='INITIALIZATION'。
     或w_line(19)='AT SELECTION-SCREEN'
     或w_line(16)='LOAD-OF-PROGRAM'。
     或w_line(19)='开始选择'。
     或(w_line(4)='GET'AND w_line + 4(4)<>'REFE'
                             AND w_line + 4(4)<>'PARA'
                             AND w_line + 4(3)<>'BIT'
                             AND w_line + 4(4)<>'CURS')
     或w_line(17)='选择结束'。
     。
       stop_detail = abap_false。
       CONCATENATE'

'w_line'

'INTO w_s。 oref-> write_html(iv_html = w_s)。 * ------------------------------------------------- ------------------- * *检测表格 ELSEIF w_line(5)='FORM'。 将1加到等级。 stop_detail = abap_true。 ELSEIF w_line(8)='ENDFORM。'。 stop_detail = abap_false。 从级别减去1。 * ------------------------------------------------- ------------------- * *检测宏 ELSEIF w_line(7)='DEFINE'。 将1加到等级。 stop_detail = abap_true。 ELSEIF w_line(18)='END-OF-DEFINITION。'。 stop_detail = abap_false。 从级别减去1。 * ------------------------------------------------- ------------------- * *检测DO ELSEIF w_line(3)='DO'并且stop_detail = abap_false。 将1加到等级。 w_s =级别。 CONCATENATE w_s')'w_line INTO w_s由空格分隔。 oref-> write_text(iv_text = w_s iv_format = if_demo_output_formats => nonprop)。 ELSEIF w_line(6)='ENDDO'。 AND stop_detail = abap_false。 从级别减去1。 * ------------------------------------------------- ------------------- * *检测环 ELSEIF w_line(5)='LOOP'并且stop_detail = abap_false。 将1加到等级。 w_s =级别。 CONCATENATE w_s')'w_line INTO w_s由空格分隔。 oref-> write_text(iv_text = w_s iv_format = if_demo_output_formats => nonprop)。 ELSEIF w_line(8)='ENDLOOP'。 AND stop_detail = abap_false。 从级别减去1。 * ------------------------------------------------- ------------------- * *检测等级 ELSEIF w_line(6)='CLASS'AND stop_detail = abap_false。" AND开始= abap_true。 将1加到等级。 stop_detail = abap_true。 ELSEIF w_line(9)='ENDCLASS'。 AND stop_detail = abap_false。 stop_detail = abap_false。 从级别减去1。 万一。 * ------------------------------------------------- ------------------- * *其他分析... 数据w_comm类型i。 DATA w_line_sans_comm类似于w_line。 在w_line匹配偏移w_comm中查找'"'。 如果w_comm> 0。 w_line_sans_comm = w_line(w_comm)。 其他。 w_line_sans_comm = w_line。 万一。 *调用静态方法 如果w_line_sans_comm CS'=>'AND w_line_sans_comm(1)CN'*"'AND stop_detail = abap_false。 w_s =级别。 CONCATENATE w_s')'w_line INTO w_s由空格分隔。 oref-> write_text(iv_text = w_s iv_format = if_demo_output_formats => nonprop)。 *调用实现方法 ELSEIF w_line_sans_comm CS'->'和w_line_sans_comm(1)CN'*"'AND stop_detail = abap_false。 w_s =级别。 CONCATENATE w_s')'w_line INTO w_s由空格分隔。 oref-> write_text(iv_text = w_s iv_format = if_demo_output_formats => nonprop)。 万一。 终结法。 " check_statement 方法显示。 oref-> close()。 终结法。 "显示 ENDCLASS。 " lcl_code_reader IMPLEMENTATION 参数p_report TYPE程序。 参数p_maxlvl TYPE i默认值10。 选择开始。 数据my_code_reader类型参考lcl_code_reader。 创建对象my_code_reader 出口 maxlvl = p_maxlvl。 my_code_reader-> analyse(report = p_report)。 my_code_reader-> display()。 选择结束。

最好的问候

Bertrand

一周热门 更多>