インライン宣言とは
従来の ABAP コーディングでは、以下のように変数宣言とロジックを分離して記述するのが一般的だが、
REPORT zsa202500101.
DATA: value1 TYPE i,
value2 TYPE i,
....
START-OF-SELECTION.
....
ADD value1 TO value2.
このような記述方法は、コードのボリュームが大きくなると開発効率や可読性が損なわれる。
また、従来の ABAP では、処理と同時に変数を生成することができない。
例えば、Java であれば、
int area = base * height / 2;
のように、処理(base * height / 2)を行ったタイミングで結果を格納する変数(area)を宣言できるが、ABAP でコーディングする場合は、
DATA area TYPE i.
area = base * height / 2.
のように、変数宣言と処理を別々のステートメントで記述する必要がある。
モダン ABAP では、一般的なオブジェクト指向言語のように、処理を行う場所( = インライン)で変数の宣言が可能になり、簡潔で可読性の高いコードで記述できるようなった。例えば、上記のコードをモダン ABAP で記述し直すと、
DATA(area) = base * height / 2.
になる。
インライン宣言の基本形
変数をインライン宣言する場合の基本形は以下の通り。
DATA(生成する変数名) = 値や代入元の変数名.
DATA の後に () で挟んで生成する変数名を指定する。なお、( の前後と ) の前には半角スペースは入れない。続いて、前後に半角スペースを挟んで = を記述し、その後に変数に代入する値や、代入元の変数名を指定する。
例えば、変数 height を宣言して整数値 183 を代入する場合には、以下のように記述する。
DATA(height) = 183.
なお、従来の変数宣言と異なり、インライン宣言ではデータ型を指定する必要がない。この例の場合、代入される値が整数なので、ABAP のコンパイラが変数 height のデータ型を推論して、事前定義 ABAP データ型 i で自動生成する。
また、変数 name を宣言して文字列 'TAKAHIRO IKEYAMA' を代入する場合には、以下のように記述する。
DATA(name) = 'TAKAHIRO IKEYAMA'.
この場合は、16 文字分の文字列を代入しているので、事前定義 ABAP データ型 c で長さ 13 の変数 name が生成される。
式を使ったインライン宣言
値や変数名の代わりに式(Expression)を組み合わせてインライン宣言を行える。基本形は以下の通り。
DATA(生成する変数名) = 式.
以下の例では、選択画面で入力された底辺(base)と高さ(height)の値を使って三角形の面積を計算し、変数 area を生成して計算結果を代入する。
PARAMETERS: base TYPE i OBLIGATORY,
height TYPE i OBLIGATORY.
....
DATA(area) = base * height / 2.
生成される変数 area には、底辺 × 高さ ÷ 2 の数式で計算された面積の値が代入される。なお、選択項目 base 、height 共にデータ型が i なので、変数 area のデータ型も i になる。
インライン宣言でのデータ型指定
データ型を明示的に指定してインライン宣言を行う場合は、演算子(Operator)を使用する。
値を代入せずに変数を宣言する場合は、VALUE 演算子を使用する。基本形は以下の通り。
DATA(生成する変数名) = VALUE データ型またはデータエレメント名( ).
= の後は、前後に半角スペースを挟んで VALUE を、その後にデータ型やデータエレメント名、 (、半角スペース、 ) を記述する。
この例では、データエレメント ze_area を参照して変数 area をインライン宣言している。
DATA(area) = VALUE ze_area( ).
指定したデータ型に式の結果を変換して変数に代入する場合は、CONV 演算子を使用する。基本形は以下の通り。
DATA(生成する変数名) = CONV データ型またはデータエレメント名( 式 ).
VALUE の代わりに CONV を記述し、式を () で囲んで指定する。なお、( の後と ) の前には半角スペースを挟む。
この例では、選択画面で入力された底辺(base)と高さ(height)の値を使って三角形の面積を計算し、データ型にデータエレメント ze_area を指定して変数 area を生成して、選択画面で入力された底辺(base)と高さ(height)の値を使って計算した三角形の面積を代入している。
PARAMETERS: base TYPE i OBLIGATORY,
height TYPE i OBLIGATORY.
....
DATA(area) = CONV ze_area( base * height / 2 ).
LOOP 処理のインライン宣言
従来のコーディングでは、内部テーブルに格納された値を LOOP で処理するために、内部テーブルと同じ変数構成の構造を定義する必要があった。
DATA: profile TYPE TABLE OF zs_profile,
profiles TYPE zs_profile.
....
LOOP AT profiles INTO profile.
....
ENDLOOP.
モダン ABAP では、LOOP ステートメントの INTO 句にインライン宣言を組み込んで、内部テーブルと同じ変数構成の構造を自動生成できる。基本形は以下の通り。
LOOP AT 内部テーブル名 INTO DATA(構造名) ....
INTO の後に半角スペースを入れて DATA を記述し、その後 () で囲んで構造名を指定する。なお、( の前後と ) の前には半角スペースは入れない。上記のコードをインライン宣言で書き換えると以下のようになる。
DATA profiles TYPE TABLE OF zs_profile.
....
LOOP AT profiles INTO DATA(profile).
....
ENDLOOP.
さらに、構造だけでなくフィールドシンボルもインライン宣言できる。基本形は以下の通り。
LOOP AT 内部テーブル名 INTO ASSIGNING FIELD-SYMBOL(<フィールドシンボル名>) ....
インライン宣言で上記のコードを書き換えると以下のようになる。
DATA profiles TYPE TABLE OF zs_profile.
....
LOOP AT profiles INTO ASSIGNING FIELD-SYMBOL(<profile>).
....
ENDLOOP.
SELECT ステートメントのインライン宣言
SELECT ステートメントにもインライン宣言を組み込める。
この例では、従来のコーディングで得意先マスターテーブルから得意先コードと得意先名称を検索している。検索する項目に合わせてデータ型や内部テーブルを予め定義した上で SELECT を実行している。
TYPES: BEGIN OF zs_customer,
kunnr TYPE kna1-kunnr,
name1 TYPE kna1-name1,
END OF zs_customer.
....
DATA customers TYPE TABLE OF zs_customer.
....
PARAMETERS land TYPE land1 OBLIGATORY.
....
SELECT kunnr name1 FROM kna1 INTO TABLE customers
WHERE land1 = land
ORDER BY kunnr.
モダン ABAP では、検索結果を格納する内部テーブルを SELECT ステートメントの中でインライン宣言できる。基本形は以下の通り。
SELECT 検索項目名, .... FROM テーブル名 INTO TABLE @DATA(生成する内部テーブル名)....
INTO TABLE の後に @DATA を記述し、内部テーブル名を () で囲んで指定する。なお、( の前後と ) の前には半角スペースは入れない。
例えば、上記のコードをモダン ABAP で書き換えると、以下のようになる。
PARAMETERS land TYPE land1 OBLIGATORY.
....
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(customers)
WHERE land1 = @land
ORDER BY kunnr.
この例の場合、kunnr(得意先コード)と name1(得意先名称)の2つの項目を検索しているので、kunnr と name1 の 2 つの変数を持つ内部テーブル customers が自動生成される。
なお、インライン宣言を使う場合、SELECT ステートメントの記述方法が従来と異なる点がある。主な相違点は以下の通り。
- 検索項目名を複数指定する場合は、項目名を ,(カンマ)で区切る。
- ABAP の変数を検索条件に指定する場合は、変数名の前に @ を付ける。
