mcpField
B
badi-enhancement

badi-enhancement

github.com/likweitanDevelopment7291 installsUpdated 2w ago
Repository

About badi-enhancement

badi-enhancement is a guide for SAP ABAP developers extending standard functionality. It covers finding, defining, and implementing BAdIs, and classifies enhancement techniques by clean core level.

Key features

  1. 01Find and implement existing BAdIs
  2. 02Create custom BAdIs
  3. 03Compare new and classic BAdI frameworks
  4. 04Classify techniques by clean core level
  5. 05Review ATC checks and governance

Use cases

  1. 01Choose an extension method for SAP standard functionality
  2. 02Replace modifications or implicit enhancements with BAdIs
  3. 03Assess BAdIs for ABAP Cloud or RAP scenarios

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/likweitan/abap-skills --skill badi-enhancement

After installing, type/badi-enhancementin Claude Code to confirm it loaded.

Bundled filesreferences/badi-patterns.md

Details

From the project README

BAdI & Enhancement Framework

Guide for using BAdIs (Business Add-Ins) and the ABAP enhancement framework to extend SAP standard functionality, with clean core level classification for each technique.

BAdIs are the only recommended enhancement technology under the clean core level concept. The ATC check SYCM_ALLOWED_ENH_TECHNOLOGY reports ENHO enhancements built on any other technology as a priority 1 (Level D) finding.

Workflow

  1. Determine the user's goal:

    • Finding an existing BAdI to implement
    • Creating a custom BAdI definition
    • Implementing a BAdI
    • Replacing a modification or implicit enhancement with a BAdI
    • Understanding classic vs. new enhancement framework
    • Using key user extensibility
    • Classifying an enhancement's clean core level
  2. Identify the framework:

    • New BAdI framework (preferred, ABAP Cloud compatible)
    • Classic BAdI framework (legacy, SE18/SE19)
    • Enhancement spots and implementations
    • Key user extensibility (no-code)
  3. Classify the clean core level using the table below

  4. Guide implementation toward the highest applicable level

Clean Core Level by Enhancement Technique

TechniqueLevelGuidance
Key user extensibilityAStart here for tightly coupled extensions — custom fields, custom logic, custom CDS views
Released BAdIAPreferred code-based extension point
Released extension includeAPreferred technique for custom fields on DB tables and CDS views
Released extension point / RAP BOAUse for extending RAP-based SAP Fiori apps
CDS extends / metadata extensionsA/BExtend SAP CDS views rather than modifying them
Non-released BAdIBGood choice for classic extensions even when not released for cloud development. Monitor for release
User exits (VOFM, SAPMV45A)BPredefined SAP coding parts are stable and typically survive upgrades. Technically a modification
Customer exits (SMOD/CMOD)BPredecessor of BAdIs. Use only where no BAdI exists — likely to be replaced in future releases
Non-released extension includeBAcceptable; monitor when a released extension include becomes available
DDIC appends (CI / EEW includes)BAppend fields via customer includes or extension includes
Domain value appends, search help appends/exitsBAcceptable classic extension techniques
OData service redefinitionBRedefine rather than modify
Classic append on DB tableCMonitor when an extension include becomes available and adapt accordingly
Explicit enhancement spotsB/DExceptional cases only, to include a custom BAdI. Do not place extension code directly in the spot
Implicit enhancement spotsDSimilar to a modification — do not use
Source code plug-insDATC priority 1 finding — delete and use a BAdI
SAP-internal-flagged BAdIDExceptional cases only
ModificationsDAvoid completely. If unavoidable, use the modification assistant and govern via ATC

General rule: no modifications to SAP objects. Where a modification exists, check whether a released or classic BAdI can replace it.

ATC governance
ATC checkTechnical nameReports
Allowed enhancement technologiesSYCM_ALLOWED_ENH_TECHNOLOGYENHO enhancements on non-allowed technology — only BAdIs are recommended
Search customer modificationsCI_SEARCH_CUST_MODIFICATIONSModified objects (one finding per object); checks ABAP Cloud object type support

