PDA

Ver la Versión Completa : Todo acerca de la BADI's de SAP


tracer
17/04/06, 11:58:53
¿Qué es una BADI ?

Las BADI’s (Bussiness Ad-ins) son unas herramienta de programación abap orientada a objetos que se utilizan en sap para implementar validaciones y ampliaciones en el código standard de sap en versiones a partir de la 4.6c

http://www.mundosap.com/foro/images/badi.gif

Es decir sirven para acomodar los requerimientos específicos de un cliente a las transacciones estándar de sap. Para los que acaban de adentrase en sap vamos a explicar esto un poco más el resto se puede saltar el siguiente párrafo.

El código generado por SAP en sus transacciones estándar (para realizar un pedido,…) no se puede modificar (salvo para implementar un parche de SAP ), ya que se perdería el soporte que este ofrece a su producto. Pero pongamos que cuando termino de hacer un pedido de comprar por ME21N necesito guardar ciertos datos de este pedido en una tabla ZPEDIDOS que yo he creado. Pues para esto están las ampliaciones (BADI’s, user exits, field exits) que al fin y al cabo no son más que fragmentos de código que me permite SAP meter dentro de su código estándar para realizar ciertas operaciones a medida, en este caso meter la información que necesito en una tabla cuando se crea el pedido en concreto.

Básicamente cumplen la misma función que las USER EXITS y las FIELD EXITS amen de algunas diferencias que vamos a exponer.

No las confundamos con las BAPI’s que de una forma llana y sencilla podríamos decir que son simplemente funciones abap que pueden consultarse desde la transacción BAPI y llamadas desde otros sistemas y que realizan funciones concretar con los parámetros que se les pasa como crear pedidos, modificarlos, crear documentos de material, ….


Diferencia entre BADI y las USER EXITS

BADI se puede utilizar todas las veces que quieras, donde las users exits solo se pueden usar una sola vez. Ejemplo: Si asignas una user-exit a un proyecto usando la transacción CMOD, entonces no puedes volver a asignarlo a otro proyecto. Es decir varios programadores pueden implementar la misma BADI independientemente.
Las BADI’s son mucho más moldeables a las necesidades del programador en cuento a que podemos definir los puntos de salida, junto con la lógica de programación que necesitemos. Es decir posee todas las propiedades de una programación orientada a objetos.Como encontrar la BADI que necesitamos

Existen varios métodos para encontrar la BADI que necesitamos pero nosotros vamos a explicar un método basado en la transacción ST05 (Performance Analysis).

Esta técnica de análisis se basa en el echo de que todas las BADIS’s están registradas en tablas de SAP. Por lo que en cada llamada a una Badi el sistema pasa por estas tablas. Las tablas de las BADIS son las siguientes SXS_INTER, SXC_EXIT, SXC_CLASS y SXC_ATTR. A estas tablas Sap siempre accede mediante las vistas V_EXT_IMP y V_EXT_ACT. Por lo que estas vistas (T: SE11) serán la base de nuestro análisis.

EJEMPLO:

Supongamos que quiero saber que BADIS son llamadas en la transacción “Maintain Business Partners” código BT

PASOS:

1.- Primero chequeamos que ningún otro usuario (T:SM04) o jobs en fondo (T: SM50) están usando el mismo usuario que tú.

2.- Nos vamos a la transacción ST05 (Performance Analysis) y marcamos el flag "Buffer trace", después pulsamos el botón “Activate Trace “, para activar el Trace.

3.- Inmediatamente después ya que el sistema está ya “Grabando” nos vamos a la transacción BT que queremos analizar y pulsamos el boton "Organization" completando los campos con los siguientes datos de prueba:

http://www.mundosap.com/foro/images/badi_1.gif

Al finalizar pulsamos el boton salvar.

4.- Volvemos a la ventana donde teníamos abierta la ST05 y pulsamos el botón "Deactivate Trace" para finalizar el trace y pulsamos sobre el botón "Display Trace", entonces el popup "Set Restrictions for Displaying Trace" aparecerá.

5.- Ahora vamos a filtrar el Trace con los objetos: V_EXT_IMP y V_EXT_ACT. Que son nuestras vistas.

http://www.mundosap.com/foro/images/badi_2.jpg

Pulsamos el botón "Copy (F8)" , Fill Operations: OPEN y pulsamos el botón "Enter"

ANALISIS DE LOS RESULTADOS

Obtendremos un listado parecido a este que interpretaremos de la siguiente manera:

