LoginSignup
4
6

More than 3 years have passed since last update.

【ABAP】Code push down実装編

Last updated at Posted at 2019-08-17

目的

前回の記事で、Code push downを実現する方法としてOpen SQL, AMDP, CDSを紹介しました。
今回は実装編として、あるシナリオをOpen SQL, AMDP, CDSのそれぞれで実現してみます。

シナリオ

入出庫伝票のテーブル(MATDOC)から、品目、プラント、保管場所ごとに数量をサマリして出力します。従来のABAPなら、一旦内部テーブルに取得してから移動タイプによってプラマイを判断して集計していたと思います。

MATDOCテーブル(MKPF, MSEGの後継)
matdoc.png

方針

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で集計します。

結果

正しく集計できています。
image.png

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
).

結果

上記のプログラムを実行すると、以下の結果になります。
image.png

3.CDSによる実装

CDSの登録は以下の手順で行います。
※CDSを実装するときはEclipse ADT(ABAP Development Tool)を使用します。
image.png
image.png
image.png
image.png
ここでテンプレートを選択します。テンプレートに応じて下のプレビューにあるコードを自動生成してくれます。
image.png

以下のコードを書きます。

@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が入出庫伝票の正データなので、こちらを使用する必要があるようです。

結果

有効化後、F8を押すとビューが実行されます。
image.png

まとめ

今回はOpen SQL, AMDP, CDSの実装方法に焦点を当てました。簡単にするため、SQLは全て同じにしました。AMDPならでは、CDSならではのできることがもっとあるので、それぞれの特徴が出るシナリオも考えてみたいと思います。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6