サブルーチン(FORM)
22.2 サブルーチン(FORM)
サブルーチンは、繰り返し使う処理をまとめておき、必要なタイミングで呼び出すための仕組みです。 同じ処理を何度も書かずに済むため、プログラムが読みやすくなり、修正も一か所で済むようになります。
サブルーチン
\
基本的にサブルーチンや汎用モジュール、クラスは、「繰り返し行う処理」をそこに記載しており、「必要になったら呼び出す」という使い方をします。
INCLUDEプログラムに関しては、少し毛色が違いますがサブルーチンをまとめて記述したり、処理ではなくデータ定義部分を切り出して記述したりと用途は様々です。
サブルーチンの定義
サブルーチンの定義における<サブルーチン名>は、任意の名称を指定します。
FORMとENDFORMの間に[処理]を記載します。
サブルーチンの呼び出し
サブルーチンの呼び出しの記載方法で定義済のサブルーチン名を指定します。
サブルーチンの処理後、呼び出し元に戻り、処理が続行されます。
パラメータの受け渡し(呼び出し)
サブルーチン呼び出し時に、データの受け渡しを行うことができます。
USINGは、呼び出し元から値を引き渡す際に使用します。 呼び出し元の値を変更したくない場合は USING VALUE(変数)を使用します。
CHANGINGは、呼び出し元からの値の引き渡しと、引き渡された値を変更する際に使用します。 引き渡された値をサブルーチン内で変更すると呼び出し元も書き換わります。パラメータの受け渡し(定義)
USINGとCHANGINGの区別が、サブルーチンを理解するうえで最も大切です。
USING(使う)とCHANGING(変える)という名称に騙されやすいのですが、
実際は以下の区分が最も適切です。
USING ⇒ インプットデータ(入力)、(サブルーチンに渡す値)
CHANGING ⇒ インプットデータ(入力) かつ アウトプットデータ(出力)
(サブルーチン内で変更した結果を呼び出し元へ返す)
USINGは、サブルーチン内でのみ利用されるデータオブジェクトです。
そのため、サブルーチンを動かす際のインプットデータにしかなりません。
一方で、CHANGINGはサブルーチン内外で利用可能なデータオブジェクトになります。
USING/CHANGING で受け取る側(FORM内)の変数は「仮引数」です。
CHANGING は仮引数を書き換えると、呼び出し元の変数も更新されます。
また、呼び出し元の値を変更させたくない場合は、USING VALUE( ) を使用します。
どっちのパラメータを使うかは条件次第で、どちらか一方だけをパラメータとして設定する場合もあります。
サンプルコード
REPORT Z_SAMPLE222_SUBROUTINE.
" データ定義
DATA GV_NUM1 TYPE I.
DATA GV_NUM2 TYPE I.
DATA GV_RESULT TYPE I.
START-OF-SELECTION.
" 入力値を設定
GV_NUM1 = 3.
GV_NUM2 = 5.
" サブルーチン呼び出し(結果を gv_result に返す)
PERFORM CALCULATE_SUM USING GV_NUM1 GV_NUM2
CHANGING GV_RESULT.
" 結果表示
WRITE: / |RESULT: { GV_RESULT }|.
END-OF-SELECTION.
*---------------------------------------------------------------------*
* サブルーチン:2つの数値を加算し、結果を返す
*---------------------------------------------------------------------*
FORM CALCULATE_SUM USING VALUE(IV_NUM1) TYPE I
VALUE(IV_NUM2) TYPE I
CHANGING CV_RESULT TYPE I.
" 入力(iv_)を足して、出力(cv_)へ返す
CV_RESULT = IV_NUM1 + IV_NUM2.
ENDFORM.
命名は gv_(グローバル)/iv_(入力)/cv_(変更して返す) に統一しています。
USING VALUE(…) により、サブルーチン内で入力値を誤って変更しない意図が明確になります。
結果