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

注:本文的重中之重理论内容已经包蕴在事先的英特尔P介绍小说: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 Table Function

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

lovebet体育官网 2

因为英特尔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视图。

开发

开采你的HANA Studio(只怕ADT),创设贰个新的Core Data Services ->
Data Definitio。

分选project,package并且定义名字和汇报:

lovebet体育官网 3

采取传输供给,然后点击Next。在模板中挑选最终三个选取“Define Table
Function with Parameters”,然后点击Finish:

lovebet体育官网 4

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

  • 字段:
    • Client
    • lovebet体育官网,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体育官网 5

让类包括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关键字去重,因为我们会找到在区别的一连日期的如出一辙的宇宙航行公司的都市记录,如图:

lovebet体育官网 6

速龙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语句前放一个RETU锐界N语句。别的,注意大家将字段名调换为前文中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体育官网 7

 

英文原来的小说:Concatenate multiple records in a single field using ABAP CDS
Table
Function

有些改变