12
Ampliaciones SAP Como muchos sabemos, SAP es un sistema que no permite la modificación de los programas-transacciones estándar. Sin embargo, ocasionalmente se requiere adaptar las funcionalidades estándar a requerimientos específicos del cliente. Para ello, SAP permite ciertas herramientas para realizar “modificaciones controladas” a los programas estándar. Más que modificaciones, se tratan más bien de “ampliaciones”, ya que lo que se nos permite hacer, es añadirles funcionalidades a las ya existentes, como por ejemplo, alguna validación adicional a un pedido de ventas, específica del cliente, que no esté contemplada en el estándar de SAP. Actualmente, existen 3 tipos de ampliaciones permitidas en SAP: USEREXIT’s: Son subrutinas vacías existentes en los programas estándar, las cuales se pueden activar y escribir el código adicional que requerimos añadir; estas subrutinas responden a determinados eventos del proceso estándar, por lo que debemos ubicar cual es el userexit que corresponde al apartado de la transacción que queremos modificar, por ejemplo, si nos piden validar que el monto de un pedido no exceda una cantidad determinada al momento de crearlo, debemos encontrar que USEREXITS se activan al momento de pulsar el botón “Guardar”, o lo que es lo mismo, cuando se invoca el evento “guardar pedido”. Estas subrutinas cuentan con ciertas tablas y estructuras internas con la información relevante obtenida por el proceso estándar, en este ejemplo, la información del pedido que se pretende crear. CUSTOMER-EXIT: En algunos puntos del código estándar, hay llamadas del tipo CALL CUSTOMER-FUNCTION <número>. Estas rutinas se editarán con la transacción CMOD. BADI’S: Son ampliaciones que funcionan bajo la filosofía de programación orientada a objetos, es decir, mediante clases y métodos, son invocados dentro del estándar con CALL METHOD, creadas a través de la transacción SE18 e implementadas por la SE19. Las BADI’s se definen mediante la SE18, donde se debe especificar lo siguiente: Definición de la interfaz: métodos y parámetros que contendrá la clase a implementar. Tipo de implementación: se puede crear una BADI simple (permite una sola implementación activa) o múltiple (permitir varias invocaciones desde diferentes programas). Luego, para implementar la BADI recién creada, o cualquier otra existente en el sistema, o bien utilizar alguna de las distintas implementaciones de BADI’s existentes, se debe utilizar la transacción SE19. Las BADI’s se pueden implementar más de una vez, a diferencia de los USEREXITS, que solo permiten una implementación; esto es porque un USEREXIT es un perform dentro de un programa estándar, por lo que solo puede ser invocado por dicho programa, en cambio las BADI’s son interfaces de clases, cuyos métodos pueden ser invocados desde diferentes programas. En resumen, los USEREXITS son performs dentro del código estándar, los CUSTOMER-EXIT son funciones, y las BADI’s son interfaces. Subrutinas para el módulo de Ventas. Si bien la tendencia de SAP es ir sustituyendo las USEREXITS propiamente dichas por BADi’s, en el módulo SD aún son frecuentes encontrar USEREXITS, y de una manera muy sencilla. Buscamos el programa fuente de la transacción estándar, entramos al programa por la SE80, buscamos las subrutinas asociadas al mismo, y de la lista que nos muestran, ubicamos aquellas que empiecen con el prefijo USEREXIT. Luego nos queda determinar cuál de todas es la que nos es útil según lo que nos pidan. Estas EXITS son simples llamados a INCLUDES, a los cuales debemos solicitar su clave de modificación para añadirle código a los FORMS contenidos en ellos. Mi forma de determinar cual es el EXIT que necesito, es fijar un break-point en cada EXIT,

Ampliaciones SAP

Embed Size (px)

Citation preview

Page 1: Ampliaciones SAP

Ampliaciones SAP

