共计 2230 个字符,预计需要花费 6 分钟才能阅读完成。
业务背景
在 SAP 标准系统中,物料主数据(MM03)的字段往往无法满足企业特定需求。例如某汽车零部件制造商需要记录:

- 供应商专属物料编号
- RoHS 环保认证状态
- 客户指定的特殊包装要求
这些字段在标准 SAP 中不存在,但又是供应链协同的关键数据。通过 ABAP 增强技术扩展标准表 MARA/MARC,可以在不修改 SAP 标准代码的前提下实现业务需求。
技术方案对比
三种主流实现方式
- BAPI 增强(BAdI)
- 原理:使用 Business Add-In(BAdI)增强标准 BAPI_MATERIAL_SAVE
- 优点:支持多实现、标准接口规范
-
缺点:需要处理 BAPI 事务一致性
-
用户出口(User Exit)
- 原理:在标准程序预留的 EXIT_开头子例程中编码
- 优点:直接访问程序内部变量
-
缺点:S/4HANA 中逐渐淘汰
-
隐式增强(Implicit Enhancement)
- 原理:在标准程序隐式增强点插入代码
- 优点:无需 SAP Access Key
- 缺点:升级时需重新实施
| 方案类型 | 维护难度 | 升级友好性 | 适用场景 |
|---|---|---|---|
| BAPI 增强 | 中 | 高 | 新开发系统首选方案 |
| 用户出口 | 低 | 低 | ECC 系统维护 |
| 隐式增强 | 高 | 中 | 紧急字段修补 |
BAdI 增强实战详解
步骤 1:数据字典扩展
首先创建自定义结构 ZMM_MATERIAL_EXT:
DATA: BEGIN OF zmm_material_ext,
matnr TYPE matnr, " 物料编号
zrohs TYPE flag, " RoHS 标志
zsupp_partno TYPE char30, " 供应商零件号
END OF zmm_material_ext.
通过 SE11 在 MARA 表追加字段:
- 使用事务码 SE11 打开 MARA
- 点击【追加结构】按钮
- 创建包含自定义字段的包含结构 ZMM_MARA_EXT
步骤 2:屏幕增强实现
在物料主数据屏幕添加标签页:
- 使用事务码 CMOD 创建增强项目
- 选择组件 MM06E005(物料主数据屏幕)
- 在子屏幕 SAPLMGD1 中创建新标签页
关键代码示例:
MODULE status_9001 OUTPUT.
LOOP AT SCREEN.
CASE screen-name.
WHEN 'ZROHS' OR 'ZSUPP_PARTNO'.
IF gv_display_mode = 'D'.
screen-input = 0. " 显示模式禁用输入
ENDIF.
ENDCASE.
MODIFY SCREEN.
ENDLOOP.
ENDMODULE.
步骤 3:BAdI 核心实现
创建 BAdI 实现类:
CLASS zcl_mm_material_badi IMPLEMENTATION.
METHOD if_ex_mm_material_badi~save.
DATA: ls_extension TYPE zmm_material_ext.
" 从内存获取增强字段值
IMPORT zmm_material_ext FROM MEMORY ID 'MM_EXTENSION'.
" 保存到自定义表
IF NOT ls_extension IS INITIAL.
MODIFY zmm_material_ext FROM ls_extension.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS.
注册 BAdI 实现:
DATA: lr_badi TYPE REF TO if_ex_mm_material_badi.
try.
lr_badi = cl_exithandler=>get_instance('MM_MATERIAL_BADI').
catch cx_badi_not_implemented.
" 异常处理
endtry.
生产环境部署要点
传输策略
- 将增强对象分组:
- 开发系统:ZDDIC*(数据字典)
- 测试系统:ZMM_ENH*(程序增强)
- 生产系统:完整传输包
多客户端处理
SELECT mandt FROM t000
INTO TABLE lt_clients
WHERE cccategory <> 'D'. " 排除开发客户端
LOOP AT lt_clients ASSIGNING FIELD-SYMBOL(<fs_client>).
CALL FUNCTION 'ZDISTRIBUTE_EXTENSION'
DESTINATION <fs_client>-mandt.
ENDLOOP.
性能优化
对于批量处理(如物料批量导入):
- 使用 FOR ALL ENTRIES 替代单条 SELECT
- 在 BAdI 中实现缓冲机制
- 禁用非关键字段的校验逻辑
高级思考:字段权限控制
实现字段级权限的两种方式:
- 授权对象方案
- 创建自定义授权对象 Z_MM_EXT
-
在屏幕 PBO 中动态控制字段属性
-
字段组方案
- 使用事务码 SU21 创建字段组
- 在权限配置中分配字段可见性
关键代码示例:
IF sy-tcode = 'MM02'.
AUTHORITY-CHECK OBJECT 'Z_MM_EXT'
ID 'ZROHS' FIELD 'DISPLAY'.
IF sy-subrc <> 0.
LOOP AT SCREEN WHERE name = 'ZROHS'.
screen-active = 0.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDIF.
经验总结
经过三个月的生产环境运行,这套增强方案成功支持了 2000+ 物料的扩展字段维护。特别提醒注意:
- 在 S /4HANA 2020 之后版本,优先使用 CDS View 扩展替代传统增强
- 批量导入场景下,建议单独开发 ZMM_MASS_UPDATE 程序绕过标准校验
- 定期使用 SCAN_ABAP_SOURCE 检查废弃语法
当我们需要新增 ” 跨境电商 HS 编码 ” 字段时,这套框架只需 2 小时即可完成部署,体现了良好的扩展性。
正文完
