共计 1418 个字符,预计需要花费 4 分钟才能阅读完成。
技术选型:BADI vs User Exit
在 SAP 系统中扩展物料主数据逻辑时,我们主要面对两种技术选择:

- BADI(Business Add-In):
- 使用
MATERIAL_MAINTAIN标准 BADI - 优势:支持多实现、可热部署
-
查找方法:SE19 输入
MATERIAL_MAINTAIN -
User Exit:
- 使用
MM06E005出口 - 优势:直接访问内存表、响应更快
- 查找方法:SE80 搜索
EXIT_SAPLMMAT_001
实战代码示例
场景 1:物料类型自动填充
当创建清算物料(CLEARING_MAT)时自动填充特定字段:
METHOD if_ex_material_maintain~check_data.
IF is_mara-matkl = 'CLEARING'.
cs_mara-mtpos_mara = 'NORM'.
cs_mara-disgr = '01'.
ENDIF.
ENDMETHOD.
场景 2:自定义字段校验
使用 BAPI 实现校验失败时的回滚:
METHOD if_ex_material_maintain~check_data.
IF cs_mara-zz_custom_field IS INITIAL.
CALL FUNCTION 'BAPI_MATERIAL_SAVEREPLICA'
EXPORTING
no_commit = abap_true.
RAISE EXCEPTION TYPE cx_bapi_error.
ENDIF.
ENDMETHOD.
生产环境关键点
- 事务锁管理:
- 在批量处理时使用
ENQUEUE_EMMARA -
示例代码:
CALL FUNCTION 'ENQUEUE_EMMARA' EXPORTING mandt = sy-mandt matnr = ls_mara-matnr. -
性能优化:
- 避免在循环内调用 BAPI
- 使用
BAPI_MATERIAL_SAVEDATA批量提交
典型问题解决方案
- 继承问题:
- 重写
CL_MATERIAL_MAINTAIN方法时 -
必须调用
super->method保持标准逻辑 -
命名冲突:
- 用户出口变量前缀加
Z_ - 示例:
DATA: z_my_variable TYPE mara-matnr.
进阶思考
如何实现跨 Client 的默认值设置?可以考虑:
- 使用自定义表存储配置
- 在 BADI 初始化时读取配置
- 通过 RFC 调用中央配置系统
测试函数模板(SE37):
FUNCTION z_test_material_enhancement.
*"----------------------------------------------------------------------
*"*Local Interface:
*" IMPORTING
*" VALUE(IV_MATNR) TYPE MATNR
*" EXPORTING
*" VALUE(EV_RESULT) TYPE CHAR1
*"----------------------------------------------------------------------
DATA: ls_mara TYPE mara.
SELECT SINGLE * FROM mara INTO ls_mara
WHERE matnr = iv_matnr.
" 添加测试逻辑
ENDFUNCTION.
经验总结
通过这个增强项目,我们发现:
- User Exit 适合简单逻辑快速实现
- BADI 更适合复杂业务规则
- 生产环境必须考虑锁和性能
- 良好的命名规范能避免很多问题
建议在开发完成后,用不同物料类型进行充分测试,特别是边界条件的验证。
正文完
