在SAP中记录使用SM30修改表记录时,对操作登记日志。日志的操作类型分增加、删除、修改。
最后对日志做个报表进行查询。
步骤一、对表设置为表维护生成器(函数组需要新创建)
步骤二、对表添加事件:01事件类型(在数据库中保存数据前),并填写事件方法名称(我这里为CHANGE_ENTRY)
步骤三、点击以上的‘编辑器’,进入编辑代码。需要选择‘插入’
按操作类型<ACTION> = 'D'."删除、<action> = 'U'."修改、<ACTION> = 'N'."新建分别编辑代码。注意删除类型的前一句代码READ TABLE extract WITH KEY <vim_xtotal_key>.是查不到时表示删除在界面中删除了。
具体代码如下:
其中 ZFPACCTXT_LOG为我创建的日志表、ZFPACCTXT为需要在SM30维护的数据表(拷贝以下代码时需要替换这两个表名)
DEFINE assign_field.
ASSIGN COMPONENT &1 OF STRUCTURE <ls_maintview> TO <lv_field>.
IF sy-subrc = 0.
IF <lv_field> IS ASSIGNED.
<lv_field> = &2.
ENDIF.
ENDIF.
END-OF-DEFINITION.
FORM change_entry.
DATA:WA_LOG_TXT LIKE ZFPACCTXT_LOG.
DATA:IT_LOG_TXT LIKE TABLE OF ZFPACCTXT_LOG.
DATA:WA_LOG_NUM LIKE ZFPACCNUM_LOG.
DATA:IT_LOG_NUM LIKE TABLE OF ZFPACCNUM_LOG.
DATA:lo_data TYPE REF TO data,
lv_tabix TYPE sy-tabix.
FIELD-SYMBOLS:
<ls_maintview> TYPE any,
<lv_field> TYPE any.
IF x_header-maintview IS NOT INITIAL.
CREATE DATA lo_data TYPE (x_header-maintview).
IF lo_data IS BOUND.
ASSIGN lo_data->* TO <ls_maintview>.
ENDIF.
IF <ls_maintview> IS ASSIGNED.
IF x_header-maintview = 'ZFPACCTXT'.
LOOP AT total.
READ TABLE extract WITH KEY <vim_xtotal_key>.
IF sy-subrc <> 0.
IF <ACTION> = 'D'."删除
MOVE-CORRESPONDING <vim_total_struc> TO WA_LOG_TXT.
WA_LOG_TXT-OPTY = 'DEL'.
WA_LOG_TXT-CREATE_DATE = SY-DATUM.
WA_LOG_TXT-CREATE_TIME = SY-UZEIT.
WA_LOG_TXT-CREATE_USER = SY-UNAME.
APPEND WA_LOG_TXT TO IT_LOG_TXT.
ENDIF.
ELSE.
IF <action> = 'U'."修改
MOVE-CORRESPONDING <vim_total_struc> TO WA_LOG_TXT.
WA_LOG_TXT-OPTY = 'UPD'.
WA_LOG_TXT-CREATE_DATE = SY-DATUM.
WA_LOG_TXT-CREATE_TIME = SY-UZEIT.
WA_LOG_TXT-CREATE_USER = SY-UNAME.
APPEND WA_LOG_TXT TO IT_LOG_TXT.
ENDIF.
IF <ACTION> = 'N'."新建
MOVE-CORRESPONDING <vim_total_struc> TO WA_LOG_TXT.
WA_LOG_TXT-OPTY = 'ADD'.
WA_LOG_TXT-CREATE_DATE = SY-DATUM.
WA_LOG_TXT-CREATE_TIME = SY-UZEIT.
WA_LOG_TXT-CREATE_USER = SY-UNAME.
APPEND WA_LOG_TXT TO IT_LOG_TXT.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
IF IT_LOG_TXT[] IS NOT INITIAL.
MODIFY ZFPACCTXT_LOG FROM TABLE IT_LOG_TXT.
IF SY-SUBRC = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
sy-subrc = 0.
ENDFORM.
到此已经完成日志记录,当在SM30修改、增加、删除数据表 ZFPACCTXT时,会记录日志到日志表中 ZFPACCTXT_LOG。日志查询报表不再做展示了哈