今回は、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句、インライン定義
-
リテラル・固定値・演算値・文字列編集・条件分岐・型変換
-
日付系機能・グループ化・内部テーブルをデータソースとして使用・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句より必ず後に記述する(先に記述すると構文エラーになる)
FIELDS句を使用したSQLは、ほかの句の記述順も厳密にチェックが入るようになるようです(未調査) -
FIELDS句内の項目はカンマで区切る
ABAP7.53では項目値定義の際に編集加工や処理分岐をすることが可能となりました。それにより1項目の記述がこれまでより長くなる場合があります。このため、項目間をカンマで区切る必要が出てきたものと思われます。こちらについては別記事にて説明をします。 -
WHERE句のSY-DATUMやINTO TABLEの内部テーブルの前に「@」が追加されている
この記述方法で変数値を使用する場合は、ホスト変数としてエスケープするために名称の前に「@」を付与する必要があります。
・固定値/変数/構造/内部テーブル等
・システム変数(SY-*****)
・動的定義変数(後述)
※リテラル値は「@」不要です
3.インライン宣言を使用した記述方法
以降はオプションですが、この記述方法を使用していると、内部テーブル(や構造)をインライン宣言で使用することが可能です。インライン宣言とは変数等を使用箇所で直接宣言する記述方法で、**「DATA(変数名)」**と記述して定義します。
さらに前述のとおり、SQLで使用する際には先頭に「@」が必要となりますので、「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の項目定義で処理が可能となっています。新しい記述方法で記述することのメリットをさらに感じられるかと思います。
今回の内容は以上です、ありがとうございました。