S4基于ECC做了很多底层改进,其中一个很重要的改进就是把物料凭证的底层表从MKPF/MSEG调整到MATDOC .
具体表现为 ,从DB02的SQL编辑器中无法读取MKPF/MSEG表,但是SE16N中可以读取.原因在于S4为了重用ECC的表,在ABAP访问数据库环节添加了一个表的代理视图的概念
所有对存在代理视图的表的访问,都会用替换为访问代理视图
本文主要介绍表的代理视图的相关信息及实现方式
这个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维护一个代理视图
用ECLIPS连接S4系统,创建一个CDS视图.CDS视图中的字段需要和源表一致.内容则可以任意从其它表获取.
数据字典工具没有提供代理对象的维护入口. 可以直接更新表DD02L-VIEWREF 维护一个代理对象
CDS视图相关表的演示数据
表ZTIF001的原始数据
表ZTIF001_BACK的原始数据
SE16N显示
ZTIF001的代理对象似乎未生效.可能的原因:ABAP底层缓存机制?
ZTIF001_BACK的代理对象生效了. ZTIF001_BACK是ZTIF001维护代理对象后复制产生的表.
用ABAP程序读取表,数据内容等同于SE16N读取的.
代理视图是S4兼容ECC代码的产物,所有和库存相关的表都使用了代理视图.
写代码的时候要注意:
还有一个注意事项,因为代理视图会改变表的访问方式.
比如读取MARC会替换为读取 NSDM_V_MARC . 该视图仅仅补充了MARC中的库存相关字段内容.
如果程序仅仅想访问MARC的主数据部分内容. 可以通过视图V_MARC_MD 访问表,这样会很大程度的改进性能.(SAP官方NOTES中也提到这一点)
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)
请微信联系管理员:
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论