交货单批次拆分(BAPI_OUTB_DELIVERY_CHANGE )并更改拣配数量,发货过账(WS_DELIVERY_UPDATE)
时间: 2025-07-16 13:25:01 浏览: 5
<think>嗯,用户想了解如何使用SAP的BAPI_OUTB_DELIVERY_CHANGE进行交货单的批次拆分和修改拣配数量,然后用WS_DELIVERY_UPDATE完成发货过账。首先,我需要回忆一下这两个BAPI的用途和参数结构。
首先,BAPI_OUTB_DELIVERY_CHANGE用于修改外向交货单,可以处理项目级别的更改,包括数量、批次等。用户需要批次拆分,可能涉及到修改交货单项目的批次数据,可能需要用BAPI中的批次相关结构,比如VERRO_EXT。同时,修改拣配数量可能需要调整实际拣配的数量字段,比如DELIV_NUM_B或者PICK_QTY之类的字段。
然后是WS_DELIVERY_UPDATE,这个BAPI用于过账发货,比如发货过账或冲销。需要传递正确的过账参数,比如交货单号和过账标识。可能需要设置一些控制参数,比如是否自动过账WM等。
接下来,用户可能需要示例代码。我需要确保参数的正确性,比如交货单号、项目号、批次号、数量等。需要注意批次拆分可能需要创建新的批次行项目,或者在原有项目上调整批次和数量。可能需要使用BAPI的扩展结构,比如EXTENSIONIN,或者特定的批次分配表。
另外,处理BAPI的返回消息很重要,需要检查RETURN表是否有错误,否则后续的过账会失败。在调用WS_DELIVERY_UPDATE之前,可能需要先调用BAPI_OUTB_DELIVERY_CHANGE提交更改,或者使用事务处理方式,比如BAPI_TRANSACTION_COMMIT。
可能需要注意,修改批次和数量时,系统是否允许这样的更改,比如批次是否已分配,库存是否可用。此外,拣配数量的修改可能需要检查是否已经过拣配,或者是否允许修改。
用户可能需要具体的步骤,比如如何构建批次数据,如何设置拣配数量,以及调用BAPI的顺序。例如,先调用BAPI修改交货单,然后调用WS_DELIVERY_UPDATE进行过账。
在示例代码中,可能需要用到结构如VBPOK,VBCO6,或者VERRO_EXT,以及扩展字段。可能需要填充相应的表,比如HANDLE_ITEM、ITEM_DATA、SERNR等,具体取决于BAPI的参数要求。
还需要注意,WS_DELIVERY_UPDATE可能需要传递正确的参数,比如交货单号、过账标识(如'C'表示发货过账),以及控制参数是否自动生成传输单等。
最后,用户可能需要了解如何处理错误情况,例如批次不可用或数量不足,如何回滚事务,或者如何处理部分成功的情况。此外,可能涉及到的增强或出口程序也需要考虑,比如用户自定义的校验逻辑。
需要确保提供的示例代码结构正确,参数正确填充,并且有错误处理的机制,比如检查BAPI的返回消息。同时,要提醒用户在实际使用前进行测试,因为不同的系统配置可能会影响BAPI的行为。</think>### 使用BAPI_OUTB_DELIVERY_CHANGE进行批次拆分与拣配数量修改
#### 1. **BAPI_OUTB_DELIVERY_CHANGE功能介绍**
此BAPI用于修改外向交货单,支持以下操作:
- 批次分配与拆分(通过`VERRO_EXT`结构或批次相关字段)
- 修改拣配数量(通过`DELIV_NUM_B`或`VBEP-LMENG`字段)
- 扩展字段处理(通过`EXTENSIONIN`参数)
#### 2. **关键步骤与参数说明**
```abap
DATA: lt_handle_item TYPE TABLE OF bapiobdlvhndlchg,
lt_item_data TYPE TABLE OF bapiobdlvitemchg,
lt_return TYPE TABLE OF bapiret2,
lt_verro_ext TYPE TABLE OF bapiobdlvverro_ext.
* 设置交货单号与项目号
DATA(lv_delivery) = '80000001'. "交货单号
DATA(lv_item) = '000010'. "项目号
* 1. 批次拆分:新增批次条目
APPEND INITIAL LINE TO lt_verro_ext ASSIGNING FIELD-SYMBOL(<fs_verro>).
<fs_verro>-deliv_numb = lv_delivery.
<fs_verro>-deliv_item = lv_item.
<fs_verro>-batch = 'NEW_BATCH_001'. "新批次号
<fs_verro>-dlv_qty = 50. "新批次数量
* 2. 修改拣配数量(原批次)
APPEND INITIAL LINE TO lt_handle_item ASSIGNING FIELD-SYMBOL(<fs_handle>).
<fs_handle>-dlv_doc = lv_delivery.
<fs_handle>-dlv_item = lv_item.
<fs_handle>-itemchg = 'X'.
APPEND INITIAL LINE TO lt_item_data ASSIGNING FIELD-SYMBOL(<fs_item>).
<fs_item>-deliv_numb = lv_delivery.
<fs_item>-deliv_item = lv_item.
<fs_item>-dlv_qty = 100. "调整后的总数量(需与原批次数量一致)
* 调用BAPI
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = VALUE bapiobdlvhdrchg(deliv_numb = lv_delivery)
TABLES
handle_item = lt_handle_item
item_data = lt_item_data
verro_ext = lt_verro_ext
return = lt_return.
* 检查错误并提交
IF line_exists( lt_return[ type = 'E' ] ).
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ENDIF.
```
#### 3. **WS_DELIVERY_UPDATE发货过账**
```abap
DATA: lt_control TYPE TABLE OF wmgr_control,
lt_result TYPE TABLE OF wmgr_result.
* 设置过账参数
APPEND INITIAL LINE TO lt_control ASSIGNING FIELD-SYMBOL(<fs_control>).
<fs_control>-deliv_numb = lv_delivery.
<fs_control>-tpstk = 'C'. "发货过账标识
* 调用发货过账
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
if_auto_post_wm = 'X'
TABLES
it_control = lt_control
et_result = lt_result.
* 检查结果
IF line_exists( lt_result[ msgty = 'E' ] ).
ROLLBACK WORK.
ELSE.
COMMIT WORK.
ENDIF.
```
### 关键注意事项
1. **批次拆分逻辑**:需确保新批次与原批次总量一致,避免库存冲突[^1]。
2. **拣配数量修改**:需检查WM(仓库管理)状态,若已拣配需先取消。
3. **事务一致性**:建议在BAPI调用后立即提交或回滚事务。
阅读全文
相关推荐

















