Muchos de nosotros nos hemos encontrado a la hora de implantar SAP en un nuevo cliente que éste necesita añadir campos que SAP no proporciona de manera estándar. Estos campos pueden necesitarse en los documentos más comunes como los pedidos de compra o los pedidos de venta.
En este artículo, vamos a mostraros cómo hacerlo de una manera limpia usando BAdIs.
Las BAdIs (Business Add Ins) son un método que SAP proporciona basado en la programación orientada a objetos y que permite incluir código propio en transacciones estándar. Podéis ver más información sobre las BAdIs en este artículo de nuestro Blog.
Lo primero de todo sería localizar la BAdI que necesitamos implementar dependiendo de los requerimientos del cliente. En este artículo os vamos a explicar cómo añadir un campo en la cabecera del pedido de ventas. La BAdI que usaremos será BADI_SLS_HEAD_SCR_CUS.
Crear Implementación BAdI BADI_SLS_HEAD_SCR_CUS
Desde la transacción se18, introducimos la BAdI y le damos al botón visualizar.
En este caso estamos accediendo a una BAdI nueva que está englobada en el enhancement spot BADI_SD_SALES_BASIC, que contiene varias BAdI para manipulación de objetos de venta.
Podemos ver que la BAdI no es de uso multiple, por lo que sólo podremos tener una implementación activa y si visualizamos las implementaciones, veremos que no hay ninguna creada de manera estándar por lo que la crearemos ahora será la que se ejecutará.
Pulsamos con el botón secundario en “Implementations” y pulsamos en “Crear Implementación”.
Nos sale una lista de enhancement implementations a elegir, en este caso, crearemos una nueva, que llamaremos zenh_head_scr_cus. Añadimos también una descripción y aceptamos la ventana. También se puede elegir un composite enhancement implementation o crear uno nuevo, pero en este caso no será necesario.
En el siguiente paso, asignaremos el nombre de la implementación y el nombre de la clase que implementará esta BAdI.
Posteriormente añadiremos el código que indicará a la BAdI, qué pestaña se quiere añadir y guardaremos y mostraremos el valor de los campos en pantalla. Antes de esto, necesitamos añadir estos campos en la tabla de la cabecera de los pedidos de venta (VBAK). Para crear estos campos, generaremos un append structure llamado zvbak.
Crear Append structure en VBAK
Desde la transacción SE11 visualizamos la tabla VBAK y mediante el menú accedemos a crear una nueva append structure (Go to Append Structure).
Pulsamos el botón crear y a la estructura ZVBAK generada le añadimos los campos que necesitemos. En este caso, usaremos un campo texto sencillo de tipo CHAR40.
Crear Grupo de Funciones con la pantalla
Crearemos también un grupo de funciones ZFG_VBAK, que será utilizado como canal de comunicación entre la clase de la BAdI y la subscreen que visualizaremos. Crearemos primero la subscreen y le añadiremos el campo del mismo tipo del campo que hemos añadido en la append structure.
A parte de esta subscreen, generaremos también dos funciones, una para recuperar los datos y mostrarlos por pantalla (ZFM_VBAK_HEADER_GET) y otra para guardar estos datos en la tabla VBAK (ZFM_VBAK_HEADER_SET).
El código de estas funciones será sencillo, tendrán una estructura de tipo vbak como import y export respectivamente y dentro de ellas se asignará a la pantalla y se recuperará de esta para pasarla a la clase que implementa la BAdI. Este sería un código de ejemplo sencillo:
FUNCTION zfm_vbak_header_get.
*»——————————————————————–
*»*»Interfase local
*» IMPORTING
*» REFERENCE(IS_VBAK) TYPE VBAK
*»——————————————————————–
zztext = is_vbak-zztext.
ENDFUNCTION.
FUNCTION zfm_vbak_header_set.
*»———————————————————————-
*»*»Interfase local
*» EXPORTING
*» REFERENCE(ES_VBAK) TYPE VBAK
*»———————————————————————-
es_vbak = zztext.
ENDFUNCTION.
Implementación métodos de la clase ZCL_HEAD_SCR_CUS
En la clase creada previamente, añadiremos las llamadas a estas dos funciones en los métodos TRANSFER_DATA_TO_SUBSCREEN y TRANSFER_DATA_FROM_SUBSCREEN. Además, y para acabar, añadiremos el nombre del programa del grupo de funciones y el número de la subscreen en el método ACTIVATE_TAB_PAGE. METHOD if_ex_sls_head_scr_cus~activate_tab_page. DATA: lw_tab_page TYPE sales_cust_tab_page. lw_tab_page-head_caption = 'Extra tab text'. lw_tab_page-head_program = 'SAPLZFG_VBAK'. lw_tab_page-head_dynpro = '9000'. append lw_tab_page to ct_cus_head_tab. ENDMETHOD. method IF_EX_SLS_HEAD_SCR_CUS~TRANSFER_DATA_TO_SUBSCREEN. CALL FUNCTION 'ZFM_VBAK_HEADER_GET' EXPORTING is_vbak = IS_VBAK . endmethod. METHOD if_ex_sls_head_scr_cus~transfer_data_from_subscreen. CALL FUNCTION 'ZFM_VBAK_HEADER_SET' IMPORTING es_vbak = cs_vbak. ENDMETHOD.
Resultado final
Como veis, de esta manera sencilla y con pocas líneas de código generamos una pestaña extra que nos permitirá, sin tocar el estándar, añadir una funcionalidad muy común en nuestro sistema.
Puedes dejarnos tus preguntas en el área de comentarios o ponerte en contacto con nuestro departamento de User Experience & Integración
Área User Experience & Integración
Cuando voy a la pestaña creada me sale un Dump el cual dice que la dynpro esta mal definida o mal utilizada
Se puede agregar esta solapa a la pantalla de resumen de solapas. Sin tener que entrar a la cabecera del pedido de venta?
Hola Fabián.
El ejemplo que mostramos en el artículo es precisamente con una BADI propia de la cabecera de pedido de ventas. Para tu propósito, será necesario buscar otra, que permita modificar el comportamiento estándar en el punto que necesites.
Un saludo,