原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
项目中常常会碰到这个场景: 因为各种原因,已经导入的数据需要调整特定字段的内容.SAP提供了一个批量更改字段内容的功能. (事务代码MASS).
事务代码 MASS. 该功能只涵盖了27个对象类型及这些对象的相关表,如图1.超出这个范围则无法使用MASS修改大量数据的性能较差.
因为MASS的上述局限性.
**在项目中开发了一个批量更新工具ZUP_ANY.用于更新指定表的指定字段内容**
图一
二
MASS执行过程
先简单介绍一下通过MASS修改商品属性的过程
**_10_ **
**选定对象类型**
**_20_ **
**选择对象中的表**
**_30_ **
**选择表中的字段**
**_41_ **
**选择要修改的数据**
点击执行后, 选择要修改的数据
**_42_ **
**批量修改**
输入关键字后,系统会显示所有该数据的字段内容. 此时可以批量修改字段内容.
**_51_ **
**通过文件导入**
需要事先准备EXCEL文件, 文件中输入关键字列和要修改的字段列及内容(可以不带标题)
**_52_ **
**选择文件属性**
**_53_ **
**映射字段**
**_54_ **
**预览数据**
**_55_ **
**显示待变更数据**
进入和选择数据相同的内容(不同的是,此时目标值已经填写)
**_60_ **
**执行测试按钮**
**_70_ **
**保存修改**
点击保存,完成修改
**_80_ **
**查看结果**
查看商品的变更记录
三
通过ZUP_ANY完成该过程
通过ZUP_ANY修改商品属性的过程
_**01** _
**执行ZUP_ANY**
_**02** _
**下载模板**
下载模板,在模板中填写数据,重要字段通过批注描述字段的用法
_**03** _
**导入数据**
点击执行后,数据写入内表
_**04** _
**进入处理**
点击保存后, 进入数据处理程序
_**05** _
**执行处理**
选中行,点击处理,此时报错,因为修改的是标准表的标准字段, 所以需要配置一下.
_**06** _
**配置字段允许**
配置标准字段允许修改(ZTUP_ANY_C1)
_**07** _
**执行通过**
_**08** _
**查看变更结果**
查看商品的变更日志
四
MASS VS ZUP_ANY
对比一下MASS 与ZUP_ANY程序的优缺点.
建议还是尽量使用MASS大量变更数据, 除非碰到MASS不支持的数据对象,或者MASS性能实在太差时, 再使用ZUP_ANY更新.
_**01** _
**MASS的优点**
• 通过步骤引导用户选择要修改的对象,表,字段.通过选择或导入指定要变更的数据.
• 允许批量修改为目标值.
• 提供了测试功能,
• 记录了应用日志,
• 记录了变更文档.
• 标准程序,用户更有信心使用.
• 可以同时修改同一个表的多个字段
• 业务关联修改系统自动处理((比如MLAN-TAXM1修改后系统自动调整MARA-TAKLV)
_**02** _
**MASS的缺点**
• 支持对象有限,目前有27个对象的相关表中的字段允许修改.
• 修改增强字段需要额外配置(比如商品MARA的增强字段,需要先配置字段状态组,才能用MASS修改)
• 性能较差(因为要校验的逻辑过多)
_**03** _
**ZUP_ANY的优点**
• 任意表的非关键字都允许修改
• 默认支持自定义表或标准表的增强字段修改
• 对联合主键,允许使用通配符修改大量数据(如图二)
• 通过码表校验修改的字段内容
• 记录变更文档(自动识别待更新表/字段的变更对象)
• 记录下传控制表
• 便于处理不同数据的不同目标字段内容
• 修改信息同时记录在(ZTUP_ANY和变更文档中)
• 可以同时修改多个表的不同字段
_**04** _
**ZUP_ANY的缺点**
• 非查询式修改(待修改的数据需要用其它方式查询出来)
• 需要用户自行联合主键到一个字段中(需要注意主键顺序),如图二
• 对于标准字段的修改需要先行验证并配置(配置表:ZTUP_ANY_C1)
• 业务关联修改需要自行处理(比如MLAN-TAXM1 需要关联修改MARA-TAKLV)
• 下传控制表记录可能缺失(比如修改EKPO的字段,则无法记录采购订单的下传控制表ZTIFEKKO)
图二
五
ZUP_ANY的开发思路
ZUP_ANY按照通用导入模板开发.
> 详见连接 无峰,公众号:ABAP 技巧与实战 [ SAP工具箱 配置导入模板
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486595&idx=1&sn=e42b7e6713689b36594d418f02454d1b&chksm=cf5dd1b5f82a58a379a76ea6e71ec2f278dd0aa8bcb2897e0669a60969276befa52c4b965cee&token=109355441&lang=zh_CN#rd)
> 通用导入程序 无峰,公众号:ABAP 技巧与实战 [ SAP工具箱 通用导入程序
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486562&idx=1&sn=c128d7ca1cef276fa214d09f13ec7c43&chksm=cf5dd154f82a5842d6a8ed74f03135e82681c34097fca1df711c553226808291aba92a0fa5e6&cur_album_id=1771862497143144448&scene=189#rd)
_**01** _
**内容记录**
导入的数据写入表ZTUP_ANY
通过四个字段存放所有表变更的信息
• TABNAME 表名
• TABKEY 主键
• FIELDNAME 字段名
• FIELDVALUE 字段值
_**02** _
**处理程序**
处理程序ZUP_ANY_PROC调用处理函数Z_BAPI_ANY_TABLE_UPDATE
函数中对于传入的数据执行如下校验
• 检查传入的数据属于同一个表
• 检查传入的数据主键相同.
• 检查字段是增强字段,或者是配置表中允许的字段
• 字段内容存在与码表内容中
调用动态SQL语句更新数据后,
• 查找表对应的变更对象,写入变更表CDHDR/CDPOS,
• 查找表对应的下传控制表,写入下传控制表
主数据或单据保存后,通过配置表判断是否需要通过特定接口下传,如果需要,则把主键与接口编号写入特定的下传控制表,后续下传程序读取该下传控制表与业务表获取要下传的数据.
六
总结
ZUP_ANY 是项目中开发的一个用于更新任意表任意字段的程序.
实际使用时,可以不加限制的修改自定义表或标准表增强字段.
对于标准表字段的修改则需要谨慎对待,因为要确保该字段修改后不会影响业务处理逻辑.通过配置表ZTUP_ANY_C1来记录这个验证的结果.
后续可以考虑优化一下关联表的变更(提供一个配置表配置表字段的关联关系,包含主键的位置关系),在导入存在关联的表/字段内容后,自动产生一行关联表/字段的更新.
• 配置表字段的更新比较安全
• 主数据表字段的更新相对安全
• 单据表字段的更新则需要谨慎一些.
• 增强字段的修改相对安全些
• 标准字段的修改则需要谨慎一些
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
syjf1976
sharry_xlp
Yannick_Duan 申请进入公众号讨论群