Cómo automatizar la carga de datos en el ERP a partir de planos técnicos con SAP

· Written by Jochen Mattes

Disponible en:

Es posible automatizar la transferencia de cotas, materiales, tolerancias y datos del cuadro de títulos desde planos técnicos 2D directamente a SAP, sin necesidad de introducir los datos manualmente. Este artículo describe la arquitectura, el mapeo de campos y el código funcional para una integración de Werk24 con SAP que reemplaza horas de carga manual de datos por plano con una llamada a la API de 15 segundos.


Por qué esto es importante

Toda empresa de fabricación que utiliza SAP enfrenta el mismo cuello de botella: alguien recibe un plano técnico (PDF o escaneado), lo lee manualmente e introduce los datos extraídos en las transacciones de SAP — MM01 para maestros de materiales, CS01 para listas de materiales, CA01 para hojas de ruta, QM para características de inspección. El proceso es:

  • Lento: de 15 a 45 minutos por plano, según la complejidad.
  • Propenso a errores: errores de transcripción en tolerancias, códigos de material incorrectos, anotaciones de GD&T omitidas.
  • No escalable: cada nueva solicitud de cotización (RFQ), modificación de ingeniería o alta de proveedor genera el mismo trabajo manual.
  • Invisible: no existe una trazabilidad que vincule el registro de SAP con la anotación específica en el plano.

La API de Werk24 extrae información PMI (Product Manufacturing Information) estructurada del plano y la devuelve en formato JSON. Las interfaces de SAP (BAPIs, IDocs u OData) aceptan datos estructurados. La integración conecta ambos sistemas.


Visión general de la arquitectura

┌─────────────┐     ┌───────────┐     ┌─────────────┐     ┌───────────┐
│  Drawing     │────▶│  Werk24   │────▶│  Middleware  │────▶│   SAP     │
│  (PDF/scan)  │     │  API      │     │  (Python)   │     │  (BAPI /  │
└─────────────┘     └───────────┘     └─────────────┘     │  OData)   │
                         │                   │             └───────────┘
                    Structured JSON      Field mapping
                    (dims, GD&T,         + validation
                     materials,
                     title block)

Werk24 extrae → el middleware mapea → SAP consume. El middleware es un script ligero (Python, Node o ABAP) que:

  1. Envía el plano a Werk24.
  2. Recibe el JSON estructurado.
  3. Mapea los campos del JSON a los campos de SAP.
  4. Invoca la interfaz de SAP correspondiente (BAPI, IDoc u OData).
  5. Registra el resultado y lo vincula con el plano de origen.

Paso 1: Extraer datos del plano técnico

Instale el SDK de Python de Werk24 y obtenga una licencia de prueba:

pip install werk24
werk24 init        # walks you through license setup
werk24 health-check  # verify everything works

A continuación, extraiga datos estructurados de un plano utilizando el cliente asíncrono:

import asyncio
from werk24 import (
    Werk24Client,
    AskMetaData,
    AskFeatures,
    AskInsights,
)

async def extract_drawing(path: str):
    """Read a technical drawing and collect metadata + features."""
    results = {}

    with open(path, "rb") as fh:
        drawing = fh.read()

    async with Werk24Client() as client:
        async for message in client.read_drawing(
            drawing,
            [AskMetaData(), AskFeatures(), AskInsights()],
        ):
            # Each message contains a response for one of the asks
            results[message.ask_type] = message

    return results

result = asyncio.run(extract_drawing("drawing.pdf"))

El SDK se conecta vía WebSocket, transmite los resultados a medida que están disponibles y gestiona la autenticación automáticamente (usando la licencia de werk24 init). Cada message es un objeto de respuesta tipado — ResponseMetaDataComponentDrawing, ResponseFeaturesComponentDrawing o ResponseInsightsComponentDrawing — con campos estructurados a los que puede acceder directamente.

A continuación se muestra una vista simplificada de la estructura de respuesta (en JSON para mayor legibilidad — el SDK devuelve objetos Pydantic tipados):

AskMetaDataResponseMetaDataComponentDrawing:

{
  "identifiers": [
    { "value": "W24-0815-A", "identifier_type": "DRAWING_ID" }
  ],
  "designation": "Bearing housing",
  "weight": { "value": 2.35, "unit": "kg" },
  "material_options": [
    {
      "material_combination": [
        { "raw_ocr": "X5CrNi18-10", "designation": "1.4301", "standard": "EN 10088-1" }
      ]
    }
  ],
  "general_tolerances": { "tolerance_standard": "ISO_2768", "tolerance_class": "m" },
  "bill_of_material": {
    "rows": [
      { "position": "1", "part_number": "W24-0816", "designation": "Shaft", "quantity": { "value": 1, "unit": "ST" } }
    ]
  }
}

AskFeaturesResponseFeaturesComponentDrawing:

