SAP自定义表CDPOS日志修改记录
需求:
平台开发时,需要记录对自建表某些字段的变更履历,即写入CDHDR/CDPOS,正常方式是SCDO创建变更对象,然后调用自动生成的类方法完成记录写入,只是每次都需要自己写逻辑去获取对应的X结构(最新数据)和Y结构(历史数据),不想每次都写这段代码,故封装了一个动态方法,每次直接调用即可。
参考 SAP自建表日志_sap s4自建表有标准日志吗-CSDN博客
SAP ABAP自建表变更履历记录(动态更新)_sap自定义表修改记录-CSDN博客
https://wenku.baidu.com/view/95052a8ccd22bcd126fff705cc17552707225ea3.html?_wkts_=1709621750543&bdQuery=%E4%BF%9D%E5%AD%98%E6%95%B0%E6%8D%AE%E8%87%B3CDHDR
1.对自建表启用日志更改:
2.对要记录的字段对应的数据元素启用更改文档:
3.SCDO创建变更文档对象:
输入文本、表名,按照情况勾选表名后的选项,比如“内部表”选项:当勾选上则每次处理多条数据,生成的日志函数里包含CHANGEDOCUMENT_MULTIPLE_CASE子函数。不勾上则处理单条数据,生成的日志函数里包含CHANGEDOCUMENT_SINGLE_CASE的子函数。本例处理单条数据,则不勾选“内部表”
注意:可以选择生成函数,也可以选择生成CLASS
注意
底层无非4个function
1、CHANGEDOCUMENT_OPEN 开启 / 初始化
2、CHANGEDOCUMENT_SINGLE_CASE 单个
3、CHANGEDOCUMENT_MULTIPLE_CASE 批量
4、CHANGEDOCUMENT_CLOSE 关闭
找到SAP S4 已有的function ZWT_DEBI_WRITE_DOCUMENT
注意要用TCODE:SCDO - 变更文档对象 自动生成函数 不要手工调整,否则传输请求会被DDIC定义重新覆盖掉
CHDO => 由 RSSCD000 生成
FUNCTION ZWT_DEBI_WRITE_DOCUMENT.
*"----------------------------------------------------------------------
*"*"Verbuchungsfunktionsbaustein:
*"
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(OBJECTID) LIKE CDHDR-OBJECTID
*" VALUE(TCODE) LIKE CDHDR-TCODE
*" VALUE(UTIME) LIKE CDHDR-UTIME
*" VALUE(UDATE) LIKE CDHDR-UDATE
*" VALUE(USERNAME) LIKE CDHDR-USERNAME
*" VALUE(PLANNED_CHANGE_NUMBER) LIKE CDHDR-PLANCHNGNR
*" DEFAULT SPACE
*" VALUE(OBJECT_CHANGE_INDICATOR) LIKE CDHDR-CHANGE_IND
*" DEFAULT 'U'
*" VALUE(PLANNED_OR_REAL_CHANGES) LIKE CDHDR-CHANGE_IND
*" DEFAULT SPACE
*" VALUE(NO_CHANGE_POINTERS) LIKE CDHDR-CHANGE_IND
*" DEFAULT SPACE
*" VALUE(N_KNA1) LIKE KNA1 STRUCTURE KNA1
*" VALUE(O_YKNA1) LIKE KNA1 STRUCTURE KNA1
*" VALUE(N_KNB1) LIKE KNB1 STRUCTURE KNB1
*" VALUE(O_YKNB1) LIKE KNB1 STRUCTURE KNB1
*" VALUE(UPD_KNA1) LIKE CDPOS-CHNGIND DEFAULT SPACE
*" VALUE(UPD_KNB1) LIKE CDPOS-CHNGIND DEFAULT SPACE
*" VALUE(UPD_KNBK) LIKE CDPOS-CHNGIND DEFAULT SPACE
*" TABLES
*" XKNBK STRUCTURE FKNBK
*" YKNBK STRUCTURE FKNBK
*"----------------------------------------------------------------------
CALL FUNCTION 'CHANGEDOCUMENT_OPEN'
EXPORTING OBJECTCLASS = 'DEBI '
OBJECTID = OBJECTID
PLANNED_CHANGE_NUMBER = PLANNED_CHANGE_NUMBER
PLANNED_OR_REAL_CHANGES = PLANNED_OR_REAL_CHANGES
EXCEPTIONS SEQUENCE_INVALID = 1
OTHERS = 2.
CASE SY-SUBRC.
WHEN 1. MESSAGE A001(F2) WITH 'SEQUENCE INVALID'.
WHEN 2. MESSAGE A001(F2) WITH 'OPEN ERROR'.
ENDCASE.
* KNA1
IF UPD_KNA1 NE SPACE.
CALL FUNCTION 'CHANGEDOCUMENT_SINGLE_CASE'
EXPORTING TABLENAME = 'KNA1 '
WORKAREA_OLD = O_YKNA1
WORKAREA_NEW = N_KNA1
CHANGE_INDICATOR = UPD_KNA1
DOCU_DELETE = 'X'
EXCEPTIONS NAMETAB_ERROR = 1
OPEN_MISSING = 2
POSITION_INSERT_FAILED = 3
OTHERS = 4.
CASE SY-SUBRC.
WHEN 1. MESSAGE A001(F2) WITH 'NAMETAB-ERROR'.
WHEN 2. MESSAGE A001(F2) WITH 'OPEN MISSING'.
WHEN 3. MESSAGE A001(F2) WITH 'INSERT ERROR'.
WHEN 4. MESSAGE A001(F2) WITH 'SINGLE ERROR'.
ENDCASE.
ENDIF.
* KNB1
IF UPD_KNB1 NE SPACE.
CALL FUNCTION 'CHANGEDOCUMENT_SINGLE_CASE'
EXPORTING TABLENAME = 'KNB1 '
WORKAREA_OLD = O_YKNB1
WORKAREA_NEW = N_KNB1
CHANGE_INDICATOR = UPD_KNB1
DOCU_DELETE = 'X'
EXCEPTIONS NAMETAB_ERROR = 1
OPEN_MISSING = 2
POSITION_INSERT_FAILED = 3
OTHERS = 4.
CASE SY-SUBRC.
WHEN 1. MESSAGE A001(F2) WITH 'NAMETAB-ERROR'.
WHEN 2. MESSAGE A001(F2) WITH 'OPEN MISSING'.
WHEN 3. MESSAGE A001(F2) WITH 'INSERT ERROR'.
WHEN 4. MESSAGE A001(F2) WITH 'SINGLE ERROR'.
ENDCASE.
ENDIF.
* KNBK
IF UPD_KNBK NE SPACE.
CALL FUNCTION 'CHANGEDOCUMENT_MULTIPLE_CASE'
EXPORTING TABLENAME = 'KNBK '
CHANGE_INDICATOR = UPD_KNBK
DOCU_DELETE = 'X'
TABLES TABLE_OLD = YKNBK
TABLE_NEW = XKNBK
EXCEPTIONS NAMETAB_ERROR = 1
OPEN_MISSING = 2
POSITION_INSERT_FAILED = 3
OTHERS = 4.
CASE SY-SUBRC.
WHEN 1. MESSAGE A001(F2) WITH 'NAMETAB-ERROR'.
WHEN 2. MESSAGE A001(F2) WITH 'OPEN MISSING'.
WHEN 3. MESSAGE A001(F2) WITH 'INSERT ERROR'.
WHEN 4. MESSAGE A001(F2) WITH 'MULTIPLE ERROR'.
ENDCASE.
ENDIF.
CALL FUNCTION 'CHANGEDOCUMENT_CLOSE'
EXPORTING OBJECTCLASS = 'DEBI '
OBJECTID = OBJECTID
DATE_OF_CHANGE = UDATE
TIME_OF_CHANGE = UTIME
TCODE = TCODE
USERNAME = USERNAME
OBJECT_CHANGE_INDICATOR = OBJECT_CHANGE_INDICATOR
NO_CHANGE_POINTERS = NO_CHANGE_POINTERS
EXCEPTIONS HEADER_INSERT_FAILED = 1
OBJECT_INVALID = 2
OPEN_MISSING = 3
NO_POSITION_INSERTED = 4
OTHERS = 5.
CASE SY-SUBRC.
WHEN 1. MESSAGE A001(F2) WITH 'INSERT HEADER FAILED'.
WHEN 2. MESSAGE A001(F2) WITH 'OBJECT INVALID'.
WHEN 3. MESSAGE A001(F2) WITH 'OPEN MISSING'.
WHEN 5. MESSAGE A001(F2) WITH 'CLOSE ERROR'.
ENDCASE.
ENDFUNCTION.
4. 查询日志
使用程序CHANGEDOCU_READ(批量范围查询) /RSSCD100(单个查询)查看更改日志
日志数据记录表 CDHDR、CDPOS
CHANGEDOCU_READ: 如物料主数据变更,一次可查询多个物理变更日志
RSSCD100:选择屏幕为单值,一次只能查询一笔主数据变更日志
5. 日志相关标准函数
CHANGEDOCUMENT_READ_RANGES
这些函数组中的函数用来处理变更文档。可以不用直接读取 cdhdr、cdpos 等表。
SCD0 更改文档创建
CHANGEDOCUMENT_CLOSE 完成具有对象特征的文档创建的更改
CHANGEDOCUMENT_INSERT_NUMBER
CHANGEDOCUMENT_IS_FIELD_INTRAW
CHANGEDOCUMENT_IS_GENERATED
CHANGEDOCUMENT_IS_KEY_INTRAW
CHANGEDOCUMENT_MULTIPLE_CASE 为对象(多重情况)创建改变文档项目
CHANGEDOCUMENT_OPEN 启动为对象特性创建更改文件
CHANGEDOCUMENT_PREPARE_TABLES 编辑改变文档创建表格
CHANGEDOCUMENT_SINGLE_CASE 给对象(单一情况)创建改变文档项目
CHANGEDOCUMENT_TEXT_CASE 给对象(文本情况)创建改变文档项目
SCD1 读取并格式化更改文档
CHANGEDOCUMENT_PREPARE_DISPLAY Change document: Edit change document items
CHANGEDOCUMENT_PREPARE_POS Change document: Edit change document items
CHANGEDOCUMENT_READ_HEADERS Change document: Read change document header
CHANGEDOCUMENT_READ_POSITIONS Change document: Read change document items
CHANGEDOCUMENT_UNICODE_CHECK
CHANGEDOCU_ARCHIVE_HANDLE_SET
CHANGEDOCU_CDPOS_READ
CHANGEDOCU_GUID_READ
CHANGEDOCU_HAS_GUID
CHANGEDOCU_READ_POS_W_UID
CHANGEDOCU_READ_PREP_POS_W_UID
SCD2 读取并格式化更改文档
CHANGEDOCUMENT_READ 读取并编辑更改的文档
CHANGEDOCUMENT_READ_RANGES Change document: Read and edit change documents
CHANGEDOCU_FILLTABKEY254
SCD3 读取并格式化计划的更改
PLANNED_CHANGES_READ_HEADERS 读取计划更改的文档表头
PLANNED_CHANGES_READ_POSITIONS 读取并编辑计划更改的文件项
SCD4 删除更改文档和计划的更改
CHANGEDOCUMENT_DELETE 删除修改的文档(不依赖客户,不注册)
CHANGEDOCUMENT_DELETE_V2
INTERN_CD_DELETE_ALL
PLANNED_CHANGES_DELETE 删除计划的改变
SCD5 更改文档/存档
CD_DB_DEQUEUE
CD_DB_ENQUEUE
CHANGEDOCUMENT_READ_WITHOUT_ED
CHANGEDOCU_ARCHIVE_GET_TABLE
CHANGEDOCU_ARCHIVE_NO_CONTROL
CHANGEDOCU_ARCHIVE_OBJECT 改变文档/存档: 向存档传送对象
CHANGEDOCU_ARCHIVE_PUT_TABLE
CHANGEDOCU_CONVERT_OLD_DATA
CHANGEDOCU_DELETE_ARCHIVE_OBJ
CHANGEDOCU_GET_DELETE_FLAGS
CHANGEDOCU_MODIFY_DELETE_FLAGS
CHANGEDOCU_READ_ARCHIVE_OBJECT
CHANGEDOCU_RELOAD_ARCHIVE_OBJ
SCD6 Display change documents
CHANGEDOCUMENT_DISPLAY Display change documents
SCD8 SZD:SCD8 Conversions for UNICODE
CHANGEDOCU_FIELDS_ANY2CHAR
CHANGEDOCU_FIELDS_CHAR2ANY
CHANGEDOCU_GUID_CREATE
CHANGEDOCU_KEY_ANY2CHAR
CHANGEDOCU_KEY_CHAR2ANY
CHANGEDOCU_OUTPUTLENGTH_GET
CHANGEDOCU_STRUCT_ANY2CHAR
CHANGEDOCU_STRUCT_CHAR2ANY
CHANGEDOCU_TABKEYLEN_GET
CHANGEDOCU_TABLE_ANY2CHAR
CHANGEDOCU_TABLE_CHAR2ANY
CHANGEDOCU_TABWKEY_ANY2CHAR
CHANGEDOCU_TABWKEY_CHAR2ANY
SCD9 Read non-converted change doc. (>4.0A)
CD_OLD_PREPARE_POS Change document: Edit change document items
CD_OLD_READ_HEADERS Change document: Read change document header
CD_OLD_READ_POSITIONS Change document: Read change document items
SCDH
CD_SHLP_EXIT_CDHDR_OBJCL
CD_SHLP_EXIT_CDHDR_OBJID
CD_SHLP_EXIT_CDHDR_TCODE
SCD_SHLP_EXIT_TCDOB
SCDO CHDO AENDBELEG => Gen. by RSSCD000
AENDBELEG_WRITE_DOCUMENT CHDO AENDBELEG => Gen. by RSSCD000
SCDT Transport Chnge doc.obj. via shadow tab.
AFTER_IMP_CHDO
BEFORE_EXP_CHDO
CDNAMES_GET
CHDO_DELETE