共计 1654 个字符,预计需要花费 5 分钟才能阅读完成。
业务场景:字段长度不足引发的血案
上周业务部门突然反馈,有批进口物料在创建时报错 ”Field ZMAT_DESC overflow”。排查发现是十年前增强的 20 位文本字段不够用了(现在物料规格描述越来越复杂)。SE16N 查 MARA-ZMAT_DESC 字段果然看到大量尾部被截断的数据,采购员不得不把备注拆成多条记录维护 …

技术方案选型:标准表修改 vs 增强表
- 直接修改标准表
- 优点:开发量小,直接 ALTER TABLE 修改字段长度
-
致命缺点:需要向 SAP 申请修改授权,后续升级可能被覆盖
-
CI_* 增强表方案
- 优点:官方推荐,通过 APPEND 结构实现字段扩展
- 缺点:需要改造现有程序读取逻辑
最终选择方案二,因为:
– 现有程序已使用 BAPI_* 函数组
– 字段用于质检说明非关键字段
– 未来可能需兼容 S /4HANA
实战步骤分解
Step 1. 扩展 CI_MARA 表结构
- SE11 进入 CI_MARA 表
- 菜单栏选择 ”Append Structure”
- 新建结构 ZCI_MARA,增加字段:
ZMAT_DESC CHAR100 " 从 CHAR20 扩展到 CHAR100
关键点:
– 必须勾选 ”Client-specific”
– 字段名需与原始字段完全一致
Step 2. 增强 BAPI_MATERIAL_SAVE
在函数组 BAPI_MATERIAL_SAVE 中添加增强点:
METHOD extensionin_update.
DATA: ls_extension TYPE bapiextc,
ls_mara_ci TYPE zci_mara.
LOOP AT im_extension INTO ls_extension
WHERE structure = 'ZCI_MARA'.
MOVE-CORRESPONDING ls_extension-data TO ls_mara_ci.
" 数据长度校验
IF strlen(ls_mara_ci-zmat_desc) > 100.
RAISE EXCEPTION TYPE cx_bapi_error
EXPORTING
textid = '字段 ZMAT_DESC 超过 100 字符限制'.
ENDIF.
MODIFY zci_mara FROM ls_mara_ci.
ENDLOOP.
ENDMETHOD.
Step 3. 历史数据迁移脚本
使用 SSCN1 创建批量作业:
DATA: lt_mara TYPE STANDARD TABLE OF mara,
ls_ci TYPE zci_mara.
SELECT * FROM mara INTO TABLE lt_mara
WHERE zmat_desc IS NOT NULL.
LOOP AT lt_mara ASSIGNING FIELD-SYMBOL(<fs_mara>).
ls_ci-mandt = sy-mandt.
ls_ci-matnr = <fs_mara>-matnr.
ls_ci-zmat_desc = <fs_mara>-zmat_desc.
MODIFY zci_mara FROM ls_ci.
" 每 1000 条提交一次
IF sy-tabix MOD 1000 = 0.
COMMIT WORK AND WAIT.
ENDIF.
ENDLOOP.
性能与安全要点
内存优化技巧
- 使用 FETCH SIZE 分页查询
- 禁用表缓存:
SELECT ... BYPASSING BUFFER - 大表迁移采用后台作业
BDC 补录注意事项
- 必须设置
KEEP = 'X'保持会话 - 使用
BDC_INSERT_UPDATE模式 - 添加
NO_DISPLAY参数减少 GUI 负载
避坑指南
- SM30 锁机制
- 维护视图时默认锁整个表
-
解决方案:自定义事务码添加
SCOPE=2参数 -
跨系统传输
- 必须包含以下对象:
- 表结构 ZCI_MARA
- BAPI 增强
- 屏幕程序(如果有)
- 传输顺序:结构 -> 程序 ->BAPI
后续思考
当业务部门反馈某批物料描述需要回退到旧版本时,我们该如何设计版本控制系统?可以考虑:
– 在增强表中添加时间戳字段
– 使用 CDS 视图实现历史版本查询
– 开发专用的版本对比事务码
整个改造过程历时 3 天(含测试),关键是要确保:
1. 生产环境迁移选择业务低峰期
2. 提前备份 ZCI_MARA 表数据
3. 更新所有相关接口程序的字段长度检查逻辑
正文完