{
  "dimensions": [
    {
      "label": "120 ±0.05",
      "confidence": { "score": 0.97 },
      "size": {
        "value": 120.0, "unit": "mm",
        "tolerance": { "deviation_upper": 0.05, "deviation_lower": -0.05 }
      }
    }
  ],
  "threads": [
    { "label": "M8x1.25", "diameter": { "value": 8.0, "unit": "mm" }, "depth": { "value": 15.0, "unit": "mm" } }
  ],
  "roughnesses": [
    { "conditions": [{ "parameter": "Ra", "value": { "value": 1.6, "unit": "µm" } }] }
  ],
  "gdnts": [
    { "characteristic": "POSITION", "zone": { "value": { "value": 0.05, "unit": "mm" } }, "datums": [{ "label": "A" }, { "label": "B" }] }
  ]
}

Cada campo incluye una puntuación de confianza. Establezca un umbral (por ejemplo, ≥ 0,95 para aceptación automática, < 0,95 para revisión humana) para evitar que datos incorrectos se introduzcan en SAP.


Paso 2: Mapear los campos de Werk24 a los campos de SAP

Aquí reside la lógica de negocio. El mapeo depende del módulo de SAP de destino.

Maestro de materiales (MM01 / BAPI_MATERIAL_SAVEDATA)

La respuesta de AskMetaData (ResponseMetaDataComponentDrawing) proporciona datos del cuadro de títulos y del material:

Campo Werk24Campo SAPTabla SAPNotas
metadata.identifiers[0].valueMATNRMARANúmero de material
metadata.material_options[0].material_combination[0].standardNORMTMARANorma de material (DIN/EN)
metadata.weight.valueNTGEWMARAPeso neto
metadata.weight.unitGEWEIMARAUnidad de peso
metadata.designationMAKTXMAKTTexto breve de material
metadata.material_options[0].material_combination[0].designationWRKSTMARCEspecificación de material

Lista de materiales — BOM (CS01 / BAPI_BOM_ITEM_CREATE)

Si el plano contiene una lista de piezas, AskMetaData devuelve metadata.bill_of_material con filas estructuradas:

Campo Werk24Campo SAPNotas
metadata.bill_of_material.rows[].part_numberIDNRKNúmero de material del componente
metadata.bill_of_material.rows[].quantity.valueMENGECantidad
metadata.bill_of_material.rows[].quantity.unitMEINSUnidad de medida
metadata.bill_of_material.rows[].designationOJTXPTexto de posición

Gestión de calidad (QM — Características de inspección)

La respuesta de AskFeatures (ResponseFeaturesComponentDrawing) proporciona cotas, GD&T y acabado superficial:

Campo Werk24Campo SAPNotas
features.dimensions[].size.valueValor objetivoValor objetivo de la característica
features.dimensions[].size.tolerance.deviation_upperLímite superior
features.dimensions[].size.tolerance.deviation_lowerLímite inferior
features.roughnesses[].conditions[0].valueValor objetivoCaracterística de rugosidad superficial Ra/Rz
features.gdnts[].zone.valueBanda de toleranciaPosición/planicidad/etc.

Paso 3: Enviar los datos a SAP

Opción A: Llamada BAPI vía RFC (PyRFC)

from pyrfc import Connection

sap = Connection(
    ashost="sap-server.example.com",
    sysnr="00",
    client="100",
    user="WERK24_SVC",
    passwd="<service-password>",
)

# Assuming `metadata` is the ResponseMetaDataComponentDrawing from Step 1
part_number = metadata.identifiers[0].value if metadata.identifiers else "UNKNOWN"
material_designation = (
    metadata.material_options[0].material_combination[0].designation
    if metadata.material_options and metadata.material_options[0].material_combination
    else ""
)

headdata = {
    "MATERIAL": part_number,
    "IND_SECTOR": "M",       # Mechanical engineering
    "MATL_TYPE": "HALB",      # Semi-finished product
}

clientdata = {
    "MATL_GROUP": "010",
    "BASE_UOM": "ST",
    "NET_WEIGHT": float(metadata.weight.value) if metadata.weight else 0,
    "UNIT_OF_WT": metadata.weight.unit if metadata.weight else "KG",
    "NORM": material_designation,
}

resp = sap.call(
    "BAPI_MATERIAL_SAVEDATA",
    HEADDATA=headdata,
    CLIENTDATA=clientdata,
    CLIENTDATAX={
        "MATL_GROUP": "X", "BASE_UOM": "X",
        "NET_WEIGHT": "X", "UNIT_OF_WT": "X", "NORM": "X",
    },
)

if resp["RETURN"]["TYPE"] == "S":
    print(f"Material {headdata['MATERIAL']} created.")
else:
    print(f"Error: {resp['RETURN']['MESSAGE']}")

Opción B: OData / SAP API Business Hub

Para S/4HANA Cloud o SAP BTP, utilice la API OData API_PRODUCT_SRV:

import requests

s4_base = "https://my-s4hana.example.com/sap/opu/odata/sap/API_PRODUCT_SRV"
headers = {
    "Authorization": "Bearer <s4-oauth-token>",
    "Content-Type": "application/json",
    "X-CSRF-Token": "<fetched-token>",
}

payload = {
    "Product": part_number,
    "ProductType": "HALB",
    "BaseUnit": "ST",
    "NetWeight": str(metadata.weight.value) if metadata.weight else "0",
    "WeightUnit": metadata.weight.unit if metadata.weight else "KG",
    "IndustrySector": "M",
}

resp = requests.post(
    f"{s4_base}/A_Product",
    headers=headers,
    json=payload,
)
print(resp.status_code, resp.json())

Opción C: IDoc (para flujos de trabajo por lotes/asíncronos)

Genere un IDoc XML de tipo MATMAS05 a partir del JSON de Werk24 y deposítelo en la cola de entrada de SAP. Es la mejor opción para importaciones masivas (por ejemplo, procesamiento de un archivo de planos).


Paso 4: Flujo de trabajo con control de confianza

No todos los datos extraídos deben enviarse directamente a SAP. Utilice las puntuaciones de confianza de Werk24 para construir un flujo de trabajo en tres niveles:

ConfianzaAcciónVolumen (típico)
≥ 0,95Creación automática en SAP~70 % de los campos
0,80 – 0,95Enviar a cola de revisión humana~20 % de los campos
< 0,80Marcar para carga manual~10 % de los campos
from decimal import Decimal

THRESHOLD_AUTO = Decimal("0.95")
THRESHOLD_REVIEW = Decimal("0.80")

# features is a ResponseFeaturesComponentDrawing from Step 1
for dim in features.dimensions:
    score = dim.confidence.score if dim.confidence else Decimal("0")
    if score >= THRESHOLD_AUTO:
        push_to_sap(dim)
    elif score >= THRESHOLD_REVIEW:
        send_to_review_queue(dim)
    else:
        flag_for_manual_entry(dim)

Esto evita que datos incorrectos se introduzcan en SAP y, al mismo tiempo, automatiza la mayoría de las entradas.


Paso 5: Trazabilidad — vincular los registros de SAP con el plano de origen

Cada registro de SAP debe hacer referencia al plano de origen y a la ubicación exacta del valor extraído. Werk24 proporciona coordenadas a nivel de píxel (cajas delimitadoras) para cada campo extraído. Almacene estas referencias como vínculos de documentos en SAP:

  • Adjunte el plano original como documento DMS (transacción CV01N).
  • Almacene el upload_id de Werk24 y las coordenadas por campo en una tabla personalizada de SAP o como característica de clasificación.
  • Cuando un auditor o un ingeniero de calidad cuestione un valor, podrá rastrearlo hasta la anotación exacta en el plano original.

Cómo funciona en producción

Un despliegue típico en producción procesa los planos en uno de dos modos:

Basado en eventos (tiempo real): Un nuevo plano llega por correo electrónico, EDI o portal de proveedores → el middleware lo extrae mediante Werk24 → se completan automáticamente los datos en SAP → se notifica al ingeniero responsable si algún campo requiere revisión. Tiempo de procesamiento: de 15 a 30 segundos por plano.

Por lotes (digitalización de archivos): Archivo existente de planos (miles de PDF/TIFF) → carga masiva a Werk24 → el middleware procesa los resultados durante la noche → los registros de SAP se crean de forma masiva → cola de revisión para los elementos con baja confianza. Capacidad de procesamiento: ~3.000 planos/día en el nivel de servicio provisionado.


Preguntas frecuentes

¿Qué precisión tiene la extracción?

Werk24 alcanza una precisión superior al 95 % en planos técnicos estándar. Con puertas de calidad personalizadas entrenadas según las convenciones específicas de su empresa, la precisión llega al 99 %. Cada campo incluye una puntuación de confianza para que pueda decidir programáticamente qué aceptar automáticamente y qué enviar a revisión.

¿Qué ocurre si nuestros planos utilizan convenciones no estándar?

Werk24 es compatible con las normas ISO y ASME/ANSI, procesa planos en 7 idiomas y maneja tanto PDF generados desde CAD nativo como escaneados de más de 20 años de antigüedad. Para convenciones específicas de su empresa (diseños de cuadro de títulos personalizados, códigos de material propietarios), se puede configurar una puerta de calidad a medida.

¿Qué versiones de SAP son compatibles?

Cualquier sistema SAP que exponga BAPIs (ECC 6.0+), IDocs o APIs OData (S/4HANA). La integración se realiza a nivel de API — Werk24 no instala nada dentro de SAP. El middleware se ejecuta en su propia infraestructura o en la nube.

¿Cuánto tiempo lleva la integración?

Prueba de concepto: unas pocas horas con los ejemplos de código anteriores. Integración en producción con mapeo de campos, control de confianza, gestión de errores y vinculación con DMS: de 2 a 6 semanas dependiendo del número de módulos de SAP involucrados. Werk24 incluye soporte de integración en todos los planes de pago.

¿Qué hay de la residencia de datos y la seguridad?

Los datos se procesan en la UE (Fráncfort) o en EE. UU. (a elección del cliente). Cifrados en tránsito y en reposo. Retención configurable desde eliminación inmediata hasta 21 días. Los planos nunca abandonan la región seleccionada y nunca se utilizan para entrenar modelos compartidos.