[ABAP] 7.5xの新しいSELECT文記述方法について(NEW ABAP SQL SELECT IN ABAP 7.5x)（その１）

今回は、SELECT文の書き方について、これまでと新しい記述方法についてまとめました。
インライン定義やCDSビューの定義（ABAP CDS）など新しい技術を使用するには、
SQLも新しい記述方法で記述する必要がありますので、慣れていきましょう。

※なお、これまでABAPで使用するSQLは「OPEN SQL」と呼んでいましたが、ABAP 7.53から「ABAP SQL」と改称されました。
https://help.sap.com/doc/abapdocu_753_index_htm/7.53/en-US/abennews-753-abap_sql.htm#!ABAP_MODIFICATION_1@1@

## 記事一覧

- 7.5xの新しいSELECT文記述方法について（その１） ※当記事
 - これまでの記述方法との比較、FIELDS句、インライン定義

- [7.5xの新しいSELECT文記述方法について（その２）](https://qiita.com/Go_Ohta/items/450fa2ed291ec9279b9d)
 - リテラル・固定値・演算値・文字列編集・条件分岐・型変換

- [7.5xの新しいSELECT文記述方法について（その３）] (https://qiita.com/Go_Ohta/items/bf7bd6f2964675c97740)
 - 日付系機能・グループ化・内部テーブルをデータソースとして使用・UNION/WITH・RIGHT JOIN/CROSS JOIN

・・・

---

- これまでの記述方法
- FIELDS句を使った記述方法
- インライン宣言を使用した記述方法

- 次回予定

## 1.これまでの記述方法

まずは、これまでの記述方法です。
内部テーブル（と構造）の事前定義とSQLとなります。

```abap:これまでの記述方法
types: begin of ty_result,
 matnr type mara-matnr,
 werks type marc-werks,
 lgort type mard-lgort,
 end of ty_result,
 tty_result type table of ty_result.

data: result type ty_result,
 results type tty_result.

select t1~matnr
 t2~werks
 t3~lgort
 from mara as t1
 join marc as t2
 on t1~matnr = t2~matnr
 join mard as t3
 on t2~matnr = t3~matnr
 and t2~werks = t3~werks
 where t1~matnr like 'NI%'
 and t1~ersda <= sy-datum
 into table results.
```

この書き方の不便なところは、
**抽出項目の定義を先に行うことにより、テーブルエイリアス名を定義より前に書かないといけない**
点かなと思います。エイリアス名を決めておかないとテーブルの箇所で決定したのちに、項目の箇所に戻って書くことになりますし、
先に決めておくとテーブル名を定義するときに間違ったりと少々厄介です。

この対策として有効なものが、次に紹介するFIELDS句になります。

---

## 2.FIELDS句を使った記述方法

FIELDS句にて抽出項目を定義した書き方のサンプルです。

```ABAP:FIELDS句を使用する
types: begin of ty_result,
 matnr type mara-matnr,
 werks type marc-werks,
 lgort type mard-lgort,
 end of ty_result,
 tty_result type table of ty_result.

data: result type ty_result,
 results type tty_result.

select
 from mara as t1
 join marc as t2
 on t1~matnr = t2~matnr
 join mard as t3
 on t2~matnr = t3~matnr
 and t2~werks = t3~werks
 fields
 t1~matnr,
 t2~werks,
 t3~lgort
 where t1~matnr like 'NI%' and
 t1~ersda <= @sy-datum
 into table @results.

```

FIELS句を使用することによって、FROM句やJOIN句を先に書くことになるので、項目のエイリアス名を記述する順番が正しくなりました。
元のコードと比べていくつか差違が発生しているので、下記にまとめます。

* **FIELDS句は、FROM句やJOIN句より後に記述する必要がある（先に記述すると構文エラーになる）**<br>
この制限があることで、テーブルとテーブルエイリアス名を先にFROM句で定義し、Into句で使用してから
抽出項目を定義できるようになります。これにより、コードを上から下にスムーズに記述することが可能となります。

* **FIELDS句内の項目はカンマで区切る**<br>
カンマで区切るの面倒臭い、空白や改行でいいのに、と思った方もいるかと思いますが、今のABAP SQLでは、
項目値の編集加工や処理分岐をすることが可能となり、記述が長くなる場合があります。このため、
項目間をカンマで区切る必要が出てきたものと思われます。こちらについては**別記事にて説明をします**。

* **WHERE句のSY-DATUMやINTO TABLEの内部テーブルの前に「@」が追加されている**<br />
この記述方法で変数値を使用する場合は、ホスト変数としてエスケープするために名称の前に「@」を付与する必要があります。
・固定値（Constants）/変数/構造/内部テーブル等
・システム変数（SY-*****）
・動的定義変数（後述）
※リテラル値は「@」不要です

---

## 3.インライン宣言を使用した記述方法

以降はオプションですが、この記述方法を使用していると、内部テーブル（や構造）をインライン宣言で使用することが可能です。
インライン宣言とは変数等を使用箇所で直接宣言する記述方法で、**「DATA(変数名)」**と記述して定義します。
さらに前述のとおり「@」が必要となりますので、「results1」を内部テーブルとしてインライン宣言する場合は、
**「＠data(results1)」**と記述します
※上記の@は本来は半角文字です。リンクが作成されてしまうため全角文字で記述しています。

```ABAP:インライン宣言を使用する
select
 from mara as T1
 join marc as T2
 on T1~matnr = T2~matnr
 join mard as T3
 on T2~matnr = T3~matnr
 and T2~werks = T3~werks
 fields
 T1~matnr,
 T2~werks,
 T3~lgort
 where T1~matnr like 'NI%' and
 T1~ersda <= @sy-datum
 into table @data(results1).
```

なお、インライン宣言を使用する場合は、FIELDS句の使用有無にかかわらず、項目の区切りにカンマが必要になります。
ただし、FIELDS句を使用しないデメリットも少ないので、インライン宣言を使用するなら項目はFIELDS句で記述する、
とセットで対応した方が理解しやすくなるかと思います。

---
## 次回予定

次回は、SQLの項目内に条件分岐を記述できる、CASEについて記事を作成する予定です。
今まで内部テーブルLOOPにて行っていた簡単な分岐処理はSQL内で処理が可能となっています。
今回記述しなかった、文字列編集系の新機能もちらほら記述していきますので、新しい記述方法で記述することの
メリットをさらに感じられるかと思います。

今回の内容は以上です、ありがとうございました。

---

### 参考
[【ABAP】ABAP7.4から導入された構文](https://qiita.com/tami/items/b41982477b00afb4b0da) @tami