ABAP CDS Table Function介绍与示例

网友投稿 828 2022-10-14

ABAP CDS Table Function介绍与示例

ABAP CDS Table Function介绍与示例

参考博客:

《ABAP CDS Table Function介绍与示例》

ABAP CDS Table Function

在ABAP CDS Table Function的开发过程中,我们将字段结构、参数(可选)、association等通过类/方法定义为实体。通过AMDP我们可以直接在ABAP层写存储过程,并且把它封装在类/方法中,更多介绍可以看之前的文章:ABAP中的AMDP(ABAP-Managed Database Procedures 。

场景

每个航空公司提供世界上不同城市的航班连接,用户想要在单一字段中看到某一特定航空公司支持的所有城市,内容以逗号分隔。因为每家航空公司的城市数是不同的,我们需要一个逻辑来拼接城市们,无论有查询结果多少条数据

在常规的ABAP CDS内我们可以使用CONCAT函数,但是使用它的时候,我们需要定义固定数量的字段,既然CDS视图不能实现此处需要的处理动态逻辑,要如何处理呢?

这是一个使用ABAP CDS Table Function的绝佳场景,因为我们可以使用简单的数据库函数STRING_AGG(String Aggregation)。这个功能在SQL Script中可用,但是目前还是不支持ABAP CDS视图。

开发

编辑生成的实体,包含以下内容:

字段:

ClientAirline CodeAirline NameCities To

类: ZCL_FLIGHTS_DEMO_CDS方法: FLIGHTS_CONNECTIONS

结果应该是:

define table function ZDEMO_FLIGHTS_TABLE_FUNCTIONreturns{client : abap.clnt;airline_code : s_carr_id;airline_name : s_carrname;cities_to : abap.string;}implemented by methodZCL_FLIGHTS_DEMO_CDS=>FLIGHTS_CONNECTIONS;

当然,现在ZCL_FLIGHTS_DEMO_CDS还不存在。下一步,让我们创建它:

让类包含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 FUNCTIONFOR HDBLANGUAGE SQLSCRIPTOPTIONS READ-ONLYUSING sflights.<<你的代码>>ENDMETHOD.

让我们准备好查询分割逻辑的两个SELECT语句。

第一个SLECT需要获取Client, Airline Code, Airline Name和City To字段,并通过DISTINCT关键字去重,因为我们会找到在不同的连接日期的相同的航空公司的城市记录,

AMDP的优点之一是你可以将SELECT的查询结果传输至“内表”,并且可以执行新的SELECT来读取它的数据。让我们应用这一功能的优点,并且将第一个SELECT的语句的查询结果命名为itab_cities.

itab_cities =SELECT DISTINCTas client,asasasFROM

在第二个SELECT中,我们要从itab_cities中读取数据并且实现数据库方法STRING_AGG来聚合多个城市和航空公司。为了实现这一功能我们需要基于Client,Airline Code和Name字段GROUP BY条目。写法是:

RETURNSELECT client, airline_code, airline_name,', ' ORDER BY city_to) asFROMGROUP BY client, airline_code, airline_name;

类ZCL_FLIGHTS_DEMO_CDS的最终版本是这样的:

CLASS zcl_flights_demo_cds DEFINITION PUBLIC FINALCREATE PUBLICPUBLIC INTERFACES if_amdp_marker_hdb.CLASS-METHODS:FOR TABLE FUNCTION PROTECTED SECTION.PRIVATEENDCLASS.CLASS METHOD flights_connectionsBY DATABASE FUNCTIONFORLANGUAGEREAD-ONLYUSING itab_cities =SELECT DISTINCTas client,asasasFROM RETURNSELECT client, airline_code, airline_name,', ' ORDER BY city_to) asFROMGROUP BY client, airline_code, airline_name; ENDMETHOD.ENDCLASS.

执行结果

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:软件测试面试题:你对测试最大的兴趣在哪里?为什么?
下一篇:Jmeter在性能测试中的应用实践样例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~