目的
前回の記事で、Code push downを実現する方法としてOpen SQL, AMDP, CDSを紹介しました。
今回は実装編として、あるシナリオをOpen SQL, AMDP, CDSのそれぞれで実現してみます。
シナリオ
入出庫伝票のテーブル(MATDOC)から、品目、プラント、保管場所ごとに数量をサマリして出力します。従来のABAPなら、一旦内部テーブルに取得してから移動タイプによってプラマイを判断して集計していたと思います。
方針
SQLで貸借フラグが'S'だったらプラスの数量(入庫)、'H'だったらマイナスの数量として集計します。
1. Open SQLによる実装
SELECT matnr, werks, lgort,
SUM(
CASE shkzg
WHEN 'S' THEN ( menge * 1 )
WHEN 'H' THEN ( menge * -1 )
END
) AS menge
FROM matdoc
INTO TABLE @DATA(itab)
GROUP BY matnr, werks, lgort.
cl_demo_output=>display(
EXPORTING
data = itab
).
CASE文を使い、貸借フラグ(shkzg)によって数量をプラマイします。
さらにその結果をSUMで集計します。
結果
2. AMDPによる実装
2.1 AMDPクラスの実装
クラス定義
CLASS zcl_mob58_amdp_test DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb.
CLASS-METHODS get_matdoc EXPORTING VALUE(et_result) TYPE zoutput_t_matdoc.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
AMDPクラスを定義するときの決まりとして、インターフェースif_amdp_marker_hdbを使用します。
メソッドの実装
CLASS zcl_mob58_amdp_test IMPLEMENTATION.
METHOD get_matdoc BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY
USING matdoc.
et_result = SELECT matnr, werks, lgort,
SUM(
CASE shkzg
WHEN 'S' THEN ( menge * 1 )
WHEN 'H' THEN ( menge * -1 )
END
) AS menge
FROM matdoc
GROUP BY matnr, werks, lgort;
ENDMETHOD.
ENDCLASS.
AMDPのメソッドは宣言部分に特徴があります。
宣言 | 意味 |
---|---|
by DATABASE PROCEDURE | AMDPメソッドであるという印 |
FOR <db_type> | データベースを指定 |
LANGUAGE <db_language> | データベースを操作する言語を指定 |
OPTIONS <db_options> | オプションで、READ-ONLYを指定。指定しない場合は書き込みが可能になる |
USING <db_entity> | SQL Scriptの中で使用するテーブルをすべて宣言する |
AMDPのメソッドはSQLスクリプトで書きます。一見Open SQLとあまり違いがないですが、命令の終わりはセミコロン(;)で終わるなどのルールがあります。
SQLスクリプトのリファレンスはこちら
2.2 AMDPクラスを呼び出す
zcl_mob58_amdp_test=>get_matdoc(
IMPORTING
et_result = data(et_result)
).
cl_demo_output=>display(
EXPORTING
data = et_result
).
結果
3.CDSによる実装
CDSの登録は以下の手順で行います。
※CDSを実装するときはEclipse ADT(ABAP Development Tool)を使用します。
ここでテンプレートを選択します。テンプレートに応じて下のプレビューにあるコードを自動生成してくれます。
以下のコードを書きます。
@AbapCatalog.sqlViewName: 'ZMOB58_TRAIN_01'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Basic CDS'
define view ZMOB58_CDS_TRAIN_01 as select from matdoc
{
key matnr,
key werks,
key lgort,
sum(
case shkzg
when 'S' then ( menge * 1 )
when 'H' then ( menge * -1 )
end
) as menge
}group by matnr, werks, lgort
上の@から始まる部分はアノテーションと呼ばれます。目的によって必要なアノテーションを設定する必要があります。アノテーションの定義についてはこちらを参照してください。
なお、最初MSEGを使ってビューを定義したところ、データが取得できませんでした。S/4になってからはMATDOCが入出庫伝票の正データなので、こちらを使用する必要があるようです。
結果
まとめ
今回はOpen SQL, AMDP, CDSの実装方法に焦点を当てました。簡単にするため、SQLは全て同じにしました。AMDPならでは、CDSならではのできることがもっとあるので、それぞれの特徴が出るシナリオも考えてみたいと思います。