共计 1854 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 SAP 标准 MIGO 事务中,物料凭证保存后的行项目数据处理存在明显局限性:

- 标准功能无法自动触发后续业务逻辑(如更新自定义字段、触发工作流等)
- 业务部门常需要实时更新第三方系统数据或执行复杂校验
- 直接修改标准程序会导致升级兼容性问题
技术选型对比
- USEREXIT
- 优点:实现简单,直接嵌入标准程序
-
缺点:修改范围有限,升级时需重新适配
-
Enhancement Spot
- 优点:支持显式增强点,结构清晰
-
缺点:需标准程序已预置增强点
-
BADI
- 优点:标准接口规范,多实现共存,升级友好
- 缺点:需要查找合适的标准 BADI
推荐选择 MB_MIGO_BADI 标准 BADI,它是专为 MIGO 设计的业务插件点。
核心实现步骤
1. BADI 实现类创建
CLASS zcl_migo_badi_impl DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_ex_mb_migo_badi.
ENDCLASS.
CLASS zcl_migo_badi_impl IMPLEMENTATION.
METHOD if_ex_mb_migo_badi~post_document.
" 核心增强逻辑
ENDMETHOD.
ENDCLASS.
2. 获取行项目数据
在 POST_DOCUMENT 方法中:
- 通过参数 IS_HEADER 获取凭证抬头数据
- 通过参数 IT_ITEMS 获取所有行项目
- 关键字段示例:
- MATDOC_ITEMS-MATNR(物料编号)
- MATDOC_ITEMS-WERKS(工厂)
- MATDOC_ITEMS-CHARG(批次)
3. 数据锁机制设计
CALL FUNCTION 'ENQUEUE_EZ_MM_MATDOC'
EXPORTING
mandt = sy-mandt
mblnr = is_header-mblnr
mjahr = is_header-mjahr.
" 业务逻辑处理
CALL FUNCTION 'DEQUEUE_EZ_MM_MATDOC'.
完整代码示例
METHOD if_ex_mb_migo_badi~post_document.
DATA: lv_error TYPE abap_bool.
" 1. 加锁
CALL FUNCTION 'ENQUEUE_EZ_MM_MATDOC'
EXPORTING
mandt = sy-mandt
mblnr = is_header-mblnr
mjahr = is_header-mjahr.
" 2. 处理每行项目
LOOP AT it_items ASSIGNING FIELD-SYMBOL(<fs_item>).
" 示例:更新自定义表
UPDATE zmatdoc_cust SET
status = 'P'
updated_by = sy-uname
updated_at = sy-datum
WHERE mblnr = <fs_item>-mblnr
AND mjahr = <fs_item>-mjahr
AND zeile = <fs_item>-zeile.
IF sy-subrc <> 0.
lv_error = abap_true.
" 记录错误日志
MESSAGE e001(zmm) WITH <fs_item>-mblnr INTO DATA(lv_msg).
zcl_log=>save( ).
ENDIF.
ENDLOOP.
" 3. 错误处理
IF lv_error = abap_true.
CALL FUNCTION 'DEQUEUE_EZ_MM_MATDOC'.
RAISE EXCEPTION TYPE cx_badi_multiply_implemented.
ENDIF.
" 4. 释放锁
CALL FUNCTION 'DEQUEUE_EZ_MM_MATDOC'.
ENDMETHOD.
生产环境注意事项
- 并发控制
- 建议锁超时时间设置为 120 秒
-
使用 SM12 定期检查死锁
-
性能优化
- 批量操作时禁用 DB 提交(SET UPDATE TASK LOCAL)
-
复杂逻辑考虑异步处理
-
监控方案
- 使用 SAT 进行性能分析
- 关键节点添加 SLG1 日志
常见问题解决
- 数据不一致
- 现象:增强后部分字段未更新
-
方案:检查 ITEM 表与 HEADER 的关联关系
-
性能下降
- 现象:MIGO 执行变慢
-
方案:优化 SQL 语句,添加适当索引
-
短冲突出错
- 现象:报出锁冲突错误
- 方案:增加重试机制
扩展建议
可进一步探索:
- 使用 MB_DOCUMENT_BADI 增强其他物料凭证操作
- 结合 Fiori 应用做前端扩展
- 集成 SAP PI/CPI 实现跨系统更新
总结
通过 MB_MIGO_BADI 实现的行项目增强,既满足了业务需求,又保持了系统标准性。实际项目中建议:
- 严格测试各种移动类型组合
- 准备详细的回退方案
- 文档记录所有自定义逻辑
正文完
