サブルーチン(FORM)
22.2 サブルーチン(FORM)
2. サブルーチン(FORM)
モジュール化とサブルーチン
モジュールとは、そもそも「部品」を意味しますが、IT業界では汎用性のある標準化された部品を意味します。
ABAPではサブルーチンや汎用モジュール、クラス、INCLUDEプログラムなどを使用してモジュール化(部品の作成)を行います。
サブルーチン
モジュール化とサブルーチン
基本的にサブルーチンや汎用モジュール、クラスは、「繰り返し行う処理」をそこに記載しており、「必要になったら呼び出す」という使い方をします。
INCLUDEプログラムに関しては、少し毛色が違いますがサブルーチンをまとめて記述したり、処理ではなくデータ定義部分を切り出して記述したりと用途は様々です。
サブルーチンの定義
サブルーチンの定義における<サブルーチン名>は、任意の名称を指定します。
FORMとENDFORMの間に[処理]を記載します。
サブルーチンの呼び出し
サブルーチンの呼び出しの記載方法で定義済のサブルーチン名を指定します。
サブルーチンの処理後、呼び出し元に戻り、処理が続行されます。
パラメータの受け渡し(呼び出し)
サブルーチン呼び出し時に、データの受け渡しを行うことができます。
USINGは、呼び出し元から値を引き渡す際に使用します。引き渡された値をサブルーチン内で変更すると呼び出し元も書き換わります。
呼び出し元の値を変更したくない場合は USING VALUE(変数)を使用します。
CHANGINGは、呼び出し元からの値の引き渡しと、引き渡された値を変更する際に使用します。
パラメータの受け渡し(定義)
USING / CHANGINGは、そのサブルーチン内で利用するデータの定義です。
ここの構文はDATA命令の構文構成とほぼ変わりませんので、構文としては難しくはありません。
USINGとCHANGINGの区別が、サブルーチンを理解するうえで最も大切です。USING(使う)とCHANGING(変える)という名称に騙されやすいのですが、実際は以下の区分が最も適切です。
USING ⇒ インプットデータ
CHANGING ⇒ インプットデータ かつ アウトプットデータ
USINGは、サブルーチン内でのみ利用されるデータオブジェクトです。そのため、サブルーチンを動かす際のインプットデータにしかなりません。一方で、CHANGINGはサブルーチン内外で利用可能なデータオブジェクトになります。
したがって、条件次第でどちらか一方だけをパラメータとして設定する場合もあります。
サブルーチンのサンプルコード
サブルーチン
*&---------------------------------------------------------------------* *& Report ZTEST_PROGRAM_SUBSTITUTION_1 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZTEST_PROGRAM_SUBROUTINE_1. DATA: WK_NUM1 TYPE I, WK_NUM2 TYPE I, WK_RESULT TYPE I. WK_NUM1 = 3. WK_NUM2 = 5. *サブルーチン呼び出し PERFORM CALCULATE_NUM USING WK_NUM1 WK_NUM2 CHANGING WK_RESULT. WRITE:'RESULT:', WK_RESULT. *サブルーチン定義 FORM CALCULATE_NUM USING PI_NUM1 TYPE I PI_NUM2 TYPE I CHANGING PO_RESULT TYPE I. PO_RESULT = PI_NUM1 + PI_NUM2. ENDFORM.
“CALCULATE_NUM”というサブルーチンは、簡単な足し算のサブルーチンです。インプットの値を入れると、足し算の答えを返すロジックが組み込まれているのが分かるかと思います。
PERFORM命令では、FORMで定義したUSINGとCHANGINGに渡す値を同じくUSINGとCHANGINで指定します。USINGとCHANGINGで定義したデータが複数ある場合は、定義した順に上から値が渡される仕組みです。
上記のサンプルコードでは、「WK_NUM1」「WK_NUM2」には”3”と”5″が入っているので、サブルーチンを動かした結果「WK_RESULT」の値は”8”となります。