http://www.mundosap.com/foro/images/badi_3.jpg



Todas las “interface class names” de las vista V_EXT_IMP comienzan con IF_EX_. Este es el prefijo estándar de Sap para las “ BAdI class interfaces “. El nombre de la BAdI está después de este IF_EX_.
Es decir el nombre de la BADi para IF_EX_ADDR_LANGU_TO_VERS es ADDR_LANGU_TO_VERS.

En la transacción SE18 puedes ver la definición de la BADI.

http://www.mundosap.com/foro/images/Badi_4.jpg

Aconsejamos durante la realización del Trace no ejecutar ninguna otra transacción o comando que no sean los propios de análisis si queremos obtener unos resultados lo más limpios posibles. Bien pues ya podéis realizar una función que propiamente es de analista ;).

No obstante podemos ver una lista de las BADI’s disponibles haciendo lo siguiente:
- Vamos a la Transacción SE18
- Pulsamos F4 para desplegar el matchcode
- Hacemos click en el icono “Sistema de información”
- Aumentamos el campo “Cant. Máxima aciertos” a 999999
Hacemos click en OK.

Se nos listará de esta forma las BADIS disponibles.


Como Implementar una BADI

Las transacciones con las que vamos a trabajar con las BADI’s son las:

SE18 – Definición de BADIS
SE19 – Implementación de BADIS

Supongamos que hemos elegido la BADI ME_PROCESS_PO_CUST y su método CLOSE que cubren necesidades especificas de la creación y modificación de pedidos de materiales, transacciones ME21N y ME22N.

Por lo tanto:

Obtener la información relevante de BADIs realizando los siguientes pasos:

- Vamos a la transacción SE18 con la BADI ME_PROCESS_PO_CUST estamos trabajando en este grupo de badi (ME21N)
- Click en visualizar
- Click en la solapa Interfase
- Doble click en CLOSE
- Click en la solapa Parameters, en este caso vemos a IM_HEADER.

En tipo de referencia vemos que su tipo es IF_PURCHASE_ORDER_MM

Hallar los métodos disponibles para cada parámetro:


Supongamos que hemos elegido ME_PROCESS_PO_CUST y dentro de el a POST

- Vamos a la SE18 con la BADI ME_PROCESS_PO_CUST
- Click en visualizar
- Click en la solapa Interfase
- Doble click en POST

Se presentan sus parámetros
Cada uno tiene un tipo de referencia
El primero es un simple tipo de datos EBELN
El segundo IM_HEADER en cambio es tipo IF_PURCHASE_ORDER_MM
Si se hace doble click sobre IM_HEADER aparecen los metodos disponibles.
.
.
.
CREATE_ITEM
GET_DATA
GET_PREVIOUS_DATA
.
.
Etc.

Para hallar detalles de cada método hacer doble click sobre cada uno, por
ejemplo
Doble click sobre GET_DATA
Click en parametros
Aparece como parámetro RE_DATA de tipo MEPOHEADER
Si se hace click sobre MEPOHEADER se vera que es una estructura de datos de
cabecera.

Es importante saber que al principio la implementación no esta definida, la
primera ves que se entra a SE19 hay que crear la implementación con el mismo
nombre que ya existe en SE18.

Crear la Implementación del BADI seleccionado

- Vas a la Transacción SE19
- Click en Crear
- Darle el nombre Implementación, por ejemplo ME_PROCESS_PO_CUST
- Luego pide nombre Definición, es la misma ME_PROCESS_PO_CUST
- Paquete es AM2P
- Pide la orden de transporte
- Click en salvar
- Pide una clave SAP de modificación de objeto estándar.
- Pide un comentario, habitualmente igual al de la orden de transporte.
- Click en Salvar
- Click en Activar y marcar todo para que se recompile completamente

Modificar el código fuente de la Implementacion


- Vas a la Transacción SE19 con la BADI ME_PROCESS_PO_CUST
- Click en Modificar
- Click en solapa interfase
- Doble click sobre CLOSE
- Introducir la clave
- Editar el texto del código fuente.

Importante, nunca olvides hacer la activación formal:

- Vas a la Transacción SE19 SE19
- Click en el menú superior Implementación
- Click en activar.

Si no no funcionara.

Bueno, espero que todo esto os sea de ayuda, ya que son varios los miembros de esta comunidad los que han realizado varias preguntas al respecto.

google_adsense2

Un saludo :) .

dairolozano
24/04/06, 20:15:46
Excelente articulo. Bastante util. Solo una pregunta, el ejemplo se refiere a la transaccion BP - Tratar interlocutor comercial ?

Cordial Saludo,

Dairo L. Lozano R.

francisco.m.torres
05/07/06, 13:14:01
Otro modo de encontrar las badis que se ejecutan en un proceso / transaccion, es el siguiente:

> Ingresan en la trx. SE80.
> Seleccionamos Clase / Interfase.
> Dentro de ella colocamos la clase CL_EXITHANDLER.
> Seleccionamos el metodo GET_INSTANCE para que se visualice el codigo de dicho metodo.
> Colocamos un BREAK en la llamada al metodo:

call method cl_exithandler=>get_class_name_by_interface
exporting
instance = instance
importing
class_name = class_name
changing
exit_name = exit_name
exceptions
no_reference = 1
no_interface_reference = 2
no_exit_interface = 3
data_incons_in_exit_managem = 4
class_not_implement_interface = 5
others = 6.

Ahora ejecutamos el proceso/transaccion, del cual deseamos averiguar las BADIS que se instancian, y al haber colocado el BREAK en el metodo anterior, cada vez se intente instanciar la BADI pasara por dicho punto y el nombre de la BADI la tendremos en el parametro "exit_name" (que cambia este metodo).
Saludos.

Francisco Torres.-

ayasystems
09/08/06, 09:36:40
Un apunte.

Sólo las badis que no permiten modificar su contenido pueden ser implementadas varias veces. Las Badis que periten modificar datos (que tienen exporting) no se pueden implementar varias veces.
Aunque no permita modificar, a la hora de poner la badi se puede definir de implementación multiple o simple.

Saludos!

josellamazares
19/09/06, 10:19:27
Otro apunte al respecto.

Para que no sea neceasario meter ninguna clave a la hora de implementar la BADI, basta con que el nombre de dicha implementación empiece por Z. En paquete, le indicamos un paquete Z nuestro
Cuando pida la definición es cuando hay que indicarle el mismo nombre.

Un saludo y gracias por hacer esta página.

miki_ikim
24/11/06, 09:06:48
Otro apunte al respecto.

Para que no sea neceasario meter ninguna clave a la hora de implementar la BADI, basta con que el nombre de dicha implementación empiece por Z. En paquete, le indicamos un paquete Z nuestro
Cuando pida la definición es cuando hay que indicarle el mismo nombre.

Un saludo y gracias por hacer esta página.
Hola, una pregunta que quizas sea absurda.

Si tienes una implementación de una badi, standard activa e implementas una Z y la activas también, ¿cual de las dos se ejecutarán? o ¿se ejecutan las dos?
Muchas gracias.

ayasystems
24/11/06, 16:20:22
Depende de como esté definida la BADI, si tiene implementación múltiple se ejecutarán ambas. Si está definida de forma que no tenga implementación múltiple pues no podras hacer lo que dices...

Puedes ver como está definida mediante la SE18, ver si es dependiente de filtro.... vamos lo que es la definición.

Saludos ;)

shadowilbor
21/05/07, 14:36:51
Buenas,

Tengo un problemas con la badi I_BADI_SD_GM. No consigo implementarla.
Alguien podria ayudarme con ella.

Gracias por adelantado.

ayasystems
21/05/07, 14:51:19
Buenas,

Tengo un problemas con la badi I_BADI_SD_GM. No consigo implementarla.
Alguien podria ayudarme con ella.

Gracias por adelantado.

Como no seas más claro con cual es el problema dificilmente te podrá ayudar nadie.

S2

shadowilbor
21/05/07, 14:56:24
Hemos intentado implementar esta BADI para la cancelación de la factura y no salta. Debugeando hemos visto que la considera como inactiva por la clase de desarrollo en la que se encuentra, por tanto no nos funciona. Alguien sabe algo sobre ella? Está implementada o no?

ayasystems
21/05/07, 14:58:43
Hemos intentado implementar esta BADI para la cancelación de la factura y no salta. Debugeando hemos visto que la considera como inactiva por la clase de desarrollo en la que se encuentra, por tanto no nos funciona. Alguien sabe algo sobre ella? Está implementada o no?

De que versión estamos hablando??
Según la SE19 la implementación la tienes activa?

shadowilbor
21/05/07, 15:00:15
la version 5, y si la se19 esta activa

ayasystems
21/05/07, 15:02:15
la version 5, y si la se19 esta activa


Según la SE18 la Badi que estas intentando implementar tiene permitida la implementación múltiple? Si no lo tiene permitido mira a ver si hay alguna implementación más utilizando la referencia de utilización

shadowilbor
21/05/07, 15:09:27
si esta permitida la implementacion multiple

shadowilbor
23/05/07, 07:40:48
vaya,parece que al final no puede ayudar nadie con esto....que pena.Gracias de todas maneras

Rodrigo Gálvez
06/09/07, 20:19:26
Buena explicación inicial. Quiero contribuir con que no es necesario pedir una clave de activación.

El procedimiento menos invasivo es a partir de la SE18. Seleccionar la clase de la BADI (aparece en la SE19 tambien), pasar al menú implementeación y seleccionar CREAR. Indicar un nombre Z para la implementación y trabajar a partir de ahí. No es necesario pedir una clave a SAP para modificar, y la implementación Z, si está activada, será ejecutada junto con la estándar.

Debido a que se puede customizar el sistema, es posible desactivar una implementación estándar para que sea reemplazada por una "Z". Pero no es posible activar la implementación estándar sin la clave SAP de modificación.

Pueden crearce tantas implementaciones "Z" como se desee para una misma BADI. Esto permite que los desarrolladores no se pisen los talones durante un proyecto. Las implementaciones "Z" pueden ser liberadas en cualquier orden a Test o Producción.

Nunca modifiquen el estándar a menos que no exista otra alternativa. Las BADIs proveen la alternativa, al permitir una implementación "Z". Las modificaciones al estándar pueden ser eliminadas por la aplicación de un parche o un upgrade.

....
Crear la Implementación del BADI seleccionado

- Vas a la Transacción SE19
- Click en Crear
- Darle el nombre Implementación, por ejemplo ME_PROCESS_PO_CUST <- Mejor "ZME_PROCESS_POCUS"
- Luego pide nombre Definición, es la misma ME_PROCESS_PO_CUST
- Paquete es AM2P
- Pide la orden de transporte
- Click en salvar
- Pide una clave SAP de modificación de objeto estándar. <- No es necesario si la implementación es "Z" aunque la badi sea estándar.
- Pide un comentario, habitualmente igual al de la orden de transporte.
- Click en Salvar
- Click en Activar y marcar todo para que se recompile completamente

Modificar el código fuente de la Implementacion


- Vas a la Transacción SE19 con la BADI ME_PROCESS_PO_CUST
- Click en Modificar <- Mejor creas una "Z" nueva, copias la vieja estándar y desactivas la estándar. Así el sistema mantiene la coherencia y el desarrollo "Z" no es sobreescrito por los parches.
- Click en solapa interfase
- Doble click sobre CLOSE
- Introducir la clave
- Editar el texto del código fuente.

.....

alexabap2002
18/03/08, 15:49:11
:cool: Si la Badi, no acciona, solo falta, que la agregues a un proyecto desde la transacción CMOD.

sconoredhot
19/03/08, 17:12:29
no sabria decirte si esta implementada o no, pero podrias usar la funcion z_find_badi y quiza encuentres otra badi que se encuentre en el mismo lugar que esa y te sirva. Sldos.

javitudela
14/05/08, 10:19:48
Hola. He buscado de las todas las formas, que menciona este hilo del foro, la badi que debería de implementar pero no la encuentro. La Badi que debo implementar debe saltar al darle al botón guardar en la transacción fb60. Los datos que relleno antes de darle al botón guardar son los datos obligatorios de la pestaña 'Datos básicos', el Receptor del pago en la pestaña 'Pago' y las diferentos valores en las cuentas de mayor para que cuadre el saldo a cero.

He encontrado varias badis: SD_COND_ACCESS_A, AC_QUANTIFY_GET, PPA_CUST_BADI..., pero en ninguna de ellas se le paso el parámetro 'Receptor del pago' y necesito controlar este valor. Me podríais echar una mano y comentarme si hay alguna badi, la cual tenga algún método en la que se le importe este dato. Muchas Gracias.

P.D. He probado con la PPA_CUST_BADI, pero en tiempo de ejecución no se le pasan los datos al método.

Tango de vivier
02/10/08, 12:24:18
Hola a Tod@s
He creado un registro en el Libro de pedido para un proveedor, material y Org.Compras. En tal registro he asignado una nueva UMP, pero esta no me la toma cuando creo un nuevo PEDIDO.
Es necesario parametrizar algo para que la UMP del "Llibro de pedido" la tome directamente al crear el PEDIDO.

Gracias.

jramos_torres
05/02/09, 16:23:47
Compa
Ya le he dado varias vueltas a las badis que me arrojan los diferentes
metodos para encontrarlas y ninguna me ha servido ...de hecho la
badi WAKT_BADI_001 es la unica disponible para ampliacion pero el
metodo que necesito no viene hay...quiero que al grabar haga algo
a determinadas tablas z ...y ningun metodo de esa badi viene como para
eso como puedo hacerle si al parecer ninguna badi ni user exit esta
como para eso ???

Pato
27/02/09, 09:53:56
Sencillamente, este articulo es brillante. MUCHAS GRACIAS.

lissa_16
15/04/09, 15:36:10
Hola Buenas

Queria preguntarles si me pueden ayudar con lo siguiente. Tengo que crear una tabla Z con todas las entradas de mernacia por fecha y para las salidas de mercancia verificar el registro mas antiguo y restar el inventario. En resumen esta tabla Z contrendra la informacion de inventario por capas por asi llamarlo...pero..aqui es donde se me ocurre mi dilema...
Esta tabla puede estar actulizando campos desde tres programas distintos..
actualizando el mismo registro....osea que se bloqueara la tabla o ocurrira algo...para corregir esto...tengo estas alternativas:
1. Crear una tabla Z temporal..con los registros..y luego correr un programa como job de fondo que actualize la tabla Z.
2. Crear un indice esto me servira de algo??
no se que sugieren ustedes...
Elizabeth;)

flavioghiglione
11/06/09, 00:33:37
Gracias por el aporte...Muy útil.

alberto06
26/08/09, 20:09:31
ALguien me puede explikar como ingreso a está transaccion : Maintain Business Partners código BT es que soy nuevo en esto de abap y estoy haciendo este ejemplo de Badi pero no se ingresar gracias.

cosagaucha
28/09/10, 16:03:57
hola a todos!,

una pregunta.. estoy intentando generar una implementacion de la badi: SD_CIN_LV60AU02, en el metodo: EXCISE_INVOICE_CREATE

creo la implementacion, agrego el texto corto, y cuando intento activar, me dice que ya hay implementaciones activas, y no me deja activar la mia..

preguntas:

como veo que OTRAS implementaciones activas tiene esta badi?

Como hago para activar finalmente MI implementacion, ?

gracias!

sook
21/12/12, 17:16:38
Tengo una Badi implementada, pero no sé que programa/transacción la utiliza, cómo lo obtengo?

macatalan
07/11/13, 23:15:22
Tengo un escenario, donde deseo llevarme un valor introducido en BPC en un paquete, ese valor se guarda en una variable en BPC, deseo llevarlo a BW exactamente a un DTP, todo esto lo puedo hacer con una Badi?

saludos

Anthony Martinez
11/02/14, 14:16:52
Buenos dias alguien sabe que bapi existe para la transaccion meu2 ? , gracias por sus respuestas.

gerrard31
18/02/14, 16:32:30
Buenos dias alguien sabe que bapi existe para la transaccion meu2 ? , gracias por sus respuestas.

Aplíca la transacción ST05 para tu usuario. AL incio de este artículo aparece cómo utilizar dicha transacción para localizar las BADIS en la que tu deseas ejecutar.

squallytidus
29/07/14, 10:30:11
Hola buenos días,

Estoy buscando una Badi que pueda ejecutar antes de lanzar la impresión de facturas en sap de cara a ponerle alguna condición.
alguien me podría ayudar?

mfmarias
22/11/17, 19:17:35
Excelente artículo, me fue de mucha utilidad. Gracias!

Raulalsan
16/01/18, 07:55:40
Gracias por el artículo!

lozo2010
13/02/18, 14:37:44
Es posible limitar a una sola transaccion la ejecucion del badi?

He realizado uno para la ADDR_PRINTFORM_SHORT y salta en varias transacciones y yo solo quiero que sea en una especifica. ¿Es posible?

contab15
27/05/21, 15:52:43
Hola Grupo sabran o les ha pasado que con Usuario de Funcional la BADI si hace los cambios pero con los Usuario Finales no, emito la SU53 y no les aparece mimgun error.

MetaNodo
28/09/22, 06:44:43
Buenos dias alguien sabe que bapi existe para la transaccion meu2 ? , gracias por sus respuestas.

Buenas,

En la primera pagina tienes como identificar BADIS, echa un ojo al breve paso a paso que explican.

Saludos.