共计 2052 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
在 SAP 标准流程中,交货单保存后通常需要将数据发送到外部系统(如 WMS、TMS 或 ERP)。然而标准功能存在明显局限:

- 缺乏灵活的数据转换逻辑,无法适应企业特有的字段映射规则
- 无法直接调用外部系统的 WebService 或 API 接口
- 批量处理时可能因网络抖动导致数据丢失
- 业务数据校验逻辑无法与外部系统实时同步
技术选型:为什么是 BAdI?
SAP 提供了多种增强技术,我们对比了三种主流方案:
- User Exit
- 优点:执行效率高,直接嵌入标准程序
-
缺点:修改需要 Access Key,升级时可能被覆盖
-
Enhancement Spot
- 优点:支持显式 / 隐式增强点
-
缺点:需要定位具体增强点位置
-
BAdI
- 优点:面向对象设计,多实现类可切换
- 优点:无需修改标准代码,升级安全
- 优点:支持过滤器条件(Filter)
结论:BAdI 的松耦合特性更适合需要长期维护的集成场景。
核心实现步骤
步骤 1:定义 BAdI
通过 SE18 创建 BAdI 定义:
BADI 定义:ZBADI_DELIVERY_PUBLISH
接口方法:PUBLISH_DATA
IMPORTING
IS_LIKP TYPE LIKP
IT_LIPS TYPE LIPS_TAB
EXPORTING
EV_SUCCESS TYPE ABAP_BOOL
ET_RETURN TYPE BAPIRET2_TAB
步骤 2:实现 BAdI 类
在 SE19 中创建实现类:
CLASS zcl_badi_delivery_impl DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES if_badi_interface.
INTERFACES zif_badi_delivery_publish.
ENDCLASS.
CLASS zcl_badi_delivery_impl IMPLEMENTATION.
METHOD zif_badi_delivery_publish~publish_data.
" 1. 数据转换
DATA(lo_mapper) = NEW zcl_delivery_mapper( ).
lt_external_data = lo_mapper->convert_to_external_format(
is_likp = is_likp
it_lips = it_lips ).
" 2. 调用外部服务
DATA(lo_service) = NEW zcl_external_service( ).
ev_success = lo_service->send_data(lt_external_data).
" 3. 错误处理
IF ev_success = abap_false.
APPEND VALUE #(type = 'E' id = 'ZDELIVERY' number = '001')
TO et_return.
ENDIF.
ENDMETHOD.
ENDCLASS.
步骤 3:在保存时触发
在交货单保存函数模块(如DELIVERY_SAVE)的出口增强中调用:
DATA: lo_badi TYPE REF TO zif_badi_delivery_publish.
GET BADI lo_badi
FILTERS delivery_type = likp-vbtyp.
IF lo_badi IS BOUND.
CALL BADI lo_badi->publish_data
EXPORTING
is_likp = likp
it_lips = lips_tab
IMPORTING
ev_success = lv_success
et_return = lt_return.
ENDIF.
性能优化关键点
- 批处理设计
- 使用
FOR ALL ENTRIES替代循环中的单条查询 -
对频繁访问的表(如 LIKP/LIPS)使用缓冲区
-
异步处理
" 使用 BGTask 实现异步调用 CALL FUNCTION 'Z_DELIVERY_ASYNC_PUBLISH' IN BACKGROUND TASK EXPORTING iv_vbeln = likp-vbeln. -
连接池管理
- 复用 HTTP 连接(建议使用
cl_http_client=>create_by_url) - 设置合理的超时时间(通常 5 -10 秒)
常见问题解决方案
事务一致性
- 问题:BAdI 执行失败导致交货单无法保存
- 方案:
TRY. " BAdI 调用代码 CATCH cx_root INTO DATA(lx_error). " 记录日志但继续提交 zcl_log=>save(lx_error). ENDTRY.
网络中断处理
- 实现重试机制(建议最多 3 次)
- 使用 SM59 配置备用服务器
- 失败时写入 IDOC 供后续处理
扩展应用
相同技术可应用于:
- 采购订单审批后触发供应商通知
- 生产订单确认时同步 MES 系统
- 财务过账后推送税务系统
最佳实践建议
- 为每个 BAdI 实现添加单元测试(ABAP Unit)
- 使用事务码 ST01 跟踪性能瓶颈
- 在 SE24 中创建模拟类 (Mock) 用于测试
- 通过 SLG1 记录关键操作日志
总结
通过 BAdI 增强交货单保存流程,我们实现了:
- 与外部系统解耦
- 灵活支持不同业务场景(通过 Filter)
- 确保核心交易不受集成影响
建议开发者根据实际业务复杂度,选择同步 / 异步处理模式,并始终考虑异常场景的恢复机制。
正文完
