【ABAP】FIELD-SYMBOLS命令―フィールドシンボルを3分で

ABAP

本ページでFIELD-SYMBOLS命令(フィールドシンボルとは何か?)をご説明します。

フィールドシンボルとは、その名の通り「シンボル」です。つまり、他の変数や・構造・内部テーブルを指し示すリンクやショートカットのようなイメージです。

このページでは、初心者泣かせのフィールドシンボルについて1から分かりやすく解説します。

このページで学べる内容
  • フィールドシンボルとは何か?
  • FIELD-SYMBOLS命令の使い方
  • FIELD-SYMBOLS命令を用いたサンプルコード
  • FIELD-SYMBOLS命令の注意点・落とし穴

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から学習したい方は

SAP / ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。

特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。

ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。

是非、一度ご覧になってみてください。

タイトルとURLをコピーしました