共计 1681 个字符,预计需要花费 5 分钟才能阅读完成。
业务场景分析
最近在支持一个全球采购项目时,发现现有物料主数据的增强字段 ZMATERIAL_SOURCE(原长度 10 位)无法容纳新的国际供应商编码体系(需要 12 位)。这个字段被用于 MM03 物料主数据维护界面,同时与 SRM 系统通过 IDoc 交互。直接修改字段长度可能导致:

- 现有 IDoc 报文中该字段截断风险
- 供应商门户 RFC 接口的兼容性问题
- 历史报表数据展示异常
技术方案选型
方案对比表
| 方案类型 | 优势 | 风险点 |
|---|---|---|
| 直接修改字段长度 | 开发量小,立即生效 | 需同步修改所有接口的 XSD/WS 定义 |
| BAdI 增强 | 接口层保持兼容 | 需要额外开发校验逻辑 |
最终选择 BADI_MATERIAL_MAINTAIN 增强方案,因为:
- 通过新增字段 ZMATERIAL_SOURCE_NEW 实现物理隔离
- 使用数据迁移脚本分阶段切换
- 原字段保留作过渡期兼容
核心实现步骤
1. 结构扩展(SE11)
* 在 CI_MARA 中新增字段
DATA: ls_dd04v TYPE dd04v.
ls_dd04v-rollname = 'ZMATERIAL_SOURCE_NEW'.
ls_dd04v-datatype = 'CHAR'.
ls_dd04v-leng = 12.
ls_dd04v-outputlen = 12.
CALL FUNCTION 'DDIF_FIELDINFO_PUT'
EXPORTING
tabname = 'CI_MARA'
fieldname = 'ZMATERIAL_SOURCE_NEW'
dd04v = ls_dd04v.
2. BAdI 实现(SE18)
METHOD if_ex_badi_material_maintain~check_data.
IF is_mara-zmaterial_source_new IS NOT INITIAL.
" 自动填充旧字段保持兼容
cs_mara-zmaterial_source = is_mara-zmaterial_source_new(10).
" 长度不足时警告
IF strlen(is_mara-zmaterial_source_new) > 10.
MESSAGE w398(00) WITH '新编码将被截断存储到旧字段'.
ENDIF.
ENDIF.
ENDMETHOD.
3. 数据迁移脚本
REPORT zmaterial_field_migration.
PARAMETERS: p_test AS CHECKBOX DEFAULT 'X'.
START-OF-SELECTION.
SELECT mara~matnr, zmmara~zmaterial_source
INTO TABLE @DATA(lt_mara)
FROM mara LEFT JOIN zmmara ON mara~matnr = zmmara~matnr.
LOOP AT lt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
UPDATE zmmara SET zmaterial_source_new = <fs_mara>-zmaterial_source
WHERE matnr = <fs_mara>-matnr.
IF p_test = abap_false.
UPDATE zmmara SET zmaterial_source = space " 清空旧字段
WHERE matnr = <fs_mara>-matnr.
ENDIF.
ENDLOOP.
生产环境检查清单
必须验证的关联对象
- IDoc 类型 MATMAS 的字段映射
- RFC 函数模块 BAPI_MATERIAL_SAVEDATA
- 所有使用 ZMMARA 表的 CDS 视图
接口兼容性检查项
- [] 检查 WE20 中所有 MATMAS 类型的端口配置
- [] 验证 SRM 系统的 Web Service 响应报文
- [] 测试 BAPI 批量导入场景
延伸思考题
- 如果新旧字段需要长期共存,如何设计数据同步机制?
- 当字段扩展到 20 位时,CHAR 类型是否仍是最优选择?
- 如何通过 CDS View 实现字段版本的透明访问?
动手实验
在沙箱系统尝试以下操作:
- 使用 SE11 复制结构 CI_MARA 到 ZCI_MARA_TEST
- 添加测试字段 ZTEST_FIELD(CHAR12)
- 创建简单报表显示该字段
- 通过 SM30 维护测试数据
提示:可使用事务码 SE16N 直接查看表内容变化
正文完
