ABAP CDS Table Function介绍和示范

Core data services(以下简称CDS)可以指两样东西,一个是HANA
CDS,一个是ABAP CDS。

倘我们所知晓,HANA CDS只支持HANA数据库,ABAP
CDS理论上支持多数据库供应商,结果是,ABAP
CDS相比之下要少一些效益。因此,在好几情况下,无法以ABAP
CDS解决问题时,可以运用同样种变更的法,即通过ABAP Managed Database
Procedures
(AMDP)创建ABAP CDS Table Function

 

正文链接:http://www.cnblogs.com/hhelibeb/p/8057788.html

注:本文的机要理论内容早已包含在前的AMDP介绍文章:ABAP中的AMDP(ABAP-Managed
Database Procedures )
中,相比其,本文更如一个step by step教程。

ABAP CDS视图

在一般的ABAP
CDS视图开发进程中,我们透过编辑器(通常是ADT)在ABAP层声明了俺们的字段结构以及annotations。激活后,系统会活动地于数据库层生成有的SQL视图。

亚洲必赢bwin696.com 1

ABAP
CDS视图提供多SQL命令和函数的支持,如果您想要打听细节及全部之可用特性,建议乃看这篇稿子:ABAP
CDS Feature
Matrix。

ABAP CDS Table Function

每当ABAP CDS Table
Function的出进程被,我们将字段结构、参数(可选)、association等通过类/方法定义为实体。通过AMDP我们得一直以ABAP层写存储过程,并且把其封装在类/方法被,更多介绍好拘留之前的章:ABAP中的AMDP(ABAP-Managed
Database Procedures 。

亚洲必赢bwin696.com 2

盖AMDP直接运行数据库脚本,所以需要举行几单附加的步骤并且会以及脚本语言(在HANA中尽管SQL
Script)。稍后在示范有我们会讨论部署的底细。

由此上文介绍的当下半种植开发技术,我们可以起来开发一个技巧演示了。按本文的例证做下,你用会见得以创造而自己之ABAP
CDS Table Function
,并且也非能够直接通过ABAP
CDS实现的需求提供解决方案。为了落实示例,我们见面下数据库视图SFLIGHTS,这等同见到图供了航班连接的细节。

场景

每个航空企业供世界上不同城市的航班连接,用户想要于单一字段中来看某个平等特定航空企业支持之有着都,内容以逗号分隔。因为每家航空企业的城池数是不同之,我们要一个逻辑来拼接城市等,无论发询问结果小条数据。

当正规的ABAP
CDS内我们好行使CONCAT函数,但是利用它们的时光,我们需要定义固定数量的字段,既然CDS视图不能够兑现此需要之拍卖动态逻辑,要怎么样处理也?

立马是一个使用ABAP CDS Table
Function的绝佳场景,因为咱们得以应用简便的数据库函数STRING_AGG(String
Aggregation)。这个意义于SQL Script中可用,但是当前还是匪支持ABAP
CDS视图。

开发

开辟你的HANA Studio(或者ADT),创建一个初的Core Data Services ->
Data Definitio。

选料project,package并且定义名字与讲述:

亚洲必赢bwin696.com 3

选择传输请求,然后点击Next。在模板被挑选最后一个挑选“Define Table
Function with Parameters”,然后点击Finish:

亚洲必赢bwin696.com 4

 编辑生成的实体,包含以下内容:

  • 字段:
    • Client
    • Airline Code
    • Airline Name
    • Cities To
  • :
    ZCL_FLIGHTS_DEMO_CDS
  • 方法:
    FLIGHTS_CONNECTIONS

结果应该是:

define table function ZDEMO_FLIGHTS_TABLE_FUNCTION
returns
{
  client       : abap.clnt;
  airline_code : s_carr_id;
  airline_name : s_carrname;
  cities_to    : abap.string;
}
implemented by method
  ZCL_FLIGHTS_DEMO_CDS=>FLIGHTS_CONNECTIONS;

 当然,现在ZCL_FLIGHTS_DEMO_CDS还非在。下一致步,让我们创建它:

亚洲必赢bwin696.com 5

让类包含IF_AMDP_MARKER_HDB接口。这同一步会把您的ABAP类转换为AMDP类,并且同意在类的方外写存储过程。

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

以法实现中我们需要引入某些配置选:

  • BY DATABASE FUNCTION: 会将艺术标记为table
    function,还有一个抉择是经 BY DATABASE
    PROCEDURE
    记为存储过程.
  • FOR HDB: 设定数据库类型也HDB (HANA数据库).
  • LANGUAGE SQLSCRIPT: HANA数据库存储的语言.
  • OPTIONS READ-ONLY: 存储过程外未允许修改数据.
  • USING: 定义table
    function中花的多寡库表、视图或者存储过程。在本例中,只看SFLIGHTS
    视图.

    METHOD flights_connections

    BY DATABASE FUNCTION
    FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING sflights.
    
    <<你的代码>>
    

    ENDMETHOD.

给我们准备好查询分割逻辑的少数只SELECT语句。

先是单SLECT需要取得Client, Airline Code, Airline Name和City
To字段,并经过DISTINCT关键字去还,因为我们见面找到以不同之总是日期的如出一辙的航空企业的城池记录,如图:

亚洲必赢bwin696.com 6

AMDP的优点之一是你得用SELECT的询问结果传输至“内表”,并且可以执行新的SELECT来读取它的数据。让咱运用即无异效能的助益,并且将第一只SELECT的言辞的查询结果命名为itab_cities.

    itab_cities =
      SELECT DISTINCT 
             sflights.mandt    as client,
             sflights.carrid   as airline_code,
             sflights.carrname as airline_name,
             sflights.cityto   as city_to
        FROM sflights;

在其次单SELECT中,我们要打itab_cities面临读取数据并且实现数据库方法STRING_AGG来凑多个都市和航空企业。为了实现就同样意义我们要基于Client,Airline
Code和Name字段GROUP BY条目。写法是:

    RETURN
      SELECT client,
             airline_code,
             airline_name,
             STRING_AGG(city_to, ', ' ORDER BY city_to) as cities_to
        FROM :itab_cities
       GROUP BY client,
                airline_code,
                airline_name;

注意:table
function应永久有归参数,所以记在在结尾一个SELECT语句前放一个RETURN语句。另外,注意我们以许段名转换为前文中ABAP
CDS Table
Function声明的许段名,如果您莫提供一个得体的号,激活的时节编译器会为有提示。

 

ZCL_FLIGHTS_DEMO_CDS的最后版是这么的:

CLASS zcl_flights_demo_cds DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

    CLASS-METHODS:
      flights_connections FOR TABLE FUNCTION zdemo_flights_table_function.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_flights_demo_cds IMPLEMENTATION.

  METHOD flights_connections
    BY DATABASE FUNCTION
    FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING sflights.

    itab_cities =
      SELECT DISTINCT 
             sflights.mandt    as client,
             sflights.carrid   as airline_code,
             sflights.carrname as airline_name,
             sflights.cityto   as city_to
        FROM sflights;

    RETURN
      SELECT client,
             airline_code,
             airline_name,
             STRING_AGG(city_to, ', ' ORDER BY city_to) as cities_to
        FROM :itab_cities
       GROUP BY client,
                airline_code,
                airline_name;

  ENDMETHOD.

ENDCLASS.

每当Data Preview中的结果:

亚洲必赢bwin696.com 7

 

英文原文:Concatenate multiple records in a single field using ABAP CDS
Table
Function
有半点改动

相关文章