本ページでは、ABAPerなら知らないと恥ずかしい超・基本知識「汎用モジュールの利用方法/構文ルール」について解説します。
汎用モジュールは、一言でいえば「再利用可能なプログラムの部品」です。事前にロジックを定義しておき、後から呼び出す形で利用します。

そのため、汎用モジュールをきちんとマスターするには、大きく「定義」と「呼び出し」の2つをきちんと理解する必要があります。このページでは画面キャプチャ付きで汎用モジュールの呼び出し方法まで解説しますので、是非最後までご覧ください。
このページで学べる内容
- 汎用モジュールの実装方法(定義)
- 汎用モジュールの呼び出し―CALL FUNCTION命令の利用
- 汎用モジュールとサブルーチンの違い
汎用モジュールとは?
汎用モジュールとは、再利用可能なプログラムの部品です。「部品」ですので、事前にロジックを実装しておき、後から汎用モジュールを「呼び出す」形で利用します。
サブルーチンも「事前に定義しておき、プログラムの中で何度も利用できる」という点では全く同一ですが、汎用モジュールは「SAP内のどのプログラムでも利用可能」という点でサブルーチンと異なるのです。
実際の構文ルールを解説する前に、汎用モジュールとサブルーチンの違いについて整理しておきたいと思います。
汎用モジュールとサブルーチンの違い
汎用モジュールとサブルーチンの大きな違いは以下の2点です。

まず、先ほどの説明した通りサブルーチンは、定義したプログラム内でのみ呼び出し可能ですが、汎用モジュールはSAP内のどのプログラムからでも呼び出すことが可能です。
また、サブルーチンはすべて自分で定義する必要がありますが、汎用モジュールはSAPが標準で用意してくれているものがたくさんあります。つまりそれらの汎用モジュールについては「IMPORT / EXPORT」と「何となくの処理」さえ分かっていれば、実際のロジックを意識せずに利用することが可能なのです。
汎用モジュールとサブルーチンの使い分け
- サブルーチン ⇒ プログラム単体の構造化
- 汎用モジュール ⇒ 複数のプログラムの構造化
実際には、他にもいろいろなメリットが存在します。汎用モジュールを利用していく中でそれらに気づいていけるようになっていくはずです。
ここからは、汎用モジュールを利用する手順を解説していきます。自分で①定義・②呼び出しを行うことができれば、SAP標準の汎用モジュールの利用方法も簡単に理解できるでしょう。
まずは、汎用モジュールの実装:定義部分から解説します。
実装方法:汎用モジュール
今回は、例として「血液型の相性診断」汎用モジュールを作ってみたいと思います。(同じようなプログラムが各ベンダーの研修で用いられているようです。)
汎用モジュールの実装の大まかな流れ
- 汎用グループの登録
- 汎用モジュールの登録
- IMPORT/EXPORTの定義・ロジックの実装
まず最初の1ステップは「汎用グループ」の登録です。
汎用グループへの登録
汎用グループとは、その名の通り汎用モジュールをまとめたものです。汎用モジュールが、1つ1つのファイルだとすると、汎用モジュールはそれらのファイルをまとめた「フォルダ」です。

例えば、計算汎用グループがあるとすると、その中に「日付計算汎用モジュール」「年齢計算汎用モジュール」がまとまっているようなイメージです。汎用モジュールを新規に登録する場合は、汎用グループに登録するか、新たに汎用グループを登録する必要があります。
トランザクションコード:SE37
トランザクションコード SE37 を実行すると以下の画面に遷移します。

メニューから以下のように飛んで汎用グループ登録画面に遷移します。

画面に従って項目を埋めていきます。

これで、汎用グループの登録は完了です。
汎用モジュールの登録
汎用グループの登録が完了したら、実際に汎用モジュールの登録を行うことができます。基本的には、汎用グループを新規登録する機会は多くありませんので、ここからが覚えておくべき重要なステップになります。
下記の画面の項目にしたがって内容を入力します。

