Su Template de datos para la gestión de la cadena de suministro
Su Template de datos para la gestión de la cadena de suministro
- Atributos recomendados para recopilar
- Actividades clave que debe supervisar
- Guía de extracción
Atributos de la gestión de la cadena de suministro
| Nombre | Descripción | ||
|---|---|---|---|
| Hora del evento EventTime | La marca de tiempo que indica cuándo tuvo lugar la actividad, incluida la fecha y la hora. | ||
| Descripción Este atributo proporciona la fecha y hora exactas de cada actividad del proceso. Constituye la base cronológica del registro de eventos y ordena los pasos del proceso tal como ocurrieron en la realidad. La hora del evento es fundamental para todos los análisis basados en el tiempo. Se utiliza para calcular los tiempos de ciclo entre actividades, medir el tiempo total de ejecución de un proceso, identificar tendencias de rendimiento a lo largo del tiempo y determinar cuándo es más probable que se produzcan cuellos de botella. Por qué es importante Esta marca de tiempo es esencial para calcular todas las duraciones y métricas de rendimiento, y permite analizar los cuellos de botella y los plazos del proceso. Dónde obtenerlo Se extrae de los campos de marca de tiempo asociados con la creación de documentos o los cambios de estado en las tablas centrales de SAP, como CDHDR/CDPOS para los documentos de modificación o campos específicos de fecha y hora como ERDAT/ERZET en las tablas de cabecera. Ejemplos 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Nombre de la actividad ActivityName | El nombre de la actividad empresarial o del evento que tuvo lugar en un punto específico del proceso de la cadena de suministro. | ||
| Descripción Este atributo describe un paso o hito específico del ciclo de vida del pedido logístico, como «Pedido de compra emitido» o «Salida de mercancías contabilizada». Estas actividades forman la secuencia de eventos que constituye el proceso. Analizar la secuencia de actividades es la base de Process Mining. Permite descubrir el flujo real del proceso, compararlo con los procedimientos operativos estándar e identificar los pasos que provocan demoras o requieren reprocesamiento. Por qué es importante Define los pasos del proceso, algo fundamental para descubrir mapas de procesos, analizar variantes y medir los tiempos de ciclo entre actividades. Dónde obtenerlo Se genera al asignar códigos de transacción o cambios de estado de varias tablas de SAP, como EKKO, LIKP y VBUK, a nombres de actividad fáciles de entender durante la transformación de datos. Ejemplos Pedido de compra emitidoEntrada de mercancías para pedido de compra contabilizadaEntrega de salida creadaProof Of Delivery confirmada | |||
| Pedido logístico LogisticsOrder | El identificador único de un proceso de cadena de suministro completo, desde la demanda inicial hasta la confirmación final de la entrega. | ||
| Descripción El pedido logístico actúa como identificador principal del caso y vincula todas las actividades relacionadas con una demanda o solicitud de cumplimiento específica dentro de la cadena de suministro. Este enfoque permite realizar un seguimiento de todo el ciclo de vida del recorrido de un producto, desde la planificación y el aprovisionamiento hasta la producción y la distribución, para obtener una visión integral del proceso. En Process Mining, analizar por pedido logístico revela el recorrido completo seguido para satisfacer una demanda. Ayuda a identificar variantes habituales, cuellos de botella y desviaciones en toda la cadena de suministro, en lugar de analizar por separado procesos aislados como el aprovisionamiento o las ventas. Por qué es importante Es la clave esencial para conectar todos los eventos relacionados en una única instancia de proceso y permitir el análisis integral de la cadena de suministro. Dónde obtenerlo Es un identificador conceptual que puede requerir la construcción de un vínculo entre varios números de documento, como el número de un pedido de venta y los números posteriores del pedido de compra y la entrega. Consulte la documentación de SAP S/4HANA Supply Chain o a una persona experta en la materia. Ejemplos LO-4500078192LO-4500078193LO-4500078194 | |||
| Sistema de origen SourceSystem | El sistema del que proceden los datos. | ||
| Descripción Identifica la instancia específica del sistema de origen en la que se generaron los datos de eventos. En un entorno complejo, una empresa puede tener varias instancias de SAP S/4HANA para distintas regiones o unidades de negocio. Este atributo es importante para la gobernanza de datos y para segmentar el análisis. Permite comparar el rendimiento de los procesos entre distintos sistemas o aislar los datos de una única fuente autorizada. Por qué es importante Proporciona un contexto esencial sobre el origen de los datos, importante para validarlos y comparar procesos en distintos entornos de sistemas. Dónde obtenerlo Normalmente es un valor estático que se añade durante la extracción de datos para identificar el origen, por ejemplo, el ID del sistema SAP (SAPSID). Ejemplos S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Última actualización de datos LastDataUpdate | La marca de tiempo en la que los datos se actualizaron o extrajeron por última vez del sistema de origen. | ||
| Descripción Este atributo indica la última vez que se actualizaron los datos del Registro de eventos. Proporciona una fecha de «actualidad» para los datos analizados y garantiza que los usuarios conozcan su vigencia. En cualquier análisis, comprender la antigüedad de los datos es fundamental para tomar decisiones fundamentadas. Esta marca de tiempo ayuda a los usuarios a confiar en los datos y a comprender el periodo que abarcan los Dashboards y los KPI. Por qué es importante Garantiza la transparencia sobre la actualidad de los datos y permite conocer qué tan reciente es el análisis del proceso. Dónde obtenerlo Es un campo de metadatos que normalmente genera y completa la herramienta de extracción de datos o ETL al finalizar correctamente una actualización. Ejemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Centro Plant | La instalación de fabricación o distribución donde tuvo lugar la actividad. | ||
| Descripción El centro es una unidad organizativa de SAP que representa una ubicación donde se producen, almacenan o distribuyen productos. Proporciona el contexto geográfico o funcional de las actividades del proceso. Analizar el rendimiento del proceso por centro es un requisito habitual. Permite comparar y establecer referencias de eficiencia, capacidad de procesamiento y cumplimiento entre distintos centros operativos, así como identificar buenas prácticas o ubicaciones que necesitan mejoras. Por qué es importante Proporciona una dimensión geográfica u organizativa para el análisis y permite comparar el rendimiento entre distintas instalaciones. Dónde obtenerlo Se encuentra en muchas tablas de posiciones de documentos, como VBAP (ventas), EKPO (compras) y LIPS (entrega). El campo normalmente se denomina WERKS. Ejemplos 100021003500 | |||
| Fecha de entrega solicitada RequestedDeliveryDate | La fecha en la que se solicitó al proveedor que entregara los productos. | ||
| Descripción Es la fecha de entrega especificada en el pedido de compra y representa el objetivo del proveedor. Sirve como referencia para medir el rendimiento real de las entregas. Esta fecha es esencial para calcular el KPI de tasa de entrega puntual del proveedor. Al comparar la fecha real de entrada de mercancías con esta fecha solicitada, una empresa puede medir objetivamente si los proveedores cumplen sus compromisos. Por qué es importante Es la fecha de referencia utilizada para calcular el KPI «Tasa de entrega puntual del proveedor», por lo que resulta fundamental para gestionar el rendimiento de los proveedores. Dónde obtenerlo Se encuentra en la tabla de posiciones de pedidos de compra EKPO, con el nombre de campo EINDT (fecha de entrega). Ejemplos 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Nombre del cliente CustomerName | El nombre del cliente para quien se completa el pedido. | ||
| Descripción Este atributo identifica al cliente final asociado a un pedido de venta y a las actividades posteriores de cumplimiento. Aporta contexto sobre el lado de la demanda del proceso de la cadena de suministro. En Process Mining, analizar los datos por cliente ayuda a identificar distintos patrones de cumplimiento o niveles de rendimiento en cuentas clave. Se utiliza en Dashboards como Proof of Delivery Lag Analysis para comprobar si determinados clientes retrasan sistemáticamente las confirmaciones. Por qué es importante Permite segmentar el análisis por cliente y revelar comportamientos, cuellos de botella o rendimiento de los acuerdos de nivel de servicio específicos de cada cliente. Dónde obtenerlo El número de cliente (KUNNR) se almacena en los documentos de ventas, por ejemplo, en la tabla VBAK. El nombre se recupera de la tabla maestra central de clientes KNA1. Ejemplos Retail CorpInnovate SolutionsManufacturing Partners | |||
| Nombre del proveedor SupplierName | El nombre del proveedor asociado con las actividades de aprovisionamiento. | ||
| Descripción Este atributo identifica al proveedor al que se compran los productos o servicios. Normalmente se asocia con actividades como «Solicitud de compra creada» y «Pedido de compra emitido». El nombre del proveedor es esencial para el Dashboard de rendimiento de entregas de proveedores. Permite filtrar y segmentar los datos para comparar las tasas de entrega puntual, los plazos y los niveles de calidad de distintos proveedores, algo fundamental para el abastecimiento estratégico y la gestión de las relaciones con proveedores. Por qué es importante Permite analizar el rendimiento por proveedor, algo fundamental para optimizar el proceso de aprovisionamiento y evaluar la fiabilidad de los proveedores. Dónde obtenerlo El número de proveedor (LIFNR) se almacena en los documentos de compras, por ejemplo, en las tablas EKKN y EBAN. El nombre se recupera de la tabla maestra central de proveedores LFA1. Ejemplos Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Número de material MaterialNumber | El identificador único del producto o material que se está procesando. | ||
| Descripción Material Number, denominado a menudo SKU, es el código único de un producto específico dentro de SAP. Vincula las actividades del proceso con los bienes físicos o digitales que se fabrican, compran o envían. Este atributo es fundamental para el análisis centrado en el producto. Ayuda a determinar si ciertos productos son más propensos a sufrir problemas de calidad, retrasos de producción o falta de existencias. Los Dashboards pueden filtrarse por material para investigar el rendimiento de líneas de productos específicas. Por qué es importante Permite analizar el nivel de producto para identificar si problemas del proceso, como demoras o fallos de calidad, se concentran en materiales específicos. Dónde obtenerlo Se encuentra en las tablas de posiciones de la mayoría de los documentos, como VBAP para pedidos de venta, EKPO para pedidos de compra y LIPS para entregas. El campo normalmente se denomina MATNR. Ejemplos FG-100-ARM-2034-BSA-5500 | |||
| Resultado de la inspección de calidad QualityInspectionResult | El resultado de una inspección de calidad, como «Aprobado» o «Rechazado». | ||
| Descripción Este atributo registra el resultado de un control de calidad realizado sobre productos fabricados o recibidos. El resultado determina si los productos pueden pasar al siguiente paso o si requieren reprocesamiento, devolución o desecho. Es un atributo fundamental para el Dashboard y el KPI de tasas de rechazo del control de calidad. Analizar la frecuencia y las causas de los fallos ayuda a identificar problemas de calidad sistémicos en productos, proveedores o líneas de producción específicos. Por qué es importante Contribuye directamente al cálculo de los KPI relacionados con la calidad y ayuda a localizar las fuentes de baja calidad en la cadena de suministro. Dónde obtenerlo Esta información normalmente se almacena en el módulo de Gestión de calidad (QM). Los datos pueden proceder de tablas de lotes de inspección como QALS y de códigos de decisión de uso en QAVE. Ejemplos AprobadoNo aprobadoRequiere reprocesamientoAprobado con desviación | |||
| Usuario ejecutor ExecutingUser | El ID de la persona usuaria que ejecutó la actividad. | ||
| Descripción Este atributo captura el nombre o ID de usuario de SAP de la persona empleada que realizó una actividad determinada, como crear un pedido de compra o contabilizar una entrada de mercancías. Vincula los pasos del proceso con los recursos humanos implicados. Analizar por usuario ayuda a comprender la distribución de la carga de trabajo, identificar necesidades de capacitación y detectar diferencias de rendimiento entre personas o equipos. También resulta útil para el análisis de cumplimiento, ya que permite saber quién realizó los pasos críticos del proceso. Por qué es importante Asigna las actividades a personas usuarias específicas y permite analizar la carga de trabajo, comparar el rendimiento e investigar acciones que no cumplen las normas. Dónde obtenerlo Se encuentra en los campos «Creado por» o «Modificado por» de muchas tablas de SAP, como ERNAM en EKKO (cabecera del pedido de compra), LIKP (cabecera de entrega) y VBRK (cabecera de factura). Ejemplos CBROWNJSMITHASINGH | |||
| Cantidad del pedido OrderQuantity | La cantidad de material de la posición del pedido. | ||
| Descripción Este atributo especifica el número de unidades de material solicitadas en una posición de un pedido de venta o de compra. Proporciona una medida del volumen de cada transacción. Analizar por cantidad ayuda a priorizar el análisis de los pedidos de gran volumen, que pueden tener un mayor impacto empresarial. También puede utilizarse para normalizar otras métricas, como el cálculo del costo por unidad, o para comprender cómo afecta el tamaño del pedido a los tiempos de procesamiento. Por qué es importante Proporciona contexto sobre el volumen de las transacciones y permite analizar su impacto y segmentar los casos por tamaño. Dónde obtenerlo Se encuentra en tablas de posiciones, como MENGE en EKPO (pedido de compra) o KWMENG en VBAP (pedido de venta). Ejemplos 100500025 | |||
| Entrega tardía IsLateDelivery | Indicador booleano que señala si la entrega de un proveedor se realizó después de la fecha de entrega solicitada. | ||
| Descripción Este indicador calculado proporciona una señal sencilla de verdadero o falso para indicar si una entrega se realizó a tiempo. Se obtiene comparando la marca de tiempo de la actividad «Goods Receipt For PO Posted» con el atributo «Requested Delivery Date». Este atributo simplifica la creación de Dashboards y KPI relacionados con el rendimiento de los proveedores. Permite filtrar y agregar datos rápidamente para calcular la tasa de entregas a tiempo de los proveedores e identificar qué proveedores, materiales o regiones presentan retrasos con mayor frecuencia. Por qué es importante Simplifica el análisis del rendimiento de los proveedores al proporcionar un resultado binario claro para cada entrega, algo esencial para el KPI de entregas puntuales. Dónde obtenerlo Es un campo calculado. La lógica es: IF ('Goods Receipt For PO Posted'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Ejemplos truefalse | |||
| Hora de finalización EndTime | La marca de tiempo que indica cuándo se completó una actividad y que se utiliza para calcular el tiempo de procesamiento. | ||
| Descripción La hora de finalización marca la conclusión de una actividad específica. Mientras que la hora de inicio (EventTime) indica cuándo comienza una actividad, la hora de finalización es necesaria para saber cuánto tardó en ejecutarse, especialmente cuando no se trata de actividades instantáneas. En el análisis, disponer de una hora de inicio y otra de finalización permite medir con precisión el tiempo de procesamiento frente al tiempo de espera. Esto ayuda a distinguir entre el tiempo dedicado activamente a una tarea y el tiempo de espera hasta el siguiente paso, algo clave para identificar oportunidades de eficiencia. Por qué es importante Permite calcular con precisión los tiempos de procesamiento de las actividades y ayuda a diferenciar el trabajo que aporta valor del tiempo de espera. Dónde obtenerlo Puede derivarse de los cambios de estado en SAP. Por ejemplo, el inicio puede ser una actualización al estado «In Progress» y el final una actualización al estado «Completed» en tablas como JEST/JCDS. En los eventos instantáneos, EndTime puede ser igual a StartTime. Ejemplos 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Nombre del transportista CarrierName | El nombre de la empresa de transporte o del agente de carga que gestiona el envío. | ||
| Descripción El nombre del transportista identifica al proveedor de servicios logísticos responsable de transportar los productos entre ubicaciones, por ejemplo, desde un almacén hasta un cliente. Este atributo es esencial para el Dashboard de análisis del tiempo de ciclo del transporte. Permite comparar los tiempos de tránsito, los costos y la fiabilidad de distintos transportistas, lo que facilita una mejor planificación logística y selección de transportistas. Por qué es importante Permite analizar el rendimiento por proveedor de transporte, algo clave para optimizar los costos logísticos y los tiempos de entrega. Dónde obtenerlo El ID del transportista (agente de expedición) se almacena en documentos de envío, como la tabla VTTK (cabecera del envío). El nombre se recupera de tablas de datos maestros como LFA1. Ejemplos DHLFedExMaersk Logistics | |||
| Número de pedido de compra PurchaseOrderNumber | El identificador único del documento de pedido de compra (PO). | ||
| Descripción El número de pedido de compra es el número oficial del documento utilizado para pedir materiales a un proveedor. Es un identificador clave en la parte de aprovisionamiento de la cadena de suministro. Este atributo permite analizar en profundidad el proceso de aprovisionamiento. Se utiliza en el Dashboard del tiempo de ciclo integral de aprovisionamiento y para calcular el KPI de tasa de entrega puntual del proveedor, vinculando las actividades de solicitud, pedido, recepción y pago. Por qué es importante Actúa como identificador clave para profundizar en el subproceso de aprovisionamiento y vincular eventos relacionados con las compras. Dónde obtenerlo Se encuentra en la tabla de cabecera de pedidos de compra EKKO y en la tabla de posiciones EKPO. El campo se denomina EBELN. Ejemplos 450007819245000781934500078194 | |||
| Número de pedido de venta SalesOrderNumber | El identificador único del documento de pedido de venta (SO). | ||
| Descripción El número de pedido de venta es el número oficial del documento que confirma una venta a un cliente. Es un identificador clave en la parte de pedido a cobro de la cadena de suministro. Este atributo es fundamental para realizar el seguimiento del cumplimiento de un pedido específico del cliente. Ayuda a vincular la solicitud inicial del cliente con todas las actividades posteriores, como la entrega y la facturación, y respalda el análisis del plazo de cumplimiento del pedido. Por qué es importante Actúa como identificador clave del subproceso de cumplimiento del pedido y vincula la demanda del cliente con la liquidación logística y financiera. Dónde obtenerlo Se encuentra en la tabla de cabecera de pedidos de venta VBAK y en la tabla de posiciones VBAP. El campo se denomina VBELN. Ejemplos 100023451000234610002347 | |||
| Reprocesamiento IsRework | Indicador que señala si una actividad o una secuencia de actividades representa un reprocesamiento. | ||
| Descripción Este atributo booleano marca las actividades que repiten pasos anteriores del proceso, lo que indica algún tipo de reprocesamiento o corrección. Por ejemplo, si a una actividad «Inspección de calidad» le sigue un paso «Orden de producción creada» y después otra «Inspección de calidad», la segunda inspección podría marcarse como reprocesamiento. Identificar el reprocesamiento es clave para comprender la ineficiencia del proceso y los costos ocultos. Este indicador ayuda a cuantificar la frecuencia y el impacto de los bucles de reprocesamiento, respalda el cálculo del KPI de tasa de errores de procesamiento de pedidos y señala áreas de mejora del proceso. Por qué es importante Ayuda a cuantificar las ineficiencias del proceso al identificar y contar explícitamente las actividades que forman parte de un bucle de reprocesamiento. Dónde obtenerlo Normalmente se calcula en la herramienta de Process Mining mediante la identificación de secuencias repetidas de actividades dentro del mismo caso. Ejemplos truefalse | |||
Actividades de la gestión de la cadena de suministro
| Actividad | Descripción | ||
|---|---|---|---|
| Entrada de mercancías para pedido de compra contabilizada | Representa la recepción física de materias primas o mercancías de un proveedor asociada a un pedido de compra. Este evento se registra cuando las mercancías se reciben en el almacén o en la planta. | ||
| Por qué es importante Esta actividad completa la parte de entrega del proveedor dentro del ciclo de aprovisionamiento. Es esencial para calcular las tasas de entrega puntual de los proveedores y comprender el rendimiento de la logística de entrada. Dónde obtenerlo Es un evento explícito capturado mediante la contabilización de un documento de material. La marca de tiempo del evento se encuentra en la tabla de cabecera del documento de material (MKPF, campo BUDAT). El vínculo con el pedido de compra está en la tabla de posiciones (MSEG). Recopilar Utilice la fecha de contabilización (MKPF-BUDAT) del documento de material asociado al pedido de compra. Tipo de evento explicit | |||
| Mercancías producidas | Esta actividad representa la confirmación de que la fabricación de las mercancías ha finalizado. Normalmente se registra como una entrada de mercancías procedente de la orden de producción, que incorpora el producto terminado al inventario. | ||
| Por qué es importante Este evento marca el final del ciclo de producción. El tiempo transcurrido entre la creación de la orden de producción y este evento representa el plazo de fabricación, un indicador clave de la eficiencia productiva. Dónde obtenerlo Puede capturarse explícitamente mediante la contabilización de un documento de material, correspondiente a la entrada de mercancías de la orden de producción, o inferirse a partir de la confirmación final de la orden de producción (tabla AFRU) o de un cambio de estado a «Entregado». Recopilar Infiera el evento a partir de la fecha de contabilización del documento de material correspondiente a la entrada final de mercancías de la orden de producción o de un cambio de estado. Tipo de evento inferred | |||
| Pedido de cliente creado | Esta actividad marca la creación de un nuevo pedido de cliente, que registra formalmente la solicitud de mercancías de un cliente. Es un evento explícito que se registra cuando un usuario guarda un nuevo documento de pedido de cliente en el sistema. | ||
| Por qué es importante Este es el punto de inicio principal del proceso de pedido a cobro. Analizar el tiempo transcurrido desde este evento hasta otros permite conocer el plazo total de cumplimiento del pedido e identificar retrasos iniciales en el procesamiento. Dónde obtenerlo Este evento se registra explícitamente. Puede encontrarse en los documentos de modificación de las tablas de pedidos de cliente (CDHDR/CDPOS) o mediante la marca de tiempo de creación de la tabla de cabecera de pedidos de cliente (VBAK, campo ERDAT). Recopilar Utilice la fecha de creación (VBAK-ERDAT) y la hora (VBAK-ERZET) del documento de pedido de cliente. Tipo de evento explicit | |||
| Pedido de compra emitido | Marca la creación y emisión formal de un pedido de compra a un proveedor externo para adquirir los materiales necesarios. Esta actividad convierte una solicitud de compra en un compromiso legalmente vinculante con un proveedor. | ||
| Por qué es importante Como hito clave, esta actividad es fundamental para medir los plazos de entrega de los proveedores y los tiempos de ciclo de aprovisionamiento. Proporciona la base para evaluar el rendimiento de las entregas puntuales de los proveedores. Dónde obtenerlo Es un evento explícito que se registra al crear el pedido de compra. La marca de tiempo de creación se almacena en la tabla de cabecera de pedidos de compra (EKKO, campo AEDAT). Recopilar Utilice la fecha de creación del documento (EKKO-AEDAT) del pedido de compra. Tipo de evento explicit | |||
| Proof Of Delivery confirmada | Representa la confirmación formal del cliente o del transportista de que los productos se han recibido según lo especificado. A menudo se registra actualizando la entrega de salida con la información de la POD. | ||
| Por qué es importante Esta actividad marca el final definitivo del proceso de cumplimiento. Es fundamental para una facturación precisa, la resolución de disputas y la medición del tramo final del ciclo de entrega. Dónde obtenerlo Este es un evento explícito. La fecha de la prueba de entrega se registra en la tabla de cabecera de entregas (LIKP, campo PODAT) o en las tablas de POD relacionadas (VLPOD). Recopilar Utilice la Proof of Delivery Date (LIKP-PODAT) del documento de entrega. Tipo de evento explicit | |||
| Salida de mercancías contabilizada | Esta actividad representa la salida legal y física de los productos del almacén. Reduce el inventario y contabiliza el costo de los productos vendidos, lo que marca el envío oficial del pedido. | ||
| Por qué es importante Este es un hito crítico que marca el inicio del período «en tránsito». Es el momento definitivo en el que los productos han dejado la posesión de la empresa para su entrega. Dónde obtenerlo Este es un evento explícito que crea un documento de material. La marca de tiempo se registra en la cabecera del documento de material (MKPF, campo BUDAT) y actualiza el estado del movimiento de mercancías en el documento de entrega (LIKP, campo WBSTK). Recopilar Utilice la fecha de contabilización (MKPF-BUDAT) del documento de material de salida de mercancías asociado con la entrega de salida. Tipo de evento explicit | |||
| Disponibilidad del inventario comprobada | Representa la comprobación automática o manual para determinar si los artículos solicitados están disponibles en stock para cumplir el pedido de cliente. A menudo es un paso automatizado durante la creación del pedido de cliente, pero puede no registrarse como un evento independiente. | ||
| Por qué es importante Comprender el tiempo transcurrido entre el pedido y esta comprobación, así como su resultado, ayuda a analizar cómo afectan los niveles de inventario a los tiempos de cumplimiento. Los retrasos en esta etapa suelen dar lugar a actividades de aprovisionamiento o producción. Dónde obtenerlo Normalmente no es un evento explícito. Puede inferirse a partir de la creación de la primera línea de programación confirmada en la tabla de posiciones del pedido de cliente (VBEP) o de los cambios de estado de la posición del pedido. Recopilar Infiera el evento a partir de la actualización del estado de confirmación de la línea de programación del pedido de cliente (tabla VBEP). Tipo de evento inferred | |||
| Entrega de salida creada | Indica la creación de un documento de entrega que autoriza la preparación y el envío de los productos al cliente. Esta actividad hace pasar el proceso de la gestión de pedidos a la ejecución logística. | ||
| Por qué es importante Este es un paso clave que inicia el proceso físico de cumplimiento. Las demoras entre la creación del pedido y la creación de la entrega pueden indicar problemas de planificación o disponibilidad. Dónde obtenerlo Este es un evento explícito. La marca de tiempo de creación se registra en la tabla de cabecera de entregas (LIKP, campo ERDAT). Recopilar Utilice la fecha de creación (LIKP-ERDAT) y la hora (LIKP-ERZET) de la cabecera del documento de entrega. Tipo de evento explicit | |||
| Envío creado | Representa la creación de un documento de envío que agrupa una o varias entregas para la planificación del transporte. Este documento contiene información sobre el transportista, la ruta y el modo de transporte. | ||
| Por qué es importante Esta actividad marca el inicio de la planificación formal del transporte. Analizar el tiempo entre la salida de mercancías y la finalización del envío permite evaluar la eficiencia del proceso de transporte. Dónde obtenerlo Este es un evento explícito registrado en la tabla de cabecera de envíos (VTTK, campo ERDAT). Forma parte del módulo LE-TRA, que puede no utilizarse en todas las organizaciones. Recopilar Utilice la fecha de creación (VTTK-ERDAT) de la cabecera del documento de envío. Tipo de evento explicit | |||
| Factura del cliente creada | Esta actividad marca la creación del documento de facturación para el cliente a partir de los productos o servicios entregados. Inicia la fase de liquidación financiera final del proceso. | ||
| Por qué es importante Esta actividad es clave para analizar el tiempo del ciclo de facturación. Las demoras entre la confirmación de la entrega y la facturación pueden afectar negativamente al flujo de caja. Dónde obtenerlo Este es un evento explícito. La marca de tiempo de creación se registra en la tabla de cabecera del documento de facturación (VBRK, campo ERDAT). Recopilar Utilice la fecha de creación (VBRK-ERDAT) de la cabecera del documento de facturación. Tipo de evento explicit | |||
| Inspección de calidad realizada | Representa la finalización de una inspección de control de calidad de los productos fabricados. El resultado de esta inspección, aprobado o rechazado, se registra en una decisión de uso. | ||
| Por qué es importante Esta actividad es fundamental para supervisar la calidad del producto e identificar problemas de producción. Un alto porcentaje de rechazos o tiempos de inspección prolongados puede indicar cuellos de botella importantes. Dónde obtenerlo Este es un evento explícito que se captura cuando se toma una decisión de uso para un lote de inspección de calidad. La fecha de la decisión se encuentra en la tabla QALS (campo PASTRTERM) o en la tabla QAVE. Recopilar Utilice la marca de tiempo en la que se registra la decisión de uso del lote de inspección (tablas QALS/QAVE). Tipo de evento explicit | |||
| Mercancías descargadas en destino | Esta actividad indica la descarga física de los productos en las instalaciones del cliente. Es posible que este evento no se registre explícitamente en SAP y que a menudo deba inferirse a partir de los datos del transportista o de eventos posteriores. | ||
| Por qué es importante Esto marca el final del tramo en tránsito del recorrido. El tiempo transcurrido desde la salida de mercancías hasta este momento es el tiempo de transporte, un dato clave para optimizar la logística. Dónde obtenerlo Rara vez se trata de un evento explícito en el ERP central. Puede inferirse a partir de mensajes EDI del transportista, datos del módulo Transportation Management (TM) o la marca de tiempo del documento de prueba de entrega, si está disponible. Recopilar Infiera el evento a partir de las actualizaciones de estado del transportista, por ejemplo, EDI 214, o utilice la marca de tiempo de la Proof of Delivery como aproximación cercana. Tipo de evento inferred | |||
| Orden de producción creada | Indica que se ha creado una orden de producción para fabricar los productos terminados necesarios para el pedido de cliente. Este es el inicio formal del proceso de fabricación interno. | ||
| Por qué es importante La creación de una orden de producción marca el inicio del plazo de fabricación. Analizar este punto ayuda a identificar retrasos entre la señal de demanda y el comienzo de la producción. Dónde obtenerlo Es un evento explícito. La fecha de creación se registra en la tabla de cabecera de órdenes de producción (AUFK, campo ERDAT). Recopilar Utilice la fecha de creación (AUFK-ERDAT) de la tabla de cabecera de la orden. Tipo de evento explicit | |||
| Preparación completada | Esta actividad marca la finalización del proceso físico de recoger los artículos del almacén para la entrega de salida. En muchos sistemas, se confirma cuando se actualiza el estado de preparación del documento de entrega. | ||
| Por qué es importante Una preparación eficiente es fundamental para el rendimiento del almacén. El seguimiento de esta actividad ayuda a identificar cuellos de botella en las operaciones de almacén y a medir el rendimiento de la preparación. Dónde obtenerlo A menudo no se trata de un único evento discreto, sino que puede inferirse a partir de cambios de estado. Se registra cuando el estado de preparación en la tabla de posiciones de entrega (LIPS, campo KOSTA) se establece en «C» (procesado completamente). Recopilar Infiera el evento a partir de los documentos de modificación cuando el estado de preparación (LIPS-KOSTA) se actualice a completamente preparado. Tipo de evento inferred | |||
| Solicitud de compra creada | Esta actividad representa la creación de una solicitud interna para adquirir los bienes o las materias primas necesarios. Suele activarse cuando el inventario no es suficiente para cumplir un pedido de cliente o cae por debajo del punto de reposición. | ||
| Por qué es importante Este es el primer paso del ciclo de aprovisionamiento. Realizar un seguimiento de su creación ayuda a identificar retrasos en el inicio del aprovisionamiento y facilita el análisis del proceso de compra de principio a fin. Dónde obtenerlo Es un evento explícito. La marca de tiempo de creación se registra en la tabla de cabecera de solicitudes de compra (EBAN, campo BADAT). Recopilar Utilice la fecha de creación (EBAN-BADAT) del documento de solicitud de compra. Tipo de evento explicit | |||
Guías de extracción
Pasos
- Requisitos previos: Asegúrese de contar con un usuario que tenga autorizaciones suficientes para acceder a las vistas Core Data Services (CDS) necesarias de SAP S/4HANA. Normalmente, esto requiere un rol específico asignado por su equipo de seguridad de SAP. También necesitará un cliente SQL, como DBeaver o SAP HANA Studio, que pueda conectarse a la base de datos SAP HANA.
- Establezca la conexión con la base de datos: Configure su cliente SQL para conectarse a la base de datos de SAP S/4HANA. Necesitará el host del servidor de base de datos, el puerto (por ejemplo, 3xx15, donde xx corresponde al número de instancia), un nombre de usuario de base de datos y una contraseña.
- Prepare la consulta SQL: Copie la consulta SQL completa proporcionada en la sección de consultas de este documento y péguela en el editor de su cliente SQL. Esta consulta está diseñada para extraer todas las actividades especificadas de varios módulos logísticos y de ventas.
- Defina los parámetros de extracción: Antes de ejecutar la consulta, localice las condiciones de marcador de posición dentro de las cláusulas
WHEREde cada subconsulta. Debe sustituir'YourCompanyCode'por el código de empresa que está analizando y ajustar los marcadores de rango de fechas, como'YYYY-MM-DD', para definir el periodo de extracción deseado. - Ejecute la consulta: Ejecute el script SQL completo. El tiempo de ejecución variará según el rango de fechas seleccionado y el volumen de datos del sistema. Se recomienda hacerlo fuera de las horas punta para minimizar la carga del sistema.
- Revise los resultados iniciales: Cuando termine la consulta, revise brevemente la salida en su cliente SQL. Compruebe que el número de filas sea razonable, que las columnas como LogisticsOrder, ActivityName y EventTime estén completas y que aparezcan distintos nombres de actividad.
- Exporte los datos a CSV: Exporte todo el conjunto de resultados desde su cliente SQL a un archivo CSV. Seleccione la codificación UTF-8 para evitar problemas con caracteres especiales.
- Prepare el archivo para la carga: Asegúrese de que los encabezados de columna del archivo CSV final coincidan exactamente con los nombres de atributos necesarios para la ingesta, por ejemplo,
LogisticsOrder,ActivityNameyEventTime. Si utiliza la consulta SQL proporcionada, no debería ser necesaria ninguna otra transformación de datos.
Configuración
- Requisitos previos: Se requiere acceso a la base de datos SAP HANA subyacente. El usuario de la base de datos debe tener privilegios
SELECTsobre todas las vistas CDS a las que se hace referencia en la consulta, incluidas, entre otras, I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment e I_BillingDocumentItem. - Filtrado por rango de fechas: La consulta proporcionada incluye un marcador de posición para el filtro de rango de fechas, normalmente sobre un campo de fecha de creación (
CreationDateoDocumentDate). Para un análisis inicial, se recomienda un periodo de 3 a 6 meses que proporcione un conjunto de datos representativo sin generar una carga excesiva en el sistema. - Filtros empresariales clave: Es fundamental filtrar los datos por unidades organizativas específicas para garantizar su relevancia. La consulta incluye un marcador de posición preconfigurado para
CompanyCode. También puede añadir filtros paraSalesOrganization,DistributionChanneloPlant, según el alcance de su análisis. - Consideraciones de rendimiento: Esta consulta compleja combina varias vistas CDS de gran tamaño. Su ejecución puede consumir recursos importantes del sistema. Programe las extracciones fuera del horario laboral. Para conjuntos de datos muy grandes, considere ejecutar la consulta en lotes secuenciales más pequeños, organizados por mes.
a Consulta de ejemplo sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; Pasos
- Confirme que dispone de acceso directo de lectura al esquema SAP HANA que contiene los datos relevantes de logística, ventas, compras, inventario, producción, calidad, entregas, envíos, prueba de entrega y facturación. Solicite al equipo de SAP Basis o de la plataforma de datos el nombre del esquema, los datos de conexión y las autorizaciones. No escriba en el sistema de origen.
- Confirme el modelo de datos exacto de S/4HANA en el sistema de destino. EKKO y EKPO se utilizan para pedidos de compra, LIKP y LIPS para entregas salientes, y deben configurarse objetos adicionales para pedidos de venta, solicitudes de compra, documentos de material, órdenes de producción, resultados de inspección de calidad, envíos, pruebas de entrega y facturación. Sustituya cada marcador de objeto o columna entre corchetes por objetos verificados en el diccionario de datos del sistema.
- Defina la regla de correlación de LogisticsOrder. La regla preferida es una relación verificada del flujo documental desde el pedido de venta hasta las entregas posteriores, los documentos de material, los documentos de producción o compras y los documentos de facturación. Si no existe una relación directa, configure una tabla de correlación documentada o una correspondencia específica del negocio. No correlacione los casos utilizando únicamente el número de material o la fecha.
- Establezca el periodo de extracción mediante [Start date parameter] y [End date parameter]. Aplique el periodo de forma coherente a las marcas de tiempo de los eventos, conservando los documentos creados antes del periodo cuando sean necesarios para explicar eventos ocurridos dentro de él.
- Configure el código de empresa, la organización de ventas, el centro, la organización de compras, el tipo de documento y los demás filtros empresariales en la sección indicada. Utilice los filtros solo después de confirmar sus valores en el sistema de destino.
- Sustituya las referencias entre corchetes a tablas y columnas de cada rama de actividad por nombres verificados. Cada rama debe devolver las mismas columnas y tipos de datos compatibles. La consulta crea explícitamente una fila para cada una de las 15 actividades necesarias, porque ProcessMind no infiere los eventos que faltan.
- Ejecute la consulta en SAP HANA Database Explorer, SAP HANA cockpit SQL Console o el cliente SQL aprobado. Pruebe cada rama de actividad por separado antes de ejecutar la consulta UNION ALL completa. Revise los planes de ejecución y limite la prueba inicial a un rango de fechas reducido.
- Valide las relaciones entre documentos, las marcas de tiempo, los identificadores de usuario, los valores de proveedor y cliente, los valores de material y centro y los resultados de calidad. Investigue las filas duplicadas causadas por combinaciones a nivel de artículo y aplique la regla configurada para el nivel del evento, como un evento por documento o un evento por artículo de documento.
- Exporte el resultado como CSV UTF-8 u otro formato tabular compatible con ProcessMind. Conserve exactamente los nombres de columna de salida LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate y QualityInspectionResult. Asegúrese de que EventTime sea una marca de tiempo y de que LastDataUpdate se complete de forma coherente.
- Cargue el archivo en ProcessMind y asigne LogisticsOrder como identificador del caso, ActivityName como actividad y EventTime como marca de tiempo del evento. Confirme que las 15 etiquetas de actividad se traten como eventos explícitos y programe una actualización controlada después de validar el comportamiento de la extracción incremental.
Configuración
- Rango de fechas: Comience con datos de 3 a 6 meses. Utilice un periodo más corto para las pruebas iniciales y amplíelo solo después de validar el rendimiento y las relaciones entre documentos.
- Esquema de origen: Establezca [SAP HANA schema name] en el esquema que contiene las tablas o vistas de S/4HANA verificadas. No dé por hecho que una tabla del ERP clásico está disponible con el mismo nombre en todas las implementaciones de S/4HANA.
- Alcance documental: Configure [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] y [Document Type filter] según el alcance del proceso.
- Correlación: Configure [Your document flow or correlation object] para asignar cada evento a un LogisticsOrder. Los casos de correlación ausente o ambigua deben notificarse, no asignarse de forma silenciosa.
- Nivel del evento: Elija un evento por documento, por artículo de documento o por cambio de estado relevante para el negocio. Aplique la misma regla en todas las ramas y elimine únicamente las filas duplicadas por motivos técnicos.
- Prioridad de la marca de tiempo: Utilice para cada actividad la marca de tiempo verificada de contabilización, creación, confirmación, cambio de estado, inspección, entrega, descarga, POD o facturación. No sustituya la hora del evento empresarial por la hora de extracción.
- Etiqueta de origen: Establezca [Source system label] en un valor estable, como el identificador aprobado del sistema SAP S/4HANA.
- Marca de tiempo de actualización: Establezca [Last data update expression] en la marca de tiempo de extracción aprobada o en la marca de actualización del origen.
- Rendimiento: Restrinja pronto los filtros de fecha y organización, seleccione solo las columnas necesarias, evite combinaciones sin restricciones a nivel de artículo, revise el plan de ejecución y considere una vista de extracción persistente o una tabla de preparación para las cargas recurrentes.
- Autorizaciones: El acceso necesario incluye autorización de lectura para los objetos pertinentes del esquema SAP HANA y permiso para ejecutar SQL. La validación empresarial requiere acceso a los datos aplicables de ventas, compras, inventario, producción, calidad, ejecución logística, transporte y facturación.
- Alcance funcional: Confirme que el sistema implementado incluya los procesos empresariales representados por las actividades solicitadas. Los datos de envíos, descargas, POD, calidad, producción y facturación pueden almacenarse en aplicaciones o extensiones independientes.
- Seguridad: Aplique las normas de su organización para los datos de clientes, proveedores, materiales, finanzas y usuarios. Enmascare o restrinja los campos sensibles cuando sea necesario.
a Consulta de ejemplo sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; Pasos
- Requisitos previos: Asegúrese de disponer de una clave de desarrollador y de las autorizaciones necesarias en su sistema SAP S/4HANA para crear y ejecutar programas ABAP, incluido el acceso a la transacción SE38, y para leer tablas de la cadena de suministro como VBAK, LIKP, EKKO y MKPF.
- Cree el programa: Abra el editor ABAP mediante el código de transacción
SE38. Introduzca un nombre para el nuevo programa, por ejemplo,Z_PM_SCM_EXTRACTION, y haga clic en «Crear». Proporcione un título descriptivo y establezca el tipo de programa como «Programa ejecutable». - Inserte el código: Copie todo el código ABAP de la sección «query» que aparece a continuación y péguelo en el editor ABAP del nuevo programa.
- Defina los elementos de texto: Vaya a Go To > Text Elements > Selection Texts. Active todas las etiquetas propuestas de la pantalla de selección para que la interfaz sea clara y fácil de usar.
- Active el programa: Guarde y active el programa pulsando CTRL+S y después CTRL+F3, o mediante el icono de activación de la barra de herramientas. Corrija los errores de sintaxis que puedan surgir debido a configuraciones específicas del sistema.
- Ejecute el programa: Ejecute el programa pulsando F8 o mediante el botón «Direct Processing». Aparecerá una pantalla de selección que le permitirá filtrar los datos que desea extraer.
- Establezca los parámetros de extracción: En la pantalla de selección, especifique el rango de fechas de Sales Order Creation Date. Se recomienda encarecidamente filtrar también por códigos de empresa u organizaciones de ventas concretos para controlar el volumen de datos. Introduzca la ruta completa del archivo de salida en el servidor de aplicaciones SAP.
- Ejecútelo en segundo plano: Para conjuntos de datos grandes que abarquen varios meses, es fundamental ejecutar el programa en segundo plano para evitar tiempos de espera agotados de la transacción. En el menú, seleccione Program > Execute in Background y programe el job.
- Recupere el archivo de datos: Cuando termine la ejecución, utilice el código de transacción
AL11para acceder al directorio del servidor de aplicaciones que especificó. Localice el archivo generado y descárguelo en su equipo mediante la transacciónCG3Y. - Prepárelo para la carga: Asegúrese de que el archivo descargado esté en formato de texto sin formato, como CSV con delimitadores de coma o punto y coma, y utilice codificación UTF-8. El archivo ya estará listo para cargarse en la herramienta de Process Mining.
Configuración
- Rango de fechas de selección (S_ERDAT): Este es el filtro más importante. Define el periodo de la selección inicial de pedidos de venta según su fecha de creación (
VBAK-ERDAT). Comience con un periodo acotado, como los últimos 3 a 6 meses, para mantener un volumen de datos manejable. - Organización de ventas (S_VKORG): Filtro opcional para limitar la extracción a organizaciones de ventas concretas. Resulta útil para centrar el análisis en una unidad de negocio o región específica.
- Código de empresa (S_BUKRS): Filtro opcional para limitar los datos a códigos de empresa concretos. Se recomienda especialmente para reducir el alcance de los datos y mejorar el rendimiento.
- Ruta del archivo de salida (P_FILE): Ruta completa del servidor de aplicaciones SAP donde se guardará el archivo final del registro de eventos. El usuario que ejecute el programa debe tener acceso de escritura a este directorio. Ejemplo:
/usr/sap/trans/tmp/scm_event_log.csv. - Modo de ejecución: El programa puede ejecutarse en primer plano para extracciones de prueba pequeñas. Para cualquier volumen de datos significativo, el procesamiento en segundo plano es obligatorio para evitar tiempos de espera agotados y reducir la carga del sistema durante las horas punta.
- Autorizaciones del sistema: El usuario que ejecute el informe necesita acceso de lectura a todas las tablas subyacentes, incluidas, entre otras, VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 y LFA1.
a Consulta de ejemplo abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF. ¿Listo para comenzar?
Utilice este Template para preparar sus datos y comenzar hoy mismo a optimizar el rendimiento de su cadena de suministro. Estamos aquí para ayudarle en cada paso.
Optimice ahora la gestión de su cadena de suministro
Obtenga visibilidad de principio a fin y mejore la precisión de sus previsiones hasta un 90 % en cuestión de días.
Prueba gratuita de 14 días, sin necesidad de tarjeta de crédito.