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?

[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句より必ず後に記述する(先に記述すると構文エラーになる)

    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の項目定義で処理が可能となっています。新しい記述方法で記述することのメリットをさらに感じられるかと思います。
今回の内容は以上です、ありがとうございました。


参考

【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?