Les BAdIs (Business Add-Ins) sont le mecanisme d’extension moderne dans SAP. Ils permettent de modifier le comportement standard de SAP sans modifier le code original. Avec les Enhancement Spots, vous pouvez definir vos propres points d’extension.
Types de BAdI
Type
Description
BAdI classique
SE18/SE19, obsolete
Nouveau BAdI
Enhancement Spot, GET/CALL BADI
BAdI avec filtre
Implementation dependante du contexte
BAdI Fallback
Implementation par defaut
Nouvelle syntaxe BAdI
" Obtenir le handle BAdI
GETBADI lo_badi.
" Appeler le BAdI
CALLBADI lo_badi->method_name
EXPORTING param =value
IMPORTINGresult= lv_result.
Exemples
1. Implementer un BAdI (nouveau BAdI)
" 1. Trouver l'Enhancement Spot (SE18)
" Exemple : BADI_SD_SALES
" 2. Creer l'implementation (SE19)
" Enhancement Implementation : ZEI_SD_SALES
" BAdI Implementation : ZBI_SD_SALES
" 3. Classe d'implementation
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.
" Verification personnalisee
IF is_header-auart ='ZOR'.
" Traitement special pour le type de commande ZOR
IF is_header-vkorg NOTIN gt_allowed_orgs.
ev_error =abap_true.
ev_message ='Type de commande ZOR non autorise pour cette org. comm.'.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD if_badi_sd_sales~modify_data.
" Modifier les donnees avant enregistrement
IF cs_header-bstkd ISINITIAL.
cs_header-bstkd =|AUTO-{ sy-datum }|.
ENDIF.
ENDMETHOD.
ENDCLASS.
2. Appeler un BAdI dans son propre code
" Trouver la definition BAdI
DATA: lo_badi TYPE REF TO badi_sd_sales.
" Obtenir le handle
GETBADI lo_badi.
" Appeler la methode
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. Creer son propre BAdI
" 1. Creer l'Enhancement Spot (SE18)
" Nom : ZES_ORDER_PROCESSING
" Description courte : Extensions de traitement des commandes
" 2. Creer la definition BAdI
" Nom : ZBADI_ORDER_CHECK
" Interface : ZIF_ORDER_CHECK
" 3. Definir l'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. Utiliser dans son propre 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.
" Obtenir et appeler le 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.
" Enrichir les donnees
DATA(ls_order) = is_order.
CALLBADI lo_badi->enrich_order
CHANGING cs_order = ls_order.
" Suite du traitement...
ENDMETHOD.
ENDCLASS.
4. BAdI avec filtre
" Definition BAdI avec filtre (SE18) :
" Filtre : VKORG (Organisation commerciale)
" Implementation pour 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.
" Logique uniquement pour VKOrg 1000
cs_data-discount ='10.00'.
ENDMETHOD.
ENDCLASS.
" Implementation pour 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.
" Autre logique pour VKOrg 2000
cs_data-discount ='15.00'.
ENDMETHOD.
ENDCLASS.
" Appel avec filtre
DATA: lo_badi TYPE REF TO zbadi_sales.
GETBADI lo_badi
FILTERS
vkorg = lv_vkorg. " Seule l'implementation correspondante
CALLBADI lo_badi->process
CHANGING cs_data = ls_data.
5. Classe Fallback (implementation par defaut)
" BAdI avec Fallback (SE18) :
" Classe Fallback : 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.
" Comportement par defaut si aucune implementation active
rv_result ='DEFAULT'.
ENDMETHOD.
ENDCLASS.
" Appel - le fallback est utilise si aucune impl. active
DATA: lo_badi TYPE REF TO zbadi_custom.
GETBADI lo_badi.
" Verifier si une implementation existe
IF lo_badi ISBOUND.
CALLBADI lo_badi->process
IMPORTING rv_result = lv_result.
ENDIF.
6. Implementations multiples
" Le BAdI autorise les implementations multiples (Multiple Use)
" Toutes les implementations actives sont appelees
DATA: lo_badi TYPE REF TO zbadi_validators,
lt_messages TYPE bapiret2_t.
GETBADI lo_badi.
" Toutes les implementations sont parcourues
CALLBADI lo_badi->validate
EXPORTING is_data = ls_data
CHANGING ct_messages = lt_messages.
" lt_messages contient les messages de toutes les implementations
IFline_exists( lt_messages[ type='E' ] ).
" Au moins une implementation a signale une erreur
ENDIF.
7. Enhancement Implementations
" Points d'enhancement implicites dans le code standard