本ページでFIELD-SYMBOLS命令(フィールドシンボルとは何か?)をご説明します。
フィールドシンボルとは、その名の通り「シンボル」です。つまり、他の変数や・構造・内部テーブルを指し示すリンクやショートカットのようなイメージです。
このページでは、初心者泣かせのフィールドシンボルについて1から分かりやすく解説します。
ABAPerを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
構文ルール:FIELD-SYMBOLS命令
まずは、フィールドシンボルの宣言方法から。
* フィールドシンボルの宣言 FIELD-SYMBOLS <フィールドシンボル名> .
FIELD-SYMBOLS命令では<>が必須。<>によって、それがフィールドシンボルであると識別されます。
* フィールドシンボルの宣言NG例「<>なしはダメ」 FIELD-SYMBOLS フィールドシンボル名 .
また、フィールドシンボルの宣言はDATA命令などと同様に、ABAPプログラム中の任意の場所で行うことができますが、クラスやインターフェースの宣言部分に記述することはできません。
また、フィールドシンボルの割り当て先のデータ型が分かっている場合はDATA命令と同じようにTYPEオプションを利用してデータ型を指定することができます。
*----------------------------------------------------------------------* * FIELD-SYMBOLS *----------------------------------------------------------------------* FIELD-SYMBOLS: <FS_S_TABLE> TYPE STANDARD TABLE, <FS_TABLE> TYPE TABLE, <FS_LINE1> TYPE ANY, <FS_LINE2> TYPE ANY.
フィールドシンボルとは?
フィールドシンボルとは何か?
一言で言うと、変数や構造などのデータオブジェクトを指し示すシンボルです。
上記の図では、<fs>が「変数A」を指し示しています。つまり、<fs>は「変数A」の代わりとして扱えるということを示しています。
もし、フィールドシンボル<fs>に値を代入しようとすれば、それはすなわち「変数A」を操作しているのと同じになるのです。これが、フィールドシンボルの基本的なイメージです。
より専門的な表現をすると、フィールドシンボルは変数Aのメモリのアドレス値を保持しているということができます。
フィールドシンボルの実際の利用方法を見ていきながら、より具体的なイメージを頭に思い浮かべましょう。
FIELD-SYMBOLS命令:サンプルコード
フィールドシンボルの宣言と、参照先変数への割り当て(ASSIGN命令)のサンプルコードです。
* フィールドシンボルの宣言 FIELD-SYMBOLS: <FS1> TYPE ANY. DATA a TYPE C. c = 'Hello World'. * 変数aを<FS1>に割り当て ASSIGN a TO <FS1>. WRITE <FS1>. ⇒結果「Hello World」
変数aを<FS1>に割り当てました。図で表すと以下のような状態です。
* 変数aを<FS1>に割り当て ASSIGN a TO <FS1>.
<FS1>は変数aを参照している状態ということ。すなわち、<FS1>に対して何らかの処理を行った場合は、変数aに対して処理を行っていると同意です。そのため、<FS1>をWRITEすれば変数aの値が表示されるということになります。
もう1つサンプルコードを見てみましょう。
* フィールドシンボルの宣言 FIELD-SYMBOLS: <FS1> TYPE ANY. DATA a TYPE C. * 変数aを<FS1>に割り当て ASSIGN a TO <FS1>. <FS1> = 'Hello World' WRITE a. ⇒結果「Hello World」
今度は逆に<FS1>に対して「Hello World」を格納しています。<FS1>は変数aを参照していますので、変数aに値が格納しているのと同じ状態になります。
これが、フィールドシンボルの初歩的な使い方です。
LOOP ~ ASSIGNING <FS>
LOOP処理では、オプション「ASSIGNING」を利用することで処理対象レコードをフィールドシンボルに割り当てることができます。
以下は内部テーブルに格納したユーザ情報をLOOPしながら、パスワードを変更するプログラムの抜粋です。
* フィールドシンボルの宣言 FIELD-SYMBOLS: <FS_USR_DATA> TYPE USR_DATA. LOOP AT USR_DATA ASSIGNING <FS_USR_DATA>. " パスワード変更 CALL FUNCTION 'BAPI_USER_CHANGE' EXPORTING USERNAME = <FS_USR_DATA>-USERID " フィールドシンボルのユーザID項目 PASSWORD = 'initpass' PASSWORDX = 'X' TABLES RETURN = LDT_RTN. ENDLOOP.
同じ処理をフィールドシンボルを利用せずにコーディングしたのがこちら。
* フィールドシンボルの宣言 DATA: W_USR_DATA TYPE USR_DATA. LOOP AT USR_DATA INTO W_USR_DATA. " パスワード変更 CALL FUNCTION 'BAPI_USER_CHANGE' EXPORTING USERNAME = W_USR_DATA-USERID " 構造のユーザID項目 PASSWORD = 'initpass' PASSWORDX = 'X' TABLES RETURN = LDT_RTN. ENDLOOP.
フィールドシンボルを利用することで、作業用の構造を定義する必要がなくなり、プログラム実行中に消費するメモリを削減することができます。
このフィールドシンボルの使い方は、もっとも頻繁に目にする形です。しっかりと理解しておきましょう。
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!