BAdIs et Enhancements ABAP : GET BADI, CALL BADI

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

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

TypeDescription
BAdI classiqueSE18/SE19, obsolete
Nouveau BAdIEnhancement Spot, GET/CALL BADI
BAdI avec filtreImplementation dependante du contexte
BAdI FallbackImplementation par defaut

Nouvelle syntaxe BAdI

" Obtenir le handle BAdI
GET BADI lo_badi.
" Appeler le BAdI
CALL BADI lo_badi->method_name
EXPORTING param = value
IMPORTING result = 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 NOT IN 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 IS INITIAL.
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
GET BADI lo_badi.
" Appeler la methode
CALL BADI 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.
METHOD process_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
GET BADI lo_badi.
CALL BADI lo_badi->validate_order
EXPORTING is_order = is_order
IMPORTING ev_valid = lv_valid
et_messages = lt_messages.
IF lv_valid = abap_false.
RAISE EXCEPTION TYPE zcx_order_error
EXPORTING messages = lt_messages.
ENDIF.
" Enrichir les donnees
DATA(ls_order) = is_order.
CALL BADI 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.
GET BADI lo_badi
FILTERS
vkorg = lv_vkorg. " Seule l'implementation correspondante
CALL BADI 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.
GET BADI lo_badi.
" Verifier si une implementation existe
IF lo_badi IS BOUND.
CALL BADI 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.
GET BADI lo_badi.
" Toutes les implementations sont parcourues
CALL BADI lo_badi->validate
EXPORTING is_data = ls_data
CHANGING ct_messages = lt_messages.
" lt_messages contient les messages de toutes les implementations
IF line_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
" Peuvent etre etendus sans modification
" Dans le code standard existe :
" ENHANCEMENT-POINT ep_before_save SPOTS es_order.
" Propre implementation (SE19) :
ENHANCEMENT zei_order_enhancement.
" Le code est insere a ce point
IF ls_order-custom_field IS INITIAL.
ls_order-custom_field = 'DEFAULT'.
ENDIF.
ENDENHANCEMENT.

8. Enhancement Sections

" Dans le code standard :
" ENHANCEMENT-SECTION es_validation SPOTS es_order.
" " Code original
" IF lv_amount < 0.
" lv_error = abap_true.
" ENDIF.
" END-ENHANCEMENT-SECTION.
" Propre implementation remplace l'original :
ENHANCEMENT zei_validation_replacement.
" Propre code remplace l'original
IF lv_amount < 0 OR lv_amount > 1000000.
lv_error = abap_true.
ENDIF.
ENDENHANCEMENT.

9. BAdI dans RAP

" Extension Include dans RAP Behavior Definition :
" managed implementation in class zbp_i_order unique;
" with additional save
" {
" ...
" determination SetDefaults on save { create; }
" }
" BAdI pour extensions RAP
INTERFACE zif_rap_order_extension PUBLIC.
METHODS: on_before_save
CHANGING ct_orders TYPE zt_orders.
METHODS: on_after_save
IMPORTING it_orders TYPE zt_orders.
ENDINTERFACE.
" Appeler dans le Behavior Handler
CLASS lhc_order DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS save_modified FOR SAVE
IMPORTING it_orders FOR CREATE order.
ENDCLASS.
CLASS lhc_order IMPLEMENTATION.
METHOD save_modified.
DATA: lo_badi TYPE REF TO zbadi_rap_order.
" BAdI avant enregistrement
GET BADI lo_badi.
DATA(lt_orders) = CORRESPONDING zt_orders( it_orders ).
CALL BADI lo_badi->on_before_save
CHANGING ct_orders = lt_orders.
" Enregistrement...
" BAdI apres enregistrement
CALL BADI lo_badi->on_after_save
EXPORTING it_orders = lt_orders.
ENDMETHOD.
ENDCLASS.

10. BAdI classique (Legacy)

" BAdI classique de SE18 (avant les Enhancement Spots)
DATA: lo_badi TYPE REF TO if_ex_badi_name.
" Obtenir le handle
CALL METHOD cl_exithandler=>get_instance
CHANGING instance = lo_badi.
" Appeler la methode
IF lo_badi IS BOUND.
CALL METHOD lo_badi->method_name
EXPORTING param = value
CHANGING data = ls_data.
ENDIF.

