一
前言
前文介绍了表的代理对象
详见链接
无峰,公众号:ABAP 技巧与实战SAP小技巧 设置表的代理视图
在项目中涉及到对原有表结构的调整,尝试使用表的代理对象来简化这个调整,
所以梳理了一下和代理对象相关的一些知识点,并逐一验证.
本文主要介绍表及表的代理对象的关系及相关的写入,查询操作
二
表的代理对象
一般情况下, 表的代理对象都是一个CDS视图. 所以后文中也把代理对象称呼为代理视图
SAP没有给标准工具, 可以通过修改DD02L给表设置一个代理对象.
设置后,通过SE16N 查看表时,可以看到这个信息
标准视图(SE11创建的视图)也能用作为代理视图
三
知识点
尝试在实际应用中使用表的代理对象时,需要了解如下知识点
表的字段集与视图字段集关系
表的记录与代理视图的记录关系
表的写入
表的读取
什么情况使用代理视图
CDS怎么访问表
01
表的字段集与视图字段集关系
表的字段集和视图的字段集最好一致,如果不一致,可能以表的字段集为准, 但也可能会报DUMP错误
比如表ZTS_AGENT_CDS定义如下
表ZTS_AGENT_CDS_1 定义如下
视图定义如下
给表 ZTS_AGENT_CDS 设置代理视图 ZDDL_AGENT_CDS
二者字段集合不一致. 实际读取表内容时,系统DUMP .
表ZTS_AGENT_CDS 加上缺少的字段后. 就可以显示内容了
02
表的记录与代理视图的记录关系
因为代理视图完全代替了对表的读取访问, 所以只能读到代理视图的数据,表本身的数据在ABAP中无法读取, 但是通过HANA SQL则可读取,下图时分别从SE16N读取的表内容和从HANA SQL编辑器读取的内容 . 可以看出差异
03
表的写入
表的写入操作正常,通过正常的MODIFY INSET UPDATE 语句均可,也可以通过SE16N维护数据内容.需要注意的,SE16N维护时,保存后数据就会改变成代理视图的内容, 会出现输入保存后数据改变的奇怪情况(比如代理视图的字段取代了表中的字段,该字段内容的维护就会出现上述奇怪现象)
04
表的读取
表的读取没有什么区别, 正常访问该表即可, ABAP访问数据库时,会替换去读取代理视图.返回给ABAP的SQL语句的结果集, SE16N查看表内容时,可以看到对应的代理视图.
05
什么情况使用代理视图
一般情况下,自定义开发无需使用代理视图.
在特定项目中, 碰到了用户把一个大表按特定类别拆分到很多个小表及备份表中.(大表/小表的关键字内容一致).
因为业务改动,需要添加一段额外逻辑回写数据到大表的几个附加字段中, 这些字段同时需要带入到子表及备份表中. 大表中这几个字段内容可能重算. 此时需要同步更新多个相关表.
为了性能考虑, 可以把这几个字段放到一个与大表主键一致的附加表中. 其它表添加字段及代理视图(表内容内关联附加表).
这样做的好处时,只需要在一个地方计算或重算这个附加表内容. 所有通过代理视图访问的表就直接可以获取最新的数据.
CDS视图怎么访问有代理视图的表
在CDS视图中不能直接访问表,因为CDS视图中使用的SQL 不是ABAP SQL,没有执行ABAP语句转换成代理视图的逻辑,所以访问的是原表内容.
这种情况必须注意只能在CDS中访问表的代理视图,以避免数据不完整.
S4中所有存在代理视图的表,比如 MSEG .不能在CDS视图中使用,只能使用原表 MATDOC或代理视图NSDM_V_MSEG
四
总结
表的代理视图在正常的项目开发中一般用不到, 只有在变更项目中,如果不想对原有逻辑做过多的调整,可以使用代理视图,避免干扰所有原有的取数逻辑.
比如ECC->S4 就是一个很大的变更项目. 为了保护所有原有的程序, SAP用代理视图取代了对原本MSEG MARC MARD 等表内容的访问.
THE
END
约定
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)
请微信联系管理员:
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论