使用FM WS_DELIVERY_UPDATE更新LIPS表LFIMG字段失败的排查咨询
SAP LIPS表LFIMG字段更新失败排查方案
问题背景
开发程序需在逻辑处理后更新SAP标准表LIPS的LFIMG字段,调用函数WS_DELIVERY_UPDATE后更新失败,返回EF_ERROR_IN_INTERFACE_0接口错误,内表LT_PROT存在错误日志。
核心排查方向
1. 解析LT_PROT内表的具体错误信息
- 直接输出
LT_PROT的全量内容,重点关注*MSGID(消息类)、MSGNO(消息编号)、MSGTY(消息类型)和MSG_V1~V4*(消息变量),这些信息是定位问题的核心依据,比如可能指向物料批次缺失、库存不足、交货单状态锁定等具体业务限制。
2. 补全VBPOK内表的必填字段
你的代码中仅给LT_VBPOK-LFIMG赋值,这是不完整的。VBPOK作为交货项目更新的接口表,必须包含以下必填字段:
VBELN_VL:交货单编号(需与ls_vbkok-vbeln_vl保持一致)POSNR_VL:交货项目编号(从LIPS-POSNR字段获取)LFIMG:要更新的交货数量- 若物料启用批次管理,还需维护*
CHARG*(批次号)字段
修改后的循环示例:
LOOP AT LT_LIPS INTO GT_LIPS. CLEAR LT_VBPOK. LT_VBPOK-VBELN_VL = LT_BCODE_I-REF_DOC. " 交货单编号 LT_VBPOK-POSNR_VL = GT_LIPS-POSNR. " 交货项目编号 LT_VBPOK-LFIMG = GT_LIPS-LFIMG. " 更新的交货数量 " 若涉及批次,添加:LT_VBPOK-CHARG = GT_LIPS-CHARG. APPEND LT_VBPOK. ENDLOOP.
3. 调整WS_DELIVERY_UPDATE的参数设置
nicht_sperren参数:原代码设置为'X'表示不锁定交货单,若存在并发修改会导致更新冲突,建议改为空格(启用默认锁定机制),避免数据不一致。update_picking参数:设置为'X'表示更新拣配数量,需确认交货单状态是否允许修改(比如是否已过账发货,若已发货需先通过事务VL09冲销)。commit参数:原代码设置为'X'由函数内部提交,建议改为空格,调用函数后手动执行COMMIT WORK AND WAIT,确保事务提交的确定性。
4. 验证交货单状态与权限
- 用事务
VL03N查看目标交货单(LT_BCODE_I-REF_DOC)的状态:检查LFSTK字段是否为'C'(已完成发货),若已发货无法直接修改LFIMG,需先冲销发货操作。 - 通过事务
SU53检查当前用户权限,确认是否拥有修改交货单的权限(涉及权限对象V_LIKP_VST、V_LIPS_VST)。
5. 测试手动更新场景
- 先通过事务
VL02N手动修改该交货单的LFIMG字段,确认是否能正常保存,排除业务逻辑层面的限制(比如物料库存不足、关联销售订单已关闭等)。 - 简化函数调用参数,只保留必填项,逐步添加其他参数,定位是否由某一参数设置导致错误。
代码优化示例
补全VBPOK赋值逻辑并调整关键参数后的代码片段:
SELECT * FROM LIPS INTO CORRESPONDING FIELDS OF TABLE LT_LIPS WHERE VGBEL = LT_BCODE_I-VGBEL AND VGPOS = LT_BCODE_I-VGPOS. LOOP AT LT_LIPS INTO WA_LIPS. WA_LIPS-LFIMG = LT_BCODE_I-MENGE. MODIFY LT_LIPS FROM WA_LIPS INDEX SY-TABIX. ENDLOOP. " 构建VBPOK更新表,补充必填字段 CLEAR LT_VBPOK. REFRESH LT_VBPOK. LOOP AT LT_LIPS INTO GT_LIPS. LT_VBPOK-VBELN_VL = LT_BCODE_I-REF_DOC. LT_VBPOK-POSNR_VL = GT_LIPS-POSNR. LT_VBPOK-LFIMG = GT_LIPS-LFIMG. " 按需添加批次等字段 APPEND LT_VBPOK. ENDLOOP. CLEAR LS_VBKOK. LS_VBKOK-VBELN_VL = LT_BCODE_I-REF_DOC. CALL FUNCTION 'WS_DELIVERY_UPDATE' EXPORTING vbkok_wa = LS_VBKOK synchron = 'X' no_messages_update = ' ' update_picking = 'X' commit = ' ' " 改为空格,手动提交 delivery = LT_BCODE_I-REF_DOC nicht_sperren = ' ' " 改为空格,启用锁定 if_error_messages_send_0 = space IMPORTING ef_error_any_0 = ef_error_any_0 ef_error_in_interface_0 = ef_error_in_interface_0 TABLES vbpok_tab = LT_VBPOK prot = LT_PROT. " 手动处理事务提交/回滚 IF NOT ef_error_any_0 IS INITIAL. ROLLBACK WORK. " 输出错误日志 LOOP AT LT_PROT INTO DATA(WA_PROT). WRITE:/ WA_PROT-MSGID, WA_PROT-MSGNO, WA_PROT-MSGTY, WA_PROT-MSGV1. ENDLOOP. ELSE. COMMIT WORK AND WAIT. ENDIF.
内容的提问来源于stack exchange,提问作者NG SUIT YAN
相关产品推荐
相关产品推荐

