Su Plantilla de Datos de Supply Chain Management
Su Plantilla de Datos de Supply Chain Management
- Atributos recomendados para recopilar
- Actividades clave para el seguimiento
- Guía de Extracción
Atributos de Supply Chain Management
| Nombre | Descripción | ||
|---|---|---|---|
| Hora del Evento EventTime | El timestamp que indica cuándo ocurrió la actividad, incluyendo la fecha y la hora. | ||
| Descripción Este atributo proporciona la fecha y hora precisas para cada actividad en el proceso. Sirve como la columna vertebral cronológica del registro de eventos, ordenando los pasos del proceso tal como ocurrieron en la realidad. El Event Time es crucial para todo análisis basado en el tiempo. Se utiliza para calcular los tiempos de ciclo entre actividades, medir el tiempo total de entrega de un proceso, identificar tendencias de rendimiento a lo largo del tiempo y determinar cuándo es más probable que ocurran cuellos de botella. Por qué es importante Este timestamp es esencial para calcular todas las duraciones y métricas de rendimiento, permitiendo el análisis de cuellos de botella y tiempos de entrega del proceso. Dónde obtener Extraído de campos de marca de tiempo asociados con la creación de documentos o cambios de estado en tablas SAP centrales, como CDHDR/CDPOS para documentos de cambio, o campos específicos de fecha/hora como ERDAT/ERZET en 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 o evento comercial que ocurrió en un punto específico del proceso de la cadena de suministro. | ||
| Descripción Este atributo describe un paso o hito específico dentro del ciclo de vida del pedido logístico, como 'Orden de Compra Emitida' o 'Salida de Mercancías Contabilizada'. Estas actividades forman la secuencia de eventos que constituyen el proceso. Analizar la secuencia de actividades es el núcleo del Process Mining. Permite el descubrimiento del flujo de proceso real, la comparación con los procedimientos operativos estándar y la identificación de los pasos del proceso que causan retrasos o requieren retrabajo. Por qué es importante Define los pasos del proceso, lo cual es fundamental para descubrir mapas de procesos, analizar variantes y medir los tiempos de ciclo entre actividades. Dónde obtener Generado mediante el mapeo de códigos de transacción o cambios de estado de varias tablas SAP (por ejemplo, EKKO, LIKP, VBUK) a nombres de actividad amigables para el usuario durante la transformación de datos. Ejemplos Orden de Compra EmitidaEntrada de Mercancía para PO RegistradaEntrega de Salida CreadaPrueba de Entrega Confirmada | |||
| Pedido Logístico LogisticsOrder | El identificador único para un único proceso de cadena de suministro de principio a fin, desde la demanda inicial hasta la confirmación de entrega final. | ||
| Descripción El Pedido Logístico sirve como el identificador principal de caso, vinculando todas las actividades relacionadas con una demanda o solicitud de cumplimiento específica dentro de la cadena de suministro. Este enfoque permite rastrear todo el ciclo de vida del recorrido de un producto, desde la planificación y adquisición hasta la producción y distribución, asegurando una vista integral del proceso. En el Process Mining, analizar por Pedido Logístico revela la ruta completa tomada para satisfacer una demanda. Ayuda a identificar variantes comunes, cuellos de botella y desviaciones en toda la cadena de suministro, en lugar de examinar procesos aislados como la adquisición o las ventas. Por qué es importante Esta es la clave esencial para conectar todos los eventos relacionados en una única instancia de proceso, permitiendo un análisis de principio a fin de la cadena de suministro. Dónde obtener Este es un identificador conceptual y puede necesitar ser construido vinculando varios números de documento, como un número de pedido de venta con sus subsiguientes números de orden de compra y entrega. Consulte la documentación de la cadena de suministro de SAP S/4HANA o a un experto en la materia. Ejemplos LO-4500078192LO-4500078193LO-4500078194 | |||
| Source System SourceSystem | El sistema del cual se originaron los datos. | ||
| Descripción Identifica la instancia específica del sistema de origen donde se generaron los datos de eventos. En un entorno complejo, una empresa podría tener múltiples instancias de SAP S/4HANA para diferentes regiones o unidades de negocio. Este atributo es importante para la gobernanza de datos y para segmentar el análisis. Permite a los analistas comparar el rendimiento de los procesos entre diferentes sistemas o aislar datos de una única fuente autorizada. Por qué es importante Proporciona un contexto crítico para el origen de los datos, lo cual es importante para la validación de datos y para comparar procesos a través de diferentes entornos de sistema. Dónde obtener Este es típicamente un valor estático añadido durante el proceso de 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 | El `timestamp` cuando los datos fueron actualizados por última vez o extraídos del sistema de origen. | ||
| Descripción Este atributo indica la última vez que se actualizaron los datos para el registro de eventos. Proporciona una fecha de 'actualización' para los datos que se analizan, asegurando que los usuarios estén conscientes de la puntualidad de los datos. En cualquier análisis, comprender la antigüedad de los datos es crucial para tomar decisiones informadas. Este timestamp ayuda a los usuarios a confiar en los datos y a comprender la ventana de tiempo cubierta por los dashboards y los KPI. Por qué es importante Asegura la transparencia sobre la actualidad de los datos, permitiendo a los usuarios saber cuán reciente es el análisis del proceso. Dónde obtener Este es un campo de metadatos típicamente generado y llenado por la herramienta de extracción de datos o ETL al final de una actualización de datos exitosa. Ejemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Fecha de Entrega Solicitada RequestedDeliveryDate | La fecha en la que se solicitó al proveedor la entrega de las mercancías. | ||
| Descripción Esta es la fecha de entrega especificada en la orden de compra, que representa el objetivo para el proveedor. Sirve como la línea base contra la cual se mide el rendimiento de entrega real. Esta fecha es esencial para calcular el KPI de Tasa de Entrega a Tiempo del Proveedor. Al comparar la fecha real de Recepción de Mercancías con esta fecha solicitada, una empresa puede medir objetivamente si los proveedores están cumpliendo con sus compromisos. Por qué es importante Esta es la fecha base utilizada para calcular el KPI 'Tasa de Entrega a Tiempo del Proveedor', lo que la hace crítica para la gestión del rendimiento del proveedor. Dónde obtener Se encuentra en la tabla de partidas del pedido 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 está cumpliendo el pedido. | ||
| Descripción Este atributo identifica al cliente final asociado con un pedido de venta y las actividades de cumplimiento posteriores. Proporciona contexto para el lado de la demanda del proceso de la cadena de suministro. En el Process Mining, el análisis por cliente ayuda a identificar diferentes patrones de cumplimiento o niveles de rendimiento para cuentas clave. Se utiliza en dashboards como el Análisis de Retraso de Prueba de Entrega para ver si ciertos clientes retrasan consistentemente las confirmaciones. Por qué es importante Permite la segmentación del análisis por cliente, revelando comportamientos específicos del cliente, cuellos de botella o el rendimiento del acuerdo de nivel de servicio. Dónde obtener El número de cliente (KUNNR) se almacena en documentos de venta (por ejemplo, tabla VBAK). El nombre se recupera de la tabla maestra central de clientes KNA1. Ejemplos Retail CorpInnovar SolucionesSocios de Fabricación | |||
| Nombre del Proveedor SupplierName | El nombre del proveedor o vendedor asociado a las actividades de adquisición. | ||
| Descripción Este atributo identifica al proveedor de quien se adquieren bienes o servicios. Normalmente se asocia con actividades como 'Solicitud de Compra Creada' y 'Orden de Compra Emitida'. El Nombre del Proveedor es esencial para el dashboard de Rendimiento de Entrega del Proveedor. Permite filtrar y segmentar los datos para comparar las tasas de entrega a tiempo, los tiempos de entrega y los niveles de calidad entre diferentes proveedores, lo cual es crítico para la adquisición estratégica y la gestión de relaciones con proveedores. Por qué es importante Permite el análisis de rendimiento por proveedor, crucial para optimizar el proceso de aprovisionamiento y evaluar la fiabilidad del proveedor. Dónde obtener El número de proveedor (LIFNR) se almacena en documentos de compra (por ejemplo, tablas EKKN, 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 para el producto o material que se está procesando. | ||
| Descripción El Número de Material, a menudo llamado 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, adquieren o envían. Este atributo es vital para el análisis centrado en el producto. Ayuda a identificar si ciertos productos son más propensos a problemas de calidad, retrasos en la producción o faltantes 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 un análisis a nivel de producto para identificar si los problemas de proceso, como retrasos o fallos de calidad, se concentran en materiales específicos. Dónde obtener Se encuentra en tablas a nivel de partida para la mayoría de los documentos, como VBAP para Pedidos de Venta, EKPO para Pedidos de Compra y LIPS para Entregas. El campo típicamente se llama MATNR. Ejemplos FG-100-ARM-2034-BSA-5500 | |||
| Planta Plant | La instalación de fabricación o distribución donde tuvo lugar la actividad. | ||
| Descripción La Planta es una unidad organizacional de SAP que representa una ubicación donde se producen, almacenan o distribuyen bienes. Proporciona el contexto geográfico o funcional para las actividades del proceso. Analizar el rendimiento del proceso por Planta es un requisito común. Permite la evaluación comparativa y la comparación de la eficiencia, el rendimiento y el cumplimiento en diferentes sitios operativos, ayudando a identificar las mejores prácticas o las ubicaciones que necesitan mejoras. Por qué es importante Proporciona una dimensión geográfica u organizacional para el análisis, permitiendo la comparación del rendimiento entre diferentes instalaciones. Dónde obtener Se encuentra en muchas tablas de partidas de documento, como VBAP (Ventas), EKPO (Compras) y LIPS (Entrega). El campo típicamente se llama WERKS. Ejemplos 100021003500 | |||
| Resultado de Inspección de Calidad QualityInspectionResult | El resultado de una inspección de calidad, como 'Aprobado' o 'Reprobado'. | ||
| Descripción Este atributo registra el resultado de un control de calidad realizado sobre los bienes producidos o recibidos. El resultado determina si los bienes pueden pasar al siguiente paso o si requieren reproceso, devolución o descarte. Este es un atributo crítico para el dashboard y el KPI de Tasas de Rechazo de Control de Calidad. Analizar la frecuencia y las razones de las fallas ayuda a identificar problemas de calidad sistémicos con productos, proveedores o líneas de producción específicas. Por qué es importante Apoya directamente el cálculo de KPIs relacionados con la calidad y ayuda a identificar las fuentes de mala calidad en la cadena de suministro. Dónde obtener Esta información se almacena típicamente en el módulo de Gestión de Calidad (QM). Los datos pueden provenir de tablas de lotes de inspección como QALS y códigos de decisión de uso en QAVE. Ejemplos AprobadoFallidoRetrabajo RequeridoAprobado con Desviación | |||
| Usuario Ejecutor ExecutingUser | El `ID de usuario` de la `persona` que ejecutó la `actividad`. | ||
| Descripción Este atributo captura el nombre de usuario o ID de SAP del empleado que realizó la actividad dada, como crear una orden de compra o contabilizar una entrada de mercancías. Vincula los pasos del proceso con los recursos humanos involucrados. 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 individuos o equipos. También es valioso para el análisis de cumplimiento para ver quién realizó los pasos críticos del proceso. Por qué es importante Atribuye actividades a usuarios específicos, lo que permite el análisis de la carga de trabajo, la comparación de rendimiento y la investigación de acciones no conformes. Dónde obtener Se encuentra en los campos 'Creado por' o 'Modificado por' en muchas tablas SAP, como ERNAM en EKKO (Cabecera de PO), LIKP (Cabecera de Entrega) y VBRK (Cabecera de Factura). Ejemplos CBROWNJSMITHASINGH | |||
| ¿Es Retrabajo? IsRework | Un indicador que señala si una actividad o una secuencia de actividades representa retrabajo. | ||
| Descripción Este atributo booleano marca las actividades que son repeticiones de pasos anteriores en el proceso, indicando alguna forma de retrabajo o corrección. Por ejemplo, si una 'Inspección de Calidad' es seguida por un paso de 'Orden de Producción Creada' y luego otra 'Inspección de Calidad', la segunda inspección podría marcarse como retrabajo. Identificar el retrabajo es clave para comprender la ineficiencia del proceso y los costos ocultos. Esta bandera ayuda a cuantificar la frecuencia y el impacto de los bucles de retrabajo, apoyando el cálculo del KPI de Tasa de Error en el Procesamiento de Pedidos y destacando áreas para la mejora del proceso. Por qué es importante Ayuda a cuantificar las ineficiencias del proceso identificando y contando explícitamente las actividades que forman parte de un ciclo de reprocesos. Dónde obtener Esto se calcula típicamente dentro de la herramienta de Process Mining identificando secuencias repetidas de actividades dentro del mismo caso. Ejemplos truefalse | |||
| Cantidad del Pedido OrderQuantity | La cantidad del material en la línea de pedido. | ||
| Descripción Este atributo especifica el número de unidades de un material solicitado en un pedido de venta o en una línea de orden de compra. Proporciona una medida de volumen para cada transacción. Analizar por cantidad ayuda a priorizar el análisis en pedidos de alto volumen, que pueden tener un mayor impacto comercial. También se puede utilizar para normalizar otras métricas, como el cálculo del costo por unidad, o para comprender cómo el tamaño del pedido afecta los tiempos de procesamiento. Por qué es importante Proporciona contexto de volumen a las transacciones, permitiendo el análisis de impacto y la segmentación de casos por tamaño. Dónde obtener Se encuentra en tablas a nivel de partida, como MENGE en EKPO (Pedido de Compra) o KWMENG en VBAP (Pedido de Venta). Ejemplos 100500025 | |||
| Es Entrega Tardía IsLateDelivery | Un indicador booleano que señala si una entrega del proveedor se realizó después de la fecha de entrega solicitada. | ||
| Descripción Este indicador calculado proporciona un simple valor verdadero o falso sobre si una entrega llegó a tiempo. Se deriva comparando el timestamp de la actividad 'Entrada de Mercancías para PO Contabilizada' con el atributo 'Fecha de Entrega Solicitada'. Este atributo simplifica la creación de dashboards y KPIs relacionados con el rendimiento de los proveedores. Permite un filtrado y una agregación rápidos para calcular la Tasa de Entrega a Tiempo del Proveedor e identificar qué proveedores, materiales o regiones presentan los retrasos más frecuentes. Por qué es importante Simplifica el análisis del rendimiento del proveedor al proporcionar un resultado claro y binario para cada entrega, lo cual es esencial para el KPI de entrega a tiempo. Dónde obtener Este es un campo calculado. La lógica es: SI ('Entrada de Mercancías para PO Contabilizada'.EventTime > PurchaseOrder.RequestedDeliveryDate) ENTONCES Verdadero SINO Falso. Ejemplos truefalse | |||
| Hora de Finalización EndTime | El timestamp que indica cuándo se completó una actividad, utilizado para calcular el tiempo de procesamiento. | ||
| Descripción La Hora de Fin marca la finalización de una actividad específica. Mientras que la Hora de Inicio (EventTime) indica cuándo comienza una actividad, la Hora de Fin es necesaria para comprender cuánto tiempo tardó en ejecutarse una actividad, especialmente para aquellas que no son instantáneas. En el análisis, tener tanto una hora de inicio como una de fin permite una medición precisa del 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 para el siguiente paso, lo cual es clave para identificar oportunidades de eficiencia. Por qué es importante Permite el cálculo de tiempos de procesamiento de actividades precisos, ayudando a diferenciar entre el trabajo de valor añadido y el tiempo de espera. Dónde obtener Puede derivarse de cambios de estado en SAP. Por ejemplo, el inicio es una actualización de estado 'En Progreso' y el final es una actualización de estado 'Completado' de tablas como JEST/JCDS. Para 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 agente de carga que gestiona el envío. | ||
| Descripción El Nombre del Transportista identifica al proveedor de servicios logísticos responsable del transporte de mercancías entre ubicaciones, por ejemplo, de un almacén a un cliente. Este atributo es esencial para el dashboard de Análisis del Tiempo de Ciclo de Transporte. Permite la comparación de tiempos de tránsito, costos y fiabilidad entre diferentes transportistas, posibilitando una mejor planificación logística y selección de transportistas. Por qué es importante Permite el análisis de rendimiento por proveedor de transporte, clave para optimizar los costos logísticos y los tiempos de entrega. Dónde obtener El ID del transportista (agente de carga) se almacena en los documentos de envío, como la tabla VTTK (Cabecera de Envío). El nombre se recupera de las tablas de datos maestros como LFA1. Ejemplos DHLFedExMaersk Logistics | |||
| Número de Pedido de Venta SalesOrderNumber | El identificador único para el documento de Pedido de Venta (SO). | ||
| Descripción El Número de Pedido de Venta es el número de documento oficial que confirma una venta a un cliente. Es un identificador clave en la parte del proceso de pedido a cobro de la cadena de suministro. Este atributo es crucial para rastrear el cumplimiento de un pedido de cliente específico. Ayuda a vincular la solicitud inicial del cliente con todas las actividades posteriores, como la entrega y la facturación, apoyando el Análisis del Tiempo de Entrega del Pedido. Por qué es importante Actúa como un identificador clave para el subproceso de cumplimiento de pedidos, vinculando la demanda del cliente con la logística y la liquidación financiera. Dónde obtener Se encuentra en la tabla de cabecera de SO VBAK y la tabla de partidas VBAP. El campo se llama VBELN. Ejemplos 100023451000234610002347 | |||
| Purchase Order Number PurchaseOrderNumber | El identificador único para el documento de Orden de Compra (PO). | ||
| Descripción El Número de Orden de Compra es el número de documento oficial utilizado para pedir materiales a un proveedor. Es un identificador clave en la parte de adquisición de la cadena de suministro. Este atributo permite profundizaciones en el proceso de adquisición. Se utiliza en el dashboard de Tiempo de Ciclo de Adquisición de Principio a Fin y para calcular el KPI de Tasa de Entrega a Tiempo del Proveedor, vinculando las actividades de requisición, pedido, recepción y pago. Por qué es importante Sirve como un identificador clave para profundizar en el subproceso de adquisiciones y vincular eventos de adquisición relacionados. Dónde obtener Se encuentra en la tabla de cabecera de PO EKKO y la tabla de partidas EKPO. El campo se llama EBELN. Ejemplos 450007819245000781934500078194 | |||
| Tiempo de Procesamiento ProcessingTime | La duración del tiempo dedicado activamente a una actividad. | ||
| Descripción El Tiempo de Procesamiento es la duración calculada desde el tiempo de inicio de una actividad hasta su tiempo de finalización. Representa el trabajo real o el 'tiempo de contacto' para un paso del proceso, en contraposición al tiempo de espera entre pasos. Esta métrica es fundamental para identificar ineficiencias. Al aislar el tiempo de procesamiento del tiempo de espera, los analistas pueden determinar si los retrasos son causados por una ejecución lenta de las tareas o por largas colas y demoras en la transferencia entre departamentos o sistemas. Por qué es importante Ayuda a distinguir el tiempo de trabajo activo del tiempo de espera inactivo, lo cual es fundamental para identificar las verdaderas fuentes de los retrasos en el proceso. Dónde obtener Calculado restando el StartTime de la actividad de su EndTime (EndTime - StartTime). Ejemplos PT1H30MPT8HP2D | |||
Actividades de Supply Chain Management
| Actividad | Descripción | ||
|---|---|---|---|
| Bienes Producidos | Esta actividad representa la confirmación de que la fabricación de las mercancías está completa. Normalmente se registra como una entrada de mercancías desde la orden de producción, trasladando el producto terminado al inventario. | ||
| Por qué es importante Esto marca el final del ciclo de producción. El tiempo entre la creación de la orden de producción y este evento representa el tiempo de entrega de fabricación, una métrica clave para la eficiencia de la producción. Dónde obtener Esto puede capturarse explícitamente a través de una contabilización de documento de material (entrada de mercancías desde la orden de producción) o inferirse de la confirmación final de la orden de producción (tabla AFRU) o de un cambio de estado a 'Entregado'. Capturar Se infiere de la fecha de contabilización del documento de material de entrada de mercancías final para la orden de producción o de un cambio de estado. Tipo de evento inferred | |||
| Entrada de Mercancía para PO Registrada | Representa la recepción física de materias primas o mercancías de un proveedor contra una orden de compra. Este evento se registra cuando las mercancías son recibidas en el almacén o planta. | ||
| Por qué es importante Esta actividad completa la parte de entrega del proveedor del ciclo de adquisición. Es vital para calcular las tasas de entrega a tiempo del proveedor y comprender el rendimiento de la logística de entrada. Dónde obtener Este es un evento explícito capturado a través de una contabilización de documento de material. El timestamp del evento se encuentra en la tabla de cabecera del documento de material (MKPF, campo BUDAT). El enlace a la PO está en la tabla de ítems (MSEG). Capturar Utilice la fecha de contabilización (MKPF-BUDAT) del documento de material asociado a la orden de compra. Tipo de evento explicit | |||
| Orden de Compra Emitida | Marca la creación y emisión formal de un pedido de compra a un proveedor externo para los materiales requeridos. Esta actividad convierte una solicitud de pedido en un compromiso legalmente vinculante con un proveedor. | ||
| Por qué es importante Como hito clave, esta actividad es crucial para medir los tiempos de entrega de los proveedores y los tiempos del ciclo de aprovisionamiento. Proporciona la base para evaluar el rendimiento de entrega a tiempo de los proveedores. Dónde obtener Este es un evento explícito registrado al crear la orden de compra. El timestamp de creación se almacena en la tabla de cabecera de la orden de compra (EKKO, campo AEDAT). Capturar Utilice la fecha de creación del documento (EKKO-AEDAT) para la orden de compra. Tipo de evento explicit | |||
| Pedido de Venta Creado | Esta actividad marca la creación de un nuevo pedido de venta, que formalmente captura la solicitud de bienes 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 para el proceso de pedido a cobro. Analizar el tiempo desde este evento hasta otros revela el tiempo total de entrega del pedido e identifica los retrasos iniciales en el procesamiento. Dónde obtener Este evento se registra explícitamente. Se puede encontrar en los documentos de cambio para las tablas de pedidos de venta (CDHDR/CDPOS) o utilizando el timestamp de creación en la tabla de cabecera de pedidos de venta (VBAK, campo ERDAT). Capturar Utilice la fecha de creación (VBAK-ERDAT) y la hora (VBAK-ERZET) para el documento de pedido de venta. Tipo de evento explicit | |||
| Prueba de Entrega Confirmada | Representa la confirmación formal del cliente o transportista de que las mercancías han sido recibidas según lo especificado. Esto a menudo se registra actualizando la entrega de salida con información de la Prueba de Entrega (POD). | ||
| Por qué es importante Esta actividad es el final definitivo del proceso de cumplimiento. Es crucial para una facturación precisa, la resolución de disputas y la medición de la última etapa del ciclo de entrega. Dónde obtener Este es un evento explícito. La fecha de prueba de entrega se registra en la tabla de cabecera de la entrega (LIKP, campo PODAT) o en las tablas POD relacionadas (VLPOD). Capturar Utilice la fecha de Prueba de Entrega (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 las mercancías del almacén. Reduce el inventario y contabiliza el costo de las mercancías vendidas, marcando 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 punto definitivo en el que las mercancías han salido de la posesión de la empresa para su entrega. Dónde obtener Este es un evento explícito que crea un documento de material. El timestamp 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 con la entrega de salida. Tipo de evento explicit | |||
| Disponibilidad de Inventario Verificada | Representa la verificación del sistema o manual para determinar si los artículos solicitados están en stock para cumplir con el pedido de venta. Este es a menudo un paso automatizado durante la creación del pedido de venta, pero puede no registrarse como un evento discreto. | ||
| Por qué es importante Comprender el tiempo entre un pedido y esta verificación, y su resultado, ayuda a analizar cómo los niveles de inventario impactan los tiempos de cumplimiento. Los retrasos aquí a menudo conducen a actividades de adquisición o producción. Dónde obtener Esto no suele ser un evento explícito. Puede inferirse de la creación de la primera línea de programa confirmada en la tabla de ítems del pedido de venta (VBEP) o de los cambios de estado dentro del ítem del pedido. Capturar Se infiere de la actualización del estado de confirmación en la línea de programa del pedido de venta (tabla VBEP). Tipo de evento inferred | |||
| Entrega de Salida Creada | Significa la creación de un documento de entrega, que autoriza la preparación y el envío de mercancías al cliente. Esta actividad transiciona 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 de cumplimiento físico. Los retrasos entre la creación del pedido y la creación de la entrega pueden indicar problemas de planificación o disponibilidad. Dónde obtener Este es un evento explícito. El timestamp de creación se registra en la tabla de cabecera de la entrega (LIKP, campo ERDAT). Capturar 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 más entregas para la planificación del transporte. Este documento contiene detalles sobre el transportista, la ruta y el modo de transporte. | ||
| Por qué es importante Esta actividad es 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 revela la eficiencia del proceso de transporte. Dónde obtener Este es un evento explícito registrado en la tabla de cabecera de envío (VTTK, campo ERDAT). Esto forma parte del módulo LE-TRA, que puede no ser utilizado por 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 de Cliente Creada | Esta actividad marca la creación del documento de facturación para el cliente basado en los bienes o servicios entregados. Inicia la parte final del proceso de liquidación financiera. | ||
| 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 impactar negativamente el flujo de caja. Dónde obtener Este es un evento explícito. El timestamp 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 sobre los bienes producidos. El resultado de esta inspección, ya sea aprobado o reprobado, se registra en una decisión de uso. | ||
| Por qué es importante Esta actividad es crucial para monitorear la calidad del producto e identificar problemas de producción. Las altas tasas de rechazo o los largos tiempos de inspección pueden ser cuellos de botella significativos. Dónde obtener Este es un evento explícito capturado cuando se toma una decisión de uso para un lote de inspección de calidad. La fecha de decisión se encuentra en la tabla QALS (campo PASTRTERM) o en la tabla QAVE. Capturar Utilice el timestamp cuando se registra la decisión de uso para el lote de inspección (tablas QALS/QAVE). Tipo de evento explicit | |||
| Mercancía Descargada en Destino | Esta actividad significa la descarga física de mercancías en la ubicación del cliente. Este evento puede no ser rastreado explícitamente en SAP y a menudo necesita ser inferido de los datos del transportista o de eventos posteriores. | ||
| Por qué es importante Esto marca el final del tramo en tránsito del viaje. La duración desde la salida de mercancías hasta este punto es el tiempo de transporte, que es clave para la optimización logística. Dónde obtener Esto rara vez es un evento explícito en el ERP central. Puede inferirse de mensajes EDI del transportista, datos del módulo de Gestión de Transporte (TM) o el timestamp del documento de prueba de entrega si está disponible. Capturar Se infiere de las actualizaciones de estado del transportista (por ejemplo, EDI 214) o se utiliza la marca de tiempo de la Prueba de Entrega como un proxy cercano. Tipo de evento inferred | |||
| Orden de Producción Creada | Indica que se ha creado una orden de producción para fabricar los productos terminados requeridos para el pedido de venta. Este 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 entrega de fabricación. Analizar esto ayuda a identificar los retrasos entre la señal de demanda y el inicio de la producción. Dónde obtener Este es un evento explícito. La fecha de creación se registra en la tabla de cabecera de la orden 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 Completada | Esta actividad marca la finalización del proceso físico de recogida de artículos del almacén para la entrega de salida. En muchos sistemas, esto se confirma cuando se actualiza el estado de recogida del documento de entrega. | ||
| Por qué es importante Una recogida eficiente es crítica para el rendimiento del almacén. El seguimiento de esta actividad ayuda a identificar cuellos de botella en las operaciones del almacén y a medir el rendimiento de la recogida. Dónde obtener Esto a menudo no es un evento discreto único, pero puede inferirse de los cambios de estado. Se registra cuando el estado de picking en la tabla de ítems de entrega (LIPS, campo KOSTA) se establece en 'C' (Completamente procesado). Capturar Se infiere de los documentos de cambio cuando el estado de recogida (LIPS-KOSTA) se actualiza a 'totalmente recogido'. Tipo de evento inferred | |||
| Solicitud de Compra Creada | Esta actividad significa la creación de una solicitud interna para adquirir bienes o materias primas necesarias. A menudo se activa cuando el inventario es insuficiente para cumplir un pedido de venta o cae por debajo de un punto de reorden. | ||
| Por qué es importante Este es el primer paso en el ciclo de adquisición. Rastrear su creación ayuda a identificar retrasos en el inicio de la adquisición y apoya el análisis del proceso de compra de principio a fin. Dónde obtener Este es un evento explícito. El timestamp de creación se registra en la tabla de cabecera de la solicitud de pedido (EBAN, campo BADAT). Capturar Utilice la fecha de creación (EBAN-BADAT) para el documento de solicitud de pedido. Tipo de evento explicit | |||
Guías de Extracción
Pasos
- Requisitos Previos: Asegúrese de tener un usuario con las autorizaciones suficientes para acceder a las vistas Core Data Services (CDS) de SAP S/4HANA requeridas. Esto típicamente exige 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.
- Establecer Conexión con la Base de Datos: Configure su cliente SQL para conectarse a la base de datos SAP S/4HANA. Necesitará el host del servidor de la base de datos, el puerto (por ejemplo, 3xx15, donde xx es el 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 proporcionada en la sección de consulta de este documento en el editor de su cliente SQL. Esta consulta está diseñada para extraer todas las actividades especificadas de varios módulos de logística y ventas.
- Establecer 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 reemplazar'YourCompanyCode'con el código de sociedad real que está analizando y ajustar los marcadores de posición del rango de fechas como'YYYY-MM-DD'para definir el período de extracción deseado. - Ejecutar 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 en su sistema. Es aconsejable ejecutarlo durante horas de baja actividad para minimizar la carga del sistema.
- Revisar Resultados Iniciales: Una vez que la consulta finalice, examine brevemente la salida en su cliente SQL. Verifique un número razonable de filas, asegúrese de que columnas como LogisticsOrder, ActivityName y EventTime estén pobladas, y confirme que aparezcan varios nombres de actividad.
- Exportar Datos a CSV: Exporte el conjunto de resultados completo desde su cliente SQL a un archivo CSV. Elija la codificación UTF-8 para evitar problemas con caracteres especiales.
- Formato para Carga: Asegúrese de que los encabezados de columna en el archivo CSV final coincidan exactamente con los nombres de atributos requeridos para la ingesta (por ejemplo,
LogisticsOrder,ActivityName,EventTime). No se necesitará ninguna transformación adicional de datos si la consulta SQL se utiliza tal como se proporciona.
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, incluyendo, entre otras, I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment e I_BillingDocumentItem. - Filtro por Rango de Fechas: La consulta proporcionada incluye un marcador de posición para un filtro por rango de fechas, típicamente en un campo de fecha de creación (
CreationDateoDocumentDate). Para un análisis inicial, se recomienda un período de 3 a 6 meses para asegurar un conjunto de datos representativo sin causar una carga excesiva en el sistema. - Filtros de Negocio Clave: Es fundamental filtrar los datos por unidades organizativas específicas para asegurar la relevancia. La consulta está preconfigurada con un marcador de posición para
CompanyCode. También podría querer añadir filtros paraSalesOrganization,DistributionChanneloPlantdependiendo del alcance de su análisis. - Consideraciones de Rendimiento: Esta es una consulta compleja que une múltiples vistas CDS grandes. Su ejecución puede consumir importantes recursos del sistema. Programe las extracciones fuera del horario comercial. Para conjuntos de datos muy grandes, considere ejecutar la consulta en lotes más pequeños y secuenciales 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
- Requisitos Previos: Asegúrese de tener un usuario con las autorizaciones suficientes para acceder a las vistas Core Data Services (CDS) de SAP S/4HANA requeridas. Esto típicamente exige 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.
- Establecer Conexión con la Base de Datos: Configure su cliente SQL para conectarse a la base de datos SAP S/4HANA. Necesitará el host del servidor de la base de datos, el puerto (por ejemplo, 3xx15, donde xx es el 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 proporcionada en la sección de consulta de este documento en el editor de su cliente SQL. Esta consulta está diseñada para extraer todas las actividades especificadas de varios módulos de logística y ventas.
- Establecer 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 reemplazar'YourCompanyCode'con el código de sociedad real que está analizando y ajustar los marcadores de posición del rango de fechas como'YYYY-MM-DD'para definir el período de extracción deseado. - Ejecutar 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 en su sistema. Es aconsejable ejecutarlo durante horas de baja actividad para minimizar la carga del sistema.
- Revisar Resultados Iniciales: Una vez que la consulta finalice, examine brevemente la salida en su cliente SQL. Verifique un número razonable de filas, asegúrese de que columnas como LogisticsOrder, ActivityName y EventTime estén pobladas, y confirme que aparezcan varios nombres de actividad.
- Exportar Datos a CSV: Exporte el conjunto de resultados completo desde su cliente SQL a un archivo CSV. Elija la codificación UTF-8 para evitar problemas con caracteres especiales.
- Formato para Carga: Asegúrese de que los encabezados de columna en el archivo CSV final coincidan exactamente con los nombres de atributos requeridos para la ingesta (por ejemplo,
LogisticsOrder,ActivityName,EventTime). No se necesitará ninguna transformación adicional de datos si la consulta SQL se utiliza tal como se proporciona.
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, incluyendo, entre otras, I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment e I_BillingDocumentItem. - Filtro por Rango de Fechas: La consulta proporcionada incluye un marcador de posición para un filtro por rango de fechas, típicamente en un campo de fecha de creación (
CreationDateoDocumentDate). Para un análisis inicial, se recomienda un período de 3 a 6 meses para asegurar un conjunto de datos representativo sin causar una carga excesiva en el sistema. - Filtros de Negocio Clave: Es fundamental filtrar los datos por unidades organizativas específicas para asegurar la relevancia. La consulta está preconfigurada con un marcador de posición para
CompanyCode. También podría querer añadir filtros paraSalesOrganization,DistributionChanneloPlantdependiendo del alcance de su análisis. - Consideraciones de Rendimiento: Esta es una consulta compleja que une múltiples vistas CDS grandes. Su ejecución puede consumir importantes recursos del sistema. Programe las extracciones fuera del horario comercial. Para conjuntos de datos muy grandes, considere ejecutar la consulta en lotes más pequeños y secuenciales 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
- Requisitos Previos: Asegúrese de tener 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 de tablas de la cadena de suministro como VBAK, LIKP, EKKO y MKPF.
- Crear Programa: Abra el Editor ABAP usando el código de transacción
SE38. Ingrese 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'. - Insertar Código: Copie el código ABAP completo de la sección 'query' a continuación y péguelo en el Editor ABAP para su nuevo programa.
- Definir Elementos de Texto: Navegue a Ir a > Elementos de Texto > Textos de Selección. Active todas las etiquetas de pantalla de selección propuestas para asegurar que la interfaz de usuario sea clara y fácil de usar.
- Activar Programa: Guarde y active el programa presionando CTRL+S y luego CTRL+F3, o usando el icono de activación en la barra de herramientas. Resuelva cualquier error de sintaxis que pueda surgir debido a configuraciones específicas del sistema.
- Ejecutar Programa: Ejecute el programa presionando F8 o usando el botón 'Procesamiento directo'. Aparecerá una pantalla de selección que le permitirá filtrar los datos a extraer.
- Establecer Parámetros de Extracción: En la pantalla de selección, especifique el rango de fechas para la Fecha de Creación del Pedido de Venta. Es altamente recomendable filtrar también por Sociedades o Organizaciones de Ventas específicas para gestionar el volumen de datos. Ingrese la ruta completa para el archivo de salida en el servidor de aplicaciones SAP.
- Ejecutar en Segundo Plano: Para grandes conjuntos de datos que cubren varios meses, es crucial ejecutar el programa en segundo plano para evitar tiempos de espera de transacción. Desde el menú, elija Programa > Ejecutar en segundo plano y programe la tarea.
- Recuperar Archivo de Datos: Una vez completada la ejecución del programa, use el código de transacción
AL11para navegar al directorio en el servidor de aplicaciones que especificó. Localice el archivo generado y descárguelo a su máquina local usando la transacciónCG3Y. - Preparar para la Carga: Asegúrese de que el archivo descargado esté en un formato de texto plano, como CSV con delimitadores de coma o punto y coma, y que use codificación UTF-8. El archivo ya está listo para ser cargado a la herramienta de Process Mining.
Configuración
- Rango de Fechas de Selección (S_ERDAT): Este es el filtro más crítico. Define el período de tiempo para la selección inicial de pedidos de venta basándose en su fecha de creación (
VBAK-ERDAT). Comience con un período enfocado, como los últimos 3 a 6 meses, para asegurar volúmenes de datos manejables. - Organización de Ventas (S_VKORG): Un filtro opcional para restringir la extracción a organizaciones de ventas específicas. Esto es útil para enfocar el análisis en una unidad de negocio o región particular.
- Sociedad (S_BUKRS): Un filtro opcional para limitar los datos a sociedades específicas. Esto es altamente recomendado para reducir el alcance de los datos y mejorar el rendimiento.
- Ruta del Archivo de Salida (P_FILE): La ruta completa en el servidor de aplicaciones SAP donde se guardará el archivo final del registro de eventos. El usuario que ejecuta 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 se puede ejecutar 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 y reducir la carga en el sistema durante las horas pico.
- Autorizaciones del Sistema: El usuario que ejecuta el informe requiere acceso de lectura a todas las tablas subyacentes, incluyendo, 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.