共计 1626 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 SAP 标准系统中,主数据基本视图 3(如物料主数据的采购视图)往往无法满足企业个性化需求。例如:

- 需要增加供应商推荐评分字段
- 要求特定物料组必须填写环保认证编号
- 需根据采购组织控制字段显隐逻辑
直接修改标准程序会导致:
- SAP 版本升级时自定义代码被覆盖
- 违反 SAP 修改禁令导致合规审计问题
- 影响其他模块的标准功能调用
技术选型对比
| 增强方式 | 适用场景 | 维护难度 |
|---|---|---|
| User Exit | 简单字段扩展,SAP 预留出口 | 低 |
| BADI | 复杂业务逻辑,多场景复用 | 中 |
| Enhancement Spot | 标准程序无预留出口时的增强 | 高 |
推荐方案 :采用BADI_MATERIAL_MAINTAIN 业务加载项,优势在于:
- 支持多实现并行执行
- 可通过过滤器区分应用场景
- 标准升级时自动继承
核心实现步骤
1. SPRO 配置增强点
具体路径:
SPRO > Logistics-General > Material Master > Enhancements > Business Add-Ins
关键操作:
- 搜索
BADI_MATERIAL_MAINTAIN - 创建新实现(命名建议:
ZMM_##_ENHANCE) - 设置过滤器值为
VIEW3
2. BADI 方法实现示例
METHOD if_ex_badi_material_maintain~check_data.
" 校验环保认证编号
IF is_mara-matkl IN zcl_mat_group=>get_eco_groups( )
AND mv_eco_cert IS INITIAL.
" 多语言错误提示
MESSAGE e208(00) WITH '环保物料必须填写认证编号' INTO DATA(lv_msg).
" 标准错误处理
cv_log = abap_true.
cs_message = VALUE #( msgid = '00'
msgno = '208'
msgty = 'E' ).
ENDIF.
ENDMETHOD.
3. F4 帮助增强技巧
METHOD if_ex_badi_material_maintain~f4.
CASE iv_fieldname.
WHEN 'ZECO_CERT'.
" 调用自定义值帮助
PERFORM f4_eco_cert USING iv_help_request
CHANGING cv_value
ct_values[].
cv_processed = abap_true.
ENDCASE.
ENDMETHOD.
生产验证要点
测试用例设计
| 测试类型 | 用例示例 | 预期结果 |
|---|---|---|
| 必输校验 | 环保物料组不填认证编号 | 阻止保存 |
| 格式校验 | 输入非数字的认证编号 | 提示错误 |
| 值域联动 | 切换物料组时隐藏无关字段 | 界面刷新 |
性能监控
- 执行 ST05 开始 SQL 跟踪
- 操作增强后的视图 3
- 检查新增逻辑的数据库访问次数
- 确保没有出现全表扫描(如避免
SELECT *)
避坑指南
- 客户逻辑隔离
- 将客户特定规则配置在自定义表而非硬编码
-
使用工厂方法模式管理不同客户实现
-
多语言处理
- 错误消息文本维护在消息类而非代码中
-
动态文本使用
MESSAGE...INTO获取语言版本 -
传输管理
- 将 SPRO 配置与 ABAP 代码放在同一请求
- 使用
SCOT记录传输依赖关系
代码规范建议
"方法注释模板"----------------------------------------------------------------------
"方法名称: CHECK_DATA" 功能描述: 物料主数据保存前校验
"输入参数:" IS_MARA - 物料主数据
"输出参数:" CV_LOG - 错误标记
"异常抛出:" CX_BADI_CONTEXT_ERROR - BADI 上下文错误
"----------------------------------------------------------------------
动手实验
任务:在 IDES 系统中复现采购订单屏幕增强
- 查找采购订单对应的 BADI(建议:
ME_PROCESS_PO_CUST) - 实现字段校验逻辑(如:特定采购类型必须输入项目编号)
- 通过 ME21N 创建订单验证增强效果
提示:可使用
SE18查看 BADI 文档,注意采购订单的屏幕组是0001
正文完
