ABAPプログラミングでは、フィールドシンボルという概念を利用することができ、これを使いこなせるようになると、ABAPerとして一人前に近付けます。
覚えてしまうと難しいものではないのですが、意外と苦手としているABAP技術者もいるので、ぜひ理解して活用できるようになりましょう。フィールドシンボルというのは何かと言うと、実行時に変数名を決定することができ、動的なプログラミングが可能になるテクニックです。
単一データを扱う変数でも活用できますが、内部テーブルの操作にフィールドシンボルを使用することで、より柔軟で動的なプログラムを実現することができます。
以下に、フィールドシンボルについて解説し、内部テーブルにフィールドシンボルを活用するサンプルコードを用いて説明します。
フィールドシンボルとは
フィールドシンボルとは、データ型を指定せずに実行時に変数名を設定することができる構文です。設定すると書きましたが、正確には設定した変数のメモリ領域を割り当てる形になります。
フィールドシンボルを使用することで、実行時に変数名(内部テーブルのレコードやフィールド)を決定することができ、それを直接参照できるようになります。
説明を読むだけではイメージがしにくいと思いますので、金額項目を動的にフィールドに割り当て、内部テーブルを集計するサンプルコードを書いてみたいと思います。
REPORT sample_program.
TYPES: BEGIN OF ty_tab,
amount1 TYPE p DECIMALS 2,
amount2 TYPE p DECIMALS 2,
amount3 TYPE p DECIMALS 2,
END OF ty_tab.
DATA: itab TYPE STANDARD TABLE OF ty_tab,
wa TYPE ty_tab.
FIELD-SYMBOLS: <fs> TYPE any.
wa-amount1 = 10.50.
wa-amount2 = 20.50.
wa-amount3 = 30.50.
APPEND wa TO itab.
wa-amount1 = 40.50.
wa-amount2 = 50.50.
wa-amount3 = 60.50.
APPEND wa TO itab.
DATA: total_amount TYPE p DECIMALS 2.
LOOP AT itab INTO wa.
DO 3 TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE wa TO <fs>.
IF sy-subrc EQ 0.
IF <fs> IS ASSIGNED AND TYPEOF <fs> = 'P'.
total_amount = total_amount + <fs>.
ENDIF.
ENDIF.
ENDDO.
ENDLOOP.
WRITE: / 'Total Amount:', total_amount.
このサンプルコードでは、ty_tabという構造体を定義し、itabという内部テーブルを宣言しています。その内部テーブルには金額項目として、amount1、amount2、amount3という項目を定義しています。
次に、waという構造体を宣言し、それぞれのフィールドに値を設定しています。その後、APPEND文を使用して、waをitabに追加しています。
最後に、LOOP AT文を使用して、itabをループさせ、フィールドシンボルを使用して、動的に金額項目を指定し、その値を集計しています。
具体的には、DO 3 TIMES文を使用して、3つの金額項目に対して、それぞれの値を取得し、total_amountに加算しているという形ですね。
最後に、WRITE文を使用して、total_amountの値を出力しています。このように、フィールドシンボルを使用することで、内部テーブルの動的なアクセスや集計が可能になっているということです。
フィールドシンボルを使わなくても同じような処理を書くことは可能ではありますが、メモリ領域を節約でき、パフォーマンスの良いプログラムが書けるということと、冗長な処理をスッキリさせられるため、コード行数も減らすことが可能です。
ケースバイケースで使う・使わないは決めたら良いと思いますが、使えるテクニックのパターンとして持っておくと重宝するので、ぜひ覚えて使えるようになってください。
コメント