先ほど登録した汎用グループに紐づける形で汎用モジュールを登録します。この際、汎用モジュールの名称については、汎用グループで共通化されているものを定義すると情報体系の整理に役立ちます。
インプットデータ・アウトプットデータを指定する
汎用モジュールのIMPORTINGとEXPORTINGは、サブルーチンのUSING,CHANGINGに対応します。

インプット(入力)するデータを指定します。汎用モジュールでは、サブルーチンのように「USING / CHANGING」を自分でコーディングする必要がありません。インプット・アウトプットを定義する専用のタブが存在します。

エクスポート(出力)されるデータの定義も同様です。

そして、実際のロジックについては「ソースコードタブ」で実装することになります。一般的なソースコード編集画面と同様に操作することが可能です。

汎用モジュールでは、インポートとエクスポートのデータを定義すればその情報が自動的にコードの先頭に書き起こされます。
※例にあげた画面では、10行目までは自動で作成されたコードです。
実際に記述したコードはこちら。
* 血液型相性マスタを検索 SELECT SINGLE * "1行だけかつ全項目取得 FROM YTEST_ITKW "このテーブルから取得 WHERE BTYPE_JIBUN = @IM_BLOOD_TYPE_JIBUN "インポートパラメータの自分の血液型を指定 AND BTYPE_AITE = @IM_BLOOD_TYPE_AITE "インポートパラメータの相手の血液型を指定 INTO @DATA(LW_BLOOD). "取得したらこの構造に保持 * 取得できた場合 IF SY-SUBRC = 0. EX_AISHO = LW_BLOOD-AISHO. "エクスポートパラメータにメッセージを設定 * 取得できなかった場合 ELSE. * & はありません MESSAGE E081(MA) "メッセージを出力 WITH 'そんな血液型' "メッセージの&に入る文字を指定 RAISING BLOOD_TYPE_ERROR. "例外を設定 ENDIF.
「@DATA」から始まるコードは、インライン宣言と呼ばれる変数の定義方法です。詳しく知りたい方はこちらをご覧ください。
最後のロジックでは、例外処理としてMESSAGE命令を用いていることが分かるかと思います。汎用モジュールについては、その汎用モジュール内で利用するメッセージの内容を「例外タブ」から設定可能です。

これで、汎用モジュールの実装が完了です。汎用モジュールというとすごく技術的なスキルが必要に思うかもしれませんが、初心者でも簡単に作れるのです。
ここからは、作成した汎用モジュールを呼び出す方法について解説します。
呼び出し方法:汎用モジュール
汎用モジュールの呼び出しは「CALL FUNCTION命令」を用います。
構文ルール:CALL FUNCTION
CALL FUNCTION (汎用モジュール名)
EXPORTING
・・・
IMPORTING
・・・
TABLES
汎用モジュールを呼び出す際に必要なのは、呼び出す汎用モジュール名と、EXPORTING/IMPORTINGに渡してあげる情報のみ(テーブル)です。
IMPORTINGだけを利用する汎用モジュールであれば、もちろんEXPORTINGやTABLESを記述する必要はありません。
汎用モジュールの利用方法はたったこれだけの手順です。最後に汎用モジュールを実際に動かしてみましょう。
汎用モジュールは単体では動かない
汎用モジュールですが、実は単体で動かすことができません。あくまでもプログラムで呼び出されることによってはじめて動作します。この点はサブルーチンと同様です。
ただ、それだと実際のテストできないのでは???こう思いますよね。安心してください。実際の挙動とは多少異なりますが、汎用モジュールのテストする方法も用意されています。
汎用モジュールのテストはSE37からF8実行
汎用モジュールのテストは、先ほどの画面からF8ボタンで実行できます。
この際、汎用モジュールへのインポートデータはプログラムから引き渡されるわけではないので、マニュアルで入力して実行します。

例えば、A型とB型を入力してみましょう。
入力が終わったら実行ボタンを押下すると結果が返ってきます。

あいしょうばつぐん!!!
と返ってきました。決して占いではありません。(事前に設定したマスタにそう指定されているからです。)
汎用モジュールのテスト方法については以下の記事でさらに詳しく解説していますので、合わせてご覧ください。

初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!