Su Template de datos de Purchase to Pay - Purchase Order
Su Template de datos de Purchase to Pay - Purchase Order
- Atributos recomendados para recopilar
- Actividades clave que debe supervisar
- Guía de extracción para SAP ECC
Purchase to Pay - Purchase Order: Atributos
| Nombre | Descripción | ||
|---|---|---|---|
| Actividad Activity | El nombre del evento o paso empresarial específico que tuvo lugar durante el ciclo de vida de la orden de compra. | ||
| Descripción Este atributo describe un paso individual del proceso, como «Orden de compra creada», «Orden de compra aprobada» o «Entrada de mercancías contabilizada». La secuencia de estas actividades forma el flujo del proceso de cada orden de compra. El análisis de la secuencia, la frecuencia y la duración entre actividades constituye el núcleo de Process Mining. Ayuda a identificar cuellos de botella, ciclos de retrabajo y desviaciones del proceso estándar, lo que permite realizar mejoras específicas y estandarizar las operaciones. Por qué es importante Las actividades definen los pasos del proceso. Analizar su secuencia y sus tiempos revela el flujo real del proceso, los cuellos de botella y las desviaciones. Dónde obtenerlo Se obtiene de diversas tablas de SAP y registros de transacciones, como CDHDR/CDPOS para los cambios, EKBE para GR/IR y EBAN para las solicitudes. A menudo requiere lógica personalizada o un programa de extracción para generarlo. Ejemplos Orden de compra creadaOrden de compra aprobadaEntrada de mercancías contabilizada | |||
| Hora del evento EventTime | La fecha y hora exactas en las que tuvo lugar la actividad. | ||
| Descripción Esta marca de tiempo indica el momento exacto en que ocurrió un evento, como la aprobación de una orden de compra o la contabilización de una entrada de mercancías. Proporciona el orden cronológico de todas las actividades de un caso. Las marcas de tiempo son fundamentales para Process Mining, ya que permiten realizar todos los análisis basados en el tiempo. Esto incluye calcular los tiempos de ciclo entre actividades, identificar retrasos, analizar el rendimiento del proceso y medir el desempeño frente a los acuerdos de nivel de servicio (SLA). Por qué es importante Esta marca de tiempo es fundamental para calcular todas las métricas basadas en la duración, como los tiempos de ciclo y los cuellos de botella, y para ordenar cronológicamente los eventos. Dónde obtenerlo Se obtiene de diversos campos de fecha y hora de las tablas de SAP, como EKKO-AEDAT (fecha de modificación), CDHDR-UDATE/UTIME (marca de tiempo del registro de cambios) o EKBE-BUDAT (fecha de contabilización). Ejemplos 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Orden de compra PurchaseOrder | El identificador único del documento de orden de compra, que sirve como caso principal para realizar el seguimiento del proceso de compras. | ||
| Descripción El número de orden de compra es el identificador central que vincula todas las actividades, desde su creación hasta la recepción final de mercancías y la finalización. Cada número de orden de compra único representa una instancia individual del proceso de compras. En Process Mining, este atributo es esencial para reconstruir el recorrido completo de cada compra. Permite analizar en detalle los tiempos de ciclo, las variaciones del proceso y los controles de cumplimiento de cada orden, y constituye la base de todo el modelo de proceso. Por qué es importante Este es el identificador principal que conecta todos los eventos relacionados y permite analizar el ciclo de vida completo de cada orden de compra. Dónde obtenerlo Tabla: EKKO, campo: EBELN Ejemplos 450001762345000176244500017625 | |||
| Grupo de materiales MaterialGroup | Una clasificación para agrupar materiales o servicios con características similares. | ||
| Descripción El grupo de materiales, o categoría de compra, se utiliza para clasificar el tipo de bienes o servicios adquiridos. Algunos ejemplos son «Hardware de TI», «Material de oficina» o «Servicios profesionales». Este atributo es fundamental para analizar el gasto y comprender los patrones de compras. Permite filtrar el proceso para analizar cómo se gestionan las distintas categorías, quién las aprueba y qué proveedores las suministran. Es una dimensión clave del Dashboard de análisis del valor de las órdenes de compra. Por qué es importante Permite segmentar el proceso por categoría de producto o servicio y revelar diferencias de comportamiento, tiempos de ciclo o proveedores según el tipo de gasto. Dónde obtenerlo Tabla: EKPO, campo: MATKL Ejemplos 00101IT_HWCONSULT | |||
| Importe de la orden OrderAmount | El valor monetario total de la posición de la orden de compra. | ||
| Descripción Este atributo representa el valor total de una posición específica de la orden de compra, calculado como la cantidad multiplicada por el precio neto. Para obtener el valor total de la orden de compra, es necesario agregar los importes de las posiciones. Analizar el proceso por importe de la orden es fundamental para identificar transacciones de alto valor que puedan requerir controles más estrictos o rutas de aprobación diferentes. Alimenta el Dashboard de análisis del valor de las órdenes de compra y ayuda a priorizar las mejoras del proceso en las órdenes con mayor impacto financiero. Por qué es importante Cuantifica el impacto financiero de cada compra y permite realizar análisis basados en el valor para priorizar las órdenes de alto importe o identificar oportunidades de ahorro. Dónde obtenerlo Tabla: EKPO, campo: NETWR (valor neto de la orden). Ejemplos 1500.00250.7512345.50 | |||
| Nombre de usuario UserName | El ID de usuario de la persona que ejecutó la actividad. | ||
| Descripción Este atributo registra el nombre de usuario de SAP de la persona empleada que creó, modificó o aprobó un documento. En los pasos automatizados, puede mostrar el ID de un usuario del sistema o de un proceso por lotes. El análisis por usuario ayuda a identificar necesidades de formación, personas con un alto desempeño o posibles problemas de cumplimiento. Es clave para crear Dashboards relacionados con la distribución de la carga de trabajo, el cumplimiento de la matriz de aprobación y el desempeño de distintos equipos o personas. Por qué es importante Atribuye las acciones de los usuarios a personas concretas, lo que permite analizar su desempeño, carga de trabajo y cumplimiento de los protocolos de cumplimiento. Dónde obtenerlo Tabla: EKKO, campo: ERNAM (creado por); tabla: CDHDR, campo: USERNAME (modificado por). Ejemplos JSMITHMBROWNBATCH_USER | |||
| Número de proveedor VendorNumber | El identificador único del proveedor. | ||
| Descripción Es el código que identifica de forma única al proveedor al que se compran los bienes o servicios. Es un dato maestro fundamental del proceso de compras. Este atributo es esencial para el análisis centrado en proveedores. Permite evaluar el desempeño de las entregas, comparar los plazos de entrega entre distintos proveedores y analizar los patrones de gasto. Es la dimensión principal del Dashboard de desempeño de las entregas de proveedores. Por qué es importante Permite analizar el desempeño de los proveedores y ayuda a identificar a los proveedores fiables y a aquellos que provocan retrasos o problemas de calidad. Dónde obtenerlo Tabla: EKKO, campo: LIFNR Ejemplos 100345V-20598700112 | |||
| Sociedad CompanyCode | El identificador de la entidad jurídica o sociedad que inicia la compra. | ||
| Descripción La sociedad representa una entidad jurídica independiente en SAP. Todas las transacciones se contabilizan a nivel de sociedad, por lo que constituye una unidad organizativa fundamental. Analizar el proceso por sociedad permite comparar la eficiencia y el cumplimiento de las compras entre distintas unidades de negocio o países. Ayuda a identificar buenas prácticas en una entidad que podrían replicarse en otras, o a localizar las unidades que tienen dificultades con el proceso. Por qué es importante Representa la entidad jurídica y permite comparar el desempeño del proceso y realizar controles de cumplimiento en distintas partes de la organización. Dónde obtenerlo Tabla: EKKO, campo: BUKRS Ejemplos 10002100US01 | |||
| Tipo de documento DocumentType | Un código que clasifica los distintos tipos de órdenes de compra. | ||
| Descripción El tipo de documento es una configuración de SAP que controla el rango de numeración, la selección de campos y el flujo general del proceso de una orden de compra. Por ejemplo, puede haber tipos distintos para órdenes de compra estándar, órdenes de servicios u órdenes de traslado de stock. Este atributo es una dimensión de análisis muy útil, ya que los distintos tipos de documento suelen seguir procesos intencionadamente diferentes. Filtrar por tipo de documento permite comparar con mayor precisión tiempos de ciclo y flujos de proceso equivalentes. Por qué es importante Distingue entre distintos tipos de procesos de compra, como estándar, servicios o devoluciones, que suelen tener rutas y expectativas de desempeño diferentes. Dónde obtenerlo Tabla: EKKO, campo: BSART Ejemplos NBFOUB | |||
| ¿Es un cambio posterior a la aprobación? IsPostApprovalChange | Indicador que señala si se produjo un cambio en una PO después de la aprobación inicial. | ||
| Descripción Este atributo booleano es verdadero si se detecta una actividad «Purchase Order Changed» después de una actividad «Purchase Order Approved» para la misma PO. Ayuda a aislar los cambios problemáticos que se producen en una fase avanzada del proceso. Este campo calculado respalda directamente el KPI «Post-Approval PO Change Rate» y el Dashboard «Purchase Order Rework and Changes». Ayuda a cuantificar y destacar los cambios disruptivos que pueden provocar retrasos y exigir una nueva aprobación, lo que apunta a problemas en la especificación inicial o en el alcance del proceso. Por qué es importante Mide directamente el retrabajo posterior a la aprobación, un KPI clave para la estabilidad y la eficiencia del proceso. Los índices elevados indican problemas en la definición inicial de los requisitos. Dónde obtenerlo Se trata de un atributo calculado a partir de la secuencia de actividades del Registro de eventos. Ejemplos truefalse | |||
| ¿La entrega se realizó a tiempo? IsOnTimeDelivery | Indicador que señala si los bienes se recibieron en la fecha de entrega solicitada o antes. | ||
| Descripción Este atributo booleano es verdadero si la marca de tiempo de la actividad «Goods Receipt Posted» es anterior o igual a la «Requested Delivery Date». Proporciona un resultado binario claro sobre el desempeño de la entrega de cada posición de la PO. Este atributo es la base del KPI «On-Time Goods Receipt Rate». Simplifica el análisis del desempeño de los proveedores y de la eficiencia interna de recepción, ya que permite agregar y filtrar fácilmente las entregas realizadas a tiempo y las entregas tardías. Por qué es importante Proporciona una métrica clara de éxito o incumplimiento de los plazos de entrega y respalda directamente los KPI y los Dashboard de desempeño de los proveedores. Dónde obtenerlo Se trata de un atributo calculado mediante la comparación de la fecha de contabilización de la recepción de mercancías (EKBE-BUDAT) con la fecha de entrega solicitada (EKPO-EINDT). Ejemplos truefalse | |||
| Centro Plant | La ubicación física o el centro donde deben entregarse los bienes. | ||
| Descripción El centro es una unidad organizativa que representa una instalación de producción, un almacén u otra ubicación donde se reciben bienes o servicios. Analizar los datos por centro ayuda a comprender las diferencias geográficas del proceso de compras. Puede revelar diferencias en los tiempos de entrega de los proveedores a determinadas ubicaciones o poner de manifiesto centros con procesos de recepción ineficientes, lo que facilita el análisis de la puntualidad de las entradas de mercancías. Por qué es importante Especifica la ubicación de entrega y resulta útil para analizar las diferencias regionales del proceso y el desempeño logístico. Dónde obtenerlo Tabla: EKPO, campo: WERKS Ejemplos 100011002000 | |||
| Fecha de entrega solicitada RequestedDeliveryDate | La fecha en la que la empresa solicitó al proveedor que entregara los bienes o servicios. | ||
| Descripción Es la fecha de entrega objetivo especificada en la orden de compra. Sirve como referencia para medir el desempeño real de las entregas. Esta fecha es esencial para calcular el KPI de la tasa de entradas de mercancías puntuales. Al comparar la fecha real de entrada de mercancías con la fecha solicitada, las organizaciones pueden medir cuantitativamente la fiabilidad del proveedor y la eficiencia interna de recepción, lo que contribuye directamente al Dashboard de desempeño de las entregas de proveedores. Por qué es importante Es la fecha objetivo de entrega, fundamental para calcular los KPI de puntualidad y evaluar la fiabilidad del proveedor. Dónde obtenerlo Tabla: EKPO, campo: EINDT Ejemplos 2023-06-102023-07-222023-08-01 | |||
| Grupo de compras PurchasingGroup | La persona compradora o el grupo de personas compradoras responsables de la actividad de compras. | ||
| Descripción El grupo de compras representa a la persona o al equipo responsable de una determinada actividad de compras. Es el principal punto de contacto con los proveedores. Este atributo proporciona un nivel de análisis más detallado que la organización de compras. Ayuda a comprender la distribución de la carga de trabajo entre las personas compradoras e identificar diferencias de desempeño a ese nivel, lo que puede orientar la asignación de recursos y las iniciativas de formación. Por qué es importante Ofrece una visión detallada de quién es responsable de una compra y permite analizar la carga de trabajo y el desempeño a nivel de persona compradora o equipo. Dónde obtenerlo Tabla: EKKO, campo: EKGRP Ejemplos 001002N01 | |||
| Moneda Currency | El código de moneda del importe de la orden de compra. | ||
| Descripción Este atributo especifica la moneda en la que se expresa el valor de la orden de compra, como USD, EUR o GBP. Proporciona el contexto necesario para interpretar cualquier importe monetario. Para las organizaciones internacionales, la moneda es fundamental para realizar análisis financieros correctos. Permite agregar y comparar adecuadamente los valores de las órdenes, y todos los KPI monetarios deben interpretarse teniendo en cuenta su moneda. Por qué es importante Proporciona el contexto necesario para todos los importes monetarios y garantiza un análisis financiero preciso, especialmente en organizaciones multinacionales. Dónde obtenerlo Tabla: EKKO, campo: WAERS Ejemplos USDEURJPY | |||
| Motivo del rechazo RejectionReason | Código o texto que explica por qué se rechazó una solicitud de compra o una orden de compra. | ||
| Descripción Este atributo registra el motivo específico indicado cuando se rechaza una orden de compra durante el Workflow de aprobación. Esta información es fundamental para comprender las causas raíz del retrabajo y los retrasos. El análisis de los motivos de rechazo ayuda a identificar problemas frecuentes, como precios incorrectos, excesos presupuestarios o selección de proveedores que no cumplen los requisitos. Esta información permite abordar las causas raíz, mejorar la calidad de la creación inicial de la PO y agilizar el proceso de aprobación. Por qué es importante Proporciona información directa sobre los motivos por los que fallan las aprobaciones, lo que permite aplicar mejoras específicas para reducir el retrabajo y acortar los tiempos del ciclo de aprobación. Dónde obtenerlo Esta información puede ser difícil de localizar. Puede almacenarse en campos de texto extensos o depender de una configuración personalizada del Workflow. A menudo requiere conocimientos específicos de la implementación. Ejemplos Precio incorrectoPresupuesto excedidoSolicitud duplicada | |||
| Nombre del proveedor VendorName | El nombre legal del proveedor. | ||
| Descripción El nombre descriptivo del proveedor, más fácil de interpretar que su número. Normalmente se obtiene de los datos maestros de proveedores. Mientras que el número de proveedor se utiliza para las uniones y la identificación única, el nombre del proveedor es fundamental para los Dashboards y los informes dirigidos a los usuarios. Hace que los análisis sean más intuitivos y accesibles para las personas que no conocen los códigos de proveedor. Por qué es importante Proporciona un nombre legible para el proveedor, lo que facilita considerablemente la interpretación de los Dashboards y los informes por parte de los usuarios de negocio. Dónde obtenerlo Tabla: LFA1, campo: NAME1. Requiere una unión de EKKO-LIFNR con LFA1-LIFNR. Ejemplos Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organización de compras PurchasingOrganization | La unidad organizativa responsable de negociar precios y adquirir materiales o servicios. | ||
| Descripción La organización de compras es una unidad organizativa clave de SAP responsable de las actividades de compras. Puede estar centralizada para toda la empresa o descentralizada por centro o región. Analizar el desempeño del proceso por organización de compras ayuda a identificar qué equipos de compras son más eficientes. Permite comparar métricas como el tiempo de ciclo, las tasas de retrabajo y los costes entre distintas unidades organizativas, y poner de relieve las buenas prácticas y las áreas que necesitan apoyo. Por qué es importante Identifica al equipo de compras responsable y permite comparar el desempeño y analizar distintas unidades organizativas. Dónde obtenerlo Tabla: EKKO, campo: EKORG Ejemplos 1000US01DE01 | |||
| Sistema de origen SourceSystem | El sistema del que se extrajeron los datos. | ||
| Descripción Este atributo identifica el origen de los datos, que normalmente es el identificador de una instancia de SAP ECC, como «ECC_PROD_100». En entornos con varios sistemas, ayuda a diferenciar las fuentes de datos. Para la gobernanza y el linaje de datos, conocer el sistema de origen es fundamental. Garantiza la integridad de los datos y facilita la resolución de problemas de extracción o calidad, especialmente cuando los datos se combinan desde distintos sistemas ERP o módulos. Por qué es importante Identifica el origen de los datos, un aspecto fundamental para la gobernanza y validación de datos y para gestionar análisis en varios sistemas. Dónde obtenerlo Normalmente, es un valor estático que se añade durante el proceso de extracción de datos para etiquetar el conjunto de datos con su sistema de origen. Ejemplos SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Solicitud de compra PurchaseRequisition | El identificador de la solicitud de compra que precedió a la orden de compra. | ||
| Descripción Este atributo vincula la orden de compra con la solicitud de compra de origen. No todas las órdenes de compra tienen una solicitud previa. Este vínculo es fundamental para analizar el Dashboard de conversión de solicitudes a órdenes y el KPI de la tasa de conversión de solicitudes de compra a órdenes de compra. Permite medir la eficiencia del proceso previo, desde la solicitud inicial hasta la creación de una orden formal, e identificar órdenes de compra no conformes creadas sin una solicitud. Por qué es importante Vincula la orden de compra con su solicitud de origen, lo que permite analizar el proceso de conversión de solicitud de compra a orden de compra e identificar órdenes creadas sin una solicitud previa. Dónde obtenerlo Tabla: EKPO, campo: BANFN Ejemplos 1001589010015891 | |||
| Última actualización de datos LastDataUpdate | La marca de tiempo que indica cuándo se actualizaron por última vez los datos del sistema de origen. | ||
| Descripción Este atributo registra la fecha y hora de la extracción o actualización de datos más reciente. Proporciona contexto sobre la actualidad de los datos analizados. Mostrar esta información en los Dashboards es fundamental para que los usuarios sepan si los insights se basan en datos casi en tiempo real o en una instantánea histórica. Ayuda a gestionar las expectativas y garantiza que las decisiones se tomen a partir de datos cuya antigüedad se conoce. Por qué es importante Informa a los usuarios sobre la actualidad de los datos y garantiza que comprendan si el análisis refleja el estado operativo más reciente. Dónde obtenerlo Esta marca de tiempo la genera y añade el proceso de extracción de datos o ETL durante su ejecución. Ejemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
Purchase to Pay - Purchase Order: actividades
| Actividad | Descripción | ||
|---|---|---|---|
| Entrada de mercancías contabilizada | Esta actividad indica la recepción física de mercancías de un proveedor asociadas a una orden de compra específica. La contabilización de la entrada de mercancías es una acción explícita, por ejemplo, mediante la transacción MIGO, que crea un documento de material y actualiza el inventario. | ||
| Por qué es importante Este es un hito fundamental para realizar el seguimiento del desempeño de las entregas del proveedor y marca el inicio del proceso de verificación de facturas. Se utiliza para calcular las tasas de entregas puntuales y la puntualidad de las entradas de mercancías. Dónde obtenerlo Se registra cuando se crea un documento de material. La marca de tiempo del evento es la fecha de contabilización (MKPF-BUDAT) o la fecha de creación (MKPF-CPUDT) de la tabla de cabecera de documentos de material (MKPF), vinculada a la orden de compra mediante la tabla de posiciones (MSEG). Recopilar Utilice la marca de tiempo de contabilización o creación de la tabla MKPF para los documentos de material que hagan referencia a la orden de compra. Tipo de evento explicit | |||
| Orden de compra aprobada | Representa la aprobación final de la orden de compra, que autoriza su envío al proveedor. Este hito clave suele inferirse a partir del cambio del estado de liberación de la orden de compra a un estado de «totalmente liberada» o «aprobada». | ||
| Por qué es importante Esta actividad es fundamental para calcular el KPI del tiempo del ciclo de aprobación de la orden de compra e identificar cuellos de botella en el Workflow de aprobación. Es un requisito previo para la mayoría de las actividades posteriores, como el envío de la orden al proveedor. Dónde obtenerlo Se infiere mediante el seguimiento de los registros de cambios (CDHDR/CDPOS) de la tabla de cabecera de órdenes de compra (EKKO), para determinar cuándo se aplica el código de liberación final o cuándo el indicador de estado de liberación general (EKKO-FRGKE) se establece en «liberada». Recopilar Identifique la marca de tiempo en la que el estado de liberación general de la orden de compra (EKKO-FRGKE) cambia al estado final de aprobación. Tipo de evento inferred | |||
| Orden de compra completada | Indica que una posición de la orden de compra se considera entregada por completo. Es un evento inferido, normalmente derivado de la activación automática o manual del indicador «Entrega completada» en la posición de la orden de compra. | ||
| Por qué es importante Esta actividad sirve como punto final lógico de la parte de cumplimiento de la orden. Es esencial para calcular el tiempo total del ciclo de la orden de compra, desde su creación hasta su finalización. Dónde obtenerlo Se infiere a partir de los documentos de cambios (CDHDR/CDPOS) que registran cuándo el indicador «Entrega completada» (EKPO-ELIKZ) se establece en «X» para una posición de la orden de compra. La última posición marcada como completada puede indicar la finalización de toda la orden de compra. Recopilar Identifique la marca de tiempo en los documentos de cambios cuando se establece el indicador EKPO-ELIKZ. Tipo de evento inferred | |||
| Orden de compra creada | Esta actividad indica la creación de un documento formal de orden de compra, que constituye un contrato vinculante con un proveedor. Es un evento explícito que se registra cuando un usuario crea y guarda una orden de compra, por ejemplo, mediante la transacción ME21N, lo que genera entradas en las tablas EKKO y EKPO. | ||
| Por qué es importante Marca el inicio oficial del ciclo de vida de la orden de compra. Sirve como hito clave para medir tanto el tiempo de conversión de solicitud de compra a orden de compra como el tiempo total de cumplimiento de la orden. Dónde obtenerlo Se obtiene de la fecha de creación (EKKO-AEDAT) de la tabla de cabecera de órdenes de compra (EKKO), correspondiente al número de orden de compra (EKKO-EBELN). Recopilar Utilice la marca de tiempo de creación de la tabla EKKO para cada nueva orden de compra. Tipo de evento explicit | |||
| Orden de compra enviada al proveedor | Esta actividad marca el momento en que la orden de compra aprobada se transmite oficialmente al proveedor, por ejemplo, mediante EDI, correo electrónico o impresión. Es un evento explícito que se registra en las tablas de control de mensajes cuando un mensaje de salida se procesa correctamente. | ||
| Por qué es importante Este es un hito fundamental, ya que inicia el cómputo del plazo de entrega del proveedor. Analizar el tiempo transcurrido entre este evento y la recepción de mercancías es clave para evaluar el desempeño del proveedor y la puntualidad de las entregas. Dónde obtenerlo Se registra en la tabla de estados de mensajes (NAST). La marca de tiempo puede obtenerse de NAST-DATVR y NAST-UHRVR cuando el estado de procesamiento (NAST-VSTAT) es «1» (procesado correctamente) para el tipo de mensaje de salida correspondiente de la orden de compra. Recopilar Utilice la marca de tiempo de procesamiento de la tabla NAST para el mensaje de salida de la orden de compra. Tipo de evento explicit | |||
| Solicitud de compra creada | Esta actividad marca la creación de una solicitud formal de bienes o servicios. Es un evento explícito que se registra cuando un usuario guarda un nuevo documento de solicitud de compra, mediante transacciones como ME51N, lo que genera un registro único en la tabla EBAN. | ||
| Por qué es importante Este es el punto de partida principal del proceso de compras. Analizar el tiempo transcurrido entre este evento y la creación de la orden de compra ayuda a medir la eficiencia con la que la demanda interna se convierte en órdenes ejecutables. Dónde obtenerlo Se registra cuando se crea una entrada en la tabla de cabecera de solicitudes de compra (EBAN). La fecha de creación (EBAN-BADAT) y la hora sirven como marca de tiempo de este evento. Recopilar Identifique las nuevas entradas de la tabla EBAN según la fecha de creación. Tipo de evento explicit | |||
| Aprobación de orden de compra solicitada | Indica que una orden de compra creada o modificada se ha enviado para su aprobación conforme a la estrategia de liberación configurada. Este evento se infiere cuando se activa la estrategia de liberación y la orden de compra pasa a un estado de aprobación pendiente. | ||
| Por qué es importante Distinguir entre la creación de la orden de compra y el inicio del proceso de aprobación permite medir con precisión el KPI del tiempo del ciclo de aprobación. También pone de manifiesto cualquier demora antes de que comience el Workflow de aprobación. Dónde obtenerlo Se infiere a partir de los documentos de cambios (CDHDR/CDPOS) de la orden de compra, objeto EINKBELEG, que muestran la configuración inicial de un estado de liberación, o cuando el estado de liberación general (EKKO-FRGKE) adquiere por primera vez un valor que indica que hay un proceso de aprobación activo. Recopilar Identifique la primera entrada del documento de cambios que activa la estrategia de liberación de la orden de compra. Tipo de evento inferred | |||
| Confirmación de servicios introducida | En las órdenes de compra basadas en servicios, esta actividad representa la confirmación de que los servicios se han prestado. Es un evento explícito que se registra mediante la creación de una hoja de entrada de servicios, por ejemplo, mediante la transacción ML81N. | ||
| Por qué es importante Es el equivalente a una entrada de mercancías para los servicios y resulta esencial para realizar el seguimiento del cumplimiento de las órdenes de servicios. Activa el proceso financiero de pago de los servicios. Dónde obtenerlo Se obtiene de la fecha de creación (ESSR-ERDAT) de la tabla de cabecera de hojas de entrada de servicios (ESSR). El vínculo con la orden de compra se encuentra en la tabla ESLL. Recopilar Utilice la marca de tiempo de creación de la tabla ESSR para las hojas de entrada de servicios vinculadas a la orden de compra. Tipo de evento explicit | |||
| Inspección de calidad realizada | Indica que las mercancías recibidas han sido sometidas a una inspección de calidad. Esta actividad suele inferirse cuando se toma una decisión de uso sobre un lote de inspección creado en el momento de la entrada de mercancías, dentro del módulo de Quality Management. | ||
| Por qué es importante En las industrias donde la calidad es fundamental, esta actividad ayuda a analizar la duración y los resultados del proceso de inspección. Los retrasos en esta etapa pueden crear cuellos de botella entre la entrada de mercancías y su disponibilidad para el uso. Dónde obtenerlo Se infiere a partir del módulo de Quality Management. Al recibir las mercancías se crea un lote de inspección en la tabla QALS, y la actividad queda marcada por la creación de una decisión de uso en la tabla QAVE, que incluye una marca de tiempo. Recopilar Identifique la marca de tiempo de la decisión de uso en la tabla QAVE para el lote de inspección vinculado al documento de material. Tipo de evento inferred | |||
| Mercancías devueltas | Representa la devolución al proveedor de mercancías recibidas anteriormente, normalmente debido a problemas de calidad o envíos incorrectos. Es un evento explícito que se registra al contabilizar un documento de material con un tipo de movimiento específico para devoluciones. | ||
| Por qué es importante Esta actividad pone de manifiesto problemas de calidad del proveedor o de exactitud de la orden, y es un indicador clave del retrabajo del proceso. Es fundamental para calcular el KPI de la tasa de variación de entradas de mercancías. Dónde obtenerlo Se registra en las tablas de documentos de material (MKPF/MSEG) cuando se utiliza un tipo de movimiento de devolución, como «122» para devolución al proveedor. La fecha de contabilización (MKPF-BUDAT) sirve como marca de tiempo. Recopilar Identifique los documentos de material con un tipo de movimiento de devolución, como 122, que hagan referencia a la orden de compra original. Tipo de evento explicit | |||
| Orden de compra eliminada | Representa la cancelación o eliminación lógica de una posición de la orden de compra, lo que impide continuar con actividades como la entrada de mercancías o la facturación. Es un evento inferido que se registra cuando se establece el indicador de eliminación en la posición de la orden de compra. | ||
| Por qué es importante Esta es una actividad terminal que indica que una orden fue cancelada. Analizar por qué y cuándo se eliminan las órdenes puede revelar problemas en la planificación de la demanda o en la selección de proveedores. Dónde obtenerlo Se infiere a partir de los documentos de cambios (CDHDR/CDPOS) que muestran que el indicador de eliminación (EKPO-LOEKZ) se ha establecido en «L» para una posición de la orden de compra. Recopilar Identifique la marca de tiempo en los documentos de cambios cuando se establece el indicador EKPO-LOEKZ. Tipo de evento inferred | |||
| Orden de compra modificada | Representa cualquier modificación realizada en una orden de compra después de su creación inicial, como cambios en la cantidad, el precio o las fechas de entrega. Estos cambios se registran explícitamente en el sistema de documentos de cambios de SAP. | ||
| Por qué es importante Los cambios frecuentes, especialmente después de la aprobación, indican ineficiencias del proceso, una planificación inicial deficiente o un aumento del alcance. Esta actividad es esencial para el Dashboard de retrabajo y cambios de órdenes de compra y sus KPI relacionados. Dónde obtenerlo Se registra explícitamente en las tablas de cabecera de documentos de cambios (CDHDR) y de posiciones (CDPOS) para el objeto de orden de compra (EINKBELEG). Cada cambio crea una nueva entrada con su marca de tiempo. Recopilar Extraiga los eventos de cambio y sus marcas de tiempo de las tablas CDHDR y CDPOS vinculadas al número de orden de compra. Tipo de evento explicit | |||
| Orden de compra rechazada | Esta actividad ocurre cuando una persona aprobadora rechaza una orden de compra durante el Workflow de aprobación. Es un evento inferido, derivado de un cambio de estado en los datos de la estrategia de liberación de la orden de compra que indica que se ha producido un rechazo. | ||
| Por qué es importante El seguimiento de los rechazos ayuda a identificar problemas de calidad de los datos de la orden de compra, incumplimientos de políticas o deficiencias en la matriz de aprobación. A menudo genera retrabajo y aumenta el tiempo total del ciclo. Dónde obtenerlo Se infiere a partir de los documentos de cambios (CDHDR/CDPOS) del estado de liberación de la orden de compra. Normalmente, un rechazo se registra cuando se cancela un código de liberación o se establece un estado de rechazo específico. Recopilar Supervise los registros de cambios para detectar la cancelación de un código de liberación o un cambio de estado que indique un rechazo. Tipo de evento inferred | |||
| Solicitud de compra aprobada | Representa la aprobación formal de una solicitud de compra, que autoriza su conversión en una orden de compra. Este evento se infiere a partir de los cambios en los campos de estado de liberación de los datos de la solicitud, registrados mediante el Workflow de estrategia de liberación de SAP. | ||
| Por qué es importante El seguimiento de las aprobaciones es fundamental para identificar cuellos de botella en la fase previa a la orden y garantizar el cumplimiento de las políticas de aprobación. Los retrasos en esta etapa afectan directamente al tiempo total del ciclo de compras. Dónde obtenerlo Se infiere a partir de los registros de cambios de la tabla de solicitudes de compra (EBAN), en particular mediante el seguimiento de los cambios en los campos de estado de liberación, como EBAN-FRGZU, o mediante el análisis de los documentos de cambios de CDHDR/CDPOS para el objeto EBAN. Recopilar Supervise los documentos de cambios de los campos de estado de liberación de EBAN para identificar la marca de tiempo de la aprobación final. Tipo de evento inferred | |||
Guías de extracción
Pasos
- Crear el programa ABAP: Abra el ABAP Editor mediante el código de transacción SE38. Introduzca un nombre para el programa nuevo, por ejemplo Z_PM_PO_EXTRACT, y haga clic en «Create». Indique un título como «Process Mining PO Data Extraction» y establezca el tipo «Executable Program».
- Definir la pantalla de selección: Defina en el programa los parámetros de la pantalla de selección. Esto permite filtrar los datos que desea extraer. Los parámetros clave incluyen el intervalo de fechas de creación de la Purchase Order, el código de empresa (BUKRS) y el tipo de documento de compras (BSART).
- Definir las estructuras de datos: Declare una estructura de tabla interna que coincida con el formato final del Registro de eventos. Debe incluir todos los atributos obligatorios y recomendados: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode y DocumentType.
- Implementar la lógica de selección de datos: Escriba la lógica ABAP principal para seleccionar los datos de cada una de las 14 actividades obligatorias. Esto implica consultar varias tablas de SAP, como EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS y NAST. Utilice una subrutina independiente (PERFORM) para cada actividad a fin de mantener el código organizado.
- Seleccionar los datos de la solicitud de compra: Consulte la tabla EBAN para obtener los eventos «Purchase Requisition Created» y relaciónelos con las Purchase Orders mediante la tabla EKPO. Utilice las tablas del registro de cambios (CDHDR, CDPOS) para identificar los eventos «Purchase Requisition Approved» mediante el seguimiento de los cambios en los campos de estado de liberación.
- Seleccionar los eventos principales de la Purchase Order: Consulte las tablas EKKO y EKPO para obtener el evento «Purchase Order Created». Utilice las tablas del registro de cambios (CDHDR, CDPOS) sobre el objeto EINKBELEG para extraer los eventos «Purchase Order Changed», «Purchase Order Approved», «Purchase Order Rejected», «Purchase Order Completed» y «Purchase Order Deleted» según los cambios en campos específicos, como los indicadores de liberación y los indicadores de borrado.
- Seleccionar los eventos de comunicación de la PO: Consulte la tabla NAST para encontrar los registros en los que la PO se transmitió correctamente y capture la actividad «Purchase Order Sent to Vendor».
- Seleccionar los eventos de bienes y servicios: Consulte la tabla EKBE para identificar las contabilizaciones de documentos de material y detectar las actividades «Goods Receipt Posted» y «Goods Returned» según la categoría del tipo de movimiento. Consulte ESSR y ESLL para obtener las hojas de entrada de servicios y capturar «Services Confirmation Entered».
- Seleccionar los eventos de gestión de calidad: Si utiliza el módulo de gestión de calidad, consulte las tablas QALS y QAVE para identificar cuándo se tomó una decisión de uso para un lote de inspección vinculado a una PO, lo que representa la actividad «Quality Inspection Performed».
- Combinar y dar formato a los datos: Consolide los datos de todas las selecciones individuales en una única tabla interna final. Asegúrese de que el campo EventTime tenga un formato coherente, por ejemplo, YYYY-MM-DDTHH:MI:SS.
- Implementar la descarga del archivo: Añada una función para descargar la tabla interna final como archivo. Se recomienda utilizar un archivo separado por tabulaciones o CSV, que puede generarse mediante el módulo de funciones GUI_DOWNLOAD.
- Ejecutar y guardar: Ejecute el programa mediante la transacción SE38 o SA38. Complete los criterios de selección y ejecute el informe. Cuando se le solicite, guarde el archivo de salida en su equipo local con la extensión .csv, listo para cargarlo.
Configuración
- Intervalo de fechas: Es fundamental definir un intervalo de fechas específico para la extracción, normalmente basado en la fecha de creación de la Purchase Order (EKKO-AEDAT). Un intervalo de 3 a 6 meses suele ser un buen punto de partida para equilibrar el volumen de datos y la información obtenida del proceso.
- Código de empresa (BUKRS): Filtre por uno o varios códigos de empresa para limitar la extracción a las entidades jurídicas pertinentes. Es un parámetro clave para el rendimiento y la relevancia del análisis.
- Tipo de documento de compras (BSART): Filtre por tipos de documento específicos, por ejemplo, «NB» para una PO estándar, con el fin de centrarse en los procesos estándar y excluir, si es necesario, tipos especiales de aprovisionamiento.
- Granularidad de los datos: La extracción está diseñada para el nivel de posición de la orden de compra. El Case ID es el número de la Purchase Order (EBELN). Todos los eventos, incluidos los del nivel de posición, como las recepciones de mercancías, se vinculan a este Case ID principal.
- Consideraciones de rendimiento: Para conjuntos de datos grandes, programe el programa como un trabajo en segundo plano (SM36) para evitar errores de tiempo de espera. Asegúrese de que existan índices de base de datos en los campos clave utilizados en las cláusulas WHERE, especialmente en tablas como CDHDR y CDPOS.
- Requisitos previos: La persona que ejecute el informe necesita autorización para acceder al ABAP workbench (SE38), así como permisos de desarrollo y ejecución del programa. También necesita acceso de lectura a todas las tablas subyacentes, incluidas EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR y las tablas de QM.
a Consulta de ejemplo abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. Pasos
- Establecer la conexión con la base de datos: Obtenga credenciales de solo lectura y los datos de conexión, como nombre de host, puerto y nombre de la base de datos, para la base de datos subyacente de SAP ECC. Asegúrese de tener instaladas herramientas cliente como DBeaver, SQL Developer o SSMS.
- Identificar el esquema de SAP: Conéctese a la base de datos e identifique el esquema principal de SAP donde se encuentran las tablas. A menudo se denomina SAPSR3, SAPHANADB o tiene un nombre similar específico del sistema. Si no es el esquema predeterminado de su usuario, deberá anteponerlo a todos los nombres de tabla de la consulta.
- Revisar la consulta SQL: Abra el script SQL proporcionado en su herramienta cliente. Esta consulta integral está diseñada para extraer 14 actividades distintas del proceso Purchase-to-Pay mediante la combinación de varias tablas de SAP.
- Personalizar los parámetros de la consulta: Localice la expresión de tabla común PO_BASE (CTE) al principio del script. Modifique los valores de marcador de posición para definir el alcance de la extracción:
- [START_DATE] y [END_DATE]: Establezca el intervalo de fechas del análisis, por ejemplo, «20230101» y «20230630». Se recomienda filtrar por el campo AEDAT (Changed On).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Especifique los códigos de empresa de SAP que desea incluir.
- [DOC_TYPE_1], [DOC_TYPE_2]: Especifique los tipos de documento de PO que desea incluir.
- [Your SAP Schema]: Sustituya este marcador de posición por el nombre real de su esquema de SAP en todo el script.
- Ejecutar la consulta: Ejecute el script SQL personalizado en la base de datos de SAP. El tiempo de ejecución variará según el intervalo de fechas, el volumen de datos y el rendimiento de la base de datos.
- Inspeccionar los resultados: Cuando finalice la consulta, revise rápidamente el resultado. Compruebe que el número de filas sea razonable y que las columnas clave, como PurchaseOrder, Activity y EventTime, estén completas según lo esperado.
- Exportar los datos a CSV: Exporte todo el conjunto de resultados desde su cliente SQL a un archivo CSV. Utilice la codificación UTF-8 para evitar problemas con los caracteres.
- Preparar la carga: Asegúrese de que los encabezados de columna del archivo CSV coincidan exactamente con los nombres de atributos obligatorios: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode y DocumentType.
- Cargar los datos en la herramienta de Process Mining: Cargue el archivo CSV final en su aplicación de Process Mining para analizar y visualizar el proceso.
Configuración
- Requisitos previos: Se requiere acceso directo y de solo lectura a la base de datos subyacente de SAP ECC. Las personas usuarias necesitan autorización suficiente para consultar tablas como EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS y NAST.
- Filtrado por intervalo de fechas: Es fundamental aplicar un filtro de intervalo de fechas para limitar el volumen de datos. Filtrar por EKKO.AEDAT (fecha de cambio de la PO) durante un periodo de 3 a 6 meses es un punto de partida habitual. Los intervalos amplios pueden generar tiempos de ejecución extremadamente largos.
- Filtros de datos clave: Para garantizar un análisis centrado, filtre siempre por EKKO.BUKRS (código de empresa) y EKKO.BSART (tipo de documento). Esto limita el alcance a las entidades jurídicas y los procesos empresariales pertinentes.
- Consideraciones de rendimiento: La consulta combina varias tablas grandes, incluidas las tablas del historial de cambios (CDHDR, CDPOS). Esto puede consumir muchos recursos. Se recomienda encarecidamente ejecutar la extracción fuera de las horas punta o en una base de datos replicada que no sea de producción para evitar afectar al rendimiento del sistema.
- Registro de documentos de cambios: La precisión de actividades como «Approved», «Rejected», «Completed» y «Changed» depende de que el registro de documentos de cambios esté activo para los campos pertinentes de SAP. Confirme con la persona administradora de SAP que este registro está habilitado mediante la transacción SCDO.
a Consulta de ejemplo sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator Pasos
- Requisitos previos y conexión: Asegúrese de que su herramienta ETL de terceros tenga instalado y licenciado el conector certificado por SAP. En la consola de administración de la herramienta ETL, configure una conexión nueva con su sistema SAP ECC. Necesitará el host del servidor de aplicaciones, el número del sistema, el ID de cliente y una persona usuaria de SAP dedicada con las autorizaciones RFC y de lectura de tablas adecuadas.
- Identificar las tablas de origen: En su trabajo ETL o flujo de datos, defina las tablas de SAP necesarias como fuentes de datos. Las tablas principales incluyen EKKO (cabecera de la PO), EKPO (posición de la PO), EBAN (solicitud de compra), CDHDR (cabecera del documento de cambios), CDPOS (posición del documento de cambios), MSEG (segmento del documento: material), MKPF (cabecera del documento de material), NAST (estado del mensaje), ESSR (cabecera de la hoja de entrada de servicios) y QALS (lote de inspección).
- Extraer «Purchase Order Created»: Cree un flujo de datos cuya fuente sea la tabla EKKO. Filtre los registros según el intervalo de fechas deseado, por ejemplo, mediante AEDAT, y el alcance organizativo, por ejemplo, BUKRS para el código de empresa y BSART para el tipo de documento. Asigne EKKO.EBELN a PurchaseOrder, «Purchase Order Created» a Activity y combine AEDAT y ERZET para obtener EventTime. Asigne los demás atributos obligatorios.
- Extraer «Goods Receipt Posted»: Cree un flujo de datos independiente cuya fuente sea MSEG y combínelo con MKPF mediante MBLNR y MJAHR. Filtre los tipos de movimiento pertinentes, como «101». Asigne MSEG.EBELN a PurchaseOrder, «Goods Receipt Posted» a Activity y utilice MKPF.CPUDT y MKPF.CPUTM para EventTime.
- Extraer eventos basados en cambios, aprobaciones, modificaciones y eliminaciones: Cree un flujo de datos cuya fuente sea CDHDR y CDPOS, combinadas mediante CHANGENR. Esta única fuente puede utilizarse para derivar varias actividades.
- Filtre OBJECTCLAS = «EINKBELEG» y TABNAME = «EKPO».
- Para «Purchase Order Approved», filtre los cambios del campo de estado de liberación, por ejemplo, FNAME = «FRGZU», cuyo nuevo valor (VALUE_NEW) indique la aprobación final.
- Para «Purchase Order Deleted», filtre los cambios del indicador de borrado, FNAME = «LOEKZ», cuyo nuevo valor sea «L».
- Para «Purchase Order Changed», filtre otros cambios de campos pertinentes y excluya los campos de estado específicos utilizados para las demás actividades.
- Para todos estos eventos, utilice CDHDR.UDATE y CDHDR.UTIME como EventTime.
- Extraer los eventos de «Purchase Requisition»: Cree un flujo de datos desde EBAN para «Purchase Requisition Created». Para vincularlo a un caso de PurchaseOrder, combine EBAN con EKPO mediante el número de solicitud (BANFN) y la posición (BNFPO). Para «Purchase Requisition Approved», utilice CDHDR/CDPOS con OBJECTCLAS = «BANF». Se requiere una asignación cuidadosa para asociar el evento con la PO final.
- Extraer «PO Sent to Vendor»: Cree un flujo de datos cuya fuente sea la tabla NAST. Filtre OBJECTKEY, que contiene el número de la PO, el tipo de salida pertinente (KSCHL) y un estado de procesamiento correcto (VSTAT = «1»). Utilice ERDAT y UHR para EventTime.
- Combinar los flujos de actividades: Utilice una transformación «Union» o «Merge» en su herramienta ETL para combinar los resultados de todos los flujos de datos individuales creados en los pasos anteriores. Asegúrese de que los nombres y los tipos de datos de las columnas sean coherentes en todos los flujos: PurchaseOrder, Activity, EventTime, etc.
- Convertir los tipos y formatos de datos: Asegúrese de que la columna EventTime se convierta a un formato de marca de tiempo coherente, por ejemplo, YYYY-MM-DD HH:MM:SS. Convierta OrderAmount a un formato decimal estándar.
- Definir el destino: Configure un destino o «sink» para el flujo de datos combinado. Normalmente será un archivo plano, como CSV o Parquet. Configure el delimitador, los calificadores de texto y las opciones de encabezado.
- Ejecutar y validar: Ejecute el trabajo ETL completo. Realice comprobaciones de validación en el archivo de salida para confirmar que están presentes las 14 actividades, que el número de filas es razonable y que los atributos clave están completos correctamente.
- Programar y exportar: Una vez validado, programe el trabajo ETL para que se ejecute periódicamente, por ejemplo, cada noche, y mantenga los datos actualizados. El archivo generado ya está listo para cargarlo en su herramienta de Process Mining.
Configuración
- Requisitos previos: Una herramienta ETL comercial, por ejemplo, Informatica PowerCenter, Talend o SAP Data Services, con el SAP Certified Connector correspondiente para ECC. Un usuario de diálogo o de sistema de SAP con autorizaciones para S_RFC y S_TABU_DIS en las tablas necesarias.
- Conexión con SAP: El conector debe configurarse con el servidor de aplicaciones SAP, el número de sistema, el mandante, el usuario y la contraseña. Se recomienda utilizar Secure Network Communications (SNC).
- Filtro por intervalo de fechas: Es fundamental aplicar un filtro por intervalo de fechas para limitar el volumen de datos. Una práctica habitual consiste en filtrar EKKO.AEDAT (fecha de creación de la orden de compra) para los últimos 3 a 12 meses. Este filtro debe aplicarse en el origen para evitar extraer un volumen excesivo de datos de SAP.
- Filtros de alcance organizativo: Filtre siempre por EKKO.BUKRS (código de sociedad) y considere filtrar por EKPO.WERKS (centro) o EKKO.EKORG (organización de compras) para limitar el análisis a una unidad de negocio específica.
- Filtro por tipo de documento: Utilice EKKO.BSART para incluir únicamente los tipos de órdenes de compra relevantes y excluir los traslados de existencias u otros documentos internos que no formen parte del proceso P2P estándar.
- Optimización del rendimiento: La extracción de las tablas de documentos de modificación (CDHDR, CDPOS) puede ser lenta. Asegúrese de aplicar filtros en OBJECTCLAS, OBJECTID y UDATE. Ajuste la configuración de «Packet Size» del conector de SAP para optimizar las tasas de transferencia de datos. En sistemas muy grandes, considere realizar una carga histórica inicial seguida de cargas delta programadas.
a Consulta de ejemplo sql
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]); ¿Listo para comenzar?
Con este Template, dispone del plan necesario para optimizar su proceso Purchase to Pay - Purchase Order en SAP ECC. Empiece hoy mismo a aprovechar sus datos para descubrir información útil e impulsar la eficiencia.
Optimice Purchase Order en P2P: inicie hoy su prueba gratuita
Elimine cuellos de botella y reduzca el tiempo de ciclo en un 30 % o más.
No necesita tarjeta de crédito; comience en cuestión de minutos