点击蓝字 关注我们
前言
项目中有件很烦心的事:配置又被人修改了, 但是又不知道是谁修改的.那么怎么才能找到这个罪魁祸首呢?
标准解决方案
SAP提供的标准解决办法是激活配置表的日志记录功能(路径:事物代码SE11 -> 表的技术设置)
但是这个激活有一个依赖条件,详见该字段的帮助文档: 需要BASIS启动一个系统参数 rec/client 才能激活系统的配置表日志功能
激活后执行事务代码 SCU3就能查询到特定表的修改记录了
标准功能很好用,但是大多数时间我们只想简单直观的看到记录的创建信息,最后修改信息. 所以从某个项目开始,我开始启用了自定义配置表的简单日志功能.
简单日志功能
小提示
SPRING
简单日志功能只针对自定义配置表
先看一下实现效果
用SM30创建或修改记录时,日志相关字段是不可编辑的. 创建保存后, 相应的创建字段会填上内容. 修改保存后, 相应的修改字段会填上内容.
简单日志包含的信息:
创建人
创建日期
创建时间
创建TCODE
创建REPORT
修改人
修改日期
修改时间
修改TCODE
修改REPORT
时间戳
实现方式如下
步骤1
创建统一的结构 ZSBC001 添加这些字段
步骤2
在自定义配置表中通过.inlcude 引用该结构
步骤3
创建维护视图,设置日志相关字段的只读属性
步骤4
维护视图中点击菜单按钮 : 实用程序->表维护生成器
填写权限组 函数组 包 维护屏幕 等信息后 创建生成维护对话
小提示
SPRING
设置标准记录例程后,配置表修改时会自动写入传输请求.
步骤5
在菜单:环境->修改->事件中添加事件 01(在数据库中保存数据前) 添加例程 FRM_GET_ZSBC001
步骤6
点击编辑器: 给函数组创建一个新的include ,包含如下代码(在数据保存前根据数据的操作,决定是修改还是新建记录,通过动态指针来修改特定的字段.每个函数组只需要创建一次这个FORM. 所有函数组中的表维护都可以使用这段代码来获取记录的创建/修改信息.
*----------------------------------------------------------------------*
***INCLUDE LZVGBC_02F01.
*----------------------------------------------------------------------*
FORM frm_get_zsbc001.
FIELD-SYMBOLS: <fs_w>,<fs_action>,<fs_f>.
LOOP AT total ASSIGNING <fs_w>.
ASSIGN COMPONENT 'ACTION' OF STRUCTURE <fs_w> TO <fs_action>.
IF sy-subrc = 0.
CASE <fs_action>.
WHEN 'N'.
ASSIGN COMPONENT 'CRDAT' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-datum.
ENDIF.
ASSIGN COMPONENT 'CRTIM' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-uzeit.
ENDIF.
ASSIGN COMPONENT 'CRNAM' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-uname.
ENDIF.
ASSIGN COMPONENT 'CRTCD' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-tcode.
ENDIF.
ASSIGN COMPONENT 'CRPID' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-repid.
ENDIF.
ASSIGN COMPONENT 'TIMESTAMP' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
CONCATENATE sy-datum sy-uzeit INTO <fs_f>.
ENDIF.
WHEN 'U'.
ASSIGN COMPONENT 'CHDAT' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-datum.
ENDIF.
ASSIGN COMPONENT 'CHTIM' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-uzeit.
ENDIF.
ASSIGN COMPONENT 'CHNAM' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-uname.
ENDIF.
ASSIGN COMPONENT 'CHTCD' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-tcode.
ENDIF.
ASSIGN COMPONENT 'CHPID' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
<fs_f> = sy-repid.
ENDIF.
ASSIGN COMPONENT 'TIMESTAMP' OF STRUCTURE <fs_w> TO <fs_f>.
IF sy-subrc = 0.
CONCATENATE sy-datum sy-uzeit INTO <fs_f>.
ENDIF.
ENDCASE.
ENDIF.
ENDLOOP.
ENDFORM.
总结
简单日志功能通过简单设定就能给自定义的配置表添加一个必要的日志信息,但是聪明的读者可能已经发现了其中的一个漏洞
删除动作无法记录.
一个简单的解决办法是: 自定义配置表添加删除标记字段,同时禁用SM30中的删除按钮(这里插播一个预告 SAP小技巧之 通过SHD0禁用特定的功能按钮, 有兴趣的读者可以关注后续的公众号文章). 如果实在需要物理删除记录,可以通过其它方式.
扫码加入公众号讨论群,参与话题讨论
公众号 : syjf1976_abap
ABAP开发技巧
微信号 : 392077
约定
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)