天天看點

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 Table Function介紹與示例

ABAP CDS視圖提供多種SQL指令和函數的支援,如果你想要了解細節和全部的可用特性,建議你看這篇文章:ABAP CDS Feature Matrix。

ABAP CDS Table Function

在ABAP CDS Table Function的開發過程中,我們将字段結構、參數(可選)、association等通過類/方法定義為實體。通過AMDP我們可以直接在ABAP層寫存儲過程,并且把它封裝在類/方法中,更多介紹可以看之前的文章:ABAP中的AMDP(ABAP-Managed Database Procedures 。

ABAP CDS Table Function介紹與示例

因為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并且定義名字和描述:

ABAP CDS Table Function介紹與示例

選擇傳輸請求,然後點選Next。在模闆中選擇最後一個選項“Define Table Function with Parameters”,然後點選Finish:

ABAP CDS Table Function介紹與示例

 編輯生成的實體,包含以下内容:

  • 字段:
    • 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還不存在。下一步,讓我們建立它:

ABAP CDS Table Function介紹與示例

讓類包含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關鍵字去重,因為我們會找到在不同的連接配接日期的相同的航空公司的城市記錄,如圖:

ABAP CDS Table Function介紹與示例

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中的結果:

ABAP CDS Table Function介紹與示例

英文原文:Concatenate multiple records in a single field using ABAP CDS Table Function 有少許改動

繼續閱讀