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 seguir
- Guía de extracción
Atributos de gestión de la cadena de suministro
| Nombre | Descripción | ||
|---|---|---|---|
| Hora del evento EventTime | Marca de tiempo que indica cuándo tuvo lugar la actividad, con la fecha y la hora. | ||
| Descripción Este atributo proporciona la fecha y hora exactas de cada actividad del proceso. Es la base cronológica del registro de eventos, ya que ordena los pasos del proceso tal como ocurrieron. 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 de entrega total 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 tiempos de entrega del proceso. Dónde obtenerlo Se extrae de los campos de marca de tiempo asociados a la creación de documentos o a los cambios de estado en las tablas principales 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 | Nombre de la actividad empresarial o del evento que tuvo lugar en un momento 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 fundamental en Process Mining. Permite descubrir el flujo real del proceso, compararlo con los procedimientos operativos estándar e identificar los pasos que provocan retrasos o requieren volver a realizar el trabajo. 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 nombres de actividad fáciles de entender a los códigos de transacción o los cambios de estado de distintas tablas de SAP (por ejemplo, EKKO, LIKP y VBUK) durante la transformación de datos. Ejemplos Pedido de compra emitidoEntrada de mercancías del pedido de compra contabilizadaEntrega de salida creadaComprobante de entrega confirmado | |||
| Pedido logístico LogisticsOrder | Identificador único de un proceso integral de cadena de suministro, desde la demanda inicial hasta la confirmación final de la entrega. | ||
| Descripción El pedido logístico funciona 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 hacer un seguimiento de todo el ciclo de vida del producto, desde la planificación y el aprovisionamiento hasta la producción y la distribución, y ofrece una visión completa del proceso. En Process Mining, analizar los pedidos logísticos permite conocer el recorrido completo para satisfacer una demanda. Ayuda a identificar variantes frecuentes, 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 Esta es la clave para conectar todos los eventos relacionados en una sola instancia del proceso y permitir el análisis integral de la cadena de suministro. Dónde obtenerlo Se trata de un identificador conceptual que quizá deba construirse vinculando distintos números de documento, como el número de un pedido de venta con los números de los pedidos de compra y las entregas posteriores. 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 | Sistema del que proceden los datos. | ||
| Descripción Identifica la instancia específica del sistema de origen en la que se generaron los datos del evento. 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 de verdad. Por qué es importante Aporta contexto esencial sobre el origen de los datos, importante para validarlos y comparar procesos entre distintos entornos de sistemas. Dónde obtenerlo Suele ser 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 | Marca de tiempo de la última actualización o extracción de los datos del sistema de origen. | ||
| Descripción Este atributo indica cuándo se actualizaron por última vez los datos del registro de eventos. Muestra la fecha de actualización de los datos analizados para que las personas usuarias sepan qué tan recientes son. En cualquier análisis, conocer la antigüedad de los datos es fundamental para tomar decisiones informadas. Esta marca de tiempo ayuda a confiar en los datos y a entender el período que abarcan los Dashboards y los KPI. Por qué es importante Aporta transparencia sobre la actualidad de los datos y permite saber qué tan reciente es el análisis del proceso. Dónde obtenerlo Este campo de metadatos suele generarlo y completarlo 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 | 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 mercancías. Aporta contexto geográfico o funcional a las actividades del proceso. Analizar el rendimiento de los procesos por centro es un requisito habitual. Permite comparar la eficiencia, el volumen de producción y el cumplimiento entre distintas instalaciones operativas, y ayuda a identificar buenas prácticas o ubicaciones que necesitan mejorar. Por qué es importante Aporta una dimensión geográfica u organizativa al análisis y permite comparar el rendimiento de distintas instalaciones. Dónde obtenerlo Se encuentra en muchas tablas de posiciones de documentos, como VBAP (ventas), EKPO (compras) y LIPS (entregas). El campo suele llamarse WERKS. Ejemplos 100021003500 | |||
| Fecha de entrega solicitada RequestedDeliveryDate | Fecha en la que se solicitó al proveedor que entregara las mercancías. | ||
| Descripción Es la fecha de entrega especificada en el pedido de compra y representa el objetivo fijado al proveedor. Sirve como referencia para medir el rendimiento real de las entregas. Esta fecha es esencial para calcular el KPI de puntualidad de entrega de proveedores. Al comparar la fecha real de entrada de mercancías con la fecha solicitada, la empresa puede medir objetivamente si los proveedores cumplen sus compromisos. Por qué es importante Es la fecha de referencia para calcular el KPI de puntualidad de entrega de proveedores, 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, en el campo EINDT (fecha de entrega). Ejemplos 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Nombre del cliente CustomerName | Nombre del cliente para quien se prepara 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 la demanda en el 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 para las cuentas clave. Se utiliza en Dashboards como el de análisis del retraso en la confirmación de entrega para detectar si ciertos clientes suelen demorar las confirmaciones. Por qué es importante Permite segmentar el análisis por cliente y detectar comportamientos específicos, cuellos de botella o el cumplimiento de los acuerdos de nivel de servicio. 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 obtiene de la tabla central de datos maestros de clientes KNA1. Ejemplos Retail CorpInnovate SolutionsManufacturing Partners | |||
| Nombre del proveedor SupplierName | Nombre del proveedor asociado a las actividades de aprovisionamiento. | ||
| Descripción Este atributo identifica al proveedor al que se compran bienes o servicios. Suele asociarse a 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 la puntualidad de las entregas, los tiempos de entrega 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 cada proveedor. Dónde obtenerlo El número de proveedor (LIFNR) se almacena en documentos de compras (por ejemplo, en las tablas EKKN y EBAN). El nombre se obtiene de la tabla central de datos maestros de proveedores LFA1. Ejemplos Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Número de material MaterialNumber | Identificador único del producto o material que se procesa. | ||
| Descripción El número de material, también conocido como SKU, es el código único de un producto específico en 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 analizar los procesos por producto. Ayuda a detectar si ciertos productos presentan más problemas de calidad, retrasos de producción o falta de existencias. Los Dashboards se pueden filtrar por material para investigar el rendimiento de líneas de productos específicas. Por qué es importante Permite analizar los datos por producto y detectar si problemas del proceso, como retrasos 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 suele llamarse MATNR. Ejemplos FG-100-ARM-2034-BSA-5500 | |||
| Resultado de la inspección de calidad QualityInspectionResult | Resultado de una inspección de calidad, como 'Aprobado' o 'Reprobado'. | ||
| Descripción Este atributo registra el resultado de un control de calidad realizado a mercancías producidas o recibidas. El resultado determina si las mercancías pueden pasar al siguiente paso o si deben reprocesarse, devolverse o desecharse. Este atributo es fundamental para el Dashboard y el KPI de tasas de rechazo del control de calidad. Analizar la frecuencia y los motivos de los fallos ayuda a detectar 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 causas de la baja calidad en la cadena de suministro. Dónde obtenerlo Esta información suele almacenarse en el módulo Quality Management (QM). Los datos pueden proceder de tablas de lotes de inspección, como QALS, y de códigos de decisión de empleo en QAVE. Ejemplos AprobadoReprobadoRequiere reprocesamientoAprobado con desviación | |||
| Usuario que ejecutó la actividad ExecutingUser | ID de usuario de la persona que ejecutó la actividad. | ||
| Descripción Este atributo registra el nombre o ID de usuario de SAP de la persona que realizó la actividad, como crear un pedido de compra o contabilizar una entrada de mercancías. Vincula los pasos del proceso con las personas que participaron. Analizar los datos por usuario ayuda a entender cómo se distribuye la carga de trabajo, detectar necesidades de formación y observar 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 Asocia las actividades con usuarios específicos y permite analizar la carga de trabajo, comparar el rendimiento e investigar acciones que no cumplen los requisitos. 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 | Cantidad de material en la posición del pedido. | ||
| Descripción Este atributo indica la cantidad de unidades de un material solicitadas en una posición de un pedido de venta o de compra. Permite medir el volumen de cada transacción. Analizar los datos por cantidad ayuda a priorizar los pedidos de gran volumen, que pueden tener un mayor impacto en el negocio. También permite normalizar otras métricas, como calcular el coste por unidad, o entender cómo influye el tamaño del pedido en los tiempos de procesamiento. Por qué es importante Aporta 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, por ejemplo, en MENGE en EKPO (pedido de compra) o en KWMENG en VBAP (pedido de venta). Ejemplos 100500025 | |||
| Entrega con retraso IsLateDelivery | Indicador booleano que señala si la entrega del proveedor se realizó después de la fecha solicitada. | ||
| Descripción Este indicador calculado muestra de forma sencilla si una entrega fue puntual o no. Se obtiene al comparar la marca de tiempo de la actividad 'Entrada de mercancías de pedido de compra contabilizada' con el atributo 'Fecha de entrega solicitada'. Este atributo facilita la creación de Dashboards y KPI relacionados con el rendimiento de los proveedores. Permite filtrar y agregar datos rápidamente para calcular el KPI de puntualidad de entrega de proveedores e identificar qué proveedores, materiales o regiones acumulan más retrasos. Por qué es importante Simplifica el análisis del rendimiento de los proveedores al mostrar un resultado claro y binario para cada entrega, esencial para el KPI de puntualidad de las entregas. Dónde obtenerlo Este es un campo calculado. La lógica es: IF ('Entrada de mercancías de pedido de compra contabilizada'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Ejemplos truefalse | |||
| Es reprocesamiento IsRework | Indicador que señala si una actividad o 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 de 'Inspección de calidad' le sigue un paso de '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 entender las ineficiencias del proceso y los costes ocultos. Este indicador ayuda a cuantificar la frecuencia y el impacto de los ciclos de reprocesamiento, permite calcular el KPI de tasa de errores en el procesamiento de pedidos y señala áreas de mejora. Por qué es importante Ayuda a cuantificar las ineficiencias del proceso al identificar y contar explícitamente las actividades que forman parte de un ciclo de reprocesamiento. Dónde obtenerlo Suele calcularse en la herramienta de Process Mining mediante la identificación de secuencias de actividades repetidas dentro del mismo caso. Ejemplos truefalse | |||
| Hora de finalización EndTime | Marca de tiempo que indica cuándo se completó una actividad y se utiliza para calcular el tiempo de procesamiento. | ||
| Descripción La hora de finalización marca el momento en que concluye una actividad específica. Mientras que la hora de inicio (EventTime) indica cuándo comienza, la hora de finalización permite saber cuánto tardó en ejecutarse, sobre todo si no fue instantánea. Contar con las horas de inicio y finalización permite medir con precisión el tiempo de procesamiento y el tiempo de espera. Así se distingue el tiempo dedicado a trabajar activamente en una tarea del tiempo de espera hasta el paso siguiente, algo clave para detectar oportunidades de eficiencia. Por qué es importante Permite calcular con precisión los tiempos de procesamiento de las actividades y distinguir el trabajo que aporta valor del tiempo de espera. Dónde obtenerlo Puede deducirse de los cambios de estado en SAP. Por ejemplo, el inicio puede corresponder a una actualización del estado 'En curso' y el final a una actualización del estado 'Completado' en tablas como JEST/JCDS. En los eventos instantáneos, EndTime puede coincidir con StartTime. Ejemplos 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Nombre del transportista CarrierName | 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 trasladar las mercancías entre ubicaciones, por ejemplo, del almacén al 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 costes y la fiabilidad de distintos transportistas, lo que facilita una mejor planificación logística y selección de proveedores de transporte. Por qué es importante Permite analizar el rendimiento por proveedor de transporte, algo clave para optimizar los costes logísticos y los tiempos de entrega. Dónde obtenerlo El ID del transportista (agente de carga) se almacena en documentos de envío, como la tabla VTTK (cabecera del envío). El nombre se obtiene de tablas de datos maestros como LFA1. Ejemplos DHLFedExMaersk Logistics | |||
| Número de pedido de compra PurchaseOrderNumber | 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 que se utiliza para pedir materiales a un proveedor. Es un identificador clave en la etapa de aprovisionamiento de la cadena de suministro. Este atributo permite analizar en detalle el proceso de aprovisionamiento. Se utiliza en el Dashboard del tiempo de ciclo integral de aprovisionamiento y para calcular el KPI de puntualidad de entrega de proveedores, ya que vincula las actividades de solicitud, pedido, recepción y pago. Por qué es importante Funciona como identificador clave para analizar en detalle el subproceso de aprovisionamiento y vincular los eventos relacionados. 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 llama EBELN. Ejemplos 450007819245000781934500078194 | |||
| Número de pedido de venta SalesOrderNumber | 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 etapa de pedido a cobro de la cadena de suministro. Este atributo es fundamental para hacer un seguimiento del cumplimiento de un pedido específico del cliente. Ayuda a vincular la solicitud inicial del cliente con las actividades posteriores, como la entrega y la facturación, y permite analizar el tiempo de entrega del cumplimiento del pedido. Por qué es importante Funciona como identificador clave del subproceso de cumplimiento del pedido y vincula la demanda del cliente con la logística y la liquidación 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 llama VBELN. Ejemplos 100023451000234610002347 | |||
Actividades de gestión de la cadena de suministro
| Actividad | Descripción | ||
|---|---|---|---|
| Comprobante de entrega confirmado | Representa la confirmación formal del cliente o del transportista de que las mercancías se recibieron según lo especificado. A menudo se registra al actualizar la entrega saliente con la información del POD. | ||
| Por qué es importante Esta actividad marca el final definitivo del proceso de cumplimiento del pedido. Es fundamental para facturar correctamente, resolver disputas y medir el tramo final del ciclo de entrega. Dónde obtenerlo Este es un evento explícito. La fecha del comprobante de entrega se registra en la tabla de cabecera de entrega (LIKP, campo PODAT) o en tablas POD relacionadas (VLPOD). Capturar Utilice la fecha del comprobante de entrega (LIKP-PODAT) del documento de entrega. Tipo de evento explicit | |||
| Entrada de mercancías del pedido de compra contabilizada | Representa la recepción física de materias primas o productos de un proveedor en relación con un pedido de compra. El evento se registra cuando los productos llegan al almacén o a la planta. | ||
| Por qué es importante Esta actividad completa la etapa de entrega del proveedor dentro del ciclo de compra. Es fundamental para calcular la tasa de entregas a tiempo de los proveedores y comprender el rendimiento de la logística de entrada. Dónde obtenerlo Es un evento explícito que se registra al contabilizar 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). Capturar Utilice la fecha de contabilización (MKPF-BUDAT) del documento de material asociado al pedido de compra. 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 tiempos de entrega de los proveedores y la duración de los ciclos de compra. También sirve de referencia para evaluar el rendimiento de las entregas a tiempo. Dónde obtenerlo Este evento explícito se registra cuando se crea 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). Capturar Utilice la fecha de creación del documento (EKKO-AEDAT) del pedido de compra. Tipo de evento explicit | |||
| Pedido de venta creado | Esta actividad marca la creación de un nuevo pedido de venta, que registra formalmente la solicitud de productos de un cliente. Es un evento explícito que se registra cuando un usuario guarda un nuevo documento de pedido de venta en el sistema. | ||
| Por qué es importante Este es el punto de partida principal del proceso de pedido a cobro. Analizar el tiempo entre este evento y los siguientes permite conocer el tiempo total de entrega 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 venta (CDHDR/CDPOS) o mediante la marca de tiempo de creación en la tabla de cabecera del pedido de venta (VBAK, campo ERDAT). Capturar Utilice la fecha de creación (VBAK-ERDAT) y la hora (VBAK-ERZET) del documento de pedido de venta. Tipo de evento explicit | |||
| Productos fabricados | Esta actividad confirma que ha finalizado la fabricación de los productos. 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 Marca el final del ciclo de producción. El tiempo entre la creación de la orden de producción y este evento corresponde al tiempo de fabricación, un indicador clave de la eficiencia de la producción. Dónde obtenerlo Puede registrarse explícitamente mediante la contabilización de un documento de material (entrada de mercancías procedente 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». Capturar Infiera el evento a partir de la fecha de contabilización del documento de material de la entrada final de mercancías de la orden de producción o de un cambio de estado. Tipo de evento inferred | |||
| Salida de mercancías contabilizada | Esta actividad representa la salida legal y física de las mercancías del almacén. Reduce el inventario y contabiliza el coste 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 de tránsito. Es el momento definitivo en que las mercancías dejan de estar en 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). Capturar Utilice la fecha de contabilización (MKPF-BUDAT) del documento de material de salida de mercancías asociado a la entrega saliente. Tipo de evento explicit | |||
| Disponibilidad del inventario comprobada | Representa la comprobación, automática o manual, de si hay existencias de los productos solicitados para atender el pedido de venta. Suele ser un paso automático durante la creación del pedido, pero puede que no se registre como un evento independiente. | ||
| Por qué es importante Comprender el tiempo que transcurre entre el pedido y esta comprobación, así como su resultado, ayuda a analizar cómo afectan los niveles de inventario al tiempo de entrega. Los retrasos en esta etapa suelen dar lugar a actividades de compra o producción. Dónde obtenerlo Por lo general, 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 venta (VBEP) o de los cambios de estado de la posición. Capturar Infiera el evento a partir de la actualización del estado de confirmación de la línea de programación del pedido de venta (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 marca el paso de la gestión de pedidos a la ejecución logística. | ||
| Por qué es importante Este paso clave inicia el proceso de entrega física. Los retrasos entre la creación del pedido y la de la entrega pueden indicar problemas de planificación o disponibilidad. Dónde obtenerlo Es un evento explícito. La marca de tiempo de creación se registra en la tabla de cabecera de entregas (LIKP, campo ERDAT). Capturar Utilice la fecha (LIKP-ERDAT) y la hora (LIKP-ERZET) de creación 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 planificar el transporte. Este documento contiene información sobre el transportista, la ruta y el medio de transporte. | ||
| Por qué es importante Esta actividad marca el inicio de la planificación formal del transporte. Analizar el tiempo transcurrido 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 que se registra en la tabla de cabecera del envío (VTTK, campo ERDAT). Forma parte del módulo LE-TRA, que no utilizan todas las organizaciones. Capturar 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 bienes o servicios entregados. Da inicio a la etapa final de liquidación financiera del proceso. | ||
| Por qué es importante Esta actividad es clave para analizar el tiempo del ciclo de facturación. Los retrasos 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). Capturar 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 un control de calidad de los productos fabricados. El resultado de la inspección, aprobado o rechazado, se registra en una decisión de empleo. | ||
| Por qué es importante Esta actividad es fundamental para supervisar la calidad de los productos e identificar problemas de producción. Una tasa elevada de rechazos o inspecciones prolongadas pueden convertirse en cuellos de botella importantes. Dónde obtenerlo Es un evento explícito que se registra cuando se toma una decisión de empleo 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. Capturar Utilice la marca de tiempo en que se registra la decisión de empleo del lote de inspección (tablas QALS/QAVE). Tipo de evento explicit | |||
| Mercancías descargadas en el destino | Esta actividad indica la descarga física de las mercancías en las instalaciones del cliente. Es posible que SAP no registre este evento de forma explícita, por lo que a menudo debe deducirse a partir de los datos del transportista o de eventos posteriores. | ||
| Por qué es importante Esto marca el final del trayecto en tránsito. El tiempo transcurrido desde la salida de mercancías hasta este momento corresponde al tiempo de transporte, un dato clave para optimizar la logística. Dónde obtenerlo Rara vez se registra como evento explícito en el ERP principal. Puede deducirse de los mensajes EDI del transportista, de los datos del módulo Transportation Management (TM) o, si está disponible, de la marca de tiempo del comprobante de entrega. Capturar Dedúzcalo de las actualizaciones de estado del transportista (por ejemplo, EDI 214) o utilice la marca de tiempo del comprobante de entrega como aproximación. 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 venta. Es el inicio formal del proceso de fabricación interna. | ||
| Por qué es importante La creación de una orden de producción marca el inicio del tiempo de fabricación. Analizarlo ayuda a detectar 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). Capturar Utilice la fecha de creación (AUFK-ERDAT) de la tabla de cabecera de la orden. Tipo de evento explicit | |||
| Preparación de pedidos completada | Esta actividad marca la finalización de la recogida física de los productos en el 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. Registrar esta actividad ayuda a detectar cuellos de botella en las operaciones del almacén y medir el rendimiento de la preparación de pedidos. Dónde obtenerlo A menudo no se trata de un evento único y puntual, sino que puede deducirse a partir de los cambios de estado. Se registra cuando el estado de picking en la tabla de posiciones de entrega (LIPS, campo KOSTA) se establece en 'C' (procesado por completo). Capturar Dedúzcalo de los documentos de modificación cuando el estado de picking (LIPS-KOSTA) se actualice a completamente preparado. Tipo de evento inferred | |||
| Solicitud de compra creada | Esta actividad indica la creación de una solicitud interna para comprar los productos o las materias primas necesarios. Suele activarse cuando el inventario no basta para atender un pedido de venta o cae por debajo del punto de reposición. | ||
| Por qué es importante Es el primer paso del ciclo de compra. Registrar cuándo se crea la solicitud ayuda a detectar retrasos en el inicio de las compras y a analizar el proceso de adquisición 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). Capturar 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 las autorizaciones necesarias para acceder a las vistas de SAP S/4HANA Core Data Services (CDS). Por lo general, el equipo de seguridad de SAP debe asignarle un rol específico. También necesitará un cliente SQL, como DBeaver o SAP HANA Studio, que pueda conectarse a la base de datos SAP HANA.
- Establecer la conexión con la base de datos: Configure el cliente SQL para conectarse a la base de datos 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 la base de datos y una contraseña.
- Preparar la consulta SQL: Copie la consulta SQL completa incluida en la sección de consultas de este documento y péguela en el editor del cliente SQL. Esta consulta extrae las actividades especificadas de varios módulos de logística y ventas.
- Configurar los parámetros de extracción: Antes de ejecutar la consulta, localice las condiciones de ejemplo en las cláusulas
WHEREde cada subconsulta. Sustituya'YourCompanyCode'por el código de empresa que va a analizar y ajuste los valores de fecha de ejemplo, como'YYYY-MM-DD', para definir el periodo de extracción deseado. - Ejecutar la consulta: Ejecute el script SQL completo. El tiempo de ejecución dependerá del periodo seleccionado y del volumen de datos del sistema. Se recomienda ejecutarlo fuera de las horas de mayor actividad para reducir la carga del sistema.
- Revisar los resultados iniciales: Cuando termine la consulta, revise brevemente los resultados en el cliente SQL. Compruebe que el número de filas sea razonable, que las columnas como LogisticsOrder, ActivityName y EventTime tengan valores y que aparezcan distintos nombres de actividad.
- Exportar los datos a CSV: Exporte todo el conjunto de resultados del cliente SQL a un archivo CSV. Seleccione la codificación UTF-8 para evitar problemas con caracteres especiales.
- Preparar el archivo para cargarlo: Compruebe que los encabezados de columna del archivo CSV final coincidan exactamente con los nombres de atributos requeridos para la ingesta (por ejemplo,
LogisticsOrder,ActivityName,EventTime). Si utiliza la consulta SQL tal como se proporciona, no debería ser necesario transformar los datos.
Configuración
- Requisitos previos: Se necesita acceso a la base de datos SAP HANA subyacente. El usuario de la base de datos debe tener privilegios
SELECTen todas las vistas CDS mencionadas 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 periodo: La consulta proporcionada incluye un valor de ejemplo para filtrar por periodo, normalmente mediante un campo de fecha de creación (
CreationDateoDocumentDate). Para el análisis inicial, se recomienda un periodo de 3 a 6 meses, que permita obtener datos representativos sin sobrecargar el sistema. - Filtros empresariales clave: Es fundamental filtrar los datos por unidades organizativas específicas para que el análisis sea pertinente. La consulta incluye un valor de ejemplo para
CompanyCode. También puede añadir filtros paraSalesOrganization,DistributionChanneloPlant, según el alcance del análisis. - Consideraciones de rendimiento: Esta consulta compleja combina varias vistas CDS de gran tamaño. Su ejecución puede consumir muchos recursos del sistema. Programe las extracciones fuera del horario laboral. Si el conjunto de datos es muy grande, considere ejecutar la consulta en lotes mensuales, más pequeños y consecutivos.
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 de solo lectura al esquema de SAP HANA que contiene los datos pertinentes de logística, ventas, compras, inventario, producción, calidad, entregas, envíos, comprobantes de entrega y facturación. Solicite el nombre del esquema, los datos de conexión y las autorizaciones al equipo de SAP Basis o de la plataforma de datos. 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 los pedidos de compra; LIKP y LIPS, para las entregas salientes. 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, comprobantes de entrega y facturación. Sustituya cada marcador entre corchetes de objeto o columna de la consulta por objetos verificados en el diccionario de datos del sistema.
- Defina la regla de correlación de LogisticsOrder. Se recomienda utilizar una relación verificada del flujo de documentos desde el pedido de venta hasta las entregas, los documentos de material, los documentos de producción o compras y los documentos de facturación posteriores. Si no existe una relación directa, configure una tabla de correlación documentada o una asignación específica de la empresa. No correlacione casos usando únicamente el número de material o la fecha.
- Defina el periodo de extracción con [Start date parameter] y [End date parameter]. Aplique el periodo de forma coherente a las marcas de tiempo de los eventos, pero conserve los documentos creados antes del periodo cuando sean necesarios para explicar los eventos que ocurren 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. Aplique 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. Todas las ramas deben devolver las mismas columnas y tipos de datos compatibles. La consulta crea explícitamente una fila para cada una de las 15 actividades requeridas, ya que 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 completa con UNION ALL. Revise los planes de ejecución y limite la prueba inicial a un periodo breve.
- Valide las relaciones entre documentos, las marcas de tiempo, los identificadores de usuario, los datos de proveedores y clientes, los datos de materiales y centros, y los resultados de calidad. Investigue las filas duplicadas causadas por las combinaciones a nivel de artículo y aplique la regla configurada para el nivel de detalle de los eventos, por ejemplo, un evento por documento o por artículo del documento.
- Exporte los resultados como CSV con codificación UTF-8 u otro formato tabular compatible con ProcessMind. Mantenga exactamente estos 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 tenga valores coherentes.
- Cargue el archivo en ProcessMind y asigne LogisticsOrder al identificador del caso, ActivityName a la actividad y EventTime a la 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
- Periodo: Empiece con entre 3 y 6 meses de datos. Para las pruebas iniciales, utilice un periodo más breve y amplíelo solo después de validar el rendimiento y las relaciones entre documentos.
- Esquema de origen: Asigne [SAP HANA schema name] al esquema que contiene las tablas o vistas verificadas de S/4HANA. No dé por sentado que una tabla del ERP clásico está disponible con el mismo nombre en todas las implementaciones de S/4HANA.
- Alcance de los documentos: 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. Si la correlación falta o es ambigua, debe notificarse, no asignarse de forma silenciosa.
- Nivel de detalle de los eventos: Elija entre un evento por documento, por artículo del 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 las marcas de tiempo: Para cada actividad, utilice la marca de tiempo verificada de contabilización, creación, confirmación, cambio de estado, inspección, entrega, descarga, comprobante de entrega o facturación. No sustituya la hora del evento empresarial por la hora de extracción.
- Etiqueta del sistema de origen: Asigne [Source system label] a un valor estable, como el identificador aprobado del sistema SAP S/4HANA.
- Marca de tiempo de actualización: Asigne [Last data update expression] a la marca de tiempo de extracción aprobada o a la marca de tiempo de actualización del sistema de origen.
- Rendimiento: Aplique cuanto antes 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 utilizar una vista de extracción persistente o una tabla de preparación para las cargas recurrentes.
- Autorizaciones: Se requiere acceso de lectura a 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, comprobantes de entrega, calidad, producción y facturación pueden almacenarse en aplicaciones o extensiones independientes.
- Seguridad: Aplique las reglas de la organización para los datos de clientes, proveedores, materiales, finanzas y usuarios. Enmascare o restrinja los campos confidenciales cuando sea necesario.
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 contar con una clave de desarrollador y las autorizaciones necesarias en su sistema SAP S/4HANA para crear y ejecutar programas ABAP (acceso a la transacción SE38) y leer tablas de la cadena de suministro como VBAK, LIKP, EKKO y MKPF.
- Crear 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». Añada un título descriptivo y establezca el tipo de programa como «Programa ejecutable». - Insertar el código: Copie el código ABAP completo de la sección «consulta» que aparece a continuación y péguelo en el editor ABAP del nuevo programa.
- Definir los elementos de texto: Vaya a Go To > Text Elements > Selection Texts. Active todas las etiquetas propuestas para la pantalla de selección, de modo que la interfaz sea clara y fácil de usar.
- Activar el programa: Guarde y active el programa con CTRL+S y luego CTRL+F3, o mediante el icono de activación de la barra de herramientas. Corrija los errores de sintaxis que puedan surgir debido a la configuración específica del sistema.
- Ejecutar el programa: Pulse F8 o utilice el botón «Procesamiento directo». Aparecerá una pantalla de selección que le permitirá filtrar los datos que se extraerán.
- Configurar los parámetros de extracción: En la pantalla de selección, especifique el periodo de la fecha de creación del pedido de venta. Se recomienda filtrar también por códigos de empresa u organizaciones de ventas específicos para controlar el volumen de datos. Introduzca la ruta completa del archivo de salida en el servidor de aplicaciones SAP.
- Ejecutar en segundo plano: Para conjuntos de datos grandes que abarquen varios meses, es fundamental ejecutar el programa en segundo plano para evitar que se agote el tiempo de espera de la transacción. En el menú, seleccione Program > Execute in Background y programe el trabajo.
- Recuperar el archivo de datos: Cuando termine la ejecución del programa, utilice el código de transacción
AL11para acceder al directorio especificado en el servidor de aplicaciones. Localice el archivo generado y descárguelo en su equipo mediante la transacciónCG3Y. - Preparar el archivo para cargarlo: Compruebe que el archivo descargado esté en formato de texto sin formato, como CSV con delimitadores de coma o punto y coma, y que utilice la codificación UTF-8. El archivo ya estará listo para cargarse en la herramienta de Process Mining.
Configuración
- Periodo de selección (S_ERDAT): Es el filtro más importante. Define el periodo para seleccionar inicialmente los pedidos de venta según su fecha de creación (
VBAK-ERDAT). Empiece con un periodo acotado, por ejemplo, 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 específicas. Resulta útil para centrar el análisis en una unidad de negocio o región concreta.
- Código de empresa (S_BUKRS): Filtro opcional para limitar los datos a códigos de empresa específicos. Se recomienda aplicarlo 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 permiso de escritura en 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 considerable, es obligatorio procesarlo en segundo plano para evitar que se agote el tiempo de espera y reducir la carga del sistema durante las horas de mayor actividad.
- 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.
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. ¿Todo listo para empezar?
Utilice este Template para preparar sus datos y empezar hoy mismo a mejorar el rendimiento de su cadena de suministro. Le acompañamos en cada paso.
Mejore ahora la gestión de su cadena de suministro
Obtenga visibilidad de principio a fin y mejore la precisión de las previsiones hasta un 90 % en cuestión de días.
Prueba gratuita de 14 días, sin necesidad de tarjeta de crédito.