Los BAdIs (Business Add-Ins) son el mecanismo de ampliacion moderno en SAP. Permiten modificar el comportamiento estandar de SAP sin cambiar el codigo original. Con Enhancement Spots se pueden definir puntos de ampliacion propios.
Tipos de BAdI
Tipo
Descripcion
BAdI clasico
SE18/SE19, obsoleto
BAdI nuevo
Enhancement Spot, GET/CALL BADI
BAdI con filtro
Implementacion dependiente del contexto
BAdI Fallback
Implementacion por defecto
Sintaxis del nuevo BAdI
" Obtener handle del BAdI
GETBADI lo_badi.
" Llamar BAdI
CALLBADI lo_badi->method_name
EXPORTING param =value
IMPORTINGresult= lv_result.
Ejemplos
1. Implementar BAdI (nuevo BAdI)
" 1. Encontrar Enhancement Spot (SE18)
" Ejemplo: BADI_SD_SALES
" 2. Crear implementacion (SE19)
" Enhancement Implementation: ZEI_SD_SALES
" BAdI Implementation: ZBI_SD_SALES
" 3. Clase de implementacion
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.
" Verificacion especifica del cliente
IF is_header-auart ='ZOR'.
" Tratamiento especial para tipo de pedido ZOR
IF is_header-vkorg NOTIN gt_allowed_orgs.
ev_error =abap_true.
ev_message ='Tipo de pedido ZOR no permitido para esta org. ventas'.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD if_badi_sd_sales~modify_data.
" Modificar datos antes de guardar
IF cs_header-bstkd ISINITIAL.
cs_header-bstkd =|AUTO-{ sy-datum }|.
ENDIF.
ENDMETHOD.
ENDCLASS.
2. Llamar BAdI en codigo propio
" Encontrar definicion del BAdI
DATA: lo_badi TYPE REF TO badi_sd_sales.
" Obtener handle
GETBADI lo_badi.
" Llamar metodo
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. Crear BAdI propio
" 1. Crear Enhancement Spot (SE18)
" Nombre: ZES_ORDER_PROCESSING
" Descripcion breve: Order Processing Extensions
" 2. Crear definicion del BAdI
" Nombre: ZBADI_ORDER_CHECK
" Interfaz: ZIF_ORDER_CHECK
" 3. Definir interfaz
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. Usar en codigo propio
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.
" Obtener y llamar 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.
" Enriquecer datos
DATA(ls_order) = is_order.
CALLBADI lo_badi->enrich_order
CHANGING cs_order = ls_order.
" Procesamiento adicional...
ENDMETHOD.
ENDCLASS.
4. BAdI con filtro
" Definicion del BAdI con filtro (SE18):
" Filtro: VKORG (Organizacion de ventas)
" Implementacion para org. ventas 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.
" Logica solo para org. ventas 1000
cs_data-discount ='10.00'.
ENDMETHOD.
ENDCLASS.
" Implementacion para org. ventas 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.
" Otra logica para org. ventas 2000
cs_data-discount ='15.00'.
ENDMETHOD.
ENDCLASS.
" Llamada con filtro
DATA: lo_badi TYPE REF TO zbadi_sales.
GETBADI lo_badi
FILTERS
vkorg = lv_vkorg. " Solo implementacion correspondiente
CALLBADI lo_badi->process
CHANGING cs_data = ls_data.
5. Clase Fallback (implementacion por defecto)
" BAdI con Fallback (SE18):
" Clase 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.
" Comportamiento estandar si no hay implementacion activa
rv_result ='DEFAULT'.
ENDMETHOD.
ENDCLASS.
" Llamada - Fallback se usa si no hay impl. activa
DATA: lo_badi TYPE REF TO zbadi_custom.
GETBADI lo_badi.
" Verificar si existe implementacion
IF lo_badi ISBOUND.
CALLBADI lo_badi->process
IMPORTING rv_result = lv_result.
ENDIF.
6. Multiples implementaciones
" BAdI permite multiples implementaciones (Multiple Use)
" Se llaman todas las implementaciones activas
DATA: lo_badi TYPE REF TO zbadi_validators,
lt_messages TYPE bapiret2_t.
GETBADI lo_badi.
" Se recorren todas las implementaciones
CALLBADI lo_badi->validate
EXPORTING is_data = ls_data
CHANGING ct_messages = lt_messages.
" lt_messages contiene mensajes de todas las implementaciones
IFline_exists( lt_messages[ type='E' ] ).
" Al menos una implementacion reporto errores
ENDIF.
7. Enhancement Implementations
" Enhancement Points implicitos en codigo estandar