很早之前就想寫個能記錄函式模組日誌的通用工具,最早嘗試時,沒有想清楚插入程式碼的體積過大問題的解決方案。在一些群友的提醒下,瞭解到可以用巨集來處理這一問題。不過當時比較忙,沒有動筆。最近又想起這件事,花了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)。
希望近期可以改進。