11. Activer/desactiver une implementation BAdI

" Verifier programmatiquement si le BAdI est actif
DATA: lo_badi TYPE REF TO zbadi_test.
GET BADI lo_badi.
" Verifier si des implementations existent
DATA(lv_has_impl) = boolc( lo_badi IS BOUND ).
" Dans SE19 :
" - Ouvrir l'implementation
" - Cocher/decocher "Actif"
" - Activer

12. BAdI avec contexte

" BAdI avec contexte supplementaire
INTERFACE zif_context_badi PUBLIC.
METHODS: process
IMPORTING
iv_context TYPE string
is_data TYPE ty_data
EXPORTING
es_result TYPE ty_result.
ENDINTERFACE.
" Appel avec contexte pour filtrage
DATA: lo_badi TYPE REF TO zbadi_context.
GET BADI lo_badi
FILTERS
context = 'SPECIAL_CASE'.
" Seules les implementations pour ce contexte sont appelees
CALL BADI lo_badi->process
EXPORTING
iv_context = 'SPECIAL_CASE"
is_data = ls_data
IMPORTING
es_result = ls_result.

13. Source Code Plugins (SCP)

" Source Code Plugins pour ABAP Cloud
" Definis dans la Behavior Definition
" managed implementation in class zbp_i_product;
"
" define behavior for ZI_Product
" {
" ...
" // Point d'extension pour les partenaires
" extension point productExtension;
" }
" Extension partenaire implementee :
" enhance behavior for ZI_Product
" {
" extend productExtension
" {
" determination CalculateDiscount on modify { field price; }
" }
" }

14. User Exit (Legacy)

" User Exits classiques (CMOD/SMOD)
" Integres via des Includes
" Include ZXaaau01 pour Exit EXIT_SAPMM06E_001
FORM userexit_save_document_prepare.
" Logique personnalisee avant enregistrement
IF sy-tcode = 'ME21N'.
" Modifier l'en-tete de commande
ENDIF.
ENDFORM.

15. Apercu du framework Enhancement

" Trouver toutes les extensions pour un objet
" 1. SE84 - Repository Infosystem
" Rechercher les Enhancement Spots pour l'objet
" 2. Rechercher dans le code :
" - ENHANCEMENT-POINT
" - ENHANCEMENT-SECTION
" - GET BADI
" 3. SE18 - Rechercher les definitions BAdI
" Le where-used affiche les implementations
" 4. SE19 - Afficher les implementations
" Toutes les implementations actives/inactives

Creer son propre Enhancement Spot (etape par etape)

1. SE18 → Creer Enhancement Spot
- Nom : ZES_MY_APPLICATION
- Entrer la description courte
- Enregistrer
2. Ajouter une definition BAdI
- Nom : ZBADI_MY_BADI
- Creer l'interface : ZIF_MY_BADI
- Definir les methodes dans l'interface
- Optionnel : Definir des filtres
- Optionnel : Specifier une classe fallback
3. Activer l'Enhancement Spot
4. Integrer dans le code :
DATA: lo_badi TYPE REF TO zbadi_my_badi.
GET BADI lo_badi.
CALL BADI lo_badi->my_method( ... ).
5. Creer l'implementation (SE19)
- Enhancement Implementation : ZEI_MY_IMPL
- BAdI Implementation : ZBI_MY_IMPL
- Implementing Class : ZCL_MY_BADI_IMPL

Transactions importantes

TransactionDescription
SE18Definition BAdI / Enhancement Spot
SE19Implementation BAdI
SE80Repository Browser (Enhancements)
SE84Repository Infosystem
SPAUAjustement des modifications

Remarques importantes / Bonnes pratiques

  • Preferer les nouveaux BAdIs (GET/CALL BADI) aux classiques.
  • Utiliser les filtres pour des implementations specifiques au contexte.
  • Definir une classe fallback pour le comportement par defaut.
  • Multiple Use si plusieurs implementations sont autorisees.
  • Enhancement Spots pour ses propres points d’extension.
  • Les implementations peuvent etre activees/desactivees.
  • Ne pas oublier la documentation de l’interface BAdI.
  • Dans RAP, utiliser les Extension Points.
  • Pas de modifications - toujours preferer les extensions.
  • Combinez avec les Tests unitaires pour la testabilite.