如何检查ABAP交货单抬头的文档变更?已尝试CHANGEDOCUMENT_READ_HEADERS函数
检查交货单抬头文档变更的方法
首先,你用CHANGEDOCUMENT_READ_HEADERS这个函数的方向完全正确!这是SAP标准体系里读取变更文档抬头信息的核心函数,针对交货单(LIEFERUNG是正确的对象类)的场景完全适用。
接下来给你补充一些关键细节和优化建议:
参数验证要点:
objectid必须传入10位格式的交货单编号(VBELN),注意要补前导零到10位(比如交货单是1234的话,要转成0000001234),否则可能查不到对应变更记录。- 如果不需要限制时间范围或操作用户,对应的参数可以直接传空值,你当前的写法也没问题,但不用特意赋值为空字符串。
获取具体变更字段明细:
如果你不仅需要抬头的基础变更信息(比如谁改的、什么时候改的),还想知道具体修改了哪些字段,建议配合使用CHANGEDOCUMENT_READ_POSITIONS函数。传入从CHANGEDOCUMENT_READ_HEADERS得到的CDHDR表中的OBJECTID和CHANGENR,就能拿到字段的前后变更值(比如交货单抬头的送达方、交货日期等内容)。归档变更记录的处理:
如果有些旧的变更记录已经被系统归档,CHANGEDOCUMENT_READ_HEADERS可能读不到数据,这时候可以用CHANGEDOCUMENT_READ_HEADERS_ARCHIVE函数来读取归档中的变更文档。权限注意事项:
确保当前用户拥有读取变更文档的权限(比如事务码S_TABU_DIS对应的权限对象,或相关变更文档权限),否则函数可能返回空结果。
给你一个包含抬头和明细读取的完整示例代码片段:
DATA: lt_cdhdr TYPE STANDARD TABLE OF cdhdr, ls_cdhdr TYPE cdhdr, lt_cdpos TYPE STANDARD TABLE OF cdpos, l_cdobjid TYPE cdhdr-objectid VALUE '0000001234'. " 替换为你的实际交货单编号 " 读取变更文档抬头信息 CALL FUNCTION 'CHANGEDOCUMENT_READ_HEADERS' EXPORTING objectclass = 'LIEFERUNG' objectid = l_cdobjid date_of_change = p_datfr time_of_change = p_timfr date_until = p_datto time_until = p_timto username = '' TABLES i_cdhdr = lt_cdhdr EXCEPTIONS OTHERS = 4. IF sy-subrc = 0. " 循环读取每条抬头对应的变更明细 LOOP AT lt_cdhdr INTO ls_cdhdr. CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS' EXPORTING objectclass = 'LIEFERUNG' objectid = ls_cdhdr-objectid changenr = ls_cdhdr-changenr TABLES i_cdpos = lt_cdpos EXCEPTIONS OTHERS = 4. IF sy-subrc = 0. " 处理并输出变更明细数据 LOOP AT lt_cdpos INTO DATA(ls_cdpos). WRITE: / '字段名:', ls_cdpos-fname, '旧值:', ls_cdpos-value_old, '新值:', ls_cdpos-value_new. ENDLOOP. ENDIF. ENDLOOP. ENDIF.
另外,你也可以通过事务码VL03N里的「环境->变更文档」,或者直接用事务码CDHDR、CDPOS手动查询,来验证你的函数调用结果是否正确。
内容的提问来源于stack exchange,提问作者Lingo
相关产品推荐
相关产品推荐

