很早以前就想写个能记录函数模块日志的通用工具,最先尝试时,没有想清楚插入代码的体积过大问题的解决方案。在一些群友的提醒下,了解到能够用宏来处理这一问题。不过当时比较忙,没有动笔,后来也渐渐忘记。最近又想起这件事,花了2天完成了一个初步的实现。介绍给你们,但愿能有参考价值。html
本文连接:http://www.javashuo.com/article/p-ucgegdre-nt.htmlgit
本工具备几个目标:github
目前目标1, 2已经实现,3, 4部分实现,还在完善中。编程
基本原理是使用一些动态编程技术,在函数运行时获取参数值,转换为JSON数据存储到表中。数组
日志使用惟一ID做为主键。函数
重处理时,根据日志记录,动态生成ABAP变量,并从JSON中获取值,赋值给变量,再动态地调用日志中记录的FM。工具
代码量目前还很比较少,只有几百行,能够阅读包含文件ZAFL_MACROS和类ZCL_AFL_UTILITIES以了解更多细节。spa
关于ABAP动态编程,若是有不懂的地方,能够参考:这一系列文章:Dynamic Programming in ABAP日志
项目名:abap fm loggercode
Github地址:https://github.com/hhelibeb/abap-fm-logger
请使用ABAPGIT安装,若是你以为有帮助的话,欢迎Star.
介绍abap fm logger的用法,包含代码、配置、报表等。
日志存储在表ZAFL_LOG中,报表程序ZAFL_VIEWER能够用于查询/重处理日志
点击JSON字段能够查看参数详情。
选中日志行,点击工具栏的“Process Selected Item”,则程序会尝试使用选中的日志的参数记录从新调用相应接口。
只须要2个复制粘贴就能完成代码部分,很是简单:
1, 添加包含文件ZAFL_MACROS到须要记录日志的FM的函数组中,
FUNCTION-POOL zzxxxx. INCLUDE zafl_macros.
2, 在函数中调用相应的宏,
FUNCTION z_fm. **初始化logger,须要在FM的开头部分调用 /afl/log_init. **可选,最多指定3个用于搜索的字段(好比公司代码、物料号等) /afl/set_custom_fields 'cust field1' 'cust field2' 'cust field3'. **可选,记录状态码,如S/E等,最多2位 /afl/set_status 'S' 'message'. **保存日志,必须在FM的结尾处 /afl/save. ENDFUNCTION.
这里, /afl/log_init 和 /afl/save 是必选的,而 /afl/set_custom_fields 和 /afl/set_status 提供了一些灵活功能,能够按需选择是否调用。
表ZAFL_CONFIG用于配置abap fm logger的功能,选项包括,
另外还能够指定3个索引字段的显示名(CUST_NAME),它们会影响的ZAFL_VIEWER中的显示效果。
能够使用事务SM30维护配置。
目前发现有2个问题须要改进,
但愿近期能够改进。