Both produce priority 1 (error) findings, corresponding to Level D. Implement SAP Note 3565942 if these checks are unavailable.

BAdI Framework Overview

New vs. Classic BAdIs
AspectNew BAdI FrameworkClassic BAdI Framework
TransactionsADT or SE18/SE19SE18/SE19
Enhancement SpotRequired containerNot applicable
Multiple UseAlways multiple-useConfigurable
FilterFilter types supportedFilter values
Fallback ClassSupportedNot available
ABAP CloudSupported (released BAdIs only)Not available
Clean core levelA if released, else BB (or D if SAP-internal-flagged)
RecommendationUse for all new developmentMaintain existing only

Creating a Custom BAdI

Step 1: Create Enhancement Spot
ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Spot
Name: Z_ENH_SPOT_TRAVEL
Step 2: Define the BAdI Interface
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.
Step 3: Define the BAdI in Enhancement Spot

In the enhancement spot, add a BAdI definition:

PropertyValue
BAdI NameZBADI_TRAVEL_VALIDATE
InterfaceZIF_BADI_TRAVEL_VALIDATE
Multiple UseYes (allows multiple implementations)
Fallback ClassZCL_BADI_TRAVEL_FALLBACK (optional)
Step 4: Create Fallback Class (Optional)
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.
Step 5: Call the BAdI in Your Code
"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.
With Filters
"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.

Implementing an Existing BAdI

Step 1: Find the BAdI

Methods to find a BAdI:

  • ADT search: Search for BAdI name or enhancement spot
  • Transaction SE18: Browse BAdI definitions
  • Breakpoint on GET BADI: Set breakpoint at CL_BADI_INTERNAL_FACTORY=>GET_BADI to find BAdIs called during a process
  • Documentation: Check SAP documentation or community for BAdI names
Step 2: Create Enhancement Implementation
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)
Step 3: Create BAdI Implementation Class
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.

BAdIs in ABAP Cloud / RAP

In ABAP for Cloud Development, BAdIs follow a specific pattern:

Released BAdIs — Level A
  • Only SAP-released BAdIs can be implemented in ABAP Cloud
  • Search for released BAdIs in ADT: api:badi
  • Common in RAP scenarios for extending standard RAP BOs
  • Verify release state programmatically:
SELECT SINGLE *
  FROM i_apistateofrepositoryobject
  WHERE ObjectType   = 'SXSD'          "BAdI definition
    AND ObjectName   = 'MY_BADI'
    AND ReleaseState = 'RELEASED'
  INTO @DATA(ls_state).
RAP BAdI Pattern
"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.
Dynamic BAdI Calls
"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.

Enhancement Spots and Implementations

Beyond BAdIs, the enhancement framework supports the techniques below. Note the clean core level of each — most are Level D and must be avoided.

Explicit Enhancement Points — Level B/D

SAP defines explicit points in standard code where custom logic can be inserted. These were mainly created to enable industry-specific adaptations.

Guidance: use only in exceptional cases, and only to include a custom-defined BAdI into the SAP core. Do not place extension code directly in the enhancement spot.

"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.
Explicit Enhancement Sections — 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.
Implicit Enhancements — Level D, do not use

Implicit enhancement points (at the start/end of methods, forms, programs) are technically equivalent to modifications. SYCM_ALLOWED_ENH_TECHNOLOGY reports them as priority 1 (error) findings.

Remediation: delete the enhancement implementation and use a released or classic BAdI instead.

Modifications — Level D, avoid completely

If a modification cannot be prevented:

  • Use the modification assistant so post-upgrade adjustment stays manageable
  • Govern via the CI_SEARCH_CUST_MODIFICATIONS ATC check
  • Reset modifications from SAP Notes once the correction is part of the core

Remediation: check whether a released or classic BAdI can replace the modification.

