ABAPプログラミングの超基本知識「サブルーチン(PERFORM文)」について説明していきます。簡単に説明すると、「サブルーチン」は繰り返し利用される機能のまとまりです。
別の言語でいうところの「関数」です。
サブルーチンをうまく利用することで、ABAPのプログラム全体が読みやすく構造化され、結果としてシステム全体の品質が向上します。このページではABAP初心者向けにサブルーチンの定義方法・利用方法をサンプルコード付きでわかりやすく解説します。
ABAPerであれば知らないと恥ずかしい超基本知識です。是非最後までご覧ください。
サブルーチンとは?
サブルーチンとは、繰り返し利用可能なプログラムの部品です。他のプログラミング言語を学んだ方であれば、単なる関数だと理解してOK。
1つのプログラムの中で、繰り返し利用する機能をあらかじめ作成しておいて、使いたくなったらその都度呼び出して使うのがサブルーチンです。
別のいい方をすると、ABAPはプログラムを複数の部品に分割することができるのですが、これらの部品のことを「サブルーチン」と呼んでいる、ということです。
例えば、”データを登録する” というロジックAをサブルーチンとしてあらかじめ作成しておきます。このとき、プログラムの途中で "データを登録する" という処理が必要になったら、このサブルーチンを呼び出して利用するようなイメージ。
一度作成すれば、何度も再利用可能となりプログラミングの手間も省けるのと、コード全体がすっきりすため、できるだけサブルーチンを利用する形でプログラミングしていくのができるABAPerの定石です。
コードが長文化・複雑化してしまうことを避けるために、ある程度の処理単位ごとにコードを別切りで作成することを、プログラムの構造化(モジュール化)と言います。
以下の記事では、プログラミング言語全般に共通するモジュール化のメリットを解説しておりますのでこの機会に合わせてご覧になってみてください。
サブルーチンと汎用モジュールの違い
別のページでも解説しますが、汎用モジュールもサブルーチンと同様の考え方です。プログラムの部品を予め作成しておいて、必要に応じて繰り返し利用するという点で両者は同一です。
ただし、サブルーチンはそのプログラムの中でのみの利用であるのに対して、汎用モジュールは「どのプログラムからも利用可能」というのが相違点です。
汎用モジュールも再利用可能なプログラムの部品です。「部品」ですので、事前にロジックを実装しておき、後から汎用モジュールを「呼び出す」形で利用します。
サブルーチンも「事前に定義しておき、プログラムの中で何度も利用できる」という点では全く同一ですが、汎用モジュールは「SAP内のどのプログラムでも利用可能」という点でサブルーチンと異なります。
ここからは、サブルーチンを利用する際の構文ルールについて確認していきたいと思います。
サブルーチンの利用方法
サブルーチンは「定義」と「実行」から成り立ちます。サブルーチンを利用するにはまずサブルーチンの定義を行っておく必要があります。
サブルーチンの定義:FORM~ENDFORM
サブルーチンは、上記で説明した通り繰り返し利用する機能を「あらかじめ定義」する必要があります。以下は定義時のコーディングを説明します。
構文ルール:FORM~ENDFORM
FORM (サブルーチン名)
USING
・・・TYPE・・・
CHANGING
・・・TYPE・・・
(実際のロジックはここに記述する)
ENDFORM.
FORMで始まりENDFORMで記述を終えます。ピリオドは、ENDFORMの最後に打ちますが、それ以外では打ちません。
FORM keisanki USING p1 TYPE p p2 TYPE p CHANGING w_tashizan TYPE p. w_tashizan = p1 + p2. 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.
簡単な足し算のサブルーチンです。インプットの値を入れると、足し算の答えを返すロジックが組み込まれているのが分かるかと思いますが、サブルーチン中で不変の変数「p1」と「p2」はUSINGオプションに、可変の変数「w_tashizan」をCHANGINGオプションに指定しています。
サブルーチンの実行: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」です。答えが「7」にならなかった方は、再度ページ上部から読み直してみてください。
SAP / ABAPを1から学習したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!