モジュール化は、処理をまとまった単位に分割して再利用可能にする技法です。ABAPには歴史的な経緯から複数の手段があり、それぞれ適した用途が異なります。
3つのモジュール化手段
| 手段 | 定義場所 | 再利用範囲 | 現在の推奨度 |
|---|---|---|---|
| サブルーチン(FORM) | プログラム内 | 同一プログラム内が原則 | 非推奨(レガシー) |
| 関数モジュール | 関数グループ | システム全体 | 用途による |
| メソッド | クラス | システム全体 | 推奨 |
サブルーチン(FORM)
PERFORM calculate_total
USING lt_items
CHANGING lv_total.
FORM calculate_total
USING it_items TYPE ty_items
CHANGING cv_total TYPE i.
CLEAR cv_total.
LOOP AT it_items INTO DATA(ls_item).
cv_total = cv_total + ls_item-menge.
ENDLOOP.
ENDFORM.関数モジュール
関数モジュールは、SE37で作成する再利用可能な処理単位です。関数グループという入れ物に属し、同じグループ内の関数はグローバルデータを共有します。
| 種類 | 方向 | 特徴 |
|---|---|---|
| IMPORT | 入力 | 関数が受け取る値 |
| EXPORT | 出力 | 関数が返す値 |
| CHANGING | 入出力 | 渡した変数が書き換えられる |
| TABLES | 入出力 | 内部テーブル用(古い形式) |
| EXCEPTIONS | 例外 | 呼び出し元でsy-subrcとして受け取る |
CALL FUNCTION 'Z_CALCULATE_DISCOUNT'
EXPORTING
iv_amount = lv_amount
iv_customer = lv_kunnr
IMPORTING
ev_discount = lv_discount
EXCEPTIONS
invalid_input = 1
not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
" エラー処理
ENDIF.RFC対応関数とBAPI
関数モジュールをRFC対応(リモート呼び出し可能)に設定すると、外部システムから呼び出せるようになります。この仕組みを使い、SAPが業務処理の標準APIとして提供しているのがBAPIです。
| BAPI | 用途 |
|---|---|
| BAPI_MATERIAL_SAVEDATA | 品目マスタの登録・変更 |
| BAPI_SALESORDER_CREATEFROMDAT2 | 受注伝票の作成 |
| BAPI_PO_CREATE1 | 購買発注の作成 |
| BAPI_ACC_DOCUMENT_POST | 会計伝票の転記 |
| BAPI_GOODSMVT_CREATE | 在庫移動の転記 |
| BAPI_TRANSACTION_COMMIT | コミット(BAPI呼び出し後に必須) |
メソッド(ABAPオブジェクト)
現代のABAP開発では、クラスのメソッドが標準的なモジュール化手段です。詳細は次のセクションで扱いますが、パラメータの考え方は関数モジュールと似ています。
CLASS lcl_calculator DEFINITION.
PUBLIC SECTION.
METHODS calculate_total
IMPORTING it_items TYPE ty_items
RETURNING VALUE(rv_total) TYPE i.
ENDCLASS.
CLASS lcl_calculator IMPLEMENTATION.
METHOD calculate_total.
LOOP AT it_items INTO DATA(ls_item).
rv_total = rv_total + ls_item-menge.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
" 呼び出し
DATA(lo_calc) = NEW lcl_calculator( ).
DATA(lv_total) = lo_calc->calculate_total( lt_items ).RETURNINGパラメータを持つメソッドは、式の中で直接使えます。これにより、一時変数を減らした簡潔なコードが書けます。RETURNINGは1つしか定義できませんが、その制約が「メソッドは1つのことをする」という設計を促します。
パラメータの渡し方
| 方式 | 記法 | 挙動 |
|---|---|---|
| 参照渡し(既定) | IMPORTING iv_x TYPE i | コピーが発生しない。高速だが変更に注意 |
| 値渡し | IMPORTING VALUE(iv_x) TYPE i | コピーが渡される。安全だが大きなデータでは遅い |
ABAPでは既定が参照渡しです。IMPORTINGパラメータは呼び出し先で変更できないよう保護されていますが、大きな内部テーブルを扱う場合、値渡しにするとコピーのコストが発生します。性能が問題になる場面では、この違いを意識する必要があります。