今回は、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文記述方法について(その1) ※当記事
-
これまでの記述方法との比較、FIELDS句、インライン定義
-
リテラル・固定値・演算値・文字列編集・条件分岐・型変換
-
[7.5xの新しいSELECT文記述方法について(その3)] (https://qiita.com/Go_Ohta/items/bf7bd6f2964675c97740)
-
日付系機能・グループ化・内部テーブルをデータソースとして使用・UNION/WITH・RIGHT JOIN/CROSS JOIN
・・・
-
これまでの記述方法
-
FIELDS句を使った記述方法
-
インライン宣言を使用した記述方法
-
次回予定
1.これまでの記述方法
まずは、これまでの記述方法です。
内部テーブル(と構造)の事前定義とSQLとなります。
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句にて抽出項目を定義した書き方のサンプルです。
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句より後に記述する必要がある(先に記述すると構文エラーになる)
この制限があることで、テーブルとテーブルエイリアス名を先にFROM句で定義し、Into句で使用してから
抽出項目を定義できるようになります。これにより、コードを上から下にスムーズに記述することが可能となります。 -
FIELDS句内の項目はカンマで区切る
カンマで区切るの面倒臭い、空白や改行でいいのに、と思った方もいるかと思いますが、今のABAP SQLでは、
項目値の編集加工や処理分岐をすることが可能となり、記述が長くなる場合があります。このため、
項目間をカンマで区切る必要が出てきたものと思われます。こちらについては別記事にて説明をします。 -
WHERE句のSY-DATUMやINTO TABLEの内部テーブルの前に「@」が追加されている
この記述方法で変数値を使用する場合は、ホスト変数としてエスケープするために名称の前に「@」を付与する必要があります。
・固定値(Constants)/変数/構造/内部テーブル等
・システム変数(SY-*****)
・動的定義変数(後述)
※リテラル値は「@」不要です
3.インライン宣言を使用した記述方法
以降はオプションですが、この記述方法を使用していると、内部テーブル(や構造)をインライン宣言で使用することが可能です。
インライン宣言とは変数等を使用箇所で直接宣言する記述方法で、**「DATA(変数名)」**と記述して定義します。
さらに前述のとおり「@」が必要となりますので、「results1」を内部テーブルとしてインライン宣言する場合は、
**「@data(results1)」**と記述します
※上記の@は本来は半角文字です。リンクが作成されてしまうため全角文字で記述しています。
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内で処理が可能となっています。
今回記述しなかった、文字列編集系の新機能もちらほら記述していきますので、新しい記述方法で記述することの
メリットをさらに感じられるかと思います。
今回の内容は以上です、ありがとうございました。