ABAP CDS Table Function介绍及示范。ABAP CDS Table Function介绍和示范。

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

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

若是我辈所知晓,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

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

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

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

ABAP CDS视图

于平常的ABAP
CDS视图开发进程被,我们由此编辑器(通常是ADT)在ABAP层声明了咱的字段结构与annotations。激活后,系统会自动地当数库层生成有的SQL视图。

lovebet体育官网 1

ABAP
CDS视图提供多种SQL命令和函数的支持,如果您想只要了解细节以及全的可用特性,建议你看即篇稿子:ABAP
CDS Feature
Matrix。

ABAP CDS视图

每当通常的ABAP
CDS视图开发过程中,我们经过编辑器(通常是ADT)在ABAP层声明了咱们的字段结构及annotations。激活后,系统会活动地在数码库层生成有的SQL视图。

lovebet体育官网 2

ABAP
CDS视图提供多种SQL命令和函数的支撑,如果你想如果打听细节及一切之可用特性,建议乃看这首文章:ABAP
CDS Feature
Matrix。

ABAP CDS Table Function

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

lovebet体育官网 3

为AMDP直接运行数据库脚本,所以待举行几个附加的步骤并且会用到脚本语言(在HANA中就SQL
Script)。稍后在演示有我们见面讨论部署的底细。

透过上文介绍的就点儿种植开发技术,我们可以开始开发一个艺示范了。按本文的例证做下去,你以见面可以创建而自己之ABAP
CDS Table Function
,并且也不能够直接通过ABAP
CDS实现的需提供解决方案。为了贯彻示例,我们见面下数据库视图SFLIGHTS,这同观图供了航班连接的细节。

ABAP CDS Table Function

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

lovebet体育官网 4

因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视图。

场景

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

于健康的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并且定义名字和讲述:

lovebet体育官网 5

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

lovebet体育官网 6

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

  • 字段:
    • 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还非在。下一样步,让咱创建它:

lovebet体育官网 7

让类包含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关键字去再,因为咱们会找到以不同的连续日期的相同之飞企业之市记录,如图:

lovebet体育官网 8

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中之结果:

lovebet体育官网 9

 

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

开发

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

选project,package并且定义名字以及描述:

lovebet体育官网 10

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

lovebet体育官网 11

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

  • 字段:
    • 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还无lovebet体育官网有。下同样步,让咱创建它:

lovebet体育官网 12

让类包含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关键字去再,因为我们见面找到以不同之连接日期的同样的飞行企业之都记录,如图:

lovebet体育官网 13

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中的结果:

lovebet体育官网 14

 

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