共计 1474 个字符,预计需要花费 4 分钟才能阅读完成。
业务场景分析
在 SAP 物料管理模块中,经常需要在保存物料主数据(MM02)时实现以下业务需求:

- 强制校验物料分类的特定组合(如只有 A 类物料允许与 B 类工厂组合)
- 自动派生扩展字段值(如根据物料组自动填充质量控制标识)
- 写入自定义统计表(记录主数据创建频次等)
这些需求无法通过标准配置实现,必须通过 ABAP 增强技术来完成。
增强技术选型:USEREXIT vs BAdI
SAP 提供了两种传统增强方式:
- USEREXIT
- 存在于标准程序固定位置(如 MV45AFZZ)
- 修改需要 Access Key 且影响升级
-
适合 SAP 4.6C 之前版本
-
BAdI(Business Add-In)
- 基于接口的标准化增强
- 支持多重实现和过滤
- 推荐用于 ECC6.0 及以上版本
以 MM02 为例,我们选择 MM06E005 这个 BAdI,它在保存前(CHECK_BEFORE_UPDATE)和保存后(AFTER_UPDATE)都提供了钩子函数。
BAdI 实现步骤详解
1. 增强点定位
使用事务码 SE18 查看 BAdI 定义:
- 输入 BAdI 名称
MM06E005 - 查看
Interface选项卡确认可用方法 - 检查
Filter选项卡了解可能的过滤条件
2. 创建 BAdI 实现
在 SE19 中新建实现:
- 选择
Create Implementation - 命名规范建议:
ZMM_+ 业务含义(如ZMM_MAT_CHECK) - 实现
CHECK_BEFORE_UPDATE方法
3. 关键代码示例
METHOD if_ex_mm06e005~check_before_update.
" 获取当前处理的物料号
DATA(lv_matnr) = imara-matnr.
" 示例:校验物料类型与工厂组合
IF imara-mtart = 'FERT' AND imara-werks = '1000'.
" 使用标准消息格式
MESSAGE e208(00) WITH '成品物料不能在 1000 工厂创建'.
ENDIF.
" 示例:自动派生值
IF xmara-matkl = '001'.
xmara-ekgrp = '010'." 采购组默认值
ENDIF.
ENDMETHOD.
4. 调试技巧
- 使用
/h启动调试模式 - 在 MM02 保存时断点会停在 BAdI 实现
- 关键观察变量:
IMARA:传入的物料主数据XMARA:可修改的出口参数E_MESSAGE:错误消息容器
生产环境注意事项
性能优化
- 避免在循环中查询数据库:
" 错误做法(LOOP 中 SELECT)LOOP AT it_mara ASSIGNING FIELD-SYMBOL(<fs>).
SELECT SINGLE * FROM t134 WHERE mtart = <fs>-mtart.
ENDLOOP.
" 正确做法(先批量获取)SELECT mtart, mtbez
FROM t134
INTO TABLE @DATA(lt_t134)
FOR ALL ENTRIES IN @it_mara
WHERE mtart = @it_mara-mtart.
错误处理
- 使用
MESSAGE ID维护消息类 - 严重级别选择:
E:阻止保存W:警告但允许继续I:纯提示信息
传输管理
- 将 BAdI 实现包进开发类
- 使用
SE09创建传输请求 - 测试系统验证后再释放
延伸思考
跨 Client 复用
- 通过
CLIENT SPECIFIED查询配置表 - 使用 SCOT 配置跨 Client 消息
结构变更应对
- 在 BAdI 中添加字段存在性检查
- 使用
CL_ABAP_STRUCTDESCR动态获取字段 - 建立字段映射配置表
总结
通过 MM06E005 BAdI 实现物料主数据增强,既能满足业务需求又保持标准系统的可升级性。关键要处理好数据校验、性能影响和异常情况这三个核心问题。建议在开发完成后使用 SCU3 监控增强的执行情况,持续优化实现逻辑。
正文完
