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.

Creación de nueva pestaña en VA01 mediante BAdI - Transacción SE18

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.

Creación de nueva pestaña en VA01 mediante BAdI - Nueva BAdI

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”.

Creación de nueva pestaña en VA01 mediante BAdI - Implementations

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.

Creación de nueva pestaña en VA01 mediante BAdI - Lista enhancement implementations
En el siguiente paso, asignaremos el nombre de la implementación y el nombre de la clase que implementará esta BAdI.

Creación de nueva pestaña en VA01 mediante BAdI - Asigación enhancement implementations

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).

Creación de nueva pestaña en VA01 mediante BAdI - 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.

Creación de nueva pestaña en VA01 mediante BAdI - Estructura ZVBAK

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.

Creación de nueva pestaña en VA01 mediante BAdI - Grupo de funciones ZFG_VBAK

 

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.

Creación de nueva pestaña en VA01 mediante BAdI (11)

Creación de nueva pestaña en VA01 mediante BAdI - Texto test

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