【ABAP】5分で学ぶ「サブルーチン」―PERFORM

ABAP

ABAPプログラミングの超基本知識「サブルーチン(PERFORM文)」について説明していきます。

簡単に説明すると、「サブルーチン」は繰り返し利用される機能のまとまりです。

  • 概念はわかるけど、利用方法がよくわかっていない...
  • USNIG・CHANGINGって何がどう違うの?
  • FORM?PERFORM?

このページでは以上のような疑問にお答えします。

サブルーチンって?

結論から言うと、サブルーチンは繰り返し利用可能なプログラムの部品」です。

1つのプログラムの中で、繰り返し利用する機能をあらかじめ作成しておいて、使いたくなったらその都度呼び出して使います。

【イメージ図】サブルーチン

例えば、”ファイルを開く” というロジックAをサブルーチンとしてあらかじめ作成しておきます。このとき、プログラムの途中で "ファイルを開く" という処理が必要になったら、このサブルーチンを呼び出して利用します。

一度作成すれば、何度も再利用可能となりプログラミングの手間も省けるためABAPではサブルーチンの利用が推奨されます。

サブルーチンと汎用モジュールの違い

別のページでも解説しますが、汎用モジュールもサブルーチンと同様の考え方です。プログラムの部品を予め作成しておいて、必要に応じて繰り返し利用するという点で両者は同一です。

ただし、サブルーチンはそのプログラムの中でのみの利用であるのに対して、汎用モジュールはどのプログラムからも利用可能です。

サブルーチンは定義したプログラム内でのみ動作する

汎用モジュールについては、「【ABAP】汎用モジュールで占い機能を実装する」のページをご覧ください。

ここからは、サブルーチンを利用する際の構文ルールについて確認していきたいと思います。

サブルーチンの利用方法

サブルーチンは、定義と実行に分かれます。サブルーチンを利用するには、事前にサブルーチンを定義しておく必要があります。

サブルーチンの定義:FORM~ENDFORM

サブルーチンは、上記で説明した通り繰り返し利用する機能を「あらかじめ定義」する必要があります。以下は定義時のコーディングを説明します。

構文ルール:FORM~ENDFORM


FORM (サブルーチン名)
 USING
  ・・・TYPE・・・
 CHANGING
  ・・・TYPE・・・

(実際のロジックはここに記述する)

ENDFORM.


FORMで始まり、ENDFORMで記述を終えます。ピリオドは、ENDFORMの最後に打ちますが、それ以外では打ちません。

USING / CHANGINGは、そのサブルーチン内で利用するデータを定義です。ここの構文はDATA命令の構文構成とほぼ変わりませんので、構文としては難しくはありません。

USING / CHANGINGの違い

USINGとCHANGINGの区別が、サブルーチンを理解するうえで最も大切です。 USING(使う)とCHANGING(変える)という名称に騙されやすいのですが、実際は以下の区別が最も適切です。

  • USING    ⇒ インプットデータ
  • CHANGING ⇒ インプットデータかつアウトプットデータ

USINGは、サブルーチン内でのみ利用されるデータオブジェクトです。そのため、サブルーチンを動かす際のインプットデータにしかなりません。一方で、CHANGINGはサブルーチン内外で利用可能なデータオブジェクトになります。

  • USING    ⇒ サブルーチン実行前後で値が変わらない
  • CHANGING ⇒  サブルーチン実行前後で値が変わりうる

したがって、条件次第でどちらか一方だけ(USINGだけ・CHANGINGだけ)をパラメータとして設定する場合もあります。

以下で簡単なサブルーチンの定義例を見てみましょう。

FORM keisanki
         USING
           p1 TYPE p
           p2 TYPE p
         CHANGING
           w_tashizan  TYPE p.

    w_tashizan  =  p1 +  p2.

ENDFORM.

簡単な足し算のサブルーチンです。インプットの値を入れると、足し算の答えを返すロジックが組み込まれているのが分かるかと思います。

サブルーチンの実行:PERFORM

サブルーチンを定義したら後は動かすだけです。ここからは、サブルーチンを実際に利用する方法を学んでみましょう。

構文ルール:PERFORM


PERFORM(サブルーチン名)
 USING
  (インプットデータ)
  ・・・
 CHANGING
  (アウトプットデータ)
  ・・・.


サブルーチンを利用する際は、PERFORM命令を利用します。PERFORMでは、実際にサブルーチンで利用する値をUSINGとCHANGINGに指定します。

先ほどの例で定義したサブルーチンを動かすコード例を見てみましょう。

int1 = 2.
int2 = 3.

PERFORM keisanki
  USING
         int1
         int2
  CHANGING
    kotae_tashizan

”keisanki” というサブルーチンは「インプットデータ2つを加算しアウトプットを出力する」ロジックを組み込んでいました。(以下再掲)

FORM keisanki
         USING
           p1 TYPE p
           p2 TYPE p
         CHANGING
           w_tashizan  TYPE p.

    w_tashizan  =  p1 +  p2.

ENDFORM.

PERFORM命令では、FORMで定義したUSINGとCHANGINGに渡す値を同じく USINGとCHANGINGで指定します。

USINGとCHANGINGで定義したデータが複数ある場合は、上から順番に値が渡されます。

上記例では、"int1" "int2" の中身に2と3が入っているので、サブルーチンを動かした後 "kotae_tashizan" に入っている値は5ということになります。

サブルーチン:応用編

先ほどのサブルーチンを動かしたあと、再度同様のサブルーチンを動かした場合はどうなるでしょうか?

先ほどの例の続きに以下のコードを書き足した場合を考えてみましょう。

*****************
****値を格納*****
*****************

int1 = 2.
int2 = 3.

****************************
****計算ロジック呼び出し1****
****************************

PERFORM keisanki
  USING
         int1
         int2
  CHANGING
    kotae_tashizan

****************************
****計算ロジック呼び出し2****
****************************

PERFORM keisanki
  USING
         kotae_tashizan
         int1
  CHANGING
    kotae_tashizan_2

************************
****サブルーチン定義*****
************************

FORM keisanki
         USING
           p1 TYPE p
           p2 TYPE p
         CHANGING
           w_tashizan  TYPE p.

    w_tashizan  =  p1 +  p2.

ENDFORM.

このコードを読む鍵は「USINGとCHANGING」についての理解です。

変数「kotae_tashizan_2」に入っている数字は「7」です。これ以外の数字が返ってくると思う方は、再度ページ上部から読み直してみてください。

ヒント・・・26行目の「int1」の値は?

タイトルとURLをコピーしました