ABAP on HANA之CDS Association和Path Expression

本文阐述了ABAP CDS association的概念,并且展示了在CDS视图中和SQL语句中写路径表达式(Path Expression)代码的方法。我也会解释如何在CDS asociation中指定inner join——默认情况下是left outer join,以及如何为association添加过滤。

对于CDS的相关开发,SAP希望我们使用association而不是join,因为association更加接近“概念思维”。基本上,association本身不是join,它只是有关join连接可能性的元数据,它会按需成为join。真实的join会在路径表达式使用association的时候被创建。

一个简单的CDS association例子,它看起来和left outer join没区别:

@AbapCatalog.sqlViewName: ‘ZCDS_ASSOC11‘
define view zcds_assoc1 as select from scarr as sca
   association [0..1] to spfli as _spfli
   on sca.carrid = _spfli.carrid
   { * }

暴露CDS association的例子:

@AbapCatalog.sqlViewName: ‘ZCDS_ASSOC41‘
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view zcds_assoc4 as select from sairport as sair
    association [1..*] to spfli as _spfli on
        $projection.airportfrom = _spfli.airpfrom
    {
       sair.id as airportfrom,
       sair.name,
       sair.time_zone,
      -- exposing association
      _spfli
    }

在下面的例子里,你可以看到SPFLI表对SFLIGHT表和SAIRPORT表的association。通过别名alias _sfli和SFLIGHT和_sair,SAIRPORT的全部字段暴露在projection列表中。当路径表达式用于调用association时,会根据选择字段创建join条件:spfli.carrid = sflight.carrid and spfli.connid = sflight.connid and on spfli.airport = sairport.id。

@AbapCatalog.sqlViewName: ‘ZCDS_ASSOC21‘
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view zcds_assoc2 as select from spfli
   association to sflight as _sfli on
        spfli.carrid = _sfli.carrid and
        spfli.connid = _sfli.connid
    association [1..1] to sairport as _sair on
        $projection.airportfrom = _sair.id
    {
      spfli.carrid,
      spfli.connid,
      spfli.airpfrom as airportfrom,
      -- exposing association
      _sfli,
      _sair
    }

在下面的例子里,定义association时使用了上面的CDS entity,ZCDS_ASSOC2 :

@AbapCatalog.sqlViewName: ‘ZCDS_ASSOC31‘
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view zcds_assoc3 as select from scarr
        association [1..1] to zcds_assoc2  as _cdsassoc on
         $projection.carrierid = _cdsassoc.carrid
      {
         scarr.carrid as carrierid,
     -- Exposing Association
         _cdsassoc
      } 

Open SQL语句中的路径表达式:在SQL语句中调用CDS association,需要使用如下的路径表达式。在上面的CDS association中,通过_cdsassoc暴露了完整的projection列表。

