原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
S4基于ECC做了很多底层改进,其中一个很重要的改进就是把物料凭证的底层表从MKPF/MSEG调整到MATDOC .
具体表现为
,从DB02的SQL编辑器中无法读取MKPF/MSEG表,但是SE16N中可以读取.原因在于S4为了重用ECC的表,在ABAP访问数据库环节添加了一个表的代理视图的概念
所有对存在代理视图的表的访问,都会用替换为访问代理视图
**本文主要介绍表的代理视图的相关信息及实现方式**
二
S4中底层结构改进
这个NOTES详细介绍了和物料凭证及库存相关的底层存储的改进,感兴趣的可以找来看看.
2206980 - Material Inventory Managment_ change of data model in S4HANA
三
代理表示例
以物料凭证抬头表MKPF为例,我们看看代理对象对表的影响
• 事务代码SE16N可以查看代理对象名称,可以查询到记录 如图一
• SQL编辑器直接访问MKPF表,无法查询到数据,如图二
• SQL编辑器访问MKPF的代理对象 NSDM_V_MKPF 可以获取数据,如图三
如果你用MARD 做上面的测试, 会发现更有趣的现象, 用SQL编辑器可以读取MARD内容,但仅仅库存数量字段如LABST 值为0.
图一
图二
图三
四
表代理对象的应用
S4调整了物料凭证的底层存储,如果没有代理对象的概念,调整使用到物料凭证表的程序的工作量会非常巨大.
SAP采用了一个很巧妙的方式解决了这个问题
• 保留源表MKPF/MSEG的数据定义
• 使用代理对象视图替换对MKPF/MSEG的访问
这样就确保了所有ABAP层面的程序无需改动(除非该程序用native SQL 直接访问数据库)
这个思路也可以应用于升级项目:如果升级项目期望调整源表的数据存储,但希望延用原有的程序.可以对该表定义代理对象.用视图的访问替代表的访问
五
创建表的代理对象
S4中的表维护工具(SE11)没有开放修改代理对象字段,但我们可以直接修改DD02L表添加代理对象,
下面的步骤演示了怎么给表ZTIF001维护一个代理视图
_**01** _
**创建CDS视图**
用ECLIPS连接S4系统,创建一个CDS视图.CDS视图中的字段需要和源表一致.内容则可以任意从其它表获取.
_**02** _
**维护表的代理对象**
数据字典工具没有提供代理对象的维护入口. 可以直接更新表DD02L-VIEWREF 维护一个代理对象
_**03** _
**演示数据**
CDS视图相关表的演示数据
表ZTIF001的原始数据
表ZTIF001_BACK的原始数据
**_04_ **
**实现效果**
SE16N显示
ZTIF001的代理对象似乎未生效.可能的原因:ABAP底层缓存机制?
ZTIF001_BACK的代理对象生效了. ZTIF001_BACK是ZTIF001维护代理对象后复制产生的表.
_**05** _
**程序读取**
用ABAP程序读取表,数据内容等同于SE16N读取的.
_**06** _
**重激活表**
用SE11重新激活表ZTIF001.代理对象生效
六
总结
代理视图是S4兼容ECC代码的产物,所有和库存相关的表都使用了代理视图.
• 如果使用native SQL访问数据,或者外部程序通过SQL访问数据,需要使用表的代理对象视图访问.
• 如果在ABAP中访问,则二者皆可
还有一个注意事项,因为代理视图会改变表的访问方式.
比如读取MARC会替换为读取 NSDM_V_MARC . 该视图仅仅补充了MARC中的库存相关字段内容.
**如果程序仅仅想访问MARC的主数据部分内容. 可以通过视图V_MARC_MD
访问表,这样会很大程度的改进性能.(SAP官方NOTES中也提到这一点)**
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论