SAP小技巧 设置表的代理视图

文摘   2024-12-05 07:25   北京  

前言

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 

申请进入公众号讨论群提问或者参与话题讨论

码农干货铺
永远要保持一种无论何时何地都逼着自己更努力更优秀来享受更好生活的学习状态
 最新文章