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

调用WS_DELIVERY_UPDATE更新标准表LIPS-LFIMG字段失败求助

问题说明

经核查全流程逻辑无明显异常,但执行函数调用后更新操作未生效,目标字段LIPS-LFIMG未成功写入标准表,暂无法定位问题根因,咨询是否遗漏必要实现步骤。错误信息日志存储在内表LT_PROT中,原有实现代码如下:

DATA: LT_PROT LIKE PROTT OCCURS 10 WITH HEADER LINE.
  DATA: LT_VBPOK  LIKE VBPOK OCCURS 500  WITH HEADER LINE.
  DATA: LS_VBKOK  LIKE VBKOK.
  DATA: GT_LIPS LIKE LT_LIPS.
  DATA: WA_LIPS TYPE LTY_LIPS.


  DATA: EF_ERROR_ANY_0                TYPE C,
        EF_ERROR_IN_ITEM_DELETION_0   TYPE C,
        EF_ERROR_IN_POD_UPDATE_0      TYPE C,
        EF_ERROR_IN_INTERFACE_0       TYPE C,
        EF_ERROR_IN_GOODS_ISSUE_0     TYPE C,
        EF_ERROR_IN_FINAL_CHECK_0     TYPE C.


  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 IS CHANGE INDICATOR, AFTERWARD CALL FUNCTION TO CHANGE FIELD LFIMG IN STANDART TABLE LIPS.
             LOOP AT LT_LIPS INTO GT_LIPS.
               LT_VBPOK-LFIMG = GT_LIPS-LFIMG.
               APPEND LT_VBPOK.
             ENDLOOP.
            ls_vbkok-vbeln_vl   = LT_BCODE_I-REF_DOC.
            CALL FUNCTION 'WS_DELIVERY_UPDATE'
              EXPORTING
                vbkok_wa                    = ls_vbkok    " DELIVERY DOCUMENT NUMBER
                synchron                    = 'X'
                no_messages_update          = ' '
                update_picking              = 'X'
                commit                      = 'X'
                delivery                    = LT_BCODE_I-REF_DOC   "VARIABLE OF DELIVERY DOCUMENT
                nicht_sperren               = 'X'
                if_error_messages_send_0    = space
              IMPORTING
                ef_error_any_0              = ef_error_any_0
                ef_error_in_item_deletion_0 = ef_error_in_item_deletion_0
                ef_error_in_pod_update_0    = ef_error_in_pod_update_0
                ef_error_in_interface_0     = ef_error_in_interface_0
                ef_error_in_goods_issue_0   = ef_error_in_goods_issue_0
                ef_error_in_final_check_0   = ef_error_in_final_check_0
              TABLES
                vbpok_tab                   = lt_vbpok     "TABLE TO BE CHANGE
                prot                        = lt_prot.
问题原因

现有代码存在4处关键遗漏,会直接导致更新静默失败:

  • VBPOK行项目缺少必填关键字段:循环赋值LT_VBPOK时仅传入了LFIMG字段,未传入交货单号VBELN_VL、交货行项目号POSNR_VL,函数无法识别需要更新的具体行项目,不会执行表更新操作。
  • 缺少行项目修改标识:VBPOK结构中的CHK_DELIV字段为行项目修改标记,必须赋值为X告知函数该行存在字段变更,否则函数默认该行无修改,直接跳过处理。
  • 锁参数配置冲突:给NICHT_SPERREN(不锁定交货单)参数传值X,标准更新逻辑下未对交货单加锁时,数据一致性校验会直接拦截更新,无显性报错但更新不会生效。
  • 工作区未清空导致数据错乱:循环追加LT_VBPOK时未在每次循环开头清空工作区,上一行的字段值会被带入下一行,引发行项目字段错位。
修正方案
  1. 调用更新函数前先对交货单加锁,去掉NICHT_SPERREN = 'X'的参数传值,或自行维护锁逻辑。
  2. 填充LT_VBPOK时补全必填关键字段、修改标识,每次循环前清空工作区。
  3. 函数执行后第一时间检查EF_ERROR_ANY_0返回值,若值为X直接遍历LT_PROT内表读取具体报错信息。

修正后的核心代码片段:

" 提前锁定交货单
CALL FUNCTION 'ENQUEUE_EVVBLKE'
  EXPORTING
    vbeln = LT_BCODE_I-REF_DOC
  EXCEPTIONS
    OTHERS = 1.
IF SY-SUBRC <> 0.
  " 处理锁定失败逻辑,直接返回
  RETURN.
ENDIF.

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行项目表
LOOP AT LT_LIPS INTO WA_LIPS.
  CLEAR LT_VBPOK.
  LT_VBPOK-VBELN_VL = WA_LIPS-VBELN.
  LT_VBPOK-POSNR_VL = WA_LIPS-POSNR.
  LT_VBPOK-LFIMG = WA_LIPS-LFIMG.
  LT_VBPOK-CHK_DELIV = 'X'.
  APPEND LT_VBPOK.
ENDLOOP.

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                      = 'X'
    delivery                    = LT_BCODE_I-REF_DOC
    if_error_messages_send_0    = space
  IMPORTING
    ef_error_any_0              = ef_error_any_0
    ef_error_in_item_deletion_0 = ef_error_in_item_deletion_0
    ef_error_in_pod_update_0    = ef_error_in_pod_update_0
    ef_error_in_interface_0     = ef_error_in_interface_0
    ef_error_in_goods_issue_0   = ef_error_in_goods_issue_0
    ef_error_in_final_check_0   = ef_error_in_final_check_0
  TABLES
    vbpok_tab                   = LT_VBPOK
    prot                        = LT_PROT.

" 操作完成后解锁交货单
CALL FUNCTION 'DEQUEUE_EVVBLKE'
  EXPORTING
    vbeln = LT_BCODE_I-REF_DOC.
额外注意事项
  • 更新交货数量时,LFIMG对应的计量单位必须和交货单行项目维护的计量单位一致,单位不匹配也会触发更新拦截。
  • 若EF_ERROR_ANY_0返回X,直接读取LT_PROT内表的MSGID、MSGNO、MSGV1~MSGV4字段,调用消息读取函数即可拿到完整报错文本,无需额外截图定位问题。

内容的提问来源于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 18:48:26