• 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】在控制台输出不同颜色的文字
    【python】如何去掉使用BeautifulSoup读取html出现的警告UserWarning: You provided Unicode markup but also provided a value for from_encoding
    【nodejs】修改了下对股票表进行crud操作的代码
    【nodejs】用express又做了份crud
    day20_day23课堂笔记
    Myeclipse中java web.xml报错cvc-complex-type.2.3: Element 'web-app' cannot have character [children], because the type's content type is element- only.
    html中让input标签只读不可编辑的方法
    Win10锁屏壁纸位置在哪? 默认锁屏壁纸怎么提取?
    Potplayer怎么实现视频的镜面翻转?
    How to export Excel files in a Python/Django application
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/8057788.html
Copyright © 2020-2023  润新知