DATA(w_dbfeature) = cl_abap_dbfeatures=>use_features(  requested_features = VALUE #( ( cl_abap_dbfeatures=>views_with_parameters ) ) ).
IF w_dbfeature IS NOT INITIAL.
  SELECT  carrierid ,
          \_cdsassoc\_sfli-fldate AS flightdate,
          \_cdsassoc\_sair-name AS flightname
        FROM zcds_assoc3
        WHERE carrierid = @carrid
        INTO TABLE @DATA(t_data1).
ENDIF.

CDS视图中的路径表达式:

@AbapCatalog.sqlViewName: ‘ZCDS_ON_ASSOC1‘
define view zcds_on_assoc with parameters airport: S_FROMAIRP  as select from zcds_assoc2 as cds2
    {
      cds2.carrid,
      cds2.connid,
      cds2.airportfrom,
      cds2._sair.name, -- use inner join...by default association uses left outer join
      cds2._sfli.planetype
    }
 where cds2.airportfrom = :airport 

如我所提到的那样,在被路径表达式调用时,CDS association会默认创建left outer join。

在SPFLI表数据中,没有RTM机场的航班。

当我们输入参数airport = RTM的时候 ,下面的CDS视图的查询结果会是一条RTM机场的数据,但是这条记录里没有carrid。

@AbapCatalog.sqlViewName: ‘ZCDS_ON_ASSOC41‘
define view zcds_on_assoc4 with parameters airport: S_FROMAIRP as select from zcds_assoc4 as cds_assoc
    {
      cds_assoc.airportfrom,
      cds_assoc.name,
      cds_assoc.time_zone,
      cds_assoc._spfli.carrid -- use inner join...by default association uses left outer join
    }
 where cds_assoc.airportfrom = :airport 

运行上面的CDS视图:

data preview中的结果:

为了把默认的left outer join变成inner join,我们需要使用[inner],如下:

@AbapCatalog.sqlViewName: ‘ZCDS_ON_ASSOC41‘
define view zcds_on_assoc4 with parameters airport: S_FROMAIRP as select from zcds_assoc4 as cds_assoc
    {
      cds_assoc.airportfrom,
      cds_assoc.name,
      cds_assoc.time_zone,
      cds_assoc._spfli[inner].carrid -- use inner join...by default association uses left outer join
    }
 where cds_assoc.airportfrom = :airport 

如果运行它,输入参数RTM,得到的结果为空:

目前,还不可以在CDS association中使用right outer join。

CDS association中的过滤例子如下:

@AbapCatalog.sqlViewName: ‘ZCDS_ASSOC_FILT‘
define view ZCDS_ASSOC_FILTER  as select from zcds_assoc2 as cds2
    {
      cds2._sair[ id = ‘TYO‘ ].name,
      cds2._sfli.planetype
    }

CDS视图的输出结果:

希望本文对你有帮助!

本文链接:https://www.cnblogs.com/hhelibeb/p/9202781.html

英文原文:CDS Associations and 路径表达式s – ABAP on HANA

参考阅读:ABAP 7.52 中的Open SQL新特性

       HANA CDS与ABAP CDS

原文地址:https://www.cnblogs.com/hhelibeb/p/9202781.html

时间: 2024-10-08 03:29:20

ABAP on HANA之CDS Association和Path Expression的相关文章

ABAP CDS ON HANA-(7)CDSビューでの集約

Aggregate expression in CDS View An aggregate expression calculates a single value from an operand operand by calling an aggregate function from multiple rows of a results set. They need Group By clause to aggregate values from multiple rows and  the

CDS视图篇 2

核心数据服务 (CDS) 公司希望使用 SAPS/4HANA 核心数据服务 (CDS) 视图技术.需要学习 CDS 视 图的概念和结构以及语法 . ● 核心数据服务是用于业务实体的 SAP 战略建模方法. ● SAP HANA 视图通过脚本式 ABAP 代码创建. ● CDS 对于更多用例(例如,搜索)而言是高度灵活的 . ● CDS 是脚本式的(含有扩展的 SQL). ● CDS 与 ABAP 完全集成:生命周期.权限管理等. ABAP中的 CDS 支持代码下推到数据库层,通过ABAP 中的

[转载]大道至简!!!从SAP HANA作为SAP加速器的方式,看ERP on HANA的春天

I AM A ABAPER! 科技的进步,一定会使一些东西变得越来越精简! 大道至简!!! 文章很好!!!!!!!!!!! -------------------------------------------------------------------------------------------------------------------------- 转自:http://blog.sina.com.cn/s/blog_9154db5301019udr.html%20 说到HANA

Delphi开发单机瘦数据库程序要点(后缀cds)

一.概述 Delphi作为Windows下的一种快速开发工具,不仅能开发一般的Windows应用程序,而且还具有强大的数据库应用程序开发功能.Delphi本身提供了对BDE,ODBC,ADO和InterBase几种数据库驱动的支持,能够满足不同应用对数据库程序开发的需要. 然而,在发布用Delphi开发的数据库程序时,除了要安装应用程序之外,还需要同时发布数据库驱动程序.这对于一些只涉及单个或多个简单表数据存储的单机应用程序来说,就显得有点头重脚轻的感觉了.况且,有些应用程序本身需要存储大量数据

【ABAP系列】SAP ABAP7.40新语法简介第一篇

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简介第一篇 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 SAP的系统不断的更新 7.40已经出来很久了,一直忙着没有更新7.40新语法内容 慢慢写点新语法的相关内容 首先说一下7.40的特点及简介 1.ABAP 7.40是AS ABAP 7.31(也称为ABAP 7.

如何在SAP Cloud Platform ABAP编程环境里创建一个employee

用ABAP Development Tool登录SAP Cloud Platform ABAP编程环境后,对ABAP项目点击右键,选择属性,从而找到该环境的web访问的url: https://325df18f-0b6b-4d85-a127-ee6ad7437a7c.abap.eu10.hana.ondemand.com 登录web界面,实际上是一个Fiori UI,点击tile Maintain employee: 新建一个employee: 维护email地址: 给其维护业务角色: 要获取更

PAT Advanced 1053 Path of Equal Weight (30) [树的遍历]

题目 Given a non-empty tree with root R, and with weight Wi assigned to each tree node Ti. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L. Now given any weighted tree,

【JEMTER】后置处理器JSON Path Extractor获取server端返回的json中某项值

需求1:点击所有报表模板时,server端返回所有报表模板的ID(templateId),测试时需要下载某个模板生成的报表 需求2:点击单个报表模板时,server端返回这个报表模板下的所有报表ID(fileId),获取到fileID以后便可以下载此报表 实现:添加后置处理器 配置后置处理器参数: 配置获取报表ID ---destination variable name:获取到对应的值以后,保存到的变量名 ---JSON PATH Expression 取对应值的json表达式 配置获取文件I

Json Path 语法详解(Java)

Jayway JsonPath A Java DSL for reading JSON documents. Jayway JsonPath is a Java port of Stefan Goessner JsonPath implementation. News 05 Jul 2017 - Released JsonPath 2.4.0 26 Jun 2017 - Released JsonPath 2.3.0 29 Feb 2016 - Released JsonPath 2.2.0 2