码迷,mamicode.com
首页 > 其他好文 > 详细

ABAP CDS 替代对象(Replacement Objects)引起的数据错误

时间:2017-08-14 21:21:40      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:查询   pen   into   try   sign   ann   value   proxy   man   

 

最近遇到了一个诡异的问题:从CDS视图中取得的数据,和从透明表中取得的数据,会有不同的值。在这里记录下问题的表现和解决方案,以供参考。

系统版本:S/4HANA OP1610

涉及表:MCHB

 

本文链接:http://www.cnblogs.com/hhelibeb/p/7346984.html

 

最近写了一个CDS视图:

@AbapCatalog.sqlViewName: ZCI_TEST
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: QAQ
define view ZTEST001_11 as select from mchb
{
matnr,
charg,
lgort,
werks,
clabs
}
where clabs > 0

一段简单得不能再简单的代码。但是在测试系统上使用时,问题发生了:无法从这个CDS view中查询到任何数据。

无论是通过Open SQL代码查询也好、在SE16中查询也好、将CDS view替换为CDS entity也好,通通查不到任何数据..

测试系统中毫无疑问是有着相应的数据的,怎么会取不到呢。难道是条件语句出错?抱着试试看的态度,我去掉了DDL代码中的where条件。

@AbapCatalog.sqlViewName: ZCI_TEST
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: QAQ
define view ZTEST001_11 as select from mchb
{
matnr,
charg,
lgort,
werks,
clabs
}

 

这下子数据出现了,之前查不出数据的原因也出现了:在这个视图中,所有行的clabs值均为初始值0。但在表MCHB中是存在clabs > 0 的记录的,为什么会仅仅因为通过CDS视图查询便得不到正确的clabs值呢?

为了进一步证明二者查询结果的不一致,我写下了以下的SQL:

SELECT matnr, charg, lgort, werks, clabs FROM mchb 
INTO TABLE @DATA(gt_mchb)

通过调试器观察数据,可以得到:

技术分享

如图所示,表MHCB至少存在多个clabs > 0的行。

接着,把SQL变成:

SELECT matnr, charg, lgort, werks, clabs FROM zci_test 
INTO TABLE @DATA(gt_mchb) 

结果中的clabs全部 = 0:

技术分享

这下可头疼了...百思不得其解之下,前往了SCN提问

在热心网友的提示下,我是用ST05追踪了这两个SQL,意外地发现了原因。以下是第一段Open SQL语句的追踪结果:

技术分享

 

注意红框内的部分。虽然我的Open SQL中的FROM的目标是表MCHB,但ST05的记录表明,实际上目标被重定向到了视图“NSDM_V_MCHB”。

那么什么是重定向呢?查阅文档可以得知:

A CDS view can be assigned to a transparent database table and classic database view in ABAP Dictionary as a replacement object using the name of its CDS entity. A prerequisite is that the structure type defined by the CDS view matches the structure of the database table or classic view ...

也就是说,在HANA中,我们看到的表或者视图,和在程序中通过Open SQL访问到的对象,未必是一个东西。SAP可以将一个替代对象(Replacement Objects)分配给标准的表和视图。如这个词的字面所示,当替代对象存在时,大部分对数据库表的查询访问会被重定向到替代对象之上。

开发者也可以自己建立替代对象,但只能分配给自定义表或视图。

这一功能的存在和应用似乎和SAP对数据模型的调整有关。

相关note: 2206980 - Material Inventory Managment: change of data model in S/4HANA

      2242679 - Redirect inconsistency - Proxy Substitution

 

ABAP CDS 替代对象(Replacement Objects)引起的数据错误

标签:查询   pen   into   try   sign   ann   value   proxy   man   

原文地址:http://www.cnblogs.com/hhelibeb/p/7346984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!