调用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时未在每次循环开头清空工作区,上一行的字段值会被带入下一行,引发行项目字段错位。
修正方案
- 调用更新函数前先对交货单加锁,去掉
NICHT_SPERREN = 'X'的参数传值,或自行维护锁逻辑。 - 填充
LT_VBPOK时补全必填关键字段、修改标识,每次循环前清空工作区。 - 函数执行后第一时间检查
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
相关产品推荐
相关产品推荐

