zoukankan      html  css  js  c++  java
  • ABAP CDS Table 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

    注:本文的主要理论内容已经包含在之前的AMDP介绍文章:ABAP中的AMDP(ABAP-Managed Database Procedures ) 中,相比它,本文更像一个step by step教程。

    ABAP CDS视图

    在通常的ABAP CDS视图开发过程中,我们通过编辑器(通常是ADT)在ABAP层声明了我们的字段结构和annotations。激活后,系统会自动地在数据库层生成所有的SQL视图。

    ABAP CDS视图提供多种SQL命令和函数的支持,如果你想要了解细节和全部的可用特性,建议你看这篇文章:ABAP CDS Feature Matrix

    ABAP CDS Table Function

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

    因为AMDP直接运行数据库脚本,所以需要做几个额外的步骤并且会使用到脚本语言(在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并且定义名字和描述:

    选择传输请求,然后点击Next。在模板中选择最后一个选项“Define Table Function with Parameters”,然后点击Finish:

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

    • 字段:
      • 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还不存在。下一步,让我们创建它:

    让类包含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 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 有少许改动

  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/8057788.html
Copyright © 2011-2022 走看看