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

图片 1

ABAP
CDS视图提供各种SQL命令和函数的协助,假诺您想要明白细节和总体的可用性格,建议您看那篇小说:ABAP
CDS Feature
Matrix

ABAP CDS Table Function

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

图片 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而且定义名字和陈诉:

图片 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类转变为英特尔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关键字去重,因为我们会找到在分歧的接连日期的等同的航空集团的城阙记录,如图:

图片 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语句前放贰个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中的结果:

图片 7

 

德语原来的书文:Concatenate multiple records in a single field using ABAP CDS
Table
Function

有有限退换