動的処理(フィールドシンボル)

24.1 動的処理(フィールドシンボル)

1. 動的処理(フィールドシンボル)

フィールドシンボルとは
構文ルール
 FIELD-SYMBOLS命令
 フィールドシンボルを利用した構文例
 フィールドシンボルを利用しない場合の構文例
 フィールドシンボルを利用しない場合の欠陥
フィールドシンボルの特徴
 フィールドシンボルはデータを確認しない
 フィールドシンボルはデータの位置情報
フィールドシンボルのコード例

フィールドシンボルとは

フィールドシンボルとは

フィールドシンボルとは何でしょうか?
一言で言えば、データオブジェクトを間接的に指し示す「カーソル」のような役割を果たします。
プログラミングに明るい人であれば「デリファレンス」するようなものとお考え下さい。C言語でいうポインタのようなものです。
言葉で説明しても難しいため、処理の中での実際の使われ方を見て理解をしていきましょう。

構文ルール-フィールドシンボルを利用した構文例

上記は、LOOP処理の中でフィールドシンボルを利用したコーディングです。
最終的にこのコードが理解できれば、フィールドシンボルについて理解されたと思っていいです。
では、フィールドシンボルを利用する場合、利用しない場合をそれぞれ説明していきます。
その中でどのようにフィールドシンボルが働いているかをイメージしていきましょう。

構文ルール-フィールドシンボルを利用しない場合の構文例

フィールドシンボルを利用しない普通のLOOP~ENDLOOP構文です。
1行目:  DATA: (構造名)LIKE LINE OF (内部テーブル).
1行目では、上記構文を用いて、構造を定義しています。

2行目:  LOOP AT (内部テーブル) INTO (構造名).
2行目~9行目では、LOOP~ENDLOOPの処理を定義してします。
内部テーブルのレコードを構造に格納していくLOOP処理です。

3行目:  WHERE VBELN IS NOT INITIAL.
“VBELN” とは、内部テーブルの項目のことで、この項目が空欄ではない場合に4行目以降の処理を実行することを定義しています。

3行目~8行目:LOOP内の実際の処理を定義します。

4行目:  CLEAR LW_VBELN.
4行目:事前定義していた “LW_VBELN” の値を消去しています。LOOPの処理が始まる前に入っていた値がある想定の記述です。
今回の場合はこの記載が無くても問題ありませんが、LOOP ATを利用する場合は毎回記述しておくとよいでしょう。ほぼ「おまじない」的に毎回コーディングしておきましょう。

5行目:  LW_VBELN-SIGN= ‘I’.
6行目:   LW_VBELN-OPTION= ‘EQ’.
7行目:   LW_VBELN-LOW= (構造名)-VBELN.

※念のための解説ですが、ABAPの世界では “=” (イコール)で結んだ場合、右から左に値が格納されるということを表します・

8行目:  APPEND LW_VBELNTO LIT_VBELN.

8行目では、”LW_VBELN” (構造)に格納されたデータを “LIT_VBELN” (内部テーブル)に格納します。

構文ルール-フィールドシンボルを利用しない場合の欠陥

前述のフィールドシンボルを利用しない場合の処理では、1回のLOOPごとに予め定義した構造にデータを格納しています。
LOOP処理では100回以上繰り返すこともごく普通に存在しますが、
そのたび構造へ実データを格納していると、処理が非常に重くなってしまいます。

LOOP処理ではパフォーマンスの観点で欠点を持っていました。
その短所を補うために利用されるのが、フィールドシンボルです。

フィールドシンボルの特徴

フィールドシンボルは実データを格納しません。格納するのではなく、格納すべきデータを指し示す役割を担っています。
次のコード例を参考に解説します。

フィールドシンボルの特徴-フィールドシンボルはデータを格納しない

今回の例では、1行目でフィールドシンボルを定義しています。

先ほどは実データを格納するための構造を定義していましたが、今回のコードでは構造は利用しないため定義していません。
代わりに
FIELD-SYMBOL <fs001> LIKE LINE OF IT_test001.
という形で、フィールドシンボルを宣言しています。
2行目は、先ほどの利用しない例では”INTO” を利用していました。
今回は、“ASSIGNING” を使用しています。コーディング上で異なるのはこの点だけです。

では、処理の内容はどう変わるか?
フィールドシンボルを利用しない場合、構造に実データを格納していましたが、今回は「実データを格納していない」状態になります。
では何を格納しているか?
答えは、「何行目のデータを見ればよいか」という位置情報です。

フィールドシンボルの特徴-フィールドシンボルはデータの位置情報
前述で述べましたが、フィールドシンボルに実データは格納されていません。
格納されているのは、データの位置情報です。

フィールドシンボルは、テーブルに当たっているカーソルのようなイメージで理解いただければわかりやすいかと思います。

ASSIGNINGとは、日本語で「割り当て」という意味です。つまり、LOOPする内部テーブルに「割り当て」て利用する(カーソルを当てておく)だけであってデータの格納はしないというのが正しい理解です。

その上で、次のページの構文の意味を考えてみましょう。

利用しない例では、”(構造名)”としていた箇所が、今回は フィールドシンボル名になっています。
※フィールドシンボルを表す場合は必ず<>でくくります。

データが格納されていないはずのフィールドシンボルから “LW_VBELN-LOW” に値を格納するロジックは以下の通りで流れます。
① フィールドシンボルが指し示すデータの位置情報を読み取る
② 位置情報が指し示す先のデータを読み取る
③ データを ” LW_VBELN-LOW ” に格納する

フィールドシンボルを利用すれば、LOOP処理の中で構造へのデータ格納がない分、
メモリの消費を節約できます。

フィールドシンボルのコード例 

よく見てみてください。LOOPする内部テーブルの構造と、フィールドシンボルの構造は「常に同じ」ですよね?
LOOP処理内で定義されたフィールドシンボルは、常に割り当てる内部テーブルと同じ構造を持っているという性質を利用し、インライン定義を可能にしています。
ちなみに、フィールドシンボルはプロジェクトによって
使用禁止されていることがあります。
LOOP AT 内部テーブル~INTO構造が一般的です。


NEXT>> 24.2 他機能呼び出し