$npx -y skills add likweitan/abap-skills --skill badi-enhancementHelp with BAdI (Business Add-In) development and the ABAP enhancement framework including new BAdIs, fallback classes, filter-based BAdIs, enhancement spots, enhancement implementations, key user extensibility, classic BAdIs, and the new enhancement framework. Use when users ask
| 1 | # BAdI & Enhancement Framework |
| 2 | |
| 3 | Guide for using BAdIs (Business Add-Ins) and the ABAP enhancement framework to extend SAP standard functionality. |
| 4 | |
| 5 | ## Workflow |
| 6 | |
| 7 | 1. **Determine the user's goal**: |
| 8 | - Finding an existing BAdI to implement |
| 9 | - Creating a custom BAdI definition |
| 10 | - Implementing a BAdI |
| 11 | - Understanding classic vs. new enhancement framework |
| 12 | - Using key user extensibility |
| 13 | - Extending standard code via enhancement spots |
| 14 | |
| 15 | 2. **Identify the framework**: |
| 16 | - New BAdI framework (preferred, ABAP Cloud compatible) |
| 17 | - Classic BAdI framework (legacy, `SE18`/`SE19`) |
| 18 | - Enhancement spots and implementations |
| 19 | - Key user extensibility (no-code) |
| 20 | |
| 21 | 3. **Guide implementation** following best practices |
| 22 | |
| 23 | ## BAdI Framework Overview |
| 24 | |
| 25 | ### New vs. Classic BAdIs |
| 26 | |
| 27 | | Aspect | New BAdI Framework | Classic BAdI Framework | |
| 28 | | -------------------- | ------------------------------- | ---------------------- | |
| 29 | | **Transactions** | ADT or `SE18`/`SE19` | `SE18`/`SE19` | |
| 30 | | **Enhancement Spot** | Required container | Not applicable | |
| 31 | | **Multiple Use** | Always multiple-use | Configurable | |
| 32 | | **Filter** | Filter types supported | Filter values | |
| 33 | | **Fallback Class** | Supported | Not available | |
| 34 | | **ABAP Cloud** | Supported (released BAdIs only) | Not available | |
| 35 | | **Recommendation** | Use for all new development | Maintain existing only | |
| 36 | |
| 37 | ## Creating a Custom BAdI |
| 38 | |
| 39 | ### Step 1: Create Enhancement Spot |
| 40 | |
| 41 | ``` |
| 42 | ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Spot |
| 43 | Name: Z_ENH_SPOT_TRAVEL |
| 44 | ``` |
| 45 | |
| 46 | ### Step 2: Define the BAdI Interface |
| 47 | |
| 48 | ```abap |
| 49 | INTERFACE zif_badi_travel_validate |
| 50 | PUBLIC. |
| 51 | METHODS validate |
| 52 | IMPORTING |
| 53 | is_travel TYPE zstravel |
| 54 | CHANGING |
| 55 | ct_messages TYPE bapiret2_t |
| 56 | RAISING |
| 57 | cx_badi_not_implemented. |
| 58 | ENDINTERFACE. |
| 59 | ``` |
| 60 | |
| 61 | ### Step 3: Define the BAdI in Enhancement Spot |
| 62 | |
| 63 | In the enhancement spot, add a BAdI definition: |
| 64 | |
| 65 | | Property | Value | |
| 66 | | ------------------ | ------------------------------------- | |
| 67 | | **BAdI Name** | `ZBADI_TRAVEL_VALIDATE` | |
| 68 | | **Interface** | `ZIF_BADI_TRAVEL_VALIDATE` | |
| 69 | | **Multiple Use** | Yes (allows multiple implementations) | |
| 70 | | **Fallback Class** | `ZCL_BADI_TRAVEL_FALLBACK` (optional) | |
| 71 | |
| 72 | ### Step 4: Create Fallback Class (Optional) |
| 73 | |
| 74 | ```abap |
| 75 | CLASS zcl_badi_travel_fallback DEFINITION |
| 76 | PUBLIC FINAL CREATE PUBLIC. |
| 77 | PUBLIC SECTION. |
| 78 | INTERFACES zif_badi_travel_validate. |
| 79 | ENDCLASS. |
| 80 | |
| 81 | CLASS zcl_badi_travel_fallback IMPLEMENTATION. |
| 82 | METHOD zif_badi_travel_validate~validate. |
| 83 | "Default behavior when no implementation is active |
| 84 | ENDMETHOD. |
| 85 | ENDCLASS. |
| 86 | ``` |
| 87 | |
| 88 | ### Step 5: Call the BAdI in Your Code |
| 89 | |
| 90 | ```abap |
| 91 | "Get BAdI handle |
| 92 | DATA lo_badi TYPE REF TO zif_badi_travel_validate. |
| 93 | |
| 94 | GET BADI lo_badi. |
| 95 | |
| 96 | "Call BAdI — loops through all active implementations |
| 97 | CALL BADI lo_badi->validate |
| 98 | EXPORTING is_travel = ls_travel |
| 99 | CHANGING ct_messages = lt_messages. |
| 100 | ``` |
| 101 | |
| 102 | ### With Filters |
| 103 | |
| 104 | ```abap |
| 105 | "Define BAdI with filter |
| 106 | "In Enhancement Spot: add filter type COUNTRY (type LAND1) |
| 107 | |
| 108 | "Get BAdI with filter |
| 109 | GET BADI lo_badi |
| 110 | FILTERS country = ls_travel-country. |
| 111 | |
| 112 | CALL BADI lo_badi->validate |
| 113 | EXPORTING is_travel = ls_travel |
| 114 | CHANGING ct_messages = lt_messages. |
| 115 | ``` |
| 116 | |
| 117 | ## Implementing an Existing BAdI |
| 118 | |
| 119 | ### Step 1: Find the BAdI |
| 120 | |
| 121 | Methods to find a BAdI: |
| 122 | |
| 123 | - **ADT search**: Search for BAdI name or enhancement spot |
| 124 | - **Transaction `SE18`**: Browse BAdI definitions |
| 125 | - **Breakpoint on `GET BADI`**: Set breakpoint at `CL_BADI_INTERNAL_FACTORY=>GET_BADI` to find BAdIs called during a process |
| 126 | - **Documentation**: Check SAP documentation or community for BAdI names |
| 127 | |
| 128 | ### Step 2: Create Enhancement Implementation |
| 129 | |
| 130 | ``` |
| 131 | ADT: New → Other ABAP Repository Object → Enhancements → Enhancement Implementation |
| 132 | Name: Z_ENH_IMPL_TRAVEL_CHECK |
| 133 | Enhancement Spot: Z_ENH_SPOT_TRAVEL (or SAP's spot) |
| 134 | ``` |
| 135 | |
| 136 | ### Step 3: Create BAdI Implementation Class |
| 137 | |
| 138 | ```abap |
| 139 | CLASS zcl_badi_impl_travel_check DEFINITION |
| 140 | PUBLIC FINAL CREATE PUBLIC. |