10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-07-25

今回は、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@

記事一覧

・・・


  • これまでの記述方法

  • 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句にて抽出項目を定義した書き方のサンプルです。

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内で処理が可能となっています。
今回記述しなかった、文字列編集系の新機能もちらほら記述していきますので、新しい記述方法で記述することの
メリットをさらに感じられるかと思います。

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


参考

【ABAP】ABAP7.4から導入された構文 @tami

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?