Function介绍与示范,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视图。

图片 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等通过类/方法定义为实体。通过IntelP咱们得以直接在ABAP层写存储过程,并且把它封装在类/方法中,更多介绍可以看从前的篇章:ABAP中的AMDP(ABAP-Managed
Database Procedures

图片 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 瑟维斯s ->
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类转换为英特尔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关键字去重,因为我们会找到在不同的连日日期的同一的航空公司的城池记录,如图:

图片 8

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

图片 9

 

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

有有限改动

开发

开辟你的HANA Studio(或者ADT),创制一个新的Core Data Service(Service)s ->
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类转换为IntelP类,并且同目的在于类的点子内写存储过程。

  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

有一定量改动