mcpField
B
badi-enhancement

badi-enhancement

github.com/likweitan開発7291 回インストール2 週間前に更新
リポジトリ

badi-enhancement について

badi-enhancementは、SAP標準機能を拡張するABAP開発者向けのガイドです。BAdIの検索・定義・実装を扱い、拡張技術をclean coreレベルで分類します。

主な機能

  1. 01既存BAdIの検索と実装
  2. 02カスタムBAdIの作成
  3. 03新旧BAdIフレームワークの比較
  4. 04clean coreレベルによる技術分類
  5. 05ATCチェックとガバナンスの確認

活用シーン

  1. 01SAP標準機能に適した拡張方式の選定
  2. 02改修や暗黙的エンハンスメントのBAdI置換
  3. 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) の指摘として報告します。

ワークフロー

  1. ユーザーの目的を特定する:

    • 実装する既存の BAdI を見つける
    • カスタム BAdI 定義を作成する
    • BAdI を実装する
    • モディフィケーションまたは暗黙的拡張を BAdI に置き換える
    • クラシックと新しい拡張フレームワークの違いを理解する
    • キーユーザー拡張性を使用する
    • 拡張のクリーンコアレベルを分類する
  2. フレームワークを特定する:

    • 新しい BAdI フレームワーク(推奨、ABAP Cloud に対応)
    • クラシック BAdI フレームワーク(レガシー、SE18/SE19)
    • 拡張スポットと実装
    • キーユーザー拡張性(ノーコード)
  3. 以下の表を使用してクリーンコアレベルを分類する

  4. 該当する最高レベルを目指して実装をガイドする

拡張手法別のクリーンコアレベル

手法レベルガイダンス
キーとなるユーザー拡張性A密結合の拡張(カスタムフィールド、カスタムロジック、カスタム CDS ビュー)では、まずここから始めます
リリース済み BAdIAコードベースの拡張ポイントとして推奨されます
リリース済み拡張インクルードADB テーブルおよび CDS ビューのカスタムフィールドに推奨される手法です
リリース済み拡張ポイント / RAP BOARAP ベースの SAP Fiori アプリの拡張に使用します
CDS extends / メタデータ拡張A/BSAP CDS ビューは変更せずに拡張します
未リリースの BAdIBクラウド開発向けにリリースされていない場合でも、従来型の拡張に適しています。リリース状況を監視してください
ユーザー出口(VOFM、SAPMV45A)Bあらかじめ定義された SAP のコーディング部分は安定しており、通常はアップグレード後も維持されます。技術的には変更に該当します
カスタマー出口(SMOD/CMOD)BBAdI の前身です。BAdI が存在しない場合に限って使用してください。今後のリリースで置き換えられる可能性があります
未リリースの拡張インクルードB使用しても問題ありません。リリース済みの拡張インクルードが利用可能になったら、その状況を監視してください
DDIC 追加項目(CI / EEW インクルード)Bカスタマーインクルードまたは拡張インクルードを介して項目を追加します
ドメイン値の追加、検索ヘルプの追加/出口B従来型の拡張手法として使用しても問題ありません
OData サービスの再定義B変更ではなく再定義します
DB テーブルへの従来型の追加項目C拡張インクルードが利用可能になったら、その状況を監視し、適宜移行してください
明示的拡張スポットB/D例外的なケースに限り、カスタム BAdI を含めるために使用します。拡張コードをスポットに直接配置しないでください
暗黙的拡張スポットD変更と同様です。使用しないでください
ソースコードプラグインDATC 優先度 1 の検出項目です。削除して BAdI を使用してください
SAP 内部フラグ付き BAdID例外的なケースに限って使用します
変更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/SE19SE18/SE19
拡張スポット必須のコンテナー該当なし
複数使用常に複数使用可能設定可能
フィルターフィルタータイプをサポートフィルター値
フォールバッククラスサポート利用不可
ABAP Cloudサポート(リリース済み BAdI のみ)利用不可
クリーンコアレベルリリース済みの場合は A、それ以外は BB(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_MODIFICATIONS ATC チェックで管理します
  • 修正がコアに取り込まれたら、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 の手動修正修正がコアに含まれたら、修正をリセットする

修正ワークフロー:

  1. SYCM_ALLOWED_ENH_TECHNOLOGY と CI_SEARCH_CUST_MODIFICATIONS を実行します
  2. 優先度 1 の各検出結果について、リリース済み BAdI(ADT で api:badi)を検索します
  3. リリース済み BAdI がない場合は、クラシック BAdI(Level B)を検索します
  4. どちらもない場合は、キーユーザー拡張性、または明示的拡張スポット内のカスタム BAdI を検討します
  5. Level D の実装を削除し、ロジックを移行します
  6. ATC を再実行して、検出結果が解消されたことを確認します

ベストプラクティス

  1. 推奨される拡張技術は BAdI のみです — それ以外はすべて、せいぜい Level B です
  2. 未リリースの BAdI(Level B)より、リリース済み BAdI(Level A)を優先します
  3. クラシック BAdI より新しい BAdI フレームワークを優先します
  4. 暗黙的拡張や修正(Level D)は使用しないでください
  5. 密結合の拡張には、まずキーユーザー拡張性(Level A)を使用します
  6. フィルターを使用して、実装の適用範囲を特定のコンテキストに限定します
  7. デフォルトの動作にはフォールバッククラスを実装します
  8. 実装の対象を絞ります — 1 つの実装につき 1 つの関心事にします
  9. 明確なインターフェースドキュメントで BAdI を文書化します
  10. ABAP Unit を使用して実装を個別にテストします
  11. ABAP Cloud では、リリース済み BAdI のみを実装します
  12. 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]

参考資料

詳細な参考資料

  • 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:拡張機能の認可設定に使用します

コメント