共计 1452 个字符,预计需要花费 4 分钟才能阅读完成。
业务场景:为什么需要增强物料主数据
最近接到业务部门需求:由于环保法规要求,需要在物料主数据中记录 ROHS 认证状态、回收利用率等新字段。标准 SAP 的 MM03 事务码中并没有这些字段,直接修改标准表 MARA 会被 SAP 明确禁止——这会导致系统升级时出现严重冲突。

技术方案选型
SAP 提供了三种主流增强方案,各有适用场景:
-
User Exit:传统子程序增强,通过在固定位置插入代码实现。例如 MM06E005 可用于物料创建时增强。优点是简单直接,缺点是难以维护且功能有限。
-
Enhancement Spot:通过显示增强点插入代码。适合在标准程序特定位置增加逻辑,但缺乏结构化封装。
-
BAdI(Business Add-In):面向对象的增强技术,通过接口实现多态调用。本文推荐方案,优势在于:
- 标准化的接口定义
- 支持多重实现
- 良好的版本管理
- 与 SAP 版本升级兼容
BAdI 增强实战步骤
第一步:查找标准 BAdI(事务码 SE18)
- 在 SE18 中输入
BADI_MATERIAL(物料主数据常用 BAdI) - 检查
Methods选项卡中的CHANGE_AT_SAVE方法——这正是保存物料时触发的关键点
第二步:创建 BAdI 实现(事务码 SE19)
- 选择
Create Implementation,输入自定义名称如ZMM_ROHS_IMPL - 指定实现类名称(系统会自动生成 ZCL_前缀的类名)
- 激活时会自动生成类框架代码
关键代码实现
CLASS zcl_mm_rohs_impl DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_ex_badi_material.
ENDCLASS.
CLASS zcl_mm_rohs_impl IMPLEMENTATION.
METHOD if_ex_badi_material~change_at_save.
" 获取自定义屏幕字段值
DATA(lv_rohs) = cl_gui_alv_grid=>get_parameter(EXPORTING name = 'ZROHS_STATUS').
" 写入自定义表
IF NOT lv_rohs IS INITIAL.
MODIFY zmat_rohs FROM @( VALUE #(
matnr = material
rohs_status = lv_rohs ) ).
ENDIF.
ENDMETHOD.
ENDCLASS.
第三步:挂载实现到 BAdI
- 在 SE19 中进入
Filter Values选项卡 - 设置过滤条件(如特定工厂代码)
- 通过菜单
Implementation->Activate激活
避坑指南
- 版本检查:
- 使用 SE18 查看 BAdI 的 SAP Note
-
特别关注标有
[Version]的注释 -
命名规范:
- 自定义字段建议使用 Z / Y 前缀
-
避免使用
STATUS等常见保留字 -
传输管理:
- BAdI 实现必须包含在开发包中
- 跨系统传输时需同时包含定义和实现
扩展思考
- 当环保字段需要同步到 SD 模块时:
- 方案 A:通过 Output Management 触发异步更新
-
方案 B:在 BAdI 中直接调用 RFC 函数
-
S/4HANA 中的新选择:
- CDS View 扩展允许通过注解添加字段
- 但传统 BAdI 仍适用于复杂业务逻辑
总结
通过这个案例,我们完整走通了从业务需求分析到 BAdI 实现的技术闭环。关键收获是:对于标准主数据的扩展,一定要遵循 SAP 推荐的标准增强方式,既满足业务需求又保证系统稳定性。下次遇到类似需求时,不妨先问三个问题:
- 这个字段是否真的需要存储在物料主数据层面?
- 有没有现成的 BAdI 可以直接利用?
- 如何设计才能最小化对标准功能的影响?
正文完
