Core data services(如下简称CDS)能够指两样东西,一个是HANA CDS,一个是ABAP CDS。html
如咱们所知,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视图开发过程当中,咱们经过编辑器(一般是ADT)在ABAP层声明了咱们的字段结构和annotations。激活后,系统会自动地在数据库层生成全部的SQL视图。spa
ABAP CDS视图提供多种SQL命令和函数的支持,若是你想要了解细节和所有的可用特性,建议你看这篇文章:ABAP CDS Feature Matrix。3d
在ABAP CDS Table Function的开发过程当中,咱们将字段结构、参数(可选)、association等经过类/方法定义为实体。经过AMDP咱们能够直接在ABAP层写存储过程,而且把它封装在类/方法中,更多介绍能够看以前的文章:ABAP中的AMDP(ABAP-Managed Database Procedures 。code
由于AMDP直接运行数据库脚本,因此须要作几个额外的步骤而且会使用到脚本语言(在HANA中即SQL Script)。稍后在示例部分咱们会讨论配置的细节。htm
经过上文介绍的这两种开发技术,咱们能够开始开发一个技术示例了。按本文的例子作下去,你将会能够建立你本身的ABAP CDS Table Function,而且为不能直接经过ABAP CDS实现的需求提供解决方案。为了实现示例,咱们会使用数据库视图SFLIGHTS,这一视图提供了航班链接的细节。blog
每一个航空公司提供世界上不一样城市的航班链接,用户想要在单一字段中看到某一特定航空公司支持的全部城市,内容以逗号分隔。由于每家航空公司的城市数是不一样的,咱们须要一个逻辑来拼接城市们,不管有查询结果多少条数据。教程
在常规的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而且定义名字和描述:
选择传输请求,而后点击Next。在模板中选择最后一个选项“Define Table Function with Parameters”,而后点击Finish:
编辑生成的实体,包含如下内容:
结果应该是:
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还不存在。下一步,让咱们建立它:
让类包含IF_AMDP_MARKER_HDB接口。这一步会把你的ABAP类转换为AMDP类,而且容许在类的方法内写存储过程。
PUBLIC SECTION. INTERFACES if_amdp_marker_hdb.
在方法实现中咱们须要引入某些配置选项:
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关键字去重,由于咱们会找到在不一样的链接日期的相同的航空公司的城市记录,如图:
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中的结果:
英文原文:Concatenate multiple records in a single field using ABAP CDS Table Function 有少量改动