zoukankan      html  css  js  c++  java
  • ABAP CDS 替换对象(Replacement Objects)引起的数据错误

    最近遇到了一个诡异的问题:从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性能分析

  • 相关阅读:
    清北学堂模拟赛d6t1 角谷猜想
    清北学堂模拟赛d4t1 a
    清北学堂模拟赛d3t6 c
    清北学堂模拟赛d3t5 c
    清北学堂模拟赛d3t4 a
    清北学堂模拟赛d3t3 c
    清北学堂模拟赛d3t1 a
    清北学堂模拟赛d2t3 逆序对(pair)
    Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)
    Android(java)学习笔记175:Android进程间通讯(IPC)之AIDL
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/7346984.html
Copyright © 2011-2022 走看看