!--a11y-->

ABAP
ワークベンチで汎用モジュールビルダを使用することによってのみ、汎用モジュールおよび汎用グループを登録することができます。追加情報については、
新規汎用モジュールの登録を参照してください。このセクションでは、例を用いて ABAP
プログラムの観点から汎用モジュールがどのように登録されるかについて説明します。

汎用モジュール READ_SPFLI_INTO_TABLE を登録して、指定された航空便のデータをテーブル SPFLI から内部テーブルに読み込みます。その後、データを呼出元プログラムに戻します。
汎用グループおよび汎用モジュール
まず、新規汎用グループ DEMO_SPFLI
を登録して、汎用モジュールを保持します
(
汎用グループの登録を参照)
。その後、新規汎用モジュール登録することができます
(
汎用モジュールの登録を参照)
。
パラメータインタフェース
サブルーチンのパラメータインタフェースと同じ方法で、汎用モジュールのインタフェースパラメータの型を指定することができます。汎用モジュールはシステムのどこでも使用できるため、そのインタフェースにはシステム全体で宣言されたデータ型への参照だけを含めることができます。これには基本 ABAP データ型、ANY TABLE などのシステム全体の汎用型、ABAP ディクショナリで定義されたすべての型、が挙げられます。LIKE を使用して、メインプログラムで宣言されたデータ型を参照することはできません。
汎用モジュール READ_SPFLI_INTO_TABLE には、選択肢を 1 つの航空便に制限するインポートパラメータが必要です。型を指定するために、データベース SPFL のキー項目 CARRID を参照することができます。
参照項目/ 構造 には、データベーステーブルの列、ABAP ディクショナリ構造のコンポーネント、またはABAP ディクショナリ構造全体を入力することができます。インポートパラメータ ID はオプションで、デフォルト値が設定されています。
以下の型仕様は、同じ結果が得られます。
参照型 には、システム全体で認識される任意の汎用データ型または完全データ型を入れることができます。ここでは、パラメータは基本 ABAP ディクショナリ型 ( またはデータエレメント) S_CARR_ID への参照によって定義されます。この型は項目 SPFLI-CARRID の定義に使用されます。
データを呼出元プログラムに戻すために、汎用モジュールには内部テーブルの型を持つエクスポートパラメータが必要です。そのために、ABAP ディクショナリで行データ型 SPFLI を持つシステム全体のテーブルデータ型 SPFLI_TAB を定義します。
これで、このデータ型を使用してエクスポートパラメータ ITAB の型を指定することができます。
内部テーブルは値によって渡されます。テーブルパラメータを使って渡された内部テーブルだけが、参照によって明示的に渡されます。
例外
汎用モジュールには、テーブル SPFLI に選択基準を満たすエントリがない場合に開始できる例外が必要です。例外 NOT_FOUND がこの機能を果たします。
ソースコード
パラメータインタフェースや例外を定義した後は、汎用モジュールのソースコードを書き込むことができます。そのためには、汎用モジュールビルダで ソースコードを選択します。これにより、インクルードプログラムL<fgrp>U<xx> の ABAP エディタが開きます ( 汎用グループ を参照) 。これは、汎用モジュールのプログラムコードを保持するインクルードです。
汎用モジュールのソースコードは、FUNCTION 命令および ENDFUNCTION 命令の間に生成されます。パラメータインタフェースおよび例外の定義は、ここのコメント行に表示されます。実際のコーディングは、汎用モジュールビルダによって非表示で生成されます。
汎用モジュールのデータ
TYPES 命令および DATA 命令を使用して、ローカルデータ型およびオブジェクトを登録することができます。インタフェースパラメータもローカルデータオブジェクトのように動作します。さらに、メインプログラムのすべてのグローバルデータにアクセスすることができます。このデータは、インクルードプログラムL<fgrp>TOP で定義されています。このインクルードを開くには、ジャンプ → グローバルデータ を選択します。グローバルデータはクラスのインスタンス属性のように動作します。特定の汎用グループで汎用モジュールを最初に呼び出す際、データがメモリにロードされます。その後、グループ内のすべての汎用モジュールがデータにアクセスおよび変更することができます。次回汎用モジュールが呼び出されるまで、値は保持されます。
サブルーチンの呼出
サブルーチンは、ローカルでのモジュール化に使用します。汎用モジュールもこの技術を使用することができます。呼び出す汎用モジュールは、対応するメインプログラムで定義されます。
サブルーチンを単一汎用モジュールからのみ呼び出す場合は、サブルーチンを、汎用モジュールそのものと同じインクルードプログラムで、ENDFUNCTION 命令の直後に定義することをお奨めします。、これらのサブルーチンは、汎用グループのすべての汎用モジュールから呼び出すことができますが、明確にするために、先行する汎用モジュールからのみ呼び出す必要があります。
複数の異なる汎用モジュールから呼び出されるサブルーチンを定義する場合は、L<fgrp>F<xx> という名前で特別なインクルードプログラムを定義することができます。
例外の生成
例外を生成させるために、2 つの ABAP 命令があります。これらは汎用モジュールでのみ使用することができます。
RAISE <except>.
および
MESSAGE.....RAISING <except>.
これらの命令の効果は、呼出元プログラムが例外を処理するかどうかによって決まります。CALL FUNCTION 命令の EXCEPTIONS オプションで <except> という名前の例外または OTHERS が発生すると、例外は呼出元プログラムによって処理されます。
呼出元プログラムが例外を処理しない場合
RAISE 命令はプログラムを終了させ、デバッグモードに切り替えます。
MESSAGE ..... MESSAGE 命令は指定されたメッセージを表示します。処理の続行方法は、メッセージタイプによって決まります。
呼出元プログラムが例外を処理する場合、両方の命令がプログラムにコントロールを戻します。値は何も転送されません。MESSAGE .....RAISING 命令はメッセージを表示しません。代わりに、システム項目 SY-MSGID 、SY-MSGTY 、SY-MSGNO 、および SY-MSGV1 を SY-MSGV4 に入力します。
READ_SPFLI_INTO_TABLE のソースコード
READ_SPFLI_INTO_TABLE のソースコード全体は以下のようになります。
FUNCTION READ_SPFLI_INTO_TABLE.
*"------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*"
VALUE(ID) LIKE SPFLI-CARRID DEFAULT 'LH '
*" EXPORTING
*"
VALUE(ITAB) TYPE SPFLI_TAB
*" EXCEPTIONS
*" NOT_FOUND
*"------------------------------------------------------------
SELECT * FROM SPFLI INTO TABLE ITAB WHERE CARRID = ID.
IF SY-SUBRC NE 0.
MESSAGE E007(AT) RAISING NOT_FOUND.
ENDIF.
ENDFUNCTION
汎用モジュールはデータベーステーブル SPFLI からすべてのデータを読み取ります。ここではキー項目 CARRID はインポートパラメータ ID と同じで、検索されたエントリは内部テーブルSPFLI_TAB に入れられます。エントリが何も見つからない場合は、MESSAGE...RAISING を使用して例外 NOT_FOUND が開始されます。それ以外の場合は、テーブルはエクスポートパラメータとして呼出元に渡されます。
READ_SPFLI_INTO_TABLE の呼出
以下のプログラムは、汎用モジュール READ_SPFLI_INTO_TABLE を呼び出します。
REPORT DEMO_FUNCTION_MODULE.
PARAMETERS CARRIER TYPE S_CARR_ID.
DATA: JTAB TYPE
SPFLI_TAB,
WA LIKE LINE OF
JTAB.
CALL FUNCTION
'READ_SPFLI_INTO_TABLE'
EXPORTING
ID =
CARRIER
IMPORTING
ITAB =
JTAB
EXCEPTIONS
NOT_FOUND = 1
OTHERS =
2.
CASE
SY-SUBRC.
WHEN 1.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER
SY-MSGNO.
WHEN 2.
MESSAGE E702(AT).
ENDCASE.
LOOP AT JTAB INTO
WA.
WRITE: / WA-CARRID, WA-CONNID, WA-CITYFROM,
WA-CITYTO.
ENDLOOP.
実パラメータ CARRIER および JTAB は、汎用モジュール内の対応するインクルードパラメータと同じデータ型を持ちます。例外NOT_FOUND はプログラム内で処理されます。汎用モジュールがエラーを処理した場合に表示されるのと同じメッセージが表示されます。