BAdIs (Business Add-Ins) sind der moderne Erweiterungsmechanismus in SAP. Sie ermöglichen die Modifikation von SAP-Standardverhalten ohne Änderung des Originalcodes. Mit Enhancement Spots können eigene Erweiterungspunkte definiert werden.
BAdI-Typen
Typ
Beschreibung
Klassisches BAdI
SE18/SE19, veraltet
Neues BAdI
Enhancement Spot, GET/CALL BADI
Filter-BAdI
Kontextabhängige Implementierung
Fallback-BAdI
Standard-Implementierung
Neue BAdI-Syntax
" BAdI-Handle holen
GETBADI lo_badi.
" BAdI aufrufen
CALLBADI lo_badi->method_name
EXPORTING param =value
IMPORTINGresult= lv_result.
Beispiele
1. BAdI implementieren (neues BAdI)
" 1. Enhancement Spot finden (SE18)
" Beispiel: BADI_SD_SALES
" 2. Implementierung anlegen (SE19)
" Enhancement Implementation: ZEI_SD_SALES
" BAdI Implementation: ZBI_SD_SALES
" 3. Implementierungsklasse
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.
" Kundenspezifische Prüfung
IF is_header-auart ='ZOR'.
" Spezialbehandlung für Auftragsart ZOR
IF is_header-vkorg NOTIN gt_allowed_orgs.
ev_error =abap_true.
ev_message ='Auftragsart ZOR nicht erlaubt für diese VKOrg'.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD if_badi_sd_sales~modify_data.
" Daten modifizieren vor Speicherung
IF cs_header-bstkd ISINITIAL.
cs_header-bstkd =|AUTO-{ sy-datum }|.
ENDIF.
ENDMETHOD.
ENDCLASS.
2. BAdI in eigenem Code aufrufen
" BAdI-Definition finden
DATA: lo_badi TYPE REF TO badi_sd_sales.
" Handle holen
GETBADI lo_badi.
" Methode aufrufen
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. Eigenes BAdI erstellen
" 1. Enhancement Spot erstellen (SE18)
" Name: ZES_ORDER_PROCESSING
" Kurzbeschreibung: Order Processing Extensions
" 2. BAdI Definition erstellen
" Name: ZBADI_ORDER_CHECK
" Interface: ZIF_ORDER_CHECK
" 3. Interface definieren
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. In eigenem Code verwenden
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.
" BAdI holen und aufrufen
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.
" Daten anreichern
DATA(ls_order) = is_order.
CALLBADI lo_badi->enrich_order
CHANGING cs_order = ls_order.
" Weiterverarbeitung...
ENDMETHOD.
ENDCLASS.
4. BAdI mit Filter
" BAdI-Definition mit Filter (SE18):
" Filter: VKORG (Verkaufsorganisation)
" Implementierung für VKOrg 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.
" Logik nur für VKOrg 1000
cs_data-discount ='10.00'.
ENDMETHOD.
ENDCLASS.
" Implementierung für VKOrg 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.
" Andere Logik für VKOrg 2000
cs_data-discount ='15.00'.
ENDMETHOD.
ENDCLASS.
" Aufruf mit Filter
DATA: lo_badi TYPE REF TO zbadi_sales.
GETBADI lo_badi
FILTERS
vkorg = lv_vkorg. " Nur passende Implementierung
CALLBADI lo_badi->process
CHANGING cs_data = ls_data.
5. Fallback-Klasse (Default-Implementierung)
" BAdI mit Fallback (SE18):
" Fallback-Klasse: 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.
" Standard-Verhalten wenn keine Implementierung aktiv
rv_result ='DEFAULT'.
ENDMETHOD.
ENDCLASS.
" Aufruf - Fallback wird verwendet wenn keine Impl. aktiv