2020-09-26 16:52发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
我的代码中有几千行,所以除了调试之外,我还需要知道程序的流程,如果可以的话,我该如何实现。
我掌握大型程序的方法包括眼睛,铅笔,纸,咖啡。
使用日志点。
除调试外 ..逐行读出并向下笔..手动连接点以建立流程! 我现在可以想到了!
你好,
在这个原始示例中,您可能会发现一些想法。 该程序以递归方式读取包含在源代码中的源代码,并调用功能模块(尚无方法浏览器),在该模块中,它搜索一些语句关键字以按级别创建块。
只需复制粘贴到新的本地测试程序中即可:)
报告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()。 选择结束。
类似于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()。 选择结束。
。 检查不是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()。 选择结束。
不是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()。 选择结束。
)。 结局。 其他。 将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
对于使用ABAP对象的程序,我不知道,但是对于不基于ABAP对象的旧程序,有两种选择:要么使用事务代码SE93 以显示其背后程序的过程流,或使用事务代码SQF(博客文章 ABAP静态分析工具SQF (由Jerry Wang撰写,2013年12月23日)。
最多设置5个标签!
我掌握大型程序的方法包括眼睛,铅笔,纸,咖啡。
使用日志点。
除调试外 ..逐行读出并向下笔..手动连接点以建立流程! 我现在可以想到了!
你好,
在这个原始示例中,您可能会发现一些想法。 该程序以递归方式读取包含在源代码中的源代码,并调用功能模块(尚无方法浏览器),在该模块中,它搜索一些语句关键字以按级别创建块。
只需复制粘贴到新的本地测试程序中即可:)
最好的问候
Bertrand
对于使用ABAP对象的程序,我不知道,但是对于不基于ABAP对象的旧程序,有两种选择:要么使用事务代码SE93 以显示其背后程序的过程流,或使用事务代码SQF(博客文章 ABAP静态分析工具SQF (由Jerry Wang撰写,2013年12月23日)。
一周热门 更多>