Introducción a la Gestión Automatizada de Maestros de Materiales
La gestión de datos maestros de materiales (MM01 en la transacción estándar de SAP) es una operación fundamental en cualquier entorno SAP. Sin embargo, la creación o actualización manual de un gran volumen de materiales puede ser tediosa y propensa a errores. SAP proporciona BAPIs (Business Application Programming Interfaces) que permiten automatizar estos procesos, integrando sistemas externos o realizando cargas masivas de manera programática. Este artículo detalla cómo utilizar las BAPIs clave para la creación y modificación de datos maestros de materiales en ABAP.
Creación y Actualización de Materiales con BAPI_MATERIAL_SAVEDATA
La BAPI principal para manejar los datos maestros de materiales es BAPI_MATERIAL_SAVEDATA. Esta BAPI es altamente versátil, permitiendo la manipulación de diversas vistas del maestro de materiales (básica, compras, ventas, contabilidad, planificación de requisitos de material, etc.) y soporta tanto la creación como la actualización de registros. Su diseño se basa en una estructura de "campos de datos" y "campos de bandera (X)", donde los campos de bandera indican qué campos de datos deben ser procesados.
Parámetros Clave de BAPI_MATERIAL_SAVEDATA
HEADDATA(TipoBAPIMATHEAD): Contiene información general del material, como el tipo de material y el sector industrial, y permite seleccionar las vistas a procesar.CLIENTDATA(TipoBAPI_MARA) yCLIENTDATAX(TipoBAPI_MARAX): Para datos a nivel de mandante (vista básica 1 y 2).CLIENTDATAXutiliza banderas booleanas para indicar los campos a actualizar.PLANTDATA(TipoBAPI_MARC) yPLANTDATAX(TipoBAPI_MARCX): Para datos a nivel de centro.STORAGELOCATIONDATA(TipoBAPI_MARD) ySTORAGELOCATIONDATAX(TipoBAPI_MARDX): Para datos a nivel de centro y almacén.VALUATIONDATA(TipoBAPI_MBEW) yVALUATIONDATAX(TipoBAPI_MBEWX): Para datos de valoración (contabilidad y costes).SALESDATA(TipoBAPI_MVKE) ySALESDATAX(TipoBAPI_MVKEX): Para datos de organización de ventas y canal de distribución.MATERIALDESCRIPTION(Tabla de tipoBAPI_MAKT): Permite introducir descripciones del material en diferentes idiomas.RETURN(TipoBAPIRET2): Devuelve un mensaje de éxito o error general.RETURNMESSAGES(Tabla de tipoBAPI_MATRETURN2): Proporciona mensajes detallados para cada operación o campo.
Ejemplo de Código para Crear/Actualizar un Material
El siguiente ejemplo ABAP demuestra cómo utilizar BAPI_MATERIAL_SAVEDATA para crear o actualizar un material, incluyendo algunas de sus vistas más comunes. Se enfoca en la lógica de llenado de estructuras y la llamada a la BAPI, simplificando la complejidad de un informe completo.
REPORT z_material_bapi_process.
* Declaración de tipos y estructuras para la BAPI
TYPES: BEGIN OF ty_material_data,
material_id TYPE mara-matnr, " Número de material
tipo_material TYPE mara-mtart, " Tipo de material
sector_industrial TYPE mara-mbrsh, " Sector industrial
descripcion_es TYPE makt-maktx, " Descripción en español
unidad_medida_base TYPE mara-meins, " Unidad de medida base
grupo_material TYPE mara-matkl, " Grupo de material
centro TYPE marc-werks, " Centro
grupo_compras TYPE marc-ekgrp, " Grupo de compras
tipo_mrp TYPE marc-dismm, " Tipo MRP
clase_valoracion TYPE mbew-bklas, " Clase de valoración
control_precios TYPE mbew-vprsv, " Control de precios
precio_estandar TYPE mbew-stprs, " Precio estándar
unidad_precio TYPE mbew-peinh, " Unidad de precio
END OF ty_material_data.
DATA: ls_material_input TYPE ty_material_data,
ls_cabecera TYPE bapimathead,
ls_datos_cliente TYPE bapi_mara,
ls_datos_cliente_x TYPE bapi_marax,
ls_datos_centro TYPE bapi_marc,
ls_datos_centro_x TYPE bapi_marcx,
ls_datos_valoracion TYPE bapi_mbew,
ls_datos_valoracion_x TYPE bapi_mbewx,
lt_descripciones TYPE STANDARD TABLE OF bapi_makt,
ls_descripcion LIKE LINE OF lt_descripciones,
lt_mensajes TYPE STANDARD TABLE OF bapiret2,
ls_mensaje LIKE LINE OF lt_mensajes.
* --- Datos de ejemplo para la creación/actualización ---
ls_material_input-material_id = 'TEST_MAT_BAPI_01'. " Si está vacío, se asigna interno si el tipo lo permite
ls_material_input-tipo_material = 'FERT'.
ls_material_input-sector_industrial = 'M'.
ls_material_input-descripcion_es = 'Material de prueba via BAPI'.
ls_material_input-unidad_medida_base = 'PCE'.
ls_material_input-grupo_material = '001'.
ls_material_input-centro = '1000'.
ls_material_input-grupo_compras = '001'.
ls_material_input-tipo_mrp = 'PD'.
ls_material_input-clase_valoracion = '7920'.
ls_material_input-control_precios = 'S'. " S para precio estándar, V para precio medio variable
ls_material_input-precio_estandar = '100.00'.
ls_material_input-unidad_precio = '1'.
* --- Preparación de HEADDATA ---
ls_cabecera-material = ls_material_input-material_id.
ls_cabecera-matl_type = ls_material_input-tipo_material.
ls_cabecera-ind_sector = ls_material_input-sector_industrial.
* Seleccionar las vistas a procesar
ls_cabecera-basic_view = abap_true.
ls_cabecera-purchase_view = abap_true.
ls_cabecera-mrp_view = abap_true.
ls_cabecera-account_view = abap_true.
ls_cabecera-cost_view = abap_true.
* --- Preparación de CLIENTDATA (MARA) y CLIENTDATAX (MARAX) ---
ls_datos_cliente-base_uom = ls_material_input-unidad_medida_base.
ls_datos_cliente-matl_group = ls_material_input-grupo_material.
ls_datos_cliente_x-base_uom = abap_true.
ls_datos_cliente_x-matl_group = abap_true.
* --- Preparación de PLANTDATA (MARC) y PLANTDATAX (MARCX) ---
ls_datos_centro-plant = ls_material_input-centro.
ls_datos_centro-pur_group = ls_material_input-grupo_compras.
ls_datos_centro-mrp_type = ls_material_input-tipo_mrp.
ls_datos_centro_x-plant = abap_true.
ls_datos_centro_x-pur_group = abap_true.
ls_datos_centro_x-mrp_type = abap_true.
* --- Preparación de VALUATIONDATA (MBEW) y VALUATIONDATAX (MBEWX) ---
ls_datos_valoracion-val_area = ls_material_input-centro.
ls_datos_valoracion-val_class = ls_material_input-clase_valoracion.
ls_datos_valoracion-price_ctrl = ls_material_input-control_precios.
ls_datos_valoracion-std_price = ls_material_input-precio_estandar.
ls_datos_valoracion-price_unit = ls_material_input-unidad_precio.
ls_datos_valoracion_x-val_area = abap_true.
ls_datos_valoracion_x-val_class = abap_true.
ls_datos_valoracion_x-price_ctrl = abap_true.
ls_datos_valoracion_x-std_price = abap_true.
ls_datos_valoracion_x-price_unit = abap_true.
* --- Preparación de MATERIALDESCRIPTION (MAKT) ---
ls_descripcion-langu = 'ES'. " Idioma español
ls_descripcion-matl_desc = ls_material_input-descripcion_es.
APPEND ls_descripcion TO lt_descripciones.
* --- Llamada a la BAPI ---
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = ls_cabecera
clientdata = ls_datos_cliente
clientdatax = ls_datos_cliente_x
plantdata = ls_datos_centro
plantdatax = ls_datos_centro_x
valuationdata = ls_datos_valoracion
valuationdatax = ls_datos_valoracion_x
TABLES
materialdescription = lt_descripciones
returnmessages = lt_mensajes.
* --- Procesamiento de mensajes y COMMIT/ROLLBACK ---
LOOP AT lt_mensajes INTO ls_mensaje.
IF ls_mensaje-type EQ 'E' OR ls_mensaje-type EQ 'A'.
WRITE: / 'Error:', ls_mensaje-message.
" Un error fue encontrado, hacer ROLLBACK
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
RETURN.
ENDIF.
ENDLOOP.
IF ls_mensaje-type NE 'E' AND ls_mensaje-type NE 'A'.
WRITE: / 'Material', ls_material_input-material_id, 'procesado exitosamente.'.
" Si no hay errores críticos, hacer COMMIT
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
Extensión del Área MRP con MD_MRP_LEVEL_CREATE_DATA
Una particularidad en la gestión de materiales es la extensión del área MRP. La BAPI BAPI_MATERIAL_SAVEDATA no puede utilizarse directamente para crear o extender áreas MRP (Matreial Requirements Planning). Para esta tarea específica, SAP proporciona el módulo de función MD_MRP_LEVEL_CREATE_DATA.
Parámetros Clave de MD_MRP_LEVEL_CREATE_DATA
I_MATNR: Número de material.I_WERK: Centro.I_MRP_AREA: Área MRP a crear o extender.I_SELFIELDS(TipoSDIBE_MASSFIELDS): Una estructura con indicadores 'X' para especificar qué campos de MRP se están actualizando.I_MDMA(TipoMDMA): Contiene los valores reales para los campos de MRP que se desean establecer en el área MRP.E_ERROR_RETURN(TipoBAPIRETURN1): Mensaje de retorno de la operación.I_EXTERNAL_COMMIT: Indica si la función debe realizar su propio commit o si el llamante lo gestionará. Es recomendable establecerlo aabap_truey gestionar el commit/rollback desde el programa principal.
Ejemplo de Código para Extender un Área MRP
Este fragmento de código ilustra cómo crear un área MRP para un material existente, asignando un tipo de MRP y un planificador.
REPORT z_mrp_area_bapi_process.
DATA: lv_material TYPE matnr VALUE 'TEST_MAT_BAPI_01',
lv_centro TYPE werkdp VALUE '1000',
lv_area_mrp TYPE berid VALUE 'P001', " Ejemplo: Área MRP de producción
ls_campos_seleccionados TYPE sdibe_massfields,
ls_datos_mrp TYPE mdma,
ls_retorno_error TYPE bapireturn1.
* --- Rellenar campos de selección para indicar qué campos se actualizarán ---
ls_campos_seleccionados-xdismm = abap_true. " Tipo MRP
ls_campos_seleccionados-xdispo = abap_true. " Planificador MRP
* --- Rellenar estructura MDMA con los valores deseados ---
ls_datos_mrp-dismm = 'ND'. " Ejemplo: Tipo MRP 'No Planificado'
ls_datos_mrp-dispo = '001'. " Ejemplo: Planificador MRP '001'
* --- Llamada al módulo de función para crear/extender el área MRP ---
CALL FUNCTION 'MD_MRP_LEVEL_CREATE_DATA'
EXPORTING
i_matnr = lv_material
i_werk = lv_centro
i_mrp_area = lv_area_mrp
i_selfields = ls_campos_seleccionados
i_mdma = ls_datos_mrp
i_external_commit = abap_true " Gestionar el COMMIT/ROLLBACK externamente
IMPORTING
e_error_return = ls_retorno_error.
* --- Procesamiento del resultado ---
IF ls_retorno_error-type CA 'AEX'. " A=Abort, E=Error, X=Exit (Critical errors)
WRITE: / 'Error al procesar el área MRP', lv_area_mrp, 'para el material', lv_material, ':'.
WRITE: / ls_retorno_error-message.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
WRITE: / 'Área MRP', lv_area_mrp, 'para el material', lv_material, 'procesada exitosamente.'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
Consideraciones Adicionales
Además de la BAPI principal y la función para áreas MRP, la gestión completa del maestro de materiales a menudo requiere otras operaciones que también se pueden automatizar:
- Clasificación de materiales: Utilice
BAPI_OBJCL_CREATEoBAPI_OBJCL_CHANGEpara asignar el material a clases y valores de características. - Textos largos: Para textos de material extensos, como textos de compra o textos de ventas, se usan las funciones del grupo de funciones
STXD, comoSAVE_TEXT. - Tipos de inspección QM: La asignación y activación de tipos de inspección en la vista de Calidad se realiza a través de
BAPI_MATINSPCTRL_SAVEREPLICA. - Unidades de medida alternativas: Para definir unidades de medida alternativas y sus factores de conversión, se pueden usar las tablas
UNITSOFMEASUREyUNITSOFMEASUREXdeBAPI_MATERIAL_SAVEDATA.