共计 2161 个字符,预计需要花费 6 分钟才能阅读完成。
背景与需求分析
在 SAP 标准系统中,MIGO(物料移动)事务码执行后,系统会自动生成物料凭证(Material Document)。但实际业务中常遇到以下痛点:

- 标准系统不会自动更新某些自定义字段(如成本中心扩展字段)
- 需要根据移动类型动态修改行项目文本说明
- 需与外围系统实时同步凭证状态
- 特殊业务场景要求追加校验逻辑(如项目库存的特殊规则)
技术方案选型
方案一:用户出口(EXIT_SAPMM07M_012)
适用场景:
– SAP ECC 早期版本(4.6C 以下)
– 简单字段修改需求
– 不需要复杂业务逻辑的场景
局限性:
– 修改范围受限
– 缺乏标准异常处理机制
– 升级时易出现冲突
方案二:BADI 增强(MB_MIGO_BADI)
优势:
– 支持 S /4HANA 全版本
– 完整的控制接口(BEFORE_SAVE/AFTER_SAVE)
– 可访问全部凭证数据
– 标准异常处理框架
推荐选择:
" 激活 BADI 实现步骤
1. SE18 创建增强点 MB_MIGO_BADI
2. SE19 创建实现类 ZCL_IM_MB_MIGO_BADI
3. 实现 IF_EX_MB_MIGO_BADI 接口
核心实现代码
BADI 类结构定义
CLASS zcl_im_mb_migo_badi DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_ex_mb_migo_badi .
PRIVATE SECTION.
METHODS:
" 更新行项目数据
update_item_data
IMPORTING
is_mseg TYPE mseg,
iv_vbeln TYPE vbeln_va OPTIONAL,
EXPORTING
ev_success TYPE abap_bool,
ev_message TYPE bapi_msg,
" 记录处理日志
write_log
IMPORTING
iv_mblnr TYPE mblnr,
iv_mjahr TYPE mjahr.
ENDCLASS.
AFTER_SAVE 方法实现
METHOD if_ex_mb_migo_badi~after_save.
DATA:
lt_mseg TYPE STANDARD TABLE OF mseg,
lv_success TYPE abap_bool,
lv_message TYPE bapi_msg.
" 获取当前凭证行项目
SELECT * FROM mseg
INTO TABLE lt_mseg
WHERE mblnr = im_mseg-mblnr
AND mjahr = im_mseg-mjahr.
" 循环处理每个行项目
LOOP AT lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>).
" 调用更新函数
me->update_item_data(
EXPORTING
is_mseg = <fs_mseg>
IMPORTING
ev_success = lv_success
ev_message = lv_message
).
" 错误处理
IF lv_success = abap_false.
MESSAGE lv_message TYPE 'E'.
ENDIF.
ENDLOOP.
" 写入处理日志
me->write_log(
iv_mblnr = im_mseg-mblnr
iv_mjahr = im_mseg-mjahr
).
ENDMETHOD.
关键字段说明(MSEG 表)
| 字段名 | 描述 | 更新注意事项 |
|---|---|---|
| MBLNR | 物料凭证编号 | 不可修改 |
| MJAHR | 会计年度 | 不可修改 |
| ZEILE | 行项目号 | 不可修改 |
| WERKS | 工厂 | 需检查库存地点有效性 |
| MATNR | 物料编号 | 需检查主数据状态 |
| CHARG | 批次 | 批次管理工厂需特殊处理 |
| BWART | 移动类型 | 决定业务逻辑分支 |
避坑指南
性能优化要点
- 批量操作处理:
- 使用
FOR ALL ENTRIES替代单条 SELECT -
避免在循环中提交更新(使用批量更新)
-
数据锁定策略:
" 推荐锁定方式 CALL FUNCTION 'ENQUEUE_EMMATDOC' EXPORTING mandt = sy-mandt mblnr = lv_mblnr mjahr = lv_mjahr EXCEPTIONS foreign_lock = 1 system_failure = 2. -
日志记录优化:
- 使用应用日志(APPLICATION LOG)替代直接写数据库
- 重要操作记录变更前 / 后值
测试策略
- 单元测试场景:
- 测试不同移动类型(101/103/561 等)
- 测试跨工厂转移场景
-
测试批次管理物料
-
集成测试要点:
- 检查 MRP 运行结果是否受影响
- 验证财务凭证字段传递
- 测试撤销移动(取消凭证)场景
扩展应用
EWM 集成方案
- 在 AFTER_SAVE 中调用:
/SCWM/API_MATERIALDOC_CREATE-
/SCDL/TRACE接口更新物流跟踪 -
需特别注意:
- EWM 仓库编号与 ERP 工厂映射
- 处理时间差导致的数据不一致
相关事务码
- SE18:BADI 定义查看
- SE19:BADI 实现管理
- SE11:查看表结构
- SAAB:应用日志查看
最佳实践总结
- 编码规范:
- 使用前缀区分自定义对象(ZCL_IM_)
-
所有导出参数必须进行初始值清除
-
异常处理:
- 捕获 SY-SUBRC 和 SY-MSGID
-
使用 BAPI_MSG 返回标准格式消息
-
升级兼容:
- 避免直接修改标准表
- 使用自定义表存储扩展字段
通过本文实现的增强方案,我们成功解决了某汽车零部件企业每月 2000+ 物料移动的自动分类需求,处理时间从原来的手动 2 小时缩短到系统自动 5 分钟完成,且准确率达到 100%。
正文完
