最近遇到一个自检表需要记录更改日志,想尽量通过标准功能去记录。
表的技术设置里有一个日志更改的勾勾之前没有用过,查阅资料发现需要更改系统配置才能做到在SCU3中查询更改日志,改动影响较大故放弃。
参考:ABAP 查看自建表的更改记录_七日辞的博客-CSDN博客
然后考虑到系统标准单据的更改会记录在CDHDR/CDPOS表中,想对自建表也启用这个功能,查询资料后进行操作。
首先将需要记录OLD VALUE和NEW VALUE的字段数据元素更改文档打上勾;
然后在事务码SCDO下新建一个变更文档对象,基本信息填写之后点击生成对象(表与更改对象的对应关系保存在表TCDOBT中),会自动的创建出更新函数等一系列相关对象,我们下一步要用到的主要是更新函数;
紧接着查看自动创建出来的更新函数:ZMG_ZTQM009_WRITE_DOCUMENT,在需要记录变更日志的地方调用这个函数。
传入主键ID,事务码,更新日期,时间,操作人,更新标识等基本数据,这些都是记录在抬头的,
行项目级的变更值需要传入X表和Y表,其中X表传入新值,Y表传入旧值,调用之后需要COMMIT。
操作正确的话在CDHDR/CDPOS表中就可以查到想要的记录了。
"记录修改日志
DATA: objectid TYPE cdhdr-objectid.
DATA: icdtxt_zmg_ztqm009 TYPE TABLE OF cdtxt WITH HEADER LINE.
DATA: xztqm009 TYPE TABLE OF yztqm009 WITH HEADER LINE.
DATA: yztqm009 TYPE TABLE OF yztqm009 WITH HEADER LINE.
IF lt_modify[] IS NOT INITIAL.
LOOP AT lt_modify.
CLEAR: objectid,xztqm009,xztqm009[],yztqm009,yztqm009[],icdtxt_zmg_ztqm009,icdtxt_zmg_ztqm009[].
objectid = lt_modify-matnr && lt_modify-lifnr.
MOVE-CORRESPONDING lt_modify TO xztqm009.
xztqm009-kz = 'U'.
APPEND xztqm009.
READ TABLE lt_mold INTO DATA(ls_mold) WITH KEY
matnr = lt_modify-matnr lifnr = lt_modify-lifnr BINARY SEARCH.
IF sy-subrc = 0.
MOVE-CORRESPONDING ls_mold TO yztqm009.
yztqm009-kz = 'U'.
APPEND yztqm009.
ENDIF.
* icdtxt_zmg_ztqm009-teilobjid = objectid.
* icdtxt_zmg_ztqm009-updkz = 'U'.
* APPEND icdtxt_zmg_ztqm009 .
CALL FUNCTION 'ZMG_ZTQM009_WRITE_DOCUMENT'
EXPORTING
objectid = objectid
tcode = sy-tcode
utime = sy-uzeit
udate = sy-datum
username = sy-uname
* OBJECT_CHANGE_INDICATOR = 'U'
"upd_icdtxt_zmg_ztqm009 = 'U'
upd_ztqm009 = 'U'
TABLES
icdtxt_zmg_ztqm009 = icdtxt_zmg_ztqm009[]
xztqm009 = xztqm009[]
yztqm009 = yztqm009[].
COMMIT WORK AND WAIT.
ENDLOOP.
ENDIF.
IF lt_insert[] IS NOT INITIAL.
LOOP AT lt_insert.
CLEAR: objectid,xztqm009,xztqm009[],icdtxt_zmg_ztqm009,icdtxt_zmg_ztqm009[].
objectid = lt_insert-matnr && lt_insert-lifnr.
MOVE-CORRESPONDING lt_insert TO xztqm009.
xztqm009-kz = 'I'.
APPEND xztqm009.
* icdtxt_zmg_ztqm009-teilobjid = objectid.
* icdtxt_zmg_ztqm009-updkz = 'I'.
* APPEND icdtxt_zmg_ztqm009 .
CALL FUNCTION 'ZMG_ZTQM009_WRITE_DOCUMENT'
EXPORTING
objectid = objectid
tcode = sy-tcode
utime = sy-uzeit
udate = sy-datum
username = sy-uname
object_change_indicator = 'I'
"upd_icdtxt_zmg_ztqm009 = 'I'
upd_ztqm009 = 'I'
TABLES
icdtxt_zmg_ztqm009 = icdtxt_zmg_ztqm009[]
xztqm009 = xztqm009[].
COMMIT WORK AND WAIT.
ENDLOOP.
ENDIF.
IF gt_delt_n[] IS NOT INITIAL.
LOOP AT gt_delt_n.
CLEAR: objectid,yztqm009,yztqm009[],icdtxt_zmg_ztqm009,icdtxt_zmg_ztqm009[].
objectid = gt_delt_n-matnr && gt_delt_n-lifnr.
MOVE-CORRESPONDING gt_delt_n TO yztqm009.
yztqm009-kz = 'D'.
APPEND yztqm009.
* icdtxt_zmg_ztqm009-teilobjid = objectid.
* icdtxt_zmg_ztqm009-updkz = 'D'.
* APPEND icdtxt_zmg_ztqm009 .
CALL FUNCTION 'ZMG_ZTQM009_WRITE_DOCUMENT'
EXPORTING
objectid = objectid
tcode = sy-tcode
utime = sy-uzeit
udate = sy-datum
username = sy-uname
object_change_indicator = 'D'
" upd_icdtxt_zmg_ztqm009 = 'D'
upd_ztqm009 = 'D'
TABLES
icdtxt_zmg_ztqm009 = icdtxt_zmg_ztqm009[]
yztqm009 = yztqm009[].
COMMIT WORK AND WAIT.
ENDLOOP.
ENDIF.