サブルーチン(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(…) により、サブルーチン内で入力値を誤って変更しない意図が明確になります。

結果

NEXT>> 22.3 INCLUDEプログラム

研修の詳細はこちら