badi-enhancement について
badi-enhancementは、SAP標準機能を拡張するABAP開発者向けのガイドです。BAdIの検索・定義・実装を扱い、拡張技術をclean coreレベルで分類します。
主な機能
- 01既存BAdIの検索と実装
- 02カスタムBAdIの作成
- 03新旧BAdIフレームワークの比較
- 04clean coreレベルによる技術分類
- 05ATCチェックとガバナンスの確認
活用シーン
- 01SAP標準機能に適した拡張方式の選定
- 02改修や暗黙的エンハンスメントのBAdI置換
- 03ABAP CloudやRAPでのBAdIの評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ likweitan/ abap-skills --skill badi-enhancementインストール後、Claude Code で/badi-enhancementを入力して読み込まれたか確認します。
同梱ファイルreferences/badi-patterns.md
詳細
BAdI と拡張フレームワーク
BAdI(ビジネスアドイン)と ABAP 拡張フレームワークを使用して SAP 標準機能を拡張するためのガイドです。各手法のクリーンコア レベル 分類も記載しています。
クリーンコアレベルの概念では、推奨される拡張テクノロジーは BAdI のみです。ATC チェック
SYCM_ALLOWED_ENH_TECHNOLOGYは、ほかのテクノロジーを基盤として構築されたENHO拡張を、優先度 1(レベル D) の指摘として報告します。
ワークフロー
-
ユーザーの目的を特定する:
- 実装する既存の BAdI を見つける
- カスタム BAdI 定義を作成する
- BAdI を実装する
- モディフィケーションまたは暗黙的拡張を BAdI に置き換える
- クラシックと新しい拡張フレームワークの違いを理解する
- キーユーザー拡張性を使用する
- 拡張のクリーンコアレベルを分類する
-
フレームワークを特定する:
- 新しい BAdI フレームワーク(推奨、ABAP Cloud に対応)
- クラシック BAdI フレームワーク(レガシー、
SE18/SE19) - 拡張スポットと実装
- キーユーザー拡張性(ノーコード)
-
以下の表を使用してクリーンコアレベルを分類する
-
該当する最高レベルを目指して実装をガイドする
拡張手法別のクリーンコアレベル
| 手法 | レベル | ガイダンス |
|---|---|---|
| キーとなるユーザー拡張性 | A | 密結合の拡張(カスタムフィールド、カスタムロジック、カスタム CDS ビュー)では、まずここから始めます |
| リリース済み BAdI | A | コードベースの拡張ポイントとして推奨されます |
| リリース済み拡張インクルード | A | DB テーブルおよび CDS ビューのカスタムフィールドに推奨される手法です |
| リリース済み拡張ポイント / RAP BO | A | RAP ベースの SAP Fiori アプリの拡張に使用します |
| CDS extends / メタデータ拡張 | A/B | SAP CDS ビューは変更せずに拡張します |
| 未リリースの BAdI | B | クラウド開発向けにリリースされていない場合でも、従来型の拡張に適しています。リリース状況を監視してください |
ユーザー出口(VOFM、SAPMV45A) | B | あらかじめ定義された SAP のコーディング部分は安定しており、通常はアップグレード後も維持されます。技術的には変更に該当します |
| カスタマー出口(SMOD/CMOD) | B | BAdI の前身です。BAdI が存在しない場合に限って使用してください。今後のリリースで置き換えられる可能性があります |
| 未リリースの拡張インクルード | B | 使用しても問題ありません。リリース済みの拡張インクルードが利用可能になったら、その状況を監視してください |
| DDIC 追加項目(CI / EEW インクルード) | B | カスタマーインクルードまたは拡張インクルードを介して項目を追加します |
| ドメイン値の追加、検索ヘルプの追加/出口 | B | 従来型の拡張手法として使用しても問題ありません |
| OData サービスの再定義 | B | 変更ではなく再定義します |
| DB テーブルへの従来型の追加項目 | C | 拡張インクルードが利用可能になったら、その状況を監視し、適宜移行してください |
| 明示的拡張スポット | B/D | 例外的なケースに限り、カスタム BAdI を含めるために使用します。拡張コードをスポットに直接配置しないでください |
| 暗黙的拡張スポット | D | 変更と同様です。使用しないでください |
| ソースコードプラグイン | D | ATC 優先度 1 の検出項目です。削除して BAdI を使用してください |
| SAP 内部フラグ付き BAdI | D | 例外的なケースに限って使用します |
| 変更 | D | 完全に避けてください。避けられない場合は、変更アシスタントを使用し、ATC で管理してください |
一般原則:SAP オブジェクトは変更しないでください。変更が存在する場合は、リリース済みまたは従来型の BAdI で置き換えられるか確認してください。
ATC ガバナンス
| ATC チェック | 技術名 | レポート |
|---|---|---|
| 許可された拡張テクノロジー | SYCM_ALLOWED_ENH_TECHNOLOGY | 許可されていないテクノロジーでの ENHO 拡張 — BAdI のみを推奨します |
| 顧客による変更の検索 | CI_SEARCH_CUST_MODIFICATIONS | 変更されたオブジェクト(オブジェクトごとに 1 件の検出結果);ABAP Cloud のオブジェクトタイプのサポートをチェックします |
どちらも Level D に相当する**優先度 1(エラー)**の検出結果を生成します。これらのチェックを利用できない場合は、SAP Note 3565942 を実装してください。
BAdI フレームワークの概要
新しい BAdI と従来の BAdI
| 項目 | 新しい BAdI フレームワーク | 従来の BAdI フレームワーク |
|---|---|---|
| トランザクション | ADT または SE18/SE19 | SE18/SE19 |
| 拡張スポット | 必須のコンテナー | 該当なし |
| 複数使用 | 常に複数使用可能 | 設定可能 |
| フィルター | フィルタータイプをサポート | フィルター値 |
| フォールバッククラス | サポート | 利用不可 |
| ABAP Cloud | サポート(リリース済み BAdI のみ) | 利用不可 |
| クリーンコアレベル | リリース済みの場合は A、それ以外は B | B(SAP 内部フラグが設定されている場合は D) |
| 推奨事項 | 新規開発ではすべて使用する | 既存のもののみを維持する |
カスタム BAdI の作成
ステップ 1:拡張スポットの作成
ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Spot
Name: Z_ENH_SPOT_TRAVEL
ステップ 2:BAdI インターフェースの定義
INTERFACE zif_badi_travel_validate
PUBLIC.
METHODS validate
IMPORTING
is_travel TYPE zstravel
CHANGING
ct_messages TYPE bapiret2_t
RAISING
cx_badi_not_implemented.
ENDINTERFACE.
ステップ 3:拡張スポットで BAdI を定義する
拡張スポットに BAdI 定義を追加します。
| プロパティ | 値 |
|---|---|
| BAdI 名 | ZBADI_TRAVEL_VALIDATE |
| インターフェース | ZIF_BADI_TRAVEL_VALIDATE |
| 複数使用 | はい(複数の実装が可能になります) |
| フォールバッククラス | ZCL_BADI_TRAVEL_FALLBACK(任意) |
ステップ 4:フォールバッククラスの作成(任意)
CLASS zcl_badi_travel_fallback DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_badi_travel_validate.
ENDCLASS.
CLASS zcl_badi_travel_fallback IMPLEMENTATION.
METHOD zif_badi_travel_validate~validate.
"Default behavior when no implementation is active
ENDMETHOD.
ENDCLASS.
ステップ 5:コードで BAdI を呼び出す
"Get BAdI handle
DATA lo_badi TYPE REF TO zif_badi_travel_validate.
GET BADI lo_badi.
"Call BAdI — loops through all active implementations
CALL BADI lo_badi->validate
EXPORTING is_travel = ls_travel
CHANGING ct_messages = lt_messages.
フィルターを使用する場合
"Define BAdI with filter
"In Enhancement Spot: add filter type COUNTRY (type LAND1)
"Get BAdI with filter
GET BADI lo_badi
FILTERS country = ls_travel-country.
CALL BADI lo_badi->validate
EXPORTING is_travel = ls_travel
CHANGING ct_messages = lt_messages.
既存の BAdI の実装
ステップ 1:BAdI を見つける
BAdI を見つける方法:
- ADT 検索:BAdI 名または拡張スポットを検索します
- トランザクション
SE18:BAdI 定義を参照します GET BADIのブレークポイント:CL_BADI_INTERNAL_FACTORY=>GET_BADIにブレークポイントを設定して、プロセス中に呼び出される BAdI を見つけます- ドキュメント:SAP のドキュメントまたはコミュニティで BAdI 名を確認します
ステップ 2:拡張実装の作成
ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Implementation
Name: Z_ENH_IMPL_TRAVEL_CHECK
Enhancement Spot: Z_ENH_SPOT_TRAVEL (or SAP's spot)
ステップ 3:BAdI 実装クラスの作成
CLASS zcl_badi_impl_travel_check DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES zif_badi_travel_validate.
ENDCLASS.
CLASS zcl_badi_impl_travel_check IMPLEMENTATION.
METHOD zif_badi_travel_validate~validate.
"Custom validation logic
IF is_travel-begin_date < cl_abap_context_info=>get_system_date( ).
APPEND VALUE #(
type = 'E'
id = 'Z_TRAVEL'
number = '001'
message_v1 = 'Travel begin date must be in the future'
) TO ct_messages.
ENDIF.
ENDMETHOD.
ENDCLASS.
ABAP Cloud / RAP の BAdI
ABAP for Cloud Development では、BAdI は特定のパターンに従います。
リリース済み BAdI — Level A
- ABAP Cloud で実装できるのは、SAP がリリースした BAdI のみです
- ADT でリリース済み BAdI を検索します:
api:badi - RAP BO 標準の拡張など、RAP のシナリオでよく使用されます
- リリース状態をプログラムで確認します:
SELECT SINGLE *
FROM i_apistateofrepositoryobject
WHERE ObjectType = 'SXSD' "BAdI definition
AND ObjectName = 'MY_BADI'
AND ReleaseState = 'RELEASED'
INTO @DATA(ls_state).
RAP BAdI パターン
"BAdI for extending SAP Fiori apps / RAP BOs
"Implement the released BAdI interface
CLASS zcl_my_rap_badi DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_some_released_badi.
ENDCLASS.
CLASS zcl_my_rap_badi IMPLEMENTATION.
METHOD if_some_released_badi~some_method.
"Custom logic
ENDMETHOD.
ENDCLASS.
動的 BAdI 呼び出し
"Dynamic GET BADI with BAdI name in variable
DATA lo_badi TYPE REF TO cl_badi_base.
DATA(lv_badi_name) = 'ZBADI_MY_BADI'.
GET BADI lo_badi TYPE (lv_badi_name).
"Dynamic CALL BADI with method name in variable
CALL BADI lo_badi->('VALIDATE')
EXPORTING is_data = ls_data.
拡張スポットと実装
BAdI 以外にも、拡張フレームワークでは以下の手法がサポートされています。それぞれのクリーンコアレベルに注意してください — ほとんどは Level D であり、避ける必要があります。
明示的拡張ポイント — Level B/D
SAP は、カスタムロジックを挿入できる明示的な標準コード内のポイントを定義しています。これらは主に、業界固有の適応を可能にするために作成されました。
ガイダンス:例外的な場合に限り、カスタム定義の BAdI を SAP コアに含める目的でのみ使用してください。拡張コードを拡張スポットに直接配置しないでください。
"In SAP standard code:
ENHANCEMENT-POINT z_enh_point SPOTS z_enh_spot.
"In your enhancement implementation:
ENHANCEMENT z_my_enhancement.
"Preferred: delegate to a custom BAdI rather than inlining logic
DATA lo_badi TYPE REF TO zif_badi_my_logic.
GET BADI lo_badi.
CALL BADI lo_badi->process CHANGING cs_data = ls_data.
ENDENHANCEMENT.
明示的拡張セクション — Level B/D
"SAP code with replaceable section:
ENHANCEMENT-SECTION z_section SPOTS z_enh_spot.
"Default code (can be replaced)
lv_result = lv_a + lv_b.
END-ENHANCEMENT-SECTION.
"Your replacement:
ENHANCEMENT z_my_section_impl.
"Custom replacement code
lv_result = lv_a * lv_b.
ENDENHANCEMENT.
暗黙的エンハンスメント — レベル D、使用しないでください
暗黙的エンハンスメントポイント(メソッド、フォーム、プログラムの開始時/終了時)は、技術的には変更と同等です。SYCM_ALLOWED_ENH_TECHNOLOGY は、これらを**優先度 1(エラー)**の検出結果として報告します。
対処方法:エンハンスメント実装を削除し、リリース済みまたはクラシック BAdI を使用してください。
変更 — レベル D、完全に避けてください
変更を避けられない場合:
- 変更アシスタントを使用し、アップグレード後の調整を管理しやすくします
CI_SEARCH_CUST_MODIFICATIONSATC チェックで管理します- 修正がコアに取り込まれたら、SAP Notes による変更をリセットします
対処方法:リリース済みまたはクラシック BAdI で変更を置き換えられるか確認してください。
ユーザー出口とカスタマー出口 — レベル B
- ユーザー出口(VOFM、
SAPMV45A):SAP 名前空間内の、あらかじめ定義された SAP コード部分(フォームルーチン、インクルード)です。安定しており、通常はアップグレード後も維持されますが、技術的には変更として扱われます。リリース済み BAdI で置き換えられるか確認してください。 - カスタマー出口(SMOD/CMOD):BAdI より前の技術です。まだ BAdI が存在しない例外的なケースで使用できますが、その多くは今後のリリースで置き換えられる予定です。
構造拡張技術
業務ロジック以外にも、次の技術を使用して SAP のデータ構造やサービスを拡張できます。
DDIC — レベル A/B/C
- リリース済み拡張インクルード(EEW)→ レベル A、推奨
- リリースされていない構造体/テーブルのカスタマーインクルード(CI インクルード)→ レベル B
- DB テーブルのクラシックな追加構造→ レベル C。リリース済み拡張インクルードがないか確認してください
- ドメイン値の追加構造、検索ヘルプの追加構造、検索ヘルプ出口 → レベル B
CDS — レベル A/B
- SAP CDS ビューを変更する代わりに、CDS 拡張を使用してください
- UI アノテーションの変更には、CDS メタデータ拡張を使用してください
OData — レベル B
- 変更する代わりに、OData サービスの再定義を使用してください
キーユーザー拡張性 — レベル A
SAP Fiori から利用できる、ノーコード/ローコードの拡張機能です。密結合型の拡張では、ここから始めてください。
| 機能 | 説明 |
|---|---|
| カスタムフィールド | 標準ビジネスオブジェクトにフィールドを追加します |
| カスタムロジック | BRF+ を使用して検証/導出ロジックを追加します |
| カスタム CDS ビュー | シンプルな分析ビューを作成します |
| カスタムビジネスオブジェクト | シンプルなトランザクションオブジェクトを作成します |
| カスタム分析クエリ | 既存の CDS ビューに基づいてクエリを作成します |
拡張ポイントの検索:拡張レジストリ(トランザクション SEEA/拡張ポイントレジストリ)を使用して、システムに登録されているすべての拡張ポイントを検索します。
要件が複雑すぎてキーユーザー拡張性では対応できない場合は、開発者拡張性(ABAP Cloud)に移行してください。こちらもレベル A です。
Level D 拡張の置き換え
| 既存の Level D 技法 | 置き換え |
|---|---|
| 修正 | リリース済み BAdI → クラシック BAdI → キーユーザー拡張性 |
| 暗黙的拡張 | リリース済み BAdI → クラシック BAdI |
| インラインコードを含む明示的拡張 | 拡張から呼び出すカスタム BAdI にコードを移動 |
| ソースコードプラグイン | リリース済みまたはクラシック BAdI |
| SAP 内部フラグ付き BAdI 実装 | 代替となるリリース済みまたはクラシックの拡張ポイントを探す |
| SAP Note の手動修正 | 修正がコアに含まれたら、修正をリセットする |
修正ワークフロー:
SYCM_ALLOWED_ENH_TECHNOLOGYとCI_SEARCH_CUST_MODIFICATIONSを実行します- 優先度 1 の各検出結果について、リリース済み BAdI(ADT で
api:badi)を検索します - リリース済み BAdI がない場合は、クラシック BAdI(Level B)を検索します
- どちらもない場合は、キーユーザー拡張性、または明示的拡張スポット内のカスタム BAdI を検討します
- Level D の実装を削除し、ロジックを移行します
- ATC を再実行して、検出結果が解消されたことを確認します
ベストプラクティス
- 推奨される拡張技術は BAdI のみです — それ以外はすべて、せいぜい Level B です
- 未リリースの BAdI(Level B)より、リリース済み BAdI(Level A)を優先します
- クラシック BAdI より新しい BAdI フレームワークを優先します
- 暗黙的拡張や修正(Level D)は使用しないでください
- 密結合の拡張には、まずキーユーザー拡張性(Level A)を使用します
- フィルターを使用して、実装の適用範囲を特定のコンテキストに限定します
- デフォルトの動作にはフォールバッククラスを実装します
- 実装の対象を絞ります — 1 つの実装につき 1 つの関心事にします
- 明確なインターフェースドキュメントで BAdI を文書化します
- ABAP Unit を使用して実装を個別にテストします
- ABAP Cloud では、リリース済み BAdI のみを実装します
- ATC でガバナンスを行います — 優先度 1 および 2 の検出結果がある場合、移送のリリースをブロックします
出力形式
BAdI/拡張に関するトピックを扱う場合は、次の構成で回答します:
## BAdI / Enhancement Guidance
### Framework
- Type: [New BAdI / Classic BAdI / Enhancement Spot / Key User]
- Clean core level: [A / B / C / D]
- Context: [ABAP Cloud / Classic ABAP]
### Implementation
[Step-by-step with code examples]
### Expected ATC Findings
- [Check name, priority, and level, if any]
### Testing
[How to verify the enhancement works]
参考資料
- Clean Core Extensibility Whitepaper — クリーンコアレベルの概念
- Extend SAP S/4HANA in the cloud and on premise with ABAP based extensions(Version 2.3、August 2025)
- BAdI Cheat Sheet:https://github.com/SAP-samples/abap-cheat-sheets/blob/main/35_BAdIs.md
- Enhancement Framework:https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/enhancement
- Key User Extensibility:https://help.sap.com/docs/sap-s4hana-cloud/extensibility
- SAP Note 3565942 —
SYCM_ALLOWED_ENH_TECHNOLOGYを提供します
詳細な参考資料
- BAdI パターン:実装パターン、フィルター、フォールバッククラス、テストについては
references/badi-patterns.mdを参照してください
関連スキル
- abap-cloud:クリーンコアレベルの定義と、リリース済み BAdI の確認に使用します
- abap-cloud-migration:Level D の修正や拡張の置き換えに使用します
- atc-cloudification:
SYCM_ALLOWED_ENH_TECHNOLOGYガバナンスの設定に使用します - rap:SAP Fiori アプリ向けのリリース済み RAP BAdI の実装に使用します
- authorization-iam:拡張機能の認可設定に使用します