共计 2116 个字符,预计需要花费 6 分钟才能阅读完成。
从业务需求说起
最近接到财务部门的需求:在物料主数据(MM03/MM02)的采购视图里增加两个字段——” 首选供应商 ” 和 ” 替代供应商 ”。标准 SAP 屏幕没有这些字段,但业务部门需要根据供应商等级做采购决策。这就是典型的屏幕增强场景:在不修改标准代码的前提下扩展系统功能。

技术方案选型
在 ABAP 世界里,实现屏幕增强主要有三种方式:
-
User Exit:老牌技术,通过预留在标准程序中的子程序(如 EXIT_开头)插入代码。优点是稳定,缺点是扩展点有限。
-
BADI:面向对象的增强方式,通过接口实现多态。适合复杂业务逻辑,但物料主数据这类简单屏幕增强略显笨重。
-
Enhancement Framework:SAP 推荐的新标准,通过 CMOD/SMOD 管理。直观可视化,适合我们这种字段级别的屏幕增强。
对于物料主数据这种标准事务码,推荐使用 Enhancement Framework + User Exit 组合方案——用 CMOD 管理界面元素,在出口函数里写业务逻辑。
实战步骤详解
第一步:定位增强点
- 事务码 MM06E005 进入物料主数据屏幕增强配置
- 在搜索框输入 ”MM02″,找到采购视图对应的屏幕号(通常是 2000)
- 记下增强点 ID:MM06E005
第二步:创建 CMOD 项目
- 事务码 CMOD,创建新项目 ZMAT_ENHANCE
- 点击 ” 增强分配 ”,输入 MM06E005
- 右键选择 ” 组件 ”→” 屏幕增强 ”
第三步:设计字段布局
关键技巧:
- 按业务逻辑分组(如把供应商相关字段放在同一区域)
- 使用 SUBSCREEN 划分功能区
- 字段名前缀统一用 Z_避免冲突
示例代码动态控制字段组显示:
MODULE z_toggle_supplier_group INPUT.
IF z_supplier_flag = 'X'.
LOOP AT SCREEN INTO DATA(ls_screen).
IF ls_screen-group1 = 'SUP'.
ls_screen-active = 1.
MODIFY SCREEN FROM ls_screen.
ENDIF.
ENDLOOP.
ENDIF.
ENDMODULE.
第四步:实现业务逻辑
在出口函数 EXIT_SAPMM06E_001 中:
FUNCTION exit_sapmm06e_001.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_AKTYP) LIKE RCUKURZ-AKTYP
*" VALUE(I_MAKTX) LIKE MAKT-MAKTX OPTIONAL
*" TABLES
*" T_MARA STRUCTURE MARA
*"----------------------------------------------------------------------" 获取当前物料号
DATA(lv_matnr) = t_mara-matnr.
" 采购视图保存时校验供应商
IF i_aktyp = 'H'. " H 代表保存操作
PERFORM z_validate_supplier.
ENDIF.
ENDFUNCTION.
生产环境注意事项
- 传输管理 :
- 为增强项目创建独立传输请求
-
与 BASIS 团队约定开发 / 测试 / 生产环境的传输路径
-
命名规范 :
- 所有自定义字段必须以 Y_或 Z_开头
-
屏幕元素命名遵循 Z < 模块 >_< 功能 > 格式(如 ZMM_SUPPLIER)
-
性能优化 :
- TABLE_CONTROL 字段避免使用 LOOP AT SCREEN
- 大数据量时用 POH 和 POV 事件替代 FIELD-GROUP
完整代码模板
*&---------------------------------------------------------------------*
*& Module Z_FIELD_VALIDATION INPUT
*&---------------------------------------------------------------------*
MODULE z_field_validation INPUT.
" 获取标准表头数据
DATA: ls_vbak TYPE vbak.
CALL FUNCTION 'SAPMV45A_GET_VBAK'
EXPORTING
i_vbeln = vbak-vbeln
IMPORTING
e_vbak = ls_vbak.
" 自定义校验逻辑
IF z_preferred_vendor IS INITIAL AND
z_alternate_vendor IS INITIAL.
MESSAGE e398(00) WITH '必须维护至少一个供应商'.
ENDIF.
ENDMODULE.
进阶思考
当多个团队都需要增强同一个屏幕时,推荐采用以下协调机制:
- 建立中央配置表 ZCUST_SCREEN_LAYOUT,记录各增强字段位置
- 开发公共函数 Z_SCREEN_COORDINATION 处理重叠区域
- 在项目启动阶段进行屏幕占位预分配
下次当你看到 MM03 屏幕上突然多出一排莫名其妙的字段时,就知道这是缺乏协调机制的典型后果了。建议在开发规范中加入屏幕增强管理制度,毕竟——好的系统架构都是从血的教训中总结出来的。
