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教程。

注:本文的重中之重理论内容已经包蕴在从前的速龙P介绍文章:ABAP中的AMDP(ABAP-Managed
Database Procedures )

中,相比较它,本文更像一个step by step教程。

ABAP CDS视图

在一般的ABAP
CDS视图开发进程中,大家透过编辑器(经常是ADT)在ABAP层讲明了大家的字段结构和annotations。激活后,系统会活动地在数额库层生成所有的SQL视图。

图片 1

ABAP
CDS视图提供各种SQL命令和函数的支持,假如您想要通晓细节和全路的可用特性,提议你看这篇小说:ABAP
CDS Feature
Matrix

ABAP CDS视图

在日常的ABAP
CDS视图开发进程中,大家因而编辑器(平日是ADT)在ABAP层表明了大家的字段结构和annotations。激活后,系统会自行地在数量库层生成所有的SQL视图。

图片 2

ABAP
CDS视图提供二种SQL命令和函数的支持,即便您想要通晓细节和一切的可用特性,提出你看那篇作品:ABAP
CDS Feature
Matrix

ABAP CDS Table Function

在ABAP CDS Table
Function的花费进度中,大家将字段结构、参数(可选)、association等通过类/方法定义为实体。通过英特尔P我们得以平昔在ABAP层写存储进程,并且把它封装在类/方法中,更加多介绍可以看前边的文章:ABAP中的AMDP(ABAP-Managed
Database Procedures

图片 3

因为AMDP直接运行数据库脚本,所以须求做多少个附加的步子并且会选拔到脚本语言(在HANA中即SQL
Script)。稍后在示范部分大家会谈论配备的底细。

通过上文介绍的那三种开发技术,我们得以开端支付一个技巧示范了。按本文的例证做下来,你将会得以创立你协调的ABAP
CDS Table Function
,并且为不可以直接通过ABAP
CDS已毕的须要提供解决方案。为了兑现示例,大家会选择数据库视图SFLIGHTS,这一视图提供了航班连接的底细。

ABAP CDS Table Function

在ABAP CDS Table
Function的费用进程中,我们将字段结构、参数(可选)、association等通过类/方法定义为实体。通过英特尔P大家可以直接在ABAP层写存储进度,并且把它封装在类/方法中,越来越多介绍可以看此前的篇章:ABAP中的AMDP(ABAP-Managed
Database Procedures

图片 4

因为英特尔P直接运行数据库脚本,所以必要做多少个附加的步调并且会动用到脚本语言(在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并且定义名字和描述:

图片 5

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

图片 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还不存在。下一步,让我们创制它:

图片 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关键字去重,因为大家会找到在分歧的连日日期的平等的飞行集团的都会记录,如图:

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

图片 9

 

英文原稿:Concatenate multiple records in a single field using ABAP CDS
Table
Function

有少数改动

开发

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

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

图片 10

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

图片 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还不存在。下一步,让大家创制它:

图片 12

让类包涵IF_AMDP_MARKER_HDB接口。这一步会把你的ABAP类转换为英特尔P类,并且同意在类的主意内写存储进程。

  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关键字去重,因为我们会找到在差距的连天日期的平等的飞行公司的都会记录,如图:

图片 13

英特尔P的优点之一是你可以将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中的结果:

图片 14

 

英文原稿:Concatenate multiple records in a single field using ABAP CDS
Table
Function

有一定量改动