汎用モジュール
22.4 汎用モジュール
汎用モジュールもサブルーチンと同様、複数のプログラムから共通で利用できる「処理部品」です。
同じ処理を何度も書かずに済むため、可読性・保守性・拡張性の向上につながります。
サブルーチンと違い、汎用モジュールについては「IMPORT / EXPORT」と「何となくの処理」さえ
分かっていれば、実際のロジックを意識せずに利用することが可能です。
※標準の有無
SAPの標準機能(元から用意されているもの)という意味になります。
この場合ですと、サブルーチンは、SAPの標準機能として用意されておらず、事前に自身で作成が必要という意味になります。
反対に汎用モジュールは、SAPの標準機能(元から用意されているもの)が有るという意味になります。
汎用モジュールの実装
汎用モジュールの実装には以下の3つのステップが必要です。
1.汎用グループの登録
2.汎用モジュールの登録
3.IMPORT/EXPORTの定義・ロジックの実装
1.汎用グループの登録
汎用グループは、汎用モジュールをまとめる単位です。
汎用モジュールを「ファイル」に例えると、汎用グループはそれらをまとめる「フォルダ」のイメージです。
(例:計算グループの中に、日付計算・年齢計算などの汎用モジュールをまとめる)
汎用モジュールは、必ずどこかの汎用グループに所属します。新規作成する場合は、既存グループを利用するか、新しく汎用グループを作成します。汎用モジュールを新規に登録する場合は、 既存の汎用グループに登録するか、新たに汎用グループを登録する必要があります。
操作手順
① 汎用モジュールビルダー(SE37) を実行します。
② 「ジャンプ」→「汎用グループ」から「汎用グループ登録」画面に遷移します。
③ 汎用グループの情報を入力し、「保存」を押下します。
汎用グループ名:ZG_任意の名称
内容説明:テスト用汎用モジュールグループ
2.汎用モジュールの登録
① SE37の「汎用モジュール」に名称を入力し、登録ボタンを押下します。
汎用グループ名:ZM_任意の名称
② 登録しておいた汎用グループを記入し、保存します。
汎用モジュールの名称は、汎用グループで共通化されているものを定義すると情報体系の整理に役立ちます。
3.IMPORT/EXPORTの定義・ロジックの実装
汎用モジュールのIMPORTINGとEXPORTINGは、サブルーチンのUSING/CHANGINGに対応します。
汎用モジュールでは、サブルーチンのようにUSING/CHANGINGを自分でコーディングする必要がありません。
インプット・アウトプットを定義する専用のタブが存在します。
① 「インポート」タブに項目を記入し、Enterで登録内容を確認します。
パラメータ名:IV_ZISDT
関連する型:ZT200400101-ZISDT
②「エクスポート」タブに項目を記入し、Enterで登録内容を確認します。
●パラメータ名:EV_RECODE
関連する型:I
内容説明:データ件数
●パラメータ名:EV_TABLE
関連する型:ZTD200400101
③ 「ソースコードタブ」にロジックの記入し、「保存」「有効化」します。
④ 手順③で汎用モジュールを保存後、その汎用モジュールを使用するために有効化を行います。
ただし、汎用モジュールと一緒に別のオブジェクトも有効化する必要があります。
・SAPLZG_GNELAL_MODULE_TEST
:汎用グループを登録すると作成されるメインプログラム(FUNCTION-POOL) です。
・LZG_GNELAL_MODULE_TESTTOP
:FUNCTION-POOL 命令および汎用グループ全体のグローバルデータ宣言が含まれます。
上記オブジェクトを作成した汎用モジュールと一緒に有効化することによって汎用モジュールが登録されます。
汎用モジュールの呼び出し方法
汎用モジュールの呼び出しのためには CALL FUNCTION 命令を使います。
呼び出し時に必要なのは、汎用モジュール名と、インターフェースで定義した入出力パラメータです。
・汎用モジュールへ値を渡す → EXPORTING
・汎用モジュールから値を受け取る → IMPORTING
・参照渡しで入出力する → CHANGING
・内部テーブルを渡す → TABLES(必要な場合のみ)
・例外を受け取る → EXCEPTIONS
これらのパラメータから、必要な区分だけ記述します。(不要な区分は省略できます)。
サンプルコード
REPORT Z_SAMPLE224_MOD.
*&---------------------------------------------------------------------*
* データ定義
* ※データ型は汎用モジュールの各パラメータのタブから対応するパラメータを参照して合わせる
*&---------------------------------------------------------------------*
DATA LT_TABLE ZTD200400101. “テーブルデータ型
DATA LV_RECODE TYPE I.
*&---------------------------------------------------------------------*
* パラメータ定義
*&---------------------------------------------------------------------*
PARAMETERS P_ZISDT TYPE ZT200400101-ZISDT DEFAULT '20210101'. .
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" 汎用モジュール呼び出し
CALL FUNCTION 'ZM_SAMPLE224_MOD'
EXPORTING
IV_ISDT = P_ZISDT
IMPORTING
EV_RECODE = LV_RECODE
ET_TABLE = LT_TABLE.
" 取得件数を表示
WRITE: / |取得件数: { LV_RECODE }|.
" 取得データを表示(項目を指定して出力)
WRITE:
/ '商品名', 22 '商品コード', 40 '売上金額', 54 '通貨', 62 '登録日', 74 '伝票番号'.
ULINE.
LOOP AT LT_TABLE INTO DATA(LS_ROW).
" ※金額は通貨項目(WAERS)とセットで書くと見やすい
WRITE:
/ LS_ROW-ZTEXT UNDER '商品名',
LS_ROW-MATNR UNDER '商品コード',
LS_ROW-ZAMT_SAL UNDER '売上金額',
LS_ROW-WAERS UNDER '通貨',
LS_ROW-ZISDT UNDER '登録日',
LS_ROW-ZNUM UNDER '伝票番号'.
ENDLOOP.
結果
汎用モジュール内に記載したテーブル照会結果を確認します。
汎用モジュールを呼び出したい箇所にカーソルを合わせて、「編集」→「パターン」を選択し、 「CALL FUNCTION」に汎用モジュールの名称を入力して✔するとフォーマットで呼び出せます。
汎用モジュールの各種パラメータについて
※呼び出し元プログラム内で定義する変数と、呼び出し先汎用モジュール内で定義する変数は
いずれのパラメータも、データ型を一致させる必要があることを意識しましょう。
1.EXPORTING
呼び出し元プログラムから、汎用モジュールへ 「値を渡す(入力)」区分です。
汎用モジュール側では IMPORTING パラメータとして受け取ります。
2.IMPORTING
汎用モジュールから、呼び出し元プログラムへ 「値を返す(出力)」区分です。
汎用モジュール側では EXPORTING パラメータとして定義されます。
3.CHANGING
呼び出し元から値を渡し、汎用モジュール内で変更した結果を 「同じ変数に返す(入出力)」区分です。
「入力+出力」を1つにまとめたい場合に使用します。
※「必ず変更される」わけではありません(変更しない場合もあります)。
4.TABLES
内部テーブルを受け渡すための 旧来形式です。
入出力の方向が分かりにくいため、新規開発での使用は推奨しません。
内部テーブルも EXPORTING / IMPORTING / CHANGING で受け渡しできます。
(ただし、古い標準汎用モジュールではTABLESが使われている場合があります。
)
5.EXCEPTIONS
汎用モジュール内でエラーが発生した場合に、SY-SUBRCに値を設定して呼び出し元へ伝える仕組みです。
呼び出し後はSY-SUBRCを確認し、必要に応じて処理中断やメッセージ表示を行います。
※アドオンの汎用モジュールでも例外設計は重要です。
標準FMだけの話ではありません。
汎用モジュールのパラメータ設定の型変換について
汎用モジュールの呼び出しでは、パラメータのデータ型が一致していることが基本です。
呼び出し元の変数型と、汎用モジュール側のパラメータ型が異なる場合、パターン生成時に正しく提案されない/代入できない、といった混乱が起きやすくなります。
ABAP 7.4 以降では、CONV により 呼び出し時にその場で型変換できます。
これにより、中間変数を用意せずに、意図が分かりやすい呼び出しが可能になります。
構文
CONV データ型( 変数/定数 ).