BAdIs (Business Add-Ins) are the modern extension mechanism in SAP. They enable modification of SAP standard behavior without changing the original code. With Enhancement Spots, you can define your own extension points.
BAdI Types
Type
Description
Classic BAdI
SE18/SE19, deprecated
New BAdI
Enhancement Spot, GET/CALL BADI
Filter BAdI
Context-dependent implementation
Fallback BAdI
Default implementation
New BAdI Syntax
" Get BAdI handle
GETBADI lo_badi.
" Call BAdI
CALLBADI lo_badi->method_name
EXPORTING param =value
IMPORTINGresult= lv_result.
Examples
1. Implement BAdI (New BAdI)
" 1. Find Enhancement Spot (SE18)
" Example: BADI_SD_SALES
" 2. Create Implementation (SE19)
" Enhancement Implementation: ZEI_SD_SALES
" BAdI Implementation: ZBI_SD_SALES
" 3. Implementation class
CLASS zcl_sd_sales_badi DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES: if_badi_sd_sales.
ENDCLASS.
CLASS zcl_sd_sales_badi IMPLEMENTATION.
METHOD if_badi_sd_sales~check_document.
" Customer-specific check
IF is_header-auart ='ZOR'.
" Special handling for order type ZOR
IF is_header-vkorg NOTIN gt_allowed_orgs.
ev_error =abap_true.
ev_message ='Order type ZOR not allowed for this sales org'.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD if_badi_sd_sales~modify_data.
" Modify data before saving
IF cs_header-bstkd ISINITIAL.
cs_header-bstkd =|AUTO-{ sy-datum }|.
ENDIF.
ENDMETHOD.
ENDCLASS.
2. Call BAdI in Your Own Code
" Find BAdI definition
DATA: lo_badi TYPE REF TO badi_sd_sales.
" Get handle
GETBADI lo_badi.
" Call method
CALLBADI lo_badi->check_document
EXPORTING
is_header = ls_header
IMPORTING
ev_error = lv_error
ev_message = lv_message.
IF lv_error =abap_true.
MESSAGE lv_message TYPE'E'.
ENDIF.
3. Create Your Own BAdI
" 1. Create Enhancement Spot (SE18)
" Name: ZES_ORDER_PROCESSING
" Short description: Order Processing Extensions
" 2. Create BAdI Definition
" Name: ZBADI_ORDER_CHECK
" Interface: ZIF_ORDER_CHECK
" 3. Define interface
INTERFACE zif_order_check PUBLIC.
METHODS: validate_order
IMPORTING
is_order TYPE ty_order
EXPORTING
ev_valid TYPE abap_bool
et_messages TYPE bapiret2_t.
METHODS: enrich_order
CHANGING
cs_order TYPE ty_order.
ENDINTERFACE.
" 4. Use in your own code
CLASS zcl_order_processor DEFINITION.
PUBLIC SECTION.
METHODS: process_order
IMPORTING is_order TYPE ty_order
RAISING zcx_order_error.
ENDCLASS.
CLASS zcl_order_processor IMPLEMENTATION.
METHODprocess_order.
DATA: lo_badi TYPE REF TO zbadi_order_check,
lv_valid TYPE abap_bool,
lt_messages TYPE bapiret2_t.
" Get and call BAdI
GETBADI lo_badi.
CALLBADI lo_badi->validate_order
EXPORTING is_order = is_order
IMPORTING ev_valid = lv_valid
et_messages = lt_messages.
IF lv_valid =abap_false.
RAISEEXCEPTION TYPE zcx_order_error
EXPORTINGmessages= lt_messages.
ENDIF.
" Enrich data
DATA(ls_order) = is_order.
CALLBADI lo_badi->enrich_order
CHANGING cs_order = ls_order.
" Further processing...
ENDMETHOD.
ENDCLASS.
4. BAdI with Filter
" BAdI definition with filter (SE18):
" Filter: VKORG (Sales Organization)
" Implementation for Sales Org 1000
CLASS zcl_badi_vkorg_1000 DEFINITION.
PUBLIC SECTION.
INTERFACES: zif_sales_badi.
ENDCLASS.
CLASS zcl_badi_vkorg_1000 IMPLEMENTATION.
METHOD zif_sales_badi~process.
" Logic only for Sales Org 1000
cs_data-discount ='10.00'.
ENDMETHOD.
ENDCLASS.
" Implementation for Sales Org 2000
CLASS zcl_badi_vkorg_2000 DEFINITION.
PUBLIC SECTION.
INTERFACES: zif_sales_badi.
ENDCLASS.
CLASS zcl_badi_vkorg_2000 IMPLEMENTATION.
METHOD zif_sales_badi~process.
" Different logic for Sales Org 2000
cs_data-discount ='15.00'.
ENDMETHOD.
ENDCLASS.
" Call with filter
DATA: lo_badi TYPE REF TO zbadi_sales.
GETBADI lo_badi
FILTERS
vkorg = lv_vkorg. " Only matching implementation
CALLBADI lo_badi->process
CHANGING cs_data = ls_data.
5. Fallback Class (Default Implementation)
" BAdI with fallback (SE18):
" Fallback class: ZCL_DEFAULT_HANDLER
CLASS zcl_default_handler DEFINITION
PUBLIC FINAL.
PUBLIC SECTION.
INTERFACES: zif_custom_badi.
ENDCLASS.
CLASS zcl_default_handler IMPLEMENTATION.
METHOD zif_custom_badi~process.
" Default behavior when no implementation is active
rv_result ='DEFAULT'.
ENDMETHOD.
ENDCLASS.
" Call - fallback is used when no implementation is active