SAP_ABAP_SD_BAPI清单案例教程——交货单过账_WS_DELIVERY_UPDATE_VL01N_S4版本

<think>我们已经讨论了VL604错误的解决方案,现在用户询问如何使用BAPI替代WS_DELIVERY_UPDATE实现交货单过账。根据引用[1]的内容,我们知道WS_DELIVERY_UPDATE是一个函数,而对应的BAPIBAPI_OUTB_DELIVERY_CONFIRM_DEC(用于分散处理)或BAPI_OUTB_DELIVERY_CONFIRMATION(用于集中处理)。注意,BAPI_OUTB_DELIVERY_CONFIRM_DEC是较新的BAPI,通常推荐使用。 步骤: 1. 准备BAPI需要的数据结构,特别是交货单号(DELIVERY)和过账日期(POSTING_DATE)等。 2. 调用BAPI,然后检查返回消息。 3. 由于BAPI没有直接的RETURN表,消息在日志表PROT中,需要读取PROT表检查是否有错误(MSGTY='E')。 4. 如果没有错误,则调用BAPI_TRANSACTION_COMMIT提交事务。 注意:BAPI_OUTB_DELIVERY_CONFIRM_DEC是异步处理,可能不会立即返回生成的物料凭证,需要通过其他方式(如读取日志)获取。 具体示例代码(ABAP): ```abap DATA: lt_confirm TYPE TABLE OF bapiobdlvconfdec, lt_confirmx TYPE TABLE OF bapiobdlvconfdecx, lt_prot TYPE TABLE OF prott, ls_confirm LIKE LINE OF lt_confirm, ls_confirmx LIKE LINE OF lt_confirmx. " 设置需要过账交货单号 ls_confirm-deliv_numb = '交货单号'. ls_confirm-posting_date = sy-datum. "过账日期 APPEND ls_confirm TO lt_confirm. " 设置更新标识(X表示更新) ls_confirmx-deliv_numb = '交货单号'. ls_confirmx-posting_date = 'X'. " 更新过账日期 APPEND ls_confirmx TO lt_confirmx. " 调用BAPI CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC' TABLES conf_delivery_dec = lt_confirm conf_delivery_decx = lt_confirmx prot = lt_prot. " 检查错误 READ TABLE lt_prot WITH KEY msgty = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. " 存在错误,回滚 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 处理错误日志 lt_prot ELSE. " 无错误,提交 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. " 获取生成的物料凭证:可以通过日志表lt_prot中的消息,也可以使用函数MB_VIEW_DOCUMENTUM查看 ENDIF. ``` 注意事项: - 如果交货单包含多个项目,可以设置项目级别的确认。 - 日志表PROT中的消息需要逐一检查,因为可能存在警告(W)或成功(S)消息,但错误(E)会阻止过账。 引用说明: 根据用户提供的引用[1]:外向交货单发货过账BAPI是`BAPI_OUTB_DELIVERY_CONFIRM_DEC`(分散处理)和`BAPI_OUTB_DELIVERY_CONFIRMATION`(集中处理)[^1]。其中,`BAPI_OUTB_DELIVERY_CONFIRM_DEC`是更常用的BAPI。 相关问题: 1. 如何通过BAPI获取交货单发货过账后生成的物料凭证? 2. 使用BAPI过账交货单时如何处理批次拆分? 3. 如何批量处理多个交货单的发货过账? 请注意,以上代码仅为示例,实际使用时需要根据具体业务需求调整参数。 </think>### 使用 BAPI 替代 `WS_DELIVERY_UPDATE` 实现交货单过账的方法 在 SAP 中,推荐使用 **`BAPI_OUTB_DELIVERY_CONFIRM_DEC`**(分散处理)或 **`BAPI_OUTB_DELIVERY_CONFIRMATION`**(集中处理)替代 `WS_DELIVERY_UPDATE` 实现交货单发货过账。以下是详细步骤和注意事项: --- #### **一、核心 BAPI 选择** | BAPI 名称 | 适用场景 | 关键特性 | |-----------|---------|----------| | `BAPI_OUTB_DELIVERY_CONFIRM_DEC` | 单张交货单处理 | 直接返回过账结果,支持异步处理 | | `BAPI_OUTB_DELIVERY_CONFIRMATION` | 批量交货单处理 | 需配合 `BAPI_TRANSACTION_COMMIT` 提交 | --- #### **二、实现步骤(以 `BAPI_OUTB_DELIVERY_CONFIRM_DEC` 为例)** 1. **准备输入参数** ```abap DATA: lt_delivery TYPE TABLE OF bapiobdlvconfdec, lt_prot TYPE TABLE OF prott, " 日志表 ls_delivery LIKE LINE OF lt_delivery. ls_delivery-deliv_numb = '80000001'. " 交货单号 ls_delivery-posting_date = sy-datum. " 过账日期(默认当前日期) ls_delivery-delivery = 'X'. " 过账标识符 APPEND ls_delivery TO lt_delivery. ``` 2. **调用 BAPI** ```abap CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC' TABLES conf_delivery_dec = lt_delivery prot = lt_prot. " 日志输出表 ``` 3. **检查日志并提交** ```abap " 检查错误日志 (MSGTY = 'E') READ TABLE lt_prot WITH KEY msgty = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 回滚事务 " 处理错误日志 lt_prot ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' " 提交事务 EXPORTING wait = 'X'. " 成功过账 ENDIF. ``` --- #### **三、关键注意事项** 1. **日志处理** BAPI **不直接返回** `RETURN` 表,所有消息存储在 `PROT` 表中。需遍历该表检查错误: ```abap LOOP AT lt_prot ASSIGNING FIELD-SYMBOL(<fs_prot>) WHERE msgty CA 'EA'. WRITE: / '错误:', <fs_prot>-msgid, <fs_prot>-msgnr, <fs_prot>-msgv1. ENDLOOP. ``` 2. **获取生成的物料凭证** 成功过账后,物料凭证号存储在: - 表 `LT_PROT` 的消息变量中(如 `MATDOC_XXXXXXXX`) - 或通过函数 `MB_VIEW_DOCUMENTUM` 根据交货单号查询 3. **异步处理模式** 添加参数实现异步提交: ```abap ls_delivery-async = 'X'. " 启用异步 ``` 异步模式下需单独调用 `BAPI_TRANSACTION_COMMIT` 4. **批次管理支持** 若交货单含批次物料,需扩展结构: ```abap DATA: lt_batch TYPE TABLE OF bapiobdlvbatchchg. ls_batch-deliv_numb = '80000001'. ls_batch-batch = 'BATCH001'. APPEND ls_batch TO lt_batch. ``` --- #### **四、与 `WS_DELIVERY_UPDATE` 的差异对比** | 特性 | `WS_DELIVERY_UPDATE` | `BAPI_OUTB_DELIVERY_CONFIRM_DEC` | |------|----------------------|----------------------------------| | 事务控制 | 自动提交 | 需显式调用 `BAPI_TRANSACTION_COMMIT` | | 错误处理 | 通过 SY-SUBRC 检查 | 需解析 PROT 日志表 | | 批量处理 | 不支持 | 支持多交货单批量处理 | | 异步模式 | 不支持 | 支持异步提交 | | 返回数据 | 直接输出凭证号 | 需从日志或单独查询获取凭证 | > 提示:对于集中处理场景(如 VL06O),优先使用 `BAPI_OUTB_DELIVERY_CONFIRMATION`[^1]。 --- #### **五、错误处理最佳实践** 1. **凭证流中断(VL604)** 调用前检查凭证流完整性: ```abap CALL FUNCTION 'SD_DOCUMENTFLOW_READ' EXPORTING vbeln_v = ls_delivery-deliv_numb TABLES vbfa = lt_vbfa. " 凭证流表 ``` 若 `LT_VBFA` 为空,需先修复凭证流(参考前文方案) 2. **库存不足错误** 调用 `BAPI_MATERIAL_AVAILABILITY` 预检查库存: ```abap CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY' EXPORTING plant = '1000' material = 'MAT-001' IMPORTING available_qty = lv_qty. ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值