この記事を読むメリット
- 購買発注登録(T-CODE:ME21N)を例に、使える BAdI をパッケージと IMG の 2 通りで探せるようになる
- T-CODE:SE19 で拡張実装・BAdI 実装・実装クラスを作り、有効化する手順が分かる
- 作った拡張実装と実装クラスを削除する手順が分かる
BAdI(ビジネスアドイン)は、SAP の標準プログラムに独自の処理を足すための仕組みです。SAP のヘルプによると、BAdI は BAdI インタフェースなどから成り、利用者は BAdI 実装(主に実装クラス)を作って処理を足します。また、カスタマ Exit(ファンクションエキジット)に代わるものとされています。
この記事では、購買発注登録(T-CODE:ME21N)の BAdI を例に、次の 3 つを実際の画面で 1 画面ずつ解説します。対象は ABAP を学び始めた開発者の方です。
- 使える BAdI を 探す方法を 2 通り(パッケージから探す、IMG から探す)
- 見つけた BAdI に 実装を登録して有効化する手順
- 作った実装を 削除する手順
博士!購買発注を登録するときに、会社独自のチェックを足したいって言われました…。どこに処理を書けばいいんでしょう?
うむ、SAP には BAdI という、標準の処理に独自の処理を足すための仕組みがあるぞい。今回は BAdI の探し方と、実装の作り方を説明していくぞい!
この記事のポイント
前提
- 使うトランザクション: T-CODE:SE93、T-CODE:SE18、T-CODE:SPRO、T-CODE:SE19、T-CODE:SE24。
- 作るもの: 拡張実装
ZLAB_EI_PO、BAdI 実装 ZLAB_BI_PO、実装クラス ZCL_LAB_PO_CUST。どれもローカルオブジェクトとして作ります。
BAdI の仕組み
最初に、画面に出てくる言葉の関係を押さえておきます。
| 言葉 | 意味 | 扱うトランザクション |
|---|
| BAdI 定義 | SAP が用意した拡張の口です。どのような処理(メソッド)を足せるかが決まっています(例: ME_PROCESS_PO_CUST) | T-CODE:SE18(照会) |
| BAdI インタフェース | BAdI 定義が持つメソッドの一覧です(例: IF_EX_ME_PROCESS_PO_CUST) | T-CODE:SE18 |
| 拡張スポット | BAdI 定義を入れておく入れ物です | T-CODE:SE18 |
| 拡張実装 | 利用者が作る BAdI 実装を入れておく入れ物です(例: ZLAB_EI_PO) | T-CODE:SE19 |
| BAdI 実装 | 拡張実装の中に作る、BAdI 定義に対する実装です(例: ZLAB_BI_PO) | T-CODE:SE19 |
| 実装クラス | BAdI 実装が使うクラスで、BAdI インタフェースのメソッドに処理を書きます(例: ZCL_LAB_PO_CUST) | T-CODE:SE19、T-CODE:SE24 |
SAP のヘルプでは、次のように説明されています。
- BAdI 実装は、主に BAdI 実装クラスから成り、拡張実装の中で管理されます。
- BAdI には、拡張フレームワークに組み込まれた新しい BAdI と、それより前からある「クラシック BAdI」があります。新しい BAdI がクラシック BAdI を置き換えています。
- 新しい BAdI の実装を作るときは、T-CODE:SE19 で「新規 BAdI」を選び、拡張スポットを指定します。
探し方1: トランザクションのパッケージから BAdI を探す
たとえば、購買発注を登録するときに、会社独自のチェックを足したいという要望を受けた場面を考えます。まず購買発注登録のプログラムとパッケージを調べ、そのパッケージに属する BAdI を一覧にします。
1. T-CODE:SE93 で購買発注登録のトランザクションを照会する
コマンドフィールドに SE93 と入力して Enter キーを押します。「トランザクション更新」画面でトランザクションコードを入力し、「照会」を押します。
画面の見方
- トランザクションコード: 調べたいトランザクションコードを入力します。
- 照会: トランザクションの定義を表示します。
この例では ME21N を入力します。
2. パッケージを確認する
「照会 レポートトランザクション」画面が開きます。
画面の見方
- パッケージ: このトランザクションが属しているパッケージです。
- プログラム: トランザクションに割り当てられたプログラムの名前です。
この例では、パッケージは ME、プログラムは RM_MEPO_GUI です。次の手順でパッケージを使います。
3. T-CODE:SE18 の入力ヘルプを開く
コマンドフィールドに /nSE18 と入力して Enter キーを押します(/n を付けると、別のトランザクションの画面からでも移れます)。「BAdI ビルダ: 定義の第一画面」で「BAdI 名」を選び、入力欄で F4 キーを押します。
画面の見方
- BAdI 名: BAdI の名前で照会するときに選びます。
- BAdI 名の入力欄: ここで F4 キーを押すと、BAdI を探す画面が開きます。
4. 検索条件の画面に切り替える
「リポジトリ情報システム: BAdI 検索」画面が開き、先に一覧が表示されます。条件を指定し直すため、「新規選択」を押します。
画面の見方
- 新規選択: 検索条件を入力する画面を開きます。
5. パッケージを指定して検索する
検索条件を入力する画面が開きます。
画面の見方
- 全部 / カーネルベース BAdI / クラシック BAdI: 探す BAdI の種類を選びます。
- パッケージ: BAdI が属するパッケージで絞り込みます。
- 実行: 条件に合う BAdI を一覧にします。
この例では「全部」のまま、パッケージに手順 2 で確認した ME を入力します。
6. 一覧から BAdI を探す
パッケージに属する BAdI が一覧で表示されます。
画面の見方
- 該当数: 条件に合った BAdI の件数です。
- BAdI 定義の名称: BAdI の名前です。
- 拡張スポット: その BAdI が入っている拡張スポットの名前です。
- 検索: この一覧の中から文字を検索します。
この例では 165 件が表示されます。一覧が長いので、④の検索を使います。
7. 一覧の中で名前を検索する
画面の見方
- 検索: 探す文字を入力します。
- 検索: 一覧の中を検索します。
この例では ME_PROCESS_PO と入力します。② を押すと、該当する行が表示されます。
画面の見方
- 拡張スポットのある行: 拡張スポットの欄に名前が入っている BAdI です。
- 拡張スポットの無い行: 拡張スポットの欄が空の BAdI です。
この例では、ME_PROCESS_PO_CUST が 2 行表示されます。手順 5 の画面で「クラシック BAdI」を選んで検索すると、拡張スポットの無い②の行が表示されます。「カーネルベース BAdI」を選んで検索すると、拡張スポット ME_PROCESS_PO_CUST の付いた①の行が表示されます。この BAdI には、クラシック BAdI としての定義と、拡張スポットに入った BAdI としての定義の両方があります。
8. T-CODE:SE18 で BAdI を照会する
見つけた名前を「BAdI 名」に入力し、「照会」を押します。
画面の見方
- BAdI 名: 照会する BAdI の名前です。
- 照会: BAdI の定義を表示します。
この例では ME_PROCESS_PO_CUST を入力します。
9. BAdI のプロパティを確認する
「ビジネスアドイン: 定義 ME_PROCESS_PO_CUST 照会」画面が開きます。
画面の見方
- 拡張スポットに移行済の BAdI: 拡張スポットの名前を表す項目です(F1 ヘルプでは「拡張スポット名 (ID)」)。
- 複数使用: BAdI 定義の複数使用の設定です。
- フィルタ依存: BAdI 定義がフィルタ値によって使い分けられるかの設定です。
- Interface: BAdI インタフェースとメソッドの一覧を表示するタブです。
この例では、拡張スポットに移行済の BAdI に ME_PROCESS_PO_CUST が入っています。「複数使用」には印が付き、「フィルタ依存」には印がありません。
SAP のヘルプによると、クラシック BAdI で複数使用でないものは、同時に有効にできる実装が 1 つだけです。新しい BAdI でも、単一使用の BAdI に有効な実装が 2 つあると、実行時にショートダンプになります。またフィルタ依存の BAdI では、実装ごとにフィルタ値を決めます。実装を作る前に、この 2 つを確かめておくとよいでしょう。
10. BAdI インタフェースとメソッドを確認する
「Interface」タブを開きます。
画面の見方
- インタフェース名: この BAdI の BAdI インタフェースです。
- メソッドの一覧: 実装クラスで処理を書けるメソッドです。
- メソッドの行: メソッドの名前と、その内容説明です。
- サンプル実装クラス: サンプル実装クラスの名前です。
この例では、インタフェースは IF_EX_ME_PROCESS_PO_CUST です。メソッドには INITIALIZE・OPEN・PROCESS_HEADER・PROCESS_ITEM・CHECK・POST・CLOSE などが並びます。
探し方2: IMG(T-CODE:SPRO)から BAdI を探す
IMG(SAP カスタマイジングの導入ガイド)からも探せます。この BAdI は IMG にも項目があり、説明文(用途やメソッドの使い分け)も読めます。
1. IMG を検索する
コマンドフィールドに /nSPRO と入力して Enter キーを押し、「SAP 完全版 IMG」を押します。「IMG 照会」画面で、検索ボタン(虫めがね)を押します。
画面の見方
- 検索: IMG の中を文字で検索します。
「構造内検索」画面が開きます。
画面の見方
- 検索語句: 探す文字を入力します。
- 続行: 検索を始めます。
この例では 購買発注の拡張処理 と入力します。
2. 検索結果から IMG の場所を開く
検索語句を含む IMG の項目が一覧で表示されます。
画面の見方
- 領域: その項目が IMG のどの領域にあるかです。
- 該当箇所: 開く項目です。ダブルクリックすると、IMG のその場所に移動します。
この例では、「BAdI: 購買発注の拡張処理 (単一画面トランザクション)」が「製造委託」と「購買管理」の 2 か所に表示されます。ここでは「購買管理」の行をダブルクリックします。
画面の見方
- 購買管理におけるビジネスアドイン: 購買管理の BAdI がまとめられているフォルダです。
- BAdI: 購買発注の拡張処理 (単一画面トランザクション): 今回の BAdI の項目です。
②の行の左端には、アイコンが 2 つ並んでいます。左のアイコンを押すと説明文が、右のアイコンを押すと実装の一覧が開きます。
3. 説明文を読む
左のアイコンを押すと、「Performance Assistant」画面に説明文が表示されます。
画面の見方
- BAdI の名前と用途: 説明文の中で、この項目の BAdI 名と用途が書かれています。
- 影響するトランザクション: この BAdI で動きを変えられるトランザクションと BAPI です。
- 割り込めるステップ: BAdI のメソッドが、購買発注の処理のどのステップで使えるかです。
この例では、説明文に次のことが書かれています。
- BAdI
ME_PROCESS_PO_CUST により、Enjoy 購買発注のビジネスロジックを個別に拡張できる。
- ダイアログトランザクション T-CODE:ME21N・T-CODE:ME22N・T-CODE:ME23N・T-CODE:ME29N と、BAPI
BAPI_PO_CREATE1・BAPI_PO_CHANGE に影響する。
- メソッドは、トランザクションの開始(
INITIALIZE)、購買発注の開始(OPEN)、データのチェック(PROCESS_HEADER など)、項目選択、全体チェック(CHECK)、転記(POST)、作業終了(CLOSE)の各ステップに対応する。
「会社独自のチェックを足したい」という場面なら、全体チェックの CHECK を使うことが考えられます。説明文には、「BAdI メソッド CHECK の文書」のような、メソッドごとの文書へのリンクもあります。実装する前に読んでおくとよいでしょう。
4. 既存の実装を確認する
右のアイコンを押すと、「BAdI 実装」画面に、この BAdI の実装の一覧が表示されます。T-CODE:SE19 で作った実装は、この一覧に表示されないことがあります。既存の実装は、T-CODE:SE19 でも確かめるとよいでしょう。
画面の見方
- 有効 (IMG) / 有効 (実装): 有効かどうかを示す 2 つの列です。
- 拡張実装 / BAdI 実装: 実装の入れ物(拡張実装)と、BAdI 実装の名前です。
- 実装を登録: この画面にある「実装を登録」ボタンです。この記事では、実装は T-CODE:SE19 で作ります。
この例では、すでにいくつかの実装が並んでいます。
登録の仕方: T-CODE:SE19 で BAdI 実装を作って有効化する
ここからは、T-CODE:SE19 で ME_PROCESS_PO_CUST の実装を作り、CHECK メソッドに処理を書いて有効化します。
1. T-CODE:SE19 で実装の登録を始める
コマンドフィールドに /nSE19 と入力して Enter キーを押します。「BAdI ビルダ: 実装の第一画面」の下半分「実装の登録」で、BAdI の種類と拡張スポットを指定して「登録」を押します。
画面の見方
- 新規 BAdI: 拡張スポットに入った BAdI の実装を作るときに選びます。
- 拡張スポット: 実装する BAdI が入っている拡張スポットの名前です。
- 登録: 実装の登録を始めます。
この例では、拡張スポットに ME_PROCESS_PO_CUST を入力します。
2. 拡張実装を作る
「拡張実装の登録」画面が開きます。
画面の見方
- 拡張実装: 作る拡張実装の名前です。
- テキスト (短): 拡張実装の説明です。
- 複合拡張実装: 拡張実装をまとめる上位の拡張実装です。
- 拡張の登録: 拡張実装を作ります。
この例では、拡張実装を ZLAB_EI_PO、テキストを「購買発注の保存前チェック(学習用)」とし、複合拡張実装は空のまま進めます。
「オブジェクトディレクトリエントリ登録」画面が開くので、保存先を決めます。
画面の見方
- Object: 作るオブジェクトの種類です。
- ローカルオブジェクト: 保存先をローカルオブジェクトにします。
この例では、拡張実装のオブジェクトの種類は ENHO と表示されます。学習用なので「ローカルオブジェクト」を押します。
3. BAdI 実装と実装クラスの名前を決める
「拡張実装 ZLAB_EI_PO: BAdI 実装の登録」画面が開きます。
画面の見方
- BAdI 実装: 作る BAdI 実装の名前です。
- 実装クラス: 処理を書くクラスの名前です。
- BAdI 定義: 実装する BAdI 定義を一覧から選びます。
- 続行: 入力した内容で BAdI 実装を作ります。
この例では、BAdI 実装を ZLAB_BI_PO、実装クラスを ZCL_LAB_PO_CUST、BAdI 定義を ME_PROCESS_PO_CUST とします。BAdI 定義を選ぶと、テキスト (短) に BAdI 定義の説明が入ります。
4. 実装クラスの作り方を選ぶ
「実装クラスの登録」画面が開きます。
画面の見方
- 選べる作り方: 空のクラスを作る、サンプルクラスをコピーする、「最終」として宣言されていないサンプルクラスから継承する、の 3 つです。この例のサンプル実装クラスは「最終」に印が付いているので、継承の作り方には使えません。
- サンプル実装クラス: サンプル実装クラスの名前です。
- 空のクラス: 中身の無いクラスを作ります。
この例では「空のクラス」を押します。続けて開く「オブジェクトディレクトリエントリ登録」画面でも、保存先を決めます。
画面の見方
- Object: 作るオブジェクトの種類です。
- ローカルオブジェクト: 保存先をローカルオブジェクトにします。
この例では、オブジェクトの種類は CLAS(クラス)と表示されます。
5. 拡張実装の画面を確認する
「拡張実装 ZLAB_EI_PO 変更」画面が開き、ステータスバーに「拡張実装が保存されました」と表示されます。
画面の見方
- 拡張実装のステータス: 拡張実装が有効化されているかどうかの表示です。
- BAdI 実装と実装クラス: 拡張実装に入っている BAdI 実装と、その実装クラスです。
- 有効な実装: BAdI 実装を有効にするかどうかの設定です。
- 実行時の動作: 今の設定で、実行時にこの実装が呼び出されるかどうかの表示です。
この例では、作った直後はステータスが「無効」で、「有効な実装」には印が付いています。実行時の動作には「この実装は呼び出されません」と表示されます。
SAP のヘルプでは、BAdI 実装を作るときに、実装を有効にするプロパティを選ぶよう案内されています。「有効な実装」に印が付いていることを確かめておくとよいでしょう。
6. 実装クラスのメソッドを開く
左のツリーで「実装クラス」を押すと、実装クラスとメソッドの一覧が表示されます。
画面の見方
- 実装クラス: ツリーのこの行を押すと、右側に実装クラスの内容が表示されます。
- 実装クラスの名前: 手順 3 で決めたクラスです。
- 処理を書くメソッドの行: この行をダブルクリックすると、メソッドのソースが開きます。
メソッドにまだ処理が無いので、実装を作るかを聞かれます。「はい」を押します。
この例では「インタフェースメソッドがまだ実装されていません 実装を登録しますか」と表示されます。
7. メソッドに処理を書いて有効化する
「クラスビルダ クラス ZCL_LAB_PO_CUST 変更」画面で、メソッドのソースが開きます。
画面の見方
- メソッド: 編集しているメソッドの名前です。
- 処理を書く場所:
method と endmethod の間に処理を書きます。
- ステータス: メソッドが有効化されているかどうかの表示です。
- 有効化: 有効化します。
この例では、処理を書く場所を示すためにコメント 1 行だけを書いています。CHECK メソッドには、IM_HEADER・IM_HOLD・IM_PARK・CH_FAILED というパラメータがあり、CH_FAILED の内容説明は「エラー」です。パラメータの使い方は、IMG の説明文にある「BAdI メソッド CHECK の文書」で確かめてから処理を書くとよいでしょう。
有効化を押すと、有効化するオブジェクトを選ぶ画面が開きます。
画面の見方
- 実装クラスの行: 今回作った実装クラスを構成するオブジェクトの行です。
- 続行: 印を付けたオブジェクトを有効化します。
この例では、ZCL_LAB_PO_CUST の行のほかにも、有効化されていないオブジェクトが一覧に並びます。今回作ったクラスの行だけに印を付けてから続行するとよいでしょう。
画面の見方
- ステータス: メソッドが有効化されているかどうかの表示です。
- ステータスバー: 処理の結果を示すメッセージが表示されます。
この例では、ステータスが「有効」になり、ステータスバーに「オブジェクト有効化」と表示されます。画面の下には「Implementation missing for method …」という警告が並びます。これは、処理を書いていない他のメソッドについての警告です。
8. 拡張実装が有効になったことを確かめる
前画面ボタン(左上の「<」)で拡張実装の画面に戻ります。
画面の見方
- 拡張実装のステータス: 拡張実装が有効化されているかどうかの表示です。
- メソッドの一覧: 実装クラスのメソッドです。
- 警告の一覧: 有効化のときに出た警告です。
- 件数: メッセージの種類ごとの件数です。
この例では、拡張実装のステータスが「有効」になっています。警告の一覧の見出しには「警告: 24」と表示されます。
結果の確認
T-CODE:SE19 の上半分「実装の編集」で拡張実装を照会すると、実装が呼び出される状態になったかを確かめられます。
画面の見方
- 新規 BAdI: 拡張スポットに入った BAdI の実装を照会するときに選びます。
- 拡張実装: 照会する拡張実装の名前です。
- 照会: 拡張実装を表示します。
画面の見方
- 拡張実装のステータス: 拡張実装が有効化されているかどうかの表示です。
- 有効な実装: BAdI 実装を有効にするかどうかの設定です。
- 実行時の動作: 実行時にこの実装が呼び出されるかどうかの表示です。
この例では、実行時の動作が、「登録の仕方」の手順 5 の「この実装は呼び出されません」から「この実装は呼び出されます」に変わっています。
後片付け: 拡張実装と実装クラスを削除する
学習やテストのために作った実装は、確かめ終わったら削除しておくとよいでしょう。ここでは、この記事で作った拡張実装と実装クラスを削除する手順を説明します。
1. 拡張実装を削除する
T-CODE:SE19 の「実装の編集」で拡張実装の名前を入力し、ツールバーの「実装削除」を押します。
画面の見方
- 拡張実装: 削除する拡張実装の名前です。
- 実装削除: 拡張実装を削除します。
画面の見方
- 実装: 削除する拡張実装の名前です。
- 続行: 削除します。
画面の見方
- ステータスバー: 処理の結果を示すメッセージが表示されます。
この例では「拡張実装 ZLAB_EI_PO が削除されました」と表示されます。
2. 実装クラスを削除する
この例では、拡張実装を削除した後も、実装クラス ZCL_LAB_PO_CUST が残ります。T-CODE:SE24 で削除します。
コマンドフィールドに /nSE24 と入力して Enter キーを押し、「クラスビルダ: 第一画面」でクラス名を入力します。ツールバー右端の「…」から「クラス/インタフェースの削除」を選びます。
画面の見方
- オブジェクトタイプ: 削除するクラスの名前です。
- クラス/インタフェースの削除: クラスを削除します。
画面の見方
- ステータスバー: 処理の結果を示すメッセージが表示されます。
この例では「クラス ZCL_LAB_PO_CUST が削除されました」と表示されます。
動かないときに確かめること
- 実装を作ったのに呼び出されない: T-CODE:SE19 で拡張実装を照会し、ステータスが「有効」か、「有効な実装」に印があるか、実行時の動作が「この実装は呼び出されます」になっているかを確かめましょう。
- 同じ BAdI に別の実装がある: T-CODE:SE18 で「複数使用」の設定を確かめましょう。複数使用でない BAdI では、有効にできる実装は 1 つだけです(「探し方1」の手順 9)。
- クラシック BAdI と拡張スポットに入った BAdI のどちらで作るか迷う: 「探し方1」の手順 7 の一覧の「拡張スポット」列や、T-CODE:SE18 のプロパティの「拡張スポットに移行済の BAdI」を確かめましょう。この記事の例では、その拡張スポットを T-CODE:SE19 の「新規 BAdI」に指定して実装を作っています。
まとめ
- BAdI は、T-CODE:SE93 でパッケージを調べて T-CODE:SE18 の検索で探すか、IMG(T-CODE:SPRO)の検索で探します。IMG では、BAdI の説明文も読めます。
- 実装は、T-CODE:SE19 で拡張実装・BAdI 実装・実装クラスを作り、メソッドに処理を書いて有効化します。
- 不要になった実装は、T-CODE:SE19 で拡張実装を、T-CODE:SE24 で実装クラスを削除します。
IMG からも BAdI を探せて、説明文まで読めるんですね!
うむ。実装は T-CODE:SE19 で作り、実装クラスのメソッドに処理を書いて有効化するのじゃ。