User Exits and Customer Exits — Level B
  • User exits (VOFM, SAPMV45A): predefined SAP coding parts (form routines, includes) in an SAP namespace. Stable and typically survive upgrades, though technically treated as modifications. Monitor whether a released BAdI can replace them.
  • Customer exits (SMOD/CMOD): the predecessor technology to BAdIs. Usable in exceptional cases where no BAdI exists yet; most will be replaced in upcoming releases.

Structural Extension Techniques

Beyond business logic, these techniques extend SAP data structures and services:

DDIC — Level A/B/C
  • Released extension includes (EEW) → Level A, preferred
  • Customer includes (CI includes) on non-released structures/tables → Level B
  • Classic appends on DB tables → Level C; monitor for a released extension include
  • Domain value appends, search help appends, search help exits → Level B
CDS — Level A/B
  • Use CDS extends rather than modifying SAP CDS views
  • Use CDS metadata extensions for UI annotation changes
OData — Level B
  • Use redefinition of OData services rather than modification

Key User Extensibility — Level A

No-code/low-code extension capabilities available via SAP Fiori. This is the starting point for tightly coupled extensions.

CapabilityDescription
Custom FieldsAdd fields to standard business objects
Custom LogicAdd validation/determination logic via BRF+
Custom CDS ViewsCreate simple analytical views
Custom Business ObjectsCreate simple transactional objects
Custom Analytical QueriesBuild queries on existing CDS views

Finding extension points: use the extension registry (transaction SEEA / the extension point registry) to find every extension point registered in the system.

When a requirement is too complex for key user extensibility, move to developer extensibility (ABAP Cloud) — still Level A.

Replacing Level D Enhancements

Existing Level D techniqueReplacement
ModificationReleased BAdI → classic BAdI → key user extensibility
Implicit enhancementReleased BAdI → classic BAdI
Explicit enhancement with inline codeMove the code into a custom BAdI called from the enhancement
Source code plug-inReleased or classic BAdI
SAP-internal-flagged BAdI implementationFind an alternative released or classic extension point
SAP Note manual correctionReset the modification once the correction ships in the core

Remediation workflow:

  1. Run SYCM_ALLOWED_ENH_TECHNOLOGY and CI_SEARCH_CUST_MODIFICATIONS
  2. For each priority 1 finding, search for a released BAdI (api:badi in ADT)
  3. If no released BAdI exists, search for a classic BAdI (Level B)
  4. If neither exists, consider key user extensibility or a custom BAdI in an explicit enhancement spot
  5. Delete the Level D implementation and migrate the logic
  6. Re-run ATC to confirm the finding is resolved

Best Practices

  1. BAdIs are the only recommended enhancement technology — everything else is Level B at best
  2. Prefer released BAdIs (Level A) over non-released BAdIs (Level B)
  3. Prefer new BAdI framework over classic BAdIs
  4. Never use implicit enhancements or modifications (Level D)
  5. Start with key user extensibility (Level A) for tightly coupled extensions
  6. Use filters to scope implementations to specific contexts
  7. Implement fallback classes for default behavior
  8. Keep implementations focused — one concern per implementation
  9. Document the BAdI with clear interface documentation
  10. Test implementations independently using ABAP Unit
  11. In ABAP Cloud, only implement released BAdIs
  12. Govern with ATC — block transport release on priority 1 and 2 findings

Output Format

When helping with BAdI/enhancement topics, structure responses as:

## 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]

References

Detailed Reference

  • BAdI patterns: Read references/badi-patterns.md for implementation patterns, filters, fallback classes, and testing

Related Skills

  • abap-cloud: Use for clean core level definitions and which BAdIs are released
  • abap-cloud-migration: Use for replacing Level D modifications and enhancements
  • atc-cloudification: Use for configuring SYCM_ALLOWED_ENH_TECHNOLOGY governance
  • rap: Use for implementing released RAP BAdIs for SAP Fiori apps
  • authorization-iam: Use for setting up authorizations for enhanced functionality

Comments

Markdown supported