- VBAK si son campos a medida para la cabecera del pedido de ventas.
- VBAP si son campos a medida para las posiciones del pedido de venta.
- Desde la transacción SE11, dentro de la tabla correspondiente pulsamos el botón APPEND
- Creamos un nuevo append y añadimos nuestros campos a medida.
- Guardad y activar.
Crear un nuevo append a la tabla |
Nuevos campos a medida para la tabla VBAP |
Aviso: el nombre del campo debería empezar por ZZ o YY |
El problema surge cuando queremos gestionar estos campos con alguna bapi de ventas como:
- SD_SALESDOCUMENT_CREATE
- BAPI_SALESORDER_CHANGE
- BAPI_SALESORDER_CREATEFROMDAT2
- .... y más que hay....
¿Donde están nuestros campos a medida? ¿ como puedo usarlos en estas bapis?
Para estas bapis, los campos a medida se gestionan a través del parámetro EXTENSIONIN.
Primero, añadir los nuevos campos a las siguientes tablas a través de un APPEND:
Si son campos a medida en las posiciones del pedido de venta:
- BAPE_VBAP
- BAPE_VBAPX
- VBAPKOZ
- VBAPKOZX
- BAPE_VBAK
- BAPE_VBAKX
- VBAKKOZ
- VBAKKOZX
En las estructuras BAPE_VBAK/BAPE_VBAP todos los campos deben ser de tipo CHAR sino cuando más adelante rellenéis la estructura de la bapi, los campos numéricos saldrán con caracteres extraños como &# y no coincidirán las longitudes.
Por ejemplo:
- Un campo DEC 15 con 3 decimales , lo definiremos como CHAR de 15
- Un campo INT de longitud, lo definiremos como CHAR de 8.
En las estructuras BAPE_VBAPX / BAPE_VBAKX los campos deben ser CHAR1 (char de long. 1)
En las estructuras VBAPKOZX o VBAKKOZX los campos deben ser CHAR1 (char de long. 1)
Centrándonos en el ejemplo, ampliamos las tablas para posiciones de pedido:
BAPE_VBAP - todos los campos son de tipo CHAR |
BAPE_VBAPX - todos los campos son de tipo CHAR |
VBAPKOZ |
VBAPKOZX |
Con esto hemos terminado la parte de las estructuras que necesitamos.
Ahora vamos con el código.
EXTENSIONIN es de tipo BAPIPAREX, su estructura es la siguiente:
Estructura BAPIPAREX |
En los siguientes campos guardamos los valores de los campos concatenados como un solo registro.
Lo mejor es utilizar el método fill_container_c de la cl_abap_container_utilities.
Aquí os dejo un ejemplo para rellenar la estructura EXTENSIONIN:
DATA: wl_vbape TYPE bape_vbap, wl_vbapex TYPE bape_vbapx. DATA: tl_extin type STANDARD TABLE OF bapiparex. FIELD-SYMBOLS: <fs_extin> TYPE bapiparex. wl_vbape-VBELN = wg_vbeln. "nº de documento de ventas wl_vbape-POSNR = wg_posnr. "nº de posición wl_vbapex-VBELN = wg_vbeln. "nº de documento de ventas wl_vbapex-POSNR = wg_posnr. "nº de posición wl_vbape-zzcampo1 = 'prueba'. wl_vbape-zzcampo2 = 'de campos'. wl_vbape-zzcampo3 = 'a medida'. wl_vbapex-zzcampo1 = 'X'. "o ABAP_TRUE si usais TYPE-POOLS: ABAP. wl_vbapex-zzcampo2 = 'X'. wl_vbapex-zzcampo3 = 'X'. APPEND INITIAL LINE TO it_extin ASSIGNING <fs_extin>. <fs_extin>-structure = 'BAPE_VBAP'.
*si parecen caracteres extraños, revisar que todos los campos de la estrc son CHAR cl_abap_container_utilities=>fill_container_c( EXPORTING im_value = wl_vbape IMPORTING ex_container = <fs_extin>+30 ). APPEND INITIAL LINE TO it_extin ASSIGNING <fs_extin>. <fs_extin>-structure = 'BAPE_VBAPX'. cl_abap_container_utilities=>fill_container_c( EXPORTING im_value = wl_vbapex IMPORTING ex_container = <fs_extin>+30 ). * ya podemos usarlo en la bapi: CALL FUNCTION 'SD_SALESDOCUMENT_CREATE' EXPORTING sales_header_in = wa_so_hearder sales_header_inx = wa_so_hearderx testrun = test IMPORTING salesdocument_ex = wa_saorder TABLES return = lt_return sales_items_in = it_items sales_partners = it_fi extensionin = it_extin. "<Campos a medida del pedido
Notas relacionadas:
Note 143580 - Information on SD BAPIs and customer enhancement