最近遇到了一个诡异的问题:从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的记录表明,实际上目标被重定向(Redirected)到了视图“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 ...

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

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

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

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

      2242679 - Redirect inconsistency - Proxy Substitution

作为开发者,在创建CDS视图的时候,我们需要意识到替代对象存在的可能性...如果一个数据库表或视图存在替代对象,而我们在写DDL代码的时候没有注意这一点,便有可能从不准确的数据源获取数据,从而产生错误。

要纠正上文中的CDS视图代码,就要把其中的MCHB改为NSDM_E_MCHB。

要如何得知一个数据库表或者视图是否存在代理对象呢?以表MCHB为例,可以进入事务SE11,点击菜单栏的 附加——代理对象(也可能被翻译成“替代对象”等..),在弹出窗口中查看:

进入Eclipse查看该对象:

相关阅读:使用PlanViz进行ABAP CDS性能分析

ABAP CDS 替换对象(Replacement Objects)引起的数据错误的更多相关文章

  1. 使用PlanViz进行ABAP CDS性能分析

    如管理学学者彼得·德鲁克所说:你无法管理你不能衡量的东西( If you can't measure it, you can't manage it).要对已有程序进行性能优化,首先要对它的运行状况做 ...

  2. HANA CDS与ABAP CDS

    如果你在网络或者SCN上面搜索CDS,即SAP的Core Data Services,你会很容易地找到类似“Core Data Services(CDS)是一个在SAP HANA中用于定义和消费富语义 ...

  3. 教程:基于访问控制的ABAP CDS视图权限

    Hi! 对每一个CDS视图,我们都可以通过DCL(Data Control Language)定义访问控制.在这篇文章中,我会介绍ABAP CDS视图中非常重要的一面:权限管理. 本文的阐述基于我正在 ...

  4. CDS测试框架介绍:如何为ABAP CDS Entities写测试

    动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...

  5. 使用ABAP CDS视图创建服务

    介绍本文介绍使用ABAP Core Data Services创建OData服务的最快方法. 给出了有关@ OData.publish注释利用率,对数据源CDS实体的引用和从DDIC结构导入的详细信息 ...

  6. ABAP CDS - Syntax

    The syntax of the DDL and of the DCL of the ABAP CDS comprises elements of the general DDL and DCL o ...

  7. ABAP CDS - 字符串函数

    下表显示了ABAP CDS中CDS视图中字符串的潜在SQL函数,以及对参数的要求.函数的含义可以在字符串的SQL函数下找到. 函数 参数类型 返回类型 CONCAT(arg1, arg2) See b ...

  8. ABAP CDS-介绍(ABAP CDS视图)

    前言 文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 在SAP发展到SAP HANA版本之后,SAP内部的技术正在快速地变化,SAP开发业务应用程序的方式已经发生了范式转变(根本 ...

  9. ABAP CDS-Part 1(ABAP CDS实体)

    文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 目录 预备条件 一.概述 二.ABAP CDS实体(CDS Entity) a.定义ABAP CDS Views b.ABAP C ...

随机推荐

  1. shiro源码篇 - shiro的session共享,你值得拥有

    前言 开心一刻 老师对小明说:"乳就是小的意思,比如乳猪就是小猪,乳名就是小名,请你用乳字造个句" 小明:"我家很穷,只能住在40平米的乳房" 老师:" ...

  2. EntityFramework附加实体

    //0.0创建修改的 实体对象 Models.BlogArticle model = new BlogArticle(); model.AId = 12; model.ATitle = "新 ...

  3. Java基础之基础语法

    前言:Java内功心法之基础语法,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 一个Java程序可以认为是一系列对象的集合,而这些对象通过调 ...

  4. FFmpeg封装格式处理

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506636.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  5. 关于toggle事件委托的处理

    当html页面加载后,页面上需要再次动态加载的按钮等事件的绑定,我们有两种处理方案 一.再次加载后进行绑定 二.使用委托进行绑定 而toggle事件是无法直接绑定的,这时可以转化为click的事件,并 ...

  6. ECharts图表实战经验1:如何设置图表同序列不同数据点的独立颜色值

    最近有不少朋友在追问这样一个问题:我单序列的柱状图,我想让每一个根柱子的颜色都不一样,应该如何做? 针对这个问题,其实我只想说你压根没有认真看完或者查找ECharts官方的示例,官方能够找到的示例有: ...

  7. 浏览器与Tomcat交互

    浏览器与Tomcat交互 Web开发者都知道在Tomcat下部署应用后启动Tomcat即可通过浏览器与Tomcat建立连接. 那么二者之间的连接建立过程是怎么样的呢?(在此,我们不具体讲述关于网络底层 ...

  8. ajax提交form表单问题

    form表单提交数据可以省下大量大量获取元素的代码,局部刷新时也可以用ajax提交form表单,但是要先把表单序列化,再把后台javaBean对象序列化,但是你有可能前后台都执行了系列化,但是后台还是 ...

  9. 深入理解JVM——对象

    对象的创建 虚拟机遇到一条new指令时,首先检查指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,必须先执行相应的类加载过程. 接下 ...

  10. 使用js从element的matrix推导transform的scale、rotate 和 translate参数

    transform 网上很多都只介绍了还原角度和缩放的参数,但是没有就偏移量的计算,自己还原了一下公式的意义,进行了公式的反推,具体的推到过程就不详叙了,可以参看w3c的矩阵含义. 直接上干货. fu ...