【ABAP】Code push downを実現する方法

## Code push downとは
ABAPにおけるCode push downとは、データを使って行う処理をできるだけデータベース側でさせるという考え方のことです。Code to data paradigmとも呼ばれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1bb8ff60-36ad-80c6-3d91-69a46f851631.png)
[ABAP for HANA and “Code Push-Down”](https://blogs.sap.com/2014/02/03/abap-for-hana-code-push-down/)より

集計処理を書くときに、従来はDBからデータを取ってきて内部テーブルに格納し、それをループしながら計算を行う、といったことをしていました。なぜなら、複雑なSELECTをするとDBアクセスの負荷が大きくなり、パフォーマンスのボトルネックになってしまうからです。

しかし、HANA DBが登場したことによってDBアクセスはボトルネックではなくなり、むしろDB側でやったほうが速くできるようになりました。（インメモリー、カラムストア、データの圧縮、等々・・・）。

そこで、データ取得・編集にかかわる処理をDBレイヤでやってしまおうというCode push downが推奨されるようになりました。

## Code push downを実現する方法
Code push downを実現する方法として、大きく2通りあります。以下では、これら2通りの方法について説明します。今回は概要編で、具体的な実装方法は別の回に書きたいと思います。

①Open SQLを使う
②DBレイヤにあるビューやプロシージャを使う(AMDP, CDS)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/7d0b0f2a-e0bf-d749-ca4d-28b16f88a7e1.png)

## Open SQLを使う
Open SQLとは、ABAPで使えるSQLのことです。DBが直接理解できるNative SQLに対してOpen SQLと呼ばれます。
NetWeaver AS ABAP 7.4 SP5からOpen SQLに新しい機能が導入され、できることが増えました。（公式リファレンスは[こちら](https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/index.htm?file=ABENNEWS-740_SP05-OPEN_SQL.htm)）
新しいOpen SQLの機能を使うために、以下ののルールに従う必要があります。

- 複数の列を並べて書くときはカンマで区切る
- SQLの中で変数を使うときは先頭に@をつける

```abap
SELECT matnr, ersda, mtart
FROM mara
into table @data(itab_mara) up to 10 rows.
```

### 新しいOpen SQLでできること（一例）

- 計算式を使って計算した結果を受け取ることができる
- 文字列操作のファンクションを使うことができる

### Open SQLを使ってCode push downを実現する5つの方法
以下のブログより翻訳、引用します。
[Code Push Down for HANA Starts with ABAP Open SQL](https://blogs.sap.com/2014/09/26/code-push-down-for-hana-from-abap-starts-with-open-sql/)

>1. 新しいOpen SQLの構文を使う
>2. DBレイヤの集計機能が使えるときはそちらを使う（ABAPレイヤで集計しない）
>3. 計算式や文字列操作もDBレイヤで行う （ABAPレイヤでループして計算、操作しない）
>4. 計算をDBレイヤにpush downするために、計算結果を列で受け取るようにする(computed columnとして)
>5. CASEやIF..ELSEの条件分岐もOpen SQLの中で行うようにする

## DBレイヤにあるビューやプロシージャを使う(AMDP, CDS)
もう一つは、DBレイヤに作られたビューやプロシージャをABAPレイヤから使用する方法です。同じ集計結果を何度も利用する場合はこちらのアプローチがよいと思われます。

SAP NetWeaver AS ABAP 7.4 SP5から**Top-down**と呼ばれる方法が導入され、ビューやプロシージャをABAPレイヤから作成することができるようになりました（実際のビュー等はDBレイヤに作られる）。これによって移送の問題（※）や、DB側とABAP側のオブジェクトの同期の問題が解決しました。
※以前のButtom-upと呼ばれる方法ではABAP側とDB側をそれぞれ移送する必要があった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/801166e4-5427-d7b7-ba4e-58e2ff72de18.png)
[ABAP for HANA and “Code Push-Down”](https://blogs.sap.com/2014/02/03/abap-for-hana-code-push-down/)から引用

### Top-downアプローチの方法
AMDP, CDSという2つの方法があります。

### AMDP(ABAP Managed Database Procedures)
AMDPはABAP側からSQLスクリプトを使ってプロシージャを作成する方法です。
プロシージャとは、DBにアクセスしてデータを取ってきたり、DBを更新したりする一連の手続きを記述したプログラムです。
AMDPはSQLスクリプトをラッピングするクラスで、初回実行時にDB側にプロシージャが作られます。AMDPクラスとして定義するには、if_amdp_marker_hdbというインターフェースを使用する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/b5d18e1f-eced-b1cd-2e55-93fefe2c7841.png)

### CDS (Core Data Services)
CDSを使うと、ABAP側からDBレイヤにビューを作ることができます。ABAPプログラムからはCDSビューを通常のテーブルやビューのように取得することができます。
CDSの特徴として、Annotationによって機能をつけたり、FioriのUIを定義できるということがあります。これによって、ABAPプログラムからだけでなく様々な用途でCDSを使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9b6afa38-1b3d-56e8-99e4-f7ae9bd29cfd.png)

### AMDP VS CDS
CDSのほうが様々な用途で使えるので、今後はCDSが主流になっていくのかなと思いましたが、以下のブログを読むとAMDPにしかできないこともあることがわかります（2019年5月時点の情報）。

|  |AMDP  |CDS  |
|---|---|---|
|複数の結果セットを返せるか  |〇  |× CDSは単一の結果のみ  |
|データの読み込み  |〇  |〇  |
|データの更新  |〇  |×  |
|ストアドプロシージャを使えるか  |〇  |×  |
[Understanding evolution of CDS and AMDP in most simple way](https://blogs.sap.com/2019/05/19/understanding-evolution-of-cds-and-amdp-in-most-simple-way/)をもとに作成

CDSは結合などで取ってこられる範囲のビューであり、更新や複雑なロジックが必要なときはAMDPを使う、という使い分けだと理解しました。


## 参考
[ABAP for HANA and “Code Push-Down”](https://blogs.sap.com/2014/02/03/abap-for-hana-code-push-down/)
[Code Push Down for HANA Starts with ABAP Open SQL](https://blogs.sap.com/2014/09/26/code-push-down-for-hana-from-abap-starts-with-open-sql/)
[ABAP Managed Database Procedures – Introduction](https://blogs.sap.com/2014/01/22/abap-managed-database-procedures-introduction/)
[ABAP Core Data Services – Introduction (ABAP CDS view)](https://blogs.sap.com/2017/09/09/abap-core-data-services-introduction-abap-cds-view/#CRT)
[Understanding evolution of CDS and AMDP in most simple way](https://blogs.sap.com/2019/05/19/understanding-evolution-of-cds-and-amdp-in-most-simple-way/)