很早之前就想寫個能記錄函式模塊日志的通用工具,最早嘗試時,沒有想清楚插入代碼的體積過大問題的解決方案,在一些群友的提醒下,了解到可以用宏來處理這一問題,不過當時比較忙,沒有動筆,后來也漸漸忘記,最近又想起這件事,花了2天完成了一個初步的實作,介紹給大家,希望能有參考價值,
本文鏈接:https://www.cnblogs.com/hhelibeb/p/13560754.html
簡介
目標
本工具有幾個目標:
- 把日志資料存盤到一個統一日志表中,避免為每個介面創建日志表,從而減少重復作業量,
- 用一段通用代碼實作日志存盤,可以通過配置表來開關功能,
- 以JSON格式存盤日志,并提供一定的索引查詢功能,
- 允許根據日志的唯一ID來重處理資料(類似事務代碼WE19),
目前目標1, 2已經實作,3, 4部分實作,還在完善中,
原理
基本原理是使用一些動態編程技術,在函式運行時獲取引數值,轉換為JSON資料存盤到表中,
日志使用唯一ID作為主鍵,
重處理時,根據日志記錄,動態生成ABAP變數,并從JSON中獲取值,賦值給變數,再動態地呼叫日志中記錄的FM,
代碼量目前還很比較少,只有幾百行,可以閱讀包含檔案ZAFL_MACROS和類ZCL_AFL_UTILITIES以了解更多細節,
關于ABAP動態編程,如果有不懂的地方,可以參考:這一系列文章:Dynamic Programming in ABAP
專案地址
專案名:abap fm logger
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的功能,選項包括,
- FNAME: 函式模塊名,
- ENABLED: 如勾選,啟用日志記錄功能,
- EXPORT: 如勾選,啟用Export引數的記錄,
- IMPORT: 如勾選,啟用IMPORT引數的記錄,
另外還可以指定3個索引欄位的顯示名(CUST_NAME),它們會影響的ZAFL_VIEWER中的顯示效果,
可以使用事務SM30維護配置,
待改進
目前發現有2個問題需要改進,
- 如果介面包含CURR型別欄位,雖然可以正常記錄日志,但重處理時會無法讀取日志中的CURR型別欄位值,
- 沒有按欄位值搜索日志的功能(類似事務代碼WE10),
希望近期可以改進,
(注:嚴格來說它應該叫做函式模塊介面通用日志工具,標題中的RFC是為了搜索關鍵字考慮的,因此這個工具的正式名稱也叫做abap fm logger)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/835.html
標籤:SAP
