海洋世界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视图。

海洋世界 1

ABAP
CDS视图提供多种SQL命令和函数的支撑,倘使您想要了然细节和整体的可用特性,提出您看这篇作品:ABAP
CDS Feature
Matrix

ABAP CDS Table Function

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

海洋世界 2

因为IntelP直接运行数据库脚本,所以需要做多少个附加的步骤并且会动用到脚本语言(在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 瑟维斯(Service)s ->
Data Definitio。

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

海洋世界 3

采用传输请求,然后点击Next。在模板中挑选末了一个抉择“Define Table
Function with Parameters”,然后点击Finish:

海洋世界 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还不存在。下一步,让咱们创制它:

海洋世界 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关键字去重,因为大家会找到在不同的连接日期的同一的飞行集团的城池记录,如图:

海洋世界 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中的结果:

海洋世界 7

 

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

有有限改动