You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:09:31