Como muchos sabemos, SAP es un sistema  que no permite la modificación de los programas-transacciones estándar. Sin embargo, ocasionalmente se requiere adaptar las funcionalidades estándar a requerimientos específicos del cliente.Para ello, SAP permite ciertas herramientas para realizar “modificaciones controladas” a los programas estándar.Más que modificaciones, se tratan más bien de “ampliaciones”, ya que lo que se nos permite hacer, es añadirles funcionalidades a las ya existentes, como por ejemplo, alguna validación adicional a un pedido de ventas, específica del cliente, que no esté contemplada en el estándar de SAP.Actualmente, existen 3 tipos de ampliaciones permitidas en SAP:USEREXIT’s: Son subrutinas vacías existentes en los programas estándar, las cuales se pueden activar y escribir el código adicional que requerimos añadir; estas subrutinas responden a determinados eventos del proceso estándar, por lo que debemos ubicar cual es el userexit que corresponde al apartado de la transacción que queremos modificar, por ejemplo, si nos piden validar que el monto de un pedido no exceda una cantidad determinada al momento de crearlo, debemos encontrar que USEREXITS se activan al momento de pulsar el botón “Guardar”, o lo que es lo mismo, cuando se invoca el evento “guardar pedido”. Estas subrutinas cuentan con ciertas tablas y estructuras internas con la información relevante obtenida por el proceso estándar, en este ejemplo, la información del pedido que se pretende crear.CUSTOMER-EXIT: En algunos puntos del código estándar, hay llamadas del tipo CALL CUSTOMER-FUNCTION <número>. Estas rutinas se editarán con la transacción CMOD.BADI’S: Son ampliaciones que funcionan bajo la filosofía de programación orientada a objetos, es decir, mediante clases y métodos, son invocados dentro del estándar con CALL METHOD, creadas a través de la transacción SE18 e implementadas por la SE19.Las BADI’s se definen mediante la SE18, donde se debe especificar lo siguiente:

Definición de la interfaz: métodos y parámetros que contendrá la clase a implementar.

Tipo de implementación: se puede crear una BADI simple (permite una sola implementación activa) o múltiple (permitir varias invocaciones desde diferentes programas).

Luego, para implementar la BADI recién creada, o cualquier otra existente en el sistema, o bien utilizar  alguna de las distintas implementaciones de BADI’s existentes, se debe utilizar la transacción SE19.Las BADI’s se pueden implementar más de una vez, a diferencia de los USEREXITS, que solo permiten una implementación; esto es porque un USEREXIT es un perform dentro de un programa estándar, por lo que solo puede ser invocado por dicho programa, en cambio las BADI’s son interfaces de clases, cuyos métodos pueden ser invocados desde diferentes programas.En resumen, los USEREXITS son performs dentro del código estándar, los CUSTOMER-EXIT son funciones, y las BADI’s son interfaces.

Subrutinas para el módulo de Ventas.Si bien la tendencia de SAP es ir sustituyendo las USEREXITS propiamente dichas por BADi’s, en   el módulo SD aún son frecuentes encontrar USEREXITS, y de una manera muy sencilla. Buscamos el programa fuente de la transacción estándar, entramos al programa por la SE80, buscamos las subrutinas asociadas al mismo, y de la lista que nos muestran, ubicamos aquellas que empiecen con el prefijo USEREXIT.Luego nos queda determinar cuál de todas es la que nos es útil según lo que nos pidan. Estas EXITS son simples llamados a INCLUDES, a los cuales debemos solicitar su clave de modificación para añadirle código a los FORMS contenidos en ellos. Mi forma de determinar cual es el EXIT que necesito, es fijar un break-point en cada EXIT, ejecutar la transacción estándar, y ver cual EXIT es llamado al momento del evento sobre el cual debemos hacer la ampliación; por ejemplo, si se requiere una validación al momento de guardar/salvar un pedido, es muy probable que debamos hacer los cambios en el FORM SAVE_DOCUMENT_PREPARE o SAVE_DOCUMENT del Include MV45AFZZ.Es muy común que soliciten cambios al tratamiento de documentos de ventas, para ello, el Include MV45AFZZ del programa estándar SAPMV45A es un EXIT muy utilizado.

Page 2: Ampliaciones SAP

Búsqueda de palabras clave en programa estándar.Existe otra manera de buscar las ampliaciones disponibles, aunque en este caso debemos saber si se trata de un USEREXIT, un CUSTOMER-EXIT, o una BADI; ya que cada una tiene su propia palabra clave para identificarlos.Si no recuerdas las diferencias entre los 3 tipos de ampliaciones, en el siguiente artículo tienes una explicación detallada de los mismos.Diferencias entre tipos de ampliaciones.Aunque veamos una pequeña descripción de cada uno:

Customer Exits: Se trata de funciones utilizadas por un programa estándar cuyo código está en un include Z.

Business Add-Ins: Las badis son que podemos implementar en una clase Z. User Exits: Son subrutinas de un programa estándar que están en un include especia que SAP nos

deja modificar.Lo primero que debemos hacer es ubicar el programa fuente de la transacción estándar y entramos al código, bien sea por la SE38 o la SE80, en este caso es indiferente.Una vez allí, pulsamos el buscador y vamos a buscar las palabras claves según el tipo de ampliación que busquemos:CUSTOMER-EXIT.Si se trara de un CUSTOMER-EXIT, buscamos la cadena “CUSTOMER-FUNCTION”, obtenemos resultados como en la imagen siguiente:

Hacemos doble clic en los resultados, nos llevará al Include que contiene el llamado, allí podremos hacer doble clic en el número para llegar directamente al módulo de funciones donde podremos trabajar:

Aún nos queda por determinar la “ampliación” en donde se encuentra este CUSTOMER-EXIT; con el nombre de la función buscamos en la SMOD y obtendremos el nombre de la ampliación.Ahora, con la ampliación y el módulo de función ubicados, ya podemos implementar los cambios requeridos.BADI’SNuevamente en el código fuente del programa estándar, buscamos la cadena "CL_EXITHANDLER"; el resultado nos mostrará las BADI’s utilizadas en dicho programa.

El nombre exacto de las BADI’s los encontramos justo al lado de “exit_name”.USEREXITSEn el caso de las USEREXITS, realizamos la misma búsqueda, solo que esta vez la palabra clave es USEREXIT, el resultado serán los Includes que contienen dichas EXITS que estamos buscando.Esto salió más largo de lo que pensé en un principio, pero creo que logré abarcar un panorama bastante completo de la búsqueda de estos objetos.Si conoces algún otro método que te sea eficaz, te agradecería que lo compartieras con nosotros a través de los comentarios.Existen varios caminos para encontrar la BADI que requerimos en un momento dado, vamos a ver algunas de ellas:Opción A.Entramos a la transacción SE80, buscamos en el explorador la clase “CL_BADI_FLT_DATA_TRANS_AND_DB”, luego ubicamos el método “ACT_IMPS_PER_FLT_VAL” y entramos al código, apelamos al buscador para ubicar el comentario “read BADI attributes”, y justo debajo del SELECT que veremos, fijamos un break-point.Luego, abrimos otro modo para ejecutar la transacción que se desea analizar, y veremos que se detendrá cada vez que pase por el break-point fijado, ahora revisamos en el debugger los campos “exit_name” e “internal” para dar con las BADI’s que toca dicha transacción.Opción B.Utilizamos la transacción SE93 para ver los atributos de la transacción estándar que queremos evaluar, buscamos su paquete (clase de desarrollo), luego nos dirigimos a la transacción SE18, optamos por la opción de búsqueda ampliada, indicamos el paquete previamente encontrado y

Page 3: Ampliaciones SAP

realizamos la búsqueda; el sistema nos indicará todas las BADI’s relacionadas con dicho paquete indicado.Opción C.Esta vez partimos desde la transacción SE24 (Class Builder), ubicamos la clase CL_EXITHANDLER, método GET_INSTANCE, y en su código, colocamos un break-point en la instrucción “CALL METHOD cl_exithandler=>get_class_name_by_inerface”.Posteriormente, en otro nodo ejecutamos la transacción que queremos verificar, se activará el debugger y la ejecución alcanzará el break-point cada vez que el estándar intente verificar la existencia de alguna BADI. El sistema verificará si una definición de BADI tiene alguna implementación activa, aunque no existiese ninguna implementación, el método al que le fijamos el break-point, detectará que existe una BADI en dicho punto.En la variable “exit_name” se mostrarán los nombres de las BADI’s que implementa dicho estándar, y podremos comprobar si están implementadas o no, a través de la transacción SE18, luego de ingresar el nombre, buscando la opción de menú Implementaciones -> Resumen.Con cualquiera de estas opciones, podremos encontrar una BADI que nos sea útil para determinado momento, si conoces, o sueles usar otro camino, te invito a que lo compartas con todos en los comentarios.

Como buscar "USER-EXITS"

Esta es una duda que aparece con frecuencia en todos los curso que doy y la respuesta no es sencilla. Voy a intentar ilustrar los distintos métodos de búsqueda con pantallazos para intentar que quede muy muy claro.

Antes de empezar me gustaría aclarar que aunque todo el mundo dice "user-exits", en realidad tendríamos que decir "enhancements" ya que las user-exits son solo uno de los distintos tipos de enhancements que SAP nos proporciona. Los tipos de enhancements mas importantes son:

Customer Exits:

o Se trata de funciones utilizadas por un programa estándar cuyo código está en un include Z.

Business Add-Ins:

o Más conocidas como badis, baDis, con D de Dinamarca. No confundir con las bapis, baPis con P de Pamplona. Aunque su nombre se parece no tienen nada que ver. Las badis son interfaces (un tipo especial de programa ABAP orientado a objetos) que podemos implementar en una clase (otro tipo especial de programa ABAP orientado a objetos) Z.

User Exits:

Page 4: Ampliaciones SAP

o Son subrutinas de un programa estándar que están en un include especia que sap nos deja modificar. Son el tipo más rudimentario de enhancement y en algunos manuales de SAP aparecen como si fueran un tipo especial de modificaciones al estándar.

Tenemos otros tipos de enhancements: BTE, Screen Exits, Menu Exits, etc... pero son utilizadas con menos frecuencias que las tres anteriores. Para más detalles podemos consultar el curso de SAP BC425.

Una vez que conocemos los tres tipos principales de enhancements vamos a ver como podemos buscarlas. Existe un programa z, podemos buscarlo en google que seguro que aparece, que se encarga de buscar los enhancements de un programa cualquiera. He revisado el código a fondo y hace exactamente lo mismo que voy a contar aquí.

Buscar Customer Exits:

1. Tenemos que localizar el programa en el cual queremos buscarlas, a si que lo ejecutamos (mediante la transacción, por el menú SAP, por el menú favoritos, por el menú de usuario o como nos de la gana) y una vez que estamos en el programa que nos interesa seleccionamos el menu "Sistema" y dentro de el la opción "Status". En la pantalla que aparece nos apuntamos el último programa que aparezca en en apartado "Datos Repository" (puede que lo necesitemos más adelante) y hacemos doble click en el para ir al código fuente.

Page 5: Ampliaciones SAP

2. Una vez que estamos en el código fuente tenemos que buscar la cadena "CUSTOMER-FUNCTION" con la opción Global en prog.control

3. Al buscar la cadena, es posible que el motor de búsqueda nos pregunte por el programa principal de algún include:

Page 6: Ampliaciones SAP

A ser posible seleccionaremos el programa que apuntamos en el paso 1, de no aparecer en la lista elegimos uno cualquiera, aunque esta última opción podría terminar encontrando enhancements de otros programas distintos al que queremos. Después de un rato de búsqueda tendremos la lista de las Customer Exits del programa. Si la búsqueda termina sin resultados es que no tenemos Customer Exits.

Page 7: Ampliaciones SAP

4. Lamentablemente con esto no es suficiente para que un programador pueda implementar el enhancement. Aún tenemos que buscar un poco más. Con doble click en el nombre del include llegamos al punto del programa donde está siendo llamada la Customer Exit. Y una vez allí, con coble click en el número de la customer, llegamos a la función.

Page 8: Ampliaciones SAP

5. Aún nos queda un último paso. Los programadores necesitan saber la "ampliación" donde está esta Customer Exit. A si que nos apuntamos el nombre de la función, vamos a la SMOD y buscamos la ampliación correspondiente.

Page 10: Ampliaciones SAP

6. Con el nombre de la función y el de la ampliación ya podemos implementar nuestra customer exit.

Buscar BAdIs:

1. Las BAdIs son similares a las Customer Exits, excepto que utilizan clases (ABAP orientado a objetos) en lugar de funciones (ABAP Clásico). La tendencia de SAP es sustituir en el estándar todas las Customer Exits por BAdIs, por lo que en las nuevas versiones de SAP cada vez vamos a ver menos Customer Exits y más BAdIs. Comenzamos la búsqueda como en el caso de las Customer Exits, solo que ahora la cadena a buscar es "CL_EXITHANDLER"

2. El resultado de la búsqueda son las BAdIs. Para poder implementarlas, un programador necesita saber como se llama la BAdI, el nombre aparece justo después de "exit_name".

Page 11: Ampliaciones SAP

Buscar User Exits:

1. Las User Exits son el tipo de Enhacement más antiguo que tiene SAP. Principalmente están en el módulo SD y, al igual que las Customer Exits, tienden a desaparecer al ser sustituidas en las nuevas versiones por BaDIs. Se utiliza ABAP clásico para implementarlas. La busqueda es idéntica a los casos anteriores solo que ahora la cadena de búsqueda es USEREXIT. El resultado de la busqueda nos da el nombre del include y el de las User Exits que el programador necesita para implementarlas.

Bapi

Por empezar BAPI son las iniciales de Business Application Programming Interface, es una función de tipo RFC (Remote Function Call), utilizada en SAP para automatizar procesos e interfacear con otros sistemas.

Si querés conocer que BAPIs existen en SAP, sólo debes ir a la transacción BAPI y ahí las tenés subdivididas por categorías, osea accounting, MM, etc.

Las BAPIs se manejan al igual que cualquier función desde la transacción SE37.

Page 12: Ampliaciones SAP

En programación, una función es un grupo de instrucciones con un objetivo en particular y que se ejecuta al ser llamada desde otra función o procedimiento. Una función puede llamarse múltiples veces e incluso llamarse a sí misma (función recurrente). Las funciones pueden recibir datos desde afuera al ser llamadas a través de los parámetros y deben entregar un resultado. - See more at: http://www.alegsa.com.ar/Dic/funcion.php#sthash.pU65DcaO.dpuf