このトピックでは、動的な名称の使用方法を取り上げて説明します。
動的な名称とは
ABAPプログラムでは、以下のように様々な名称が使用されます。
データ型を指定するための名称データオブジェクトを参照するための名称SQL文に記述されるテーブル名称…
通常はプログラムを作成する際に明示的に記述しますが、より機能性が高いプログラムを作成する場合、その名前を可変にしなければならないケースがあります。この可変の名前は動的な名前と呼ばれます。
基本的な構文
基本構文は以下のようになります (名称が格納された変数)
REPORT Y_TEST.
DATA:
A TYPE C,
V1 TYPE C.
FIELD-SYMBOLS <FS> TYPE ANY.
A = 'T'.
V1 = 'A'.
ASSIGN (V1) TO <FS>.
WRITE: <FS> . 活用される場面
ツール型のプログラム作成
テーブル内容をエクスポートするツールを例とします、テーブル名はユーザから任意に指定可能です。
以下はその実装の抜粋です。
PARAMETERS: pn TYPE dd02l-tabname obligatory.
START-OF-SELECTION.
DATA:
t_itab TYPE REF TO DATA.
FIELD-SYMBOLS:
<itab> TYPE STANDARD TABLE.
CREATE DATA t_itab TYPE STANDARD TABLE OF (pn).
ASSIGN t_itab->* TO <itab>.
SELECT *
FROM (pn)
INTO TABLE <itab>.
*後続は省略コードの簡潔化
名前が番号違いだけである複数の変数に対してそれぞれ何かの処理を行う時に、動的に変数を割り当てループ処理化することにより、コーディング記述量を劇的に減らすことができます。
REPORT Y_VARNAME_TEST.
DATA:V1(2) TYPE C,
V2(2) TYPE C,
V3(2) TYPE C,
V4(2) TYPE C,
V5(2) TYPE C,
V6(2) TYPE C,
V7(2) TYPE C,
V8(2) TYPE C,
V9(2) TYPE C.
DATA: VNAME(5) TYPE c ,
VINDEX TYPE c.
FIELD-SYMBOLS <FS> TYPE ANY.
START-OF-SELECTION.
DO 9 TIMES.
VINDEX = SY-INDEX.
CONCATENATE 'V' VINDEX INTO VNAME.
ASSIGN (VNAME) TO <FS>.
CONCATENATE 'X' VINDEX INTO <FS>.
ENDDO.
DO 9 TIMES.
VINDEX = SY-INDEX.
CONCATENATE 'V' VINDEX INTO VNAME.
ASSIGN (VNAME) TO <FS>.
WRITE:/ VNAME,
: '=' ,
: <FS>.
ENDDO.
上記のサンプルの実行結果は以下の図で示します。
変数参照制限の回避
ABAPでは異なるプログラム(レポート、汎用グループetc)のグローバル変数を直接参照することができません。 但し、Exit実装のアドオンプログラムから、直接拡張された標準プログラムのグローバル変数を直接参照したいというニーズはたまたま発生します。 そこで裏技になりますが、動的な変数名を利用すれば、プログラムを跨ってグローバル変数を参照できないというABAP言語の制限を回避することができます。
以下はそのサンプルです。
*
DATA: I_OKCODE(17) TYPE C VALUE '(SAPLMR1M)OK-CODE'.
FIELD-SYMBOLS: <FS_OKCODE> TYPE ANY.
ASSIGN (I_OKCODE) TO <FS_OKCODE>.