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

ABAPCDSTableFunction介绍与示例_python

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

  • 字段:
  • Client
  • Airline Code
  • Airline Name
  • Cities To
  • : ZCL_FLIGHTS_DEMO_CDS
  • 方法: FLIGHTS_CONNECTIONS

结果应该是:

define table function ZDEMO_FLIGHTS_TABLE_FUNCTIONreturns{abap.clnt;s_carr_id;s_carrname;abap.string;}implemented by method>FLIGHTS_CONNECTIONS;

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

ABAPCDSTableFunction介绍与示例_sql_02

让类包含IF_AMDP_MARKER_HDB接口。这一步会把你的ABAP类转换为AMDP类,并且允许在类的方法内写存储过程。

PUBLIC SECTION.
INTERFACES

在方法实现中我们需要引入某些配置选项:

  • 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 DATABASE FUNCTIONHDBSQLSCRIPTREAD-ONLYsflights.
<<你的代码>>
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;

注意:table function应永远有返回参数,所以记着在最后一个SELECT语句前放一个RETURN语句。另外,注意我们将字段名转换为前文中ABAP CDS Table Function声明的字段名,如果你没有提供一个合适的别名,激活的时候编译器会给出提示。

 

ZCL_FLIGHTS_DEMO_CDS的最终版本是这样的:

CLASS zcl_flights_demo_cds DEFINITION  PUBLIC  FINALCREATE PUBLIC
PUBLIC 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.


执行结果

ABAPCDSTableFunction介绍与示例_java_03