セクション 7 / 11

モジュール化技法

サブルーチン・関数モジュール・メソッドという3つのモジュール化手段、パラメータの渡し方、BAPIの位置づけを解説します。

目次を開く

モジュール化は、処理をまとまった単位に分割して再利用可能にする技法です。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用途
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パラメータは呼び出し先で変更できないよう保護されていますが、大きな内部テーブルを扱う場合、値渡しにするとコピーのコストが発生します。性能が問題になる場面では、この違いを意識する必要があります。

📖 わからない用語は SAP用語辞典 で調べられます。

理解度チェック

このセクションの内容を確認しましょう。

確認問題 1

現在のABAP開発で新規開発時に非推奨とされているモジュール化技法はどれか。

確認問題 2

BAPIはファンクションモジュールとして実装されている。

確認問題 3

ファンクションモジュールのパラメータで、呼び出し側からデータを受け取るパラメータはどれか。

確認問題 4

外部システムからSAPのファンクションモジュールを呼び出す仕組みは何か。

確認問題 5

ファンクションモジュールは単独で存在し、ファンクショングループに属する必要はない。

確認問題 6

ファンクションモジュール呼び出しの処理順序を並べてください。

クリックして正しい順番に選んでください