Automatización de la Gestión de Maestros de Materiales en ABAP mediante BAPIs

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 (Tipo BAPIMATHEAD): Contiene información general del material, como el tipo de material y el sector industrial, y permite seleccionar las vistas a procesar.
  • CLIENTDATA (Tipo BAPI_MARA) y CLIENTDATAX (Tipo BAPI_MARAX): Para datos a nivel de mandante (vista básica 1 y 2). CLIENTDATAX utiliza banderas booleanas para indicar los campos a actualizar.
  • PLANTDATA (Tipo BAPI_MARC) y PLANTDATAX (Tipo BAPI_MARCX): Para datos a nivel de centro.
  • STORAGELOCATIONDATA (Tipo BAPI_MARD) y STORAGELOCATIONDATAX (Tipo BAPI_MARDX): Para datos a nivel de centro y almacén.
  • VALUATIONDATA (Tipo BAPI_MBEW) y VALUATIONDATAX (Tipo BAPI_MBEWX): Para datos de valoración (contabilidad y costes).
  • SALESDATA (Tipo BAPI_MVKE) y SALESDATAX (Tipo BAPI_MVKEX): Para datos de organización de ventas y canal de distribución.
  • MATERIALDESCRIPTION (Tabla de tipo BAPI_MAKT): Permite introducir descripciones del material en diferentes idiomas.
  • RETURN (Tipo BAPIRET2): Devuelve un mensaje de éxito o error general.
  • RETURNMESSAGES (Tabla de tipo BAPI_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 (Tipo SDIBE_MASSFIELDS): Una estructura con indicadores 'X' para especificar qué campos de MRP se están actualizando.
  • I_MDMA (Tipo MDMA): Contiene los valores reales para los campos de MRP que se desean establecer en el área MRP.
  • E_ERROR_RETURN (Tipo BAPIRETURN1): 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 a abap_true y 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_CREATE o BAPI_OBJCL_CHANGE para 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, como SAVE_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 UNITSOFMEASURE y UNITSOFMEASUREX de BAPI_MATERIAL_SAVEDATA.

Etiquetas: ABAP SAP MM BAPI Maestros de Materiales BAPI_MATERIAL_SAVEDATA

Publicado el 7-15 03:31