【ABAP】Code push down実装編-Part2 Realization

目的

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

シナリオ

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

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

方針

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

結果

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

 

まとめ

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值