Su Template de datos para el proceso de compra a pago: órdenes de compra
Su Template de datos para el proceso de compra a pago: órdenes de compra
- Atributos recomendados para recopilar
- Actividades clave que debe registrar
- Guía de extracción para SAP ECC
Atributos del proceso de compra a pago: órdenes de compra
| Nombre | Descripción | ||
|---|---|---|---|
| Actividad Activity | Nombre del evento o paso de negocio específico que tuvo lugar durante el ciclo de vida de la orden de compra. | ||
| Descripción Este atributo describe un paso del proceso, como «Orden de compra creada», «Orden de compra aprobada» o «Entrada de mercancías contabilizada». La secuencia de estas actividades conforma el flujo del proceso de cada orden de compra. El análisis de la secuencia, la frecuencia y la duración entre actividades es la base de Process Mining. Ayuda a detectar cuellos de botella, ciclos de retrabajo y desviaciones del proceso estándar, lo que permite realizar mejoras específicas y estandarizar el proceso. Por qué es importante Las actividades definen los pasos del proceso. Analizar su secuencia y duración permite conocer el flujo real del proceso, los cuellos de botella y las desviaciones. Dónde obtenerlo Se obtiene de varias tablas y registros de transacciones de SAP, como CDHDR/CDPOS para los cambios, EKBE para las entradas de mercancías y facturas, y EBAN para las solicitudes. A menudo, se necesita 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 | Fecha y hora exactas en que ocurrió 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. Establece 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, detectar retrasos, analizar el rendimiento del proceso y medir los resultados 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 varios 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 | Identificador único del documento de orden de compra (PO), que sirve como caso principal para hacer 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 único representa una instancia 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 las comprobaciones 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 | Clasificación que agrupa materiales o servicios con características similares. | ||
| Descripción El grupo de materiales, o categoría de compra, se utiliza para clasificar los bienes o servicios que se adquieren. Algunos ejemplos son «Hardware de TI», «Suministros de oficina» y «Servicios profesionales». Este atributo es fundamental para analizar el gasto y comprender los patrones de compra. Permite filtrar el proceso y 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 descubrir diferencias en el comportamiento, los tiempos de ciclo o los proveedores según el tipo de gasto. Dónde obtenerlo Tabla: EKPO, campo: MATKL Ejemplos 00101Hardware de TIConsultoría | |||
| Importe de la orden OrderAmount | 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, se deben sumar los importes de las posiciones. Analizar el proceso según el importe de la orden es fundamental para identificar transacciones de alto valor que pueden requerir controles más estrictos o distintas vías de aprobación. Este atributo permite crear el Dashboard de análisis del valor de las órdenes de compra y ayuda a priorizar las mejoras en las órdenes con mayor impacto financiero. Por qué es importante Cuantifica el impacto financiero de cada compra y permite priorizar las órdenes de alto valor o detectar oportunidades de ahorro mediante análisis basados en el valor. Dónde obtenerlo Tabla: EKPO, campo: NETWR (valor neto de la orden). Ejemplos 1500.00250.7512345.50 | |||
| Nombre de usuario UserName | ID de usuario de la persona que realizó la actividad. | ||
| Descripción Este atributo registra el nombre de usuario de SAP de la persona que creó, modificó o aprobó un documento. En los pasos automatizados, puede mostrar el ID de un usuario del sistema o de procesamiento por lotes. El análisis por usuario ayuda a detectar necesidades de formación, identificar a quienes obtienen mejores resultados o descubrir posibles problemas de cumplimiento. Es clave para crear Dashboards sobre la distribución de la carga de trabajo, el cumplimiento de la matriz de aprobación y el rendimiento de distintos equipos o personas. Por qué es importante Asocia las acciones de los usuarios con personas específicas y permite analizar su rendimiento, carga de trabajo y cumplimiento de los protocolos. Dónde obtenerlo Tabla: EKKO, campo: ERNAM (creado por); tabla: CDHDR, campo: USERNAME (modificado por). Ejemplos JSMITHMBROWNBATCH_USER | |||
| Número de proveedor VendorNumber | Identificador único del proveedor. | ||
| Descripción Este código identifica de forma única al proveedor al que se compran los bienes o servicios. Es un dato maestro fundamental en el proceso de compras. Este atributo es esencial para analizar el proceso desde la perspectiva de los proveedores. Permite evaluar el rendimiento de entrega de proveedores, comparar los tiempos de entrega entre distintos proveedores y analizar los patrones de gasto. Es la dimensión principal del Dashboard de rendimiento de entrega de proveedores. Por qué es importante Permite analizar el rendimiento de los proveedores e identificar a los más fiables y a quienes causan retrasos o problemas de calidad. Dónde obtenerlo Tabla: EKKO, campo: LIFNR Ejemplos 100345V-20598700112 | |||
| Sociedad CompanyCode | Identificador de la entidad jurídica o empresa que realiza la compra. | ||
| Descripción La sociedad representa una entidad jurídica independiente en SAP. Todas las transacciones se contabilizan en el nivel de sociedad, por lo que es una unidad organizativa fundamental. Analizar el proceso por sociedad permite comparar la eficiencia de compras y el cumplimiento en distintas unidades de negocio o países. Ayuda a detectar buenas prácticas que podrían replicarse en otras entidades y a identificar las unidades que tienen dificultades con el proceso. Por qué es importante Representa la entidad jurídica y permite comparar el rendimiento de los procesos y comprobar el cumplimiento en distintas partes de la organización. Dónde obtenerlo Tabla: EKKO, campo: BUKRS Ejemplos 10002100US01 | |||
| Tipo de documento DocumentType | 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 números, 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, de servicios o de traslado de existencias. Este atributo es una dimensión de análisis valiosa, ya que los distintos tipos de documento suelen seguir procesos diferentes de forma intencional. Filtrar por tipo de documento permite comparar con mayor precisión los tiempos de ciclo y los flujos de proceso. Por qué es importante Distingue entre distintos tipos de procesos de compra (por ejemplo, estándar, de servicios o de devolución), que suelen tener recorridos y expectativas de rendimiento diferentes. Dónde obtenerlo Tabla: EKKO, campo: BSART Ejemplos EstándarMarcoTraslado de existencias | |||
| Cambio posterior a la aprobación IsPostApprovalChange | Indicador que señala si se modificó una orden de compra después de su aprobación inicial. | ||
| Descripción Este atributo booleano es verdadero si se detecta la actividad «Orden de compra modificada» después de la actividad «Orden de compra aprobada» para la misma orden de compra. Permite identificar cambios problemáticos que se producen en una fase avanzada del proceso. Este campo calculado respalda directamente el KPI «Tasa de cambios en órdenes de compra posteriores a la aprobación» y el Dashboard «Reprocesos y cambios en órdenes de compra». Ayuda a cuantificar y destacar los cambios que generan interrupciones, pueden causar demoras y requieren una nueva aprobación, lo que apunta a problemas en la especificación o definición inicial. Por qué es importante Mide directamente el reproceso posterior a la aprobación, un KPI clave para evaluar la estabilidad y la eficiencia del proceso. Una tasa elevada indica problemas en la definición inicial de los requisitos. Dónde obtenerlo Es un atributo calculado a partir de la secuencia de actividades del Registro de eventos. Ejemplos truefalse | |||
| Entrega puntual 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 «Entrada de mercancías contabilizada» es igual o anterior a la «Fecha de entrega solicitada». Ofrece un resultado claro y binario del rendimiento de entrega para cada partida de la orden de compra. Este atributo es la base del KPI «Tasa de recepción puntual de mercancías». Facilita el análisis del rendimiento de los proveedores y de la eficiencia interna en la recepción, ya que permite agrupar y filtrar fácilmente las entregas puntuales y tardías. Por qué es importante Ofrece una medida clara del cumplimiento o incumplimiento de los plazos de entrega y respalda directamente los KPI y Dashboards de rendimiento de los proveedores. Dónde obtenerlo Es un atributo calculado que compara la fecha de contabilización de la entrada de mercancías (EKBE-BUDAT) con la fecha de entrega solicitada (EKPO-EINDT). Ejemplos truefalse | |||
| Fecha de entrega solicitada RequestedDeliveryDate | Fecha en que la empresa solicitó al proveedor la entrega de los bienes o servicios. | ||
| Descripción Es la fecha de entrega prevista que se especifica en la orden de compra. Sirve como referencia para medir el rendimiento 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 recepción con la fecha solicitada, las organizaciones pueden medir cuantitativamente la fiabilidad de los proveedores y la eficiencia interna de recepción, lo que contribuye directamente al Dashboard de rendimiento de entrega de proveedores. Por qué es importante Es la fecha prevista de entrega, necesaria para calcular los KPI de puntualidad y evaluar la fiabilidad de los proveedores. Dónde obtenerlo Tabla: EKPO, campo: EINDT Ejemplos 2023-06-102023-07-222023-08-01 | |||
| Grupo de compras PurchasingGroup | Persona compradora o grupo de personas compradoras responsable de la actividad de compras. | ||
| Descripción El grupo de compras representa a la persona o al equipo responsable de una actividad de compra determinada. Es el principal punto de contacto para los proveedores. Este atributo permite un análisis más detallado que el de la organización de compras. Ayuda a comprender cómo se distribuye la carga de trabajo entre las personas compradoras y a detectar diferencias de rendimiento, lo que permite tomar decisiones sobre la asignación de recursos y las iniciativas de formación. Por qué es importante Ofrece una vista detallada de quién es responsable de cada compra, lo que permite analizar la carga de trabajo y el rendimiento por comprador o equipo. Dónde obtenerlo Tabla: EKKO, campo: EKGRP Ejemplos 001002N01 | |||
| Moneda Currency | 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. Aporta el contexto necesario para interpretar cualquier importe. En las organizaciones internacionales, la moneda es fundamental para realizar análisis financieros correctos. Permite sumar y comparar adecuadamente los valores de las órdenes; además, todos los KPI monetarios deben interpretarse teniendo en cuenta la moneda correspondiente. Por qué es importante Aporta el contexto necesario para interpretar todos los importes y realizar análisis financieros precisos, 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 flujo de trabajo de aprobación. Esta información es fundamental para comprender las causas de fondo de los reprocesos y las demoras. El análisis de los motivos de rechazo ayuda a detectar problemas frecuentes, como precios incorrectos, excesos de presupuesto o selección de proveedores que no cumplen los requisitos. Esta información permite abordar las causas de fondo, mejorar la calidad de las órdenes de compra desde el inicio y agilizar el proceso de aprobación. Por qué es importante Permite saber directamente por qué no se aprueban las solicitudes y aplicar mejoras específicas para reducir los reprocesos y acortar los tiempos de aprobación. Dónde obtenerlo Puede ser difícil encontrar esta información. Es posible que esté almacenada en campos de texto largo o que dependa de una configuración personalizada del flujo de trabajo. A menudo, se requieren conocimientos específicos de implementación. Ejemplos Precio incorrectoPresupuesto excedidoSolicitud duplicada | |||
| Nombre del proveedor VendorName | Nombre legal del proveedor. | ||
| Descripción Nombre descriptivo del proveedor, más fácil de entender que su número. Por lo general, se obtiene de los datos maestros de proveedores. El número de proveedor se utiliza para las uniones y la identificación única, mientras que el nombre es fundamental para los Dashboards e informes dirigidos a los usuarios. Facilita la comprensión de los análisis a quienes no conocen los códigos de proveedor. Por qué es importante Proporciona un nombre legible para el proveedor y facilita la comprensión de los Dashboards e informes a los usuarios de negocio. Dónde obtenerlo Tabla: LFA1, campo: NAME1. Se requiere una unión de EKKO-LIFNR con LFA1-LIFNR. Ejemplos Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organización de compras PurchasingOrganization | 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 adquisición. Puede estar centralizada para toda la empresa o descentralizada por planta o región. Analizar el rendimiento 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 detectar buenas prácticas y áreas que necesitan apoyo. Por qué es importante Identifica al equipo de compras responsable y permite comparar y analizar el rendimiento de distintas unidades organizativas. Dónde obtenerlo Tabla: EKKO, campo: EKORG Ejemplos 1000US01DE01 | |||
| Planta Plant | Ubicación física o planta donde deben entregarse los bienes. | ||
| Descripción La planta 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. El análisis por planta permite comprender las diferencias geográficas en el proceso de compras. Puede revelar variaciones en los tiempos de entrega de los proveedores según la ubicación o señalar plantas con procesos de recepción ineficientes, lo que ayuda a analizar la puntualidad de la recepción de bienes. Por qué es importante Indica el lugar de entrega, un dato útil para analizar las diferencias regionales del proceso y el rendimiento logístico. Dónde obtenerlo Tabla: EKPO, campo: WERKS Ejemplos 100011002000 | |||
| Sistema de origen SourceSystem | Sistema del que se extrajeron los datos. | ||
| Descripción Este atributo identifica el origen de los datos, que suele ser el identificador de una instancia de SAP ECC (por ejemplo, «ECC_PROD_100»). En entornos con varios sistemas, permite distinguir las fuentes de datos. Para la gobernanza y el linaje de datos, es fundamental conocer el sistema de origen. Esto garantiza la integridad de los datos y facilita la resolución de problemas de extracción o calidad, especialmente cuando se combinan datos de distintos sistemas o módulos de ERP. 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 Suele ser un valor estático que se añade durante la extracción de datos para indicar el sistema de origen del conjunto de datos. Ejemplos SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Solicitud de compra PurchaseRequisition | 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 que la originó. No todas las órdenes de compra tienen una solicitud previa. Este vínculo es fundamental para analizar el Dashboard de conversión de solicitudes en órdenes y el KPI de la tasa de conversión de solicitudes de compra en órdenes de compra. Permite medir la eficiencia del proceso previo, desde la solicitud inicial hasta la creación de una orden formal, e identificar las órdenes de compra que se crearon sin una solicitud y no cumplen las políticas. Por qué es importante Vincula la orden de compra con la solicitud de origen, permite analizar la conversión de solicitudes en órdenes e identificar las órdenes creadas sin una solicitud previa. Dónde obtenerlo Tabla: EKPO, campo: BANFN Ejemplos 1001589010015891 | |||
| Última actualización de datos LastDataUpdate | 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. Permite conocer la antigüedad de los datos analizados. Mostrar esta información en los Dashboards es fundamental para que los usuarios sepan si las conclusiones se basan en datos casi en tiempo real o en una instantánea histórica. Así se ajustan las expectativas y se garantiza que las decisiones se tomen con datos cuya antigüedad se conoce. Por qué es importante Informa a los usuarios sobre la actualidad de los datos y les permite saber si el análisis refleja el estado más reciente de las operaciones. Dónde obtenerlo El proceso de extracción de datos o ETL genera y añade esta marca de tiempo durante su ejecución. Ejemplos 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
Actividades del proceso de compra a pago: órdenes de compra
| Actividad | Descripción | ||
|---|---|---|---|
| Entrada de mercancías contabilizada | Esta actividad indica la recepción física de bienes de un proveedor para 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 clave para hacer seguimiento del rendimiento de entrega de proveedores y del inicio del proceso de verificación de facturas. Se utiliza para calcular las tasas de entrega puntual y la puntualidad de las entradas de mercancías. Dónde obtenerlo Se registra al crear un documento de material. La marca de tiempo del evento corresponde a la fecha de contabilización (MKPF-BUDAT) o a 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). Capturar 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 de un cambio en el estado de liberación de la orden de compra a «totalmente liberada» o «aprobada». | ||
| Por qué es importante Esta actividad es fundamental para calcular el KPI del tiempo de ciclo de aprobación de órdenes de compra y detectar cuellos de botella en el flujo de trabajo 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 general de liberación (EKKO-FRGKE) se establece como «liberado». Capturar Identifique la marca de tiempo en que el estado general de liberación de la orden de compra (EKKO-FRGKE) cambia al estado de aprobación final. Tipo de evento inferred | |||
| Orden de compra completada | Indica que una posición de la orden de compra se considera entregada en su totalidad. Es un evento inferido, que suele derivarse 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 marca el final lógico de la etapa de cumplimiento de la orden. Es esencial para calcular el tiempo de ciclo total de la orden de compra, desde su creación hasta su finalización. Dónde obtenerlo Se infiere a partir de los documentos de cambio (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 que toda la orden está completa. Capturar Identifique en los documentos de cambio la marca de tiempo en que se activa el indicador EKPO-ELIKZ. Tipo de evento inferred | |||
| Orden de compra creada | Esta actividad indica la creación de una orden de compra formal, 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. Es un 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 (EKKO-EBELN). Capturar 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 envía 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 se procesa correctamente un mensaje de salida. | ||
| Por qué es importante Este es un hito clave que inicia el tiempo de entrega del proveedor. Analizar el tiempo transcurrido entre este evento y la recepción de los bienes es fundamental para evaluar el rendimiento del proveedor y la puntualidad de las entregas. Dónde obtenerlo Se registra en la tabla de estado 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 a la orden de compra. Capturar 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 una nueva 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 permite medir la eficiencia con la que la demanda interna se convierte en órdenes concretas. Dónde obtenerlo Se registra al crear una entrada en la tabla de cabecera de solicitudes de compra (EBAN). La fecha de creación (EBAN-BADAT) y la hora se utilizan como marca de tiempo del evento. Capturar 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 según 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 de ciclo de aprobación. También pone de manifiesto cualquier demora antes de que comience el flujo de trabajo de aprobación. Dónde obtenerlo Se infiere a partir de los documentos de cambio (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 general de liberación (EKKO-FRGKE) se establece por primera vez en un valor que indica que hay un proceso de aprobación activo. Capturar Identifique la primera entrada del documento de cambio que activa la estrategia de liberación de la orden de compra. Tipo de evento inferred | |||
| Confirmación de servicios registrada | En las órdenes de compra de servicios, esta actividad representa la confirmación de que se han prestado los servicios. Es un evento explícito que se registra al crear una hoja de entrada de servicios (por ejemplo, mediante la transacción ML81N). | ||
| Por qué es importante Equivale a una entrada de mercancías para los servicios y es esencial para hacer seguimiento del cumplimiento de las órdenes de servicio. Activa el proceso financiero para el 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). La tabla ESLL contiene el vínculo con la orden de compra. Capturar 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 los bienes recibidos han pasado una inspección de calidad. Esta actividad suele inferirse cuando se toma una decisión de empleo para un lote de inspección creado al recibir las mercancías, en el módulo de Gestión de calidad. | ||
| Por qué es importante En los sectores 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 generar cuellos de botella entre la recepción de las mercancías y su disponibilidad para el uso. Dónde obtenerlo Se infiere a partir del módulo de Gestión de calidad. Al recibir las mercancías, se crea un lote de inspección (tabla QALS); la actividad se marca cuando se crea una decisión de empleo (tabla QAVE), que incluye una marca de tiempo. Capturar Identifique la marca de tiempo de la decisión de empleo 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 bienes recibidos anteriormente, a menudo por 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 de retrabajo en el 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 (por ejemplo, «122» para devolución de entrega al proveedor). La fecha de contabilización (MKPF-BUDAT) se utiliza como marca de tiempo. Capturar Identifique los documentos de material con un tipo de movimiento de devolución (por ejemplo, 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, que impide continuar con procesos como la entrada de mercancías o la facturación. Es un evento inferido que se registra cuando se activa el indicador de eliminación en la posición de la orden. | ||
| Por qué es importante Esta es una actividad terminal que indica que se canceló una orden. 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 cambio (CDHDR/CDPOS), que muestran que el indicador de eliminación (EKPO-LOEKZ) se establece en «L» para una posición de la orden de compra. Capturar Identifique en los documentos de cambio la marca de tiempo en que se activa el indicador EKPO-LOEKZ. Tipo de evento inferred | |||
| Orden de compra modificada | Representa cualquier modificación de 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 cambio de SAP. | ||
| Por qué es importante Los cambios frecuentes, sobre todo después de la aprobación, indican ineficiencias en el proceso, una planificación inicial deficiente o cambios en el alcance. Esta actividad es esencial para el Dashboard de retrabajo y cambios en órdenes de compra y los KPI relacionados. Dónde obtenerlo Se registra explícitamente en las tablas de cabecera (CDHDR) y de posiciones (CDPOS) de los documentos de cambio para el objeto de orden de compra (EINKBELEG). Cada cambio genera una nueva entrada con una marca de tiempo. Capturar 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 flujo de trabajo de aprobación. Es un evento inferido a partir de un cambio de estado en los datos de la estrategia de liberación de la orden, que indica que se ha producido un rechazo. | ||
| Por qué es importante El seguimiento de los rechazos ayuda a detectar problemas en la calidad de los datos de la orden de compra, incumplimientos de políticas o fallos en la matriz de aprobación. A menudo, estos rechazos generan retrabajo y aumentan el tiempo de ciclo total. Dónde obtenerlo Se infiere a partir de los documentos de cambio (CDHDR/CDPOS) del estado de liberación de la orden de compra. Por lo general, se registra un rechazo cuando se cancela un código de liberación o se establece un estado de rechazo específico. Capturar 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, según el seguimiento del Workflow de estrategia de liberación de SAP. | ||
| Por qué es importante El seguimiento de las aprobaciones es fundamental para detectar 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 de 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 (por ejemplo, EBAN-FRGZU) o el análisis de los documentos de cambio de CDHDR/CDPOS para el objeto EBAN. Capturar Supervise los documentos de cambio 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
- Cree un programa ABAP: Abra el editor ABAP con el código de transacción SE38. Asigne un nombre al programa, por ejemplo, Z_PM_PO_EXTRACT, y seleccione «Crear». Indique un título, como «Extracción de datos de órdenes de compra para Process Mining», y establezca el tipo «Programa ejecutable».
- Defina la pantalla de selección: En el programa, defina los parámetros de la pantalla de selección. Así, los usuarios podrán filtrar los datos que desean extraer. Entre los parámetros clave se incluyen el intervalo de fechas de creación de la orden de compra, el código de empresa (BUKRS) y el tipo de documento de compras (BSART).
- Defina 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.
- Implemente 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 y mantenga el código organizado.
- Seleccione los datos de las solicitudes de compra: Consulte la tabla EBAN para obtener los eventos «Solicitud de compra creada» y vincúlelos a las órdenes de compra mediante la tabla EKPO. Utilice las tablas del registro de cambios (CDHDR, CDPOS) para identificar los eventos «Solicitud de compra aprobada» mediante el seguimiento de los cambios en los campos de estado de liberación.
- Seleccione los eventos principales de las órdenes de compra: Consulte las tablas EKKO y EKPO para el evento «Orden de compra creada». Utilice las tablas del registro de cambios (CDHDR, CDPOS) para el objeto EINKBELEG y extraiga los eventos «Orden de compra modificada», «Orden de compra aprobada», «Orden de compra rechazada», «Orden de compra completada» y «Orden de compra eliminada» según los cambios en campos específicos, como los indicadores de liberación y las marcas de eliminación.
- Seleccione los eventos de comunicación de las órdenes de compra: Consulte la tabla NAST para encontrar los registros en los que la orden de compra se transmitió correctamente y registre la actividad «Orden de compra enviada al proveedor».
- Seleccione los eventos de bienes y servicios: Consulte la tabla EKBE para identificar las contabilizaciones de documentos de material y registrar las actividades «Entrada de mercancías contabilizada» y «Mercancías devueltas» según la categoría del tipo de movimiento. Consulte ESSR y ESLL para obtener las hojas de entrada de servicios y registrar «Confirmación de servicios ingresada».
- Seleccione 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 orden de compra. Esto representa la actividad «Inspección de calidad realizada».
- Combine y dé 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 uniforme, por ejemplo, YYYY-MM-DDTHH:MI:SS.
- Implemente la descarga del archivo: Añada una función para descargar la tabla interna final como archivo. Se recomienda usar un archivo separado por tabulaciones o CSV, que puede generarse con el módulo de función GUI_DOWNLOAD.
- Ejecute y guarde el programa: Ejecute el programa con 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 con la extensión .csv. Quedará listo para cargarlo.
Configuración
- Intervalo de fechas: Es fundamental definir un intervalo de fechas específico para la extracción, normalmente según la fecha de creación de la orden de compra (EKKO-AEDAT). Un período de 3 a 6 meses suele ser un buen punto de partida para equilibrar el volumen de datos y la información que aporta el análisis.
- 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 orden de compra estándar, a fin de centrarse en los procesos habituales y excluir, si es necesario, los tipos de compra especiales.
- Granularidad de los datos: La extracción está diseñada para el nivel de partida de la orden de compra. El ID del caso es el número de orden de compra (EBELN). Todos los eventos, incluidos los de nivel de partida, como las entradas de mercancías, se vinculan a este ID de caso principal.
- Consideraciones de rendimiento: Para conjuntos de datos grandes, programe el programa como un trabajo en segundo plano (SM36) para evitar errores por tiempo de espera. Compruebe que haya í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 entorno de desarrollo ABAP (SE38) y permisos para desarrollar y ejecutar el 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 gestión de calidad.
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
- Establezca la conexión con la base de datos: Obtenga credenciales de solo lectura y los datos de conexión (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 las herramientas cliente necesarias, como DBeaver, SQL Developer o SSMS.
- Identifique el esquema de SAP: Conéctese a la base de datos e identifique el esquema principal de SAP donde se encuentran las tablas. Suele llamarse SAPSR3, SAPHANADB o tener otro nombre específico del sistema. Si no es el esquema predeterminado de su usuario, deberá anteponerlo a todos los nombres de tabla de la consulta.
- Revise la consulta SQL: Abra el script SQL proporcionado en su herramienta cliente. Esta consulta completa extrae 14 actividades distintas del proceso de compra a pago mediante la combinación de varias tablas de SAP.
- Personalice los parámetros de la consulta: Localice la expresión de tabla común (CTE) PO_BASE 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]: Defina el intervalo de fechas del análisis, por ejemplo, «20230101» y «20230630». Se recomienda filtrar por el campo AEDAT (fecha de modificación).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Indique los códigos de empresa de SAP que desea incluir.
- [DOC_TYPE_1], [DOC_TYPE_2]: Indique los tipos de documento de orden de compra que desea incluir.
- [Your SAP Schema]: Sustituya este marcador de posición por el nombre real del esquema de SAP en todo el script.
- Ejecute la consulta: Ejecute el script SQL personalizado en la base de datos de SAP. El tiempo de ejecución dependerá del intervalo de fechas, el volumen de datos y el rendimiento de la base de datos.
- Revise los resultados: Cuando termine la consulta, haga una revisión rápida de los resultados. Compruebe que el número de filas sea razonable y que las columnas clave, como PurchaseOrder, Activity y EventTime, contengan los datos esperados.
- Exporte 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.
- Prepare el archivo para cargarlo: 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.
- Cargue los datos en la herramienta de Process Mining: Cargue el archivo CSV final en su aplicación de Process Mining para analizar y visualizar los datos.
Configuración
- Requisitos previos: Se requiere acceso directo de solo lectura a la base de datos subyacente de SAP ECC. Los usuarios 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 fechas para limitar el volumen de datos. Filtrar por EKKO.AEDAT (fecha de modificación de la orden de compra) para un período de 3 a 6 meses es un punto de partida habitual. Los intervalos más amplios pueden alargar mucho la ejecución de la consulta.
- Filtros de datos clave: Para que el análisis sea específico, filtre siempre por EKKO.BUKRS (código de empresa) y EKKO.BSART (tipo de documento). Así, limitará 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), lo que puede consumir muchos recursos. Se recomienda encarecidamente ejecutar la extracción fuera de las horas de mayor actividad o en una base de datos replicada que no sea de producción, para evitar afectar el rendimiento del sistema.
- Registro de documentos de modificación: La precisión de actividades como «Aprobada», «Rechazada», «Completada» y «Modificada» depende de que el registro de documentos de modificación esté activo para los campos pertinentes de SAP. Confirme con su administrador de SAP que este registro esté habilitado mediante la transacción SCDO.
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 tenga instalado y licenciado el conector certificado por SAP. En la consola de administración de la herramienta ETL, configure una nueva conexión con su sistema SAP ECC. Necesitará el host del servidor de aplicaciones, el número de sistema, el ID de cliente y un usuario de SAP dedicado con las autorizaciones adecuadas para RFC y lectura de tablas.
- Identifique las tablas de origen: En el trabajo ETL o el flujo de datos, defina las tablas de SAP necesarias como fuentes de datos. Entre las tablas principales se incluyen EKKO (cabecera de orden de compra), EKPO (partida de orden de compra), EBAN (solicitud de compra), CDHDR (cabecera del documento de modificación), CDPOS (partida del documento de modificación), MSEG (segmento de 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).
- Extraiga «Orden de compra creada»: Cree un flujo de datos que utilice la tabla EKKO como origen. 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 y «Orden de compra creada» a Activity. Combine AEDAT y ERZET para obtener EventTime. Asigne también los demás atributos obligatorios.
- Extraiga «Entrada de mercancías contabilizada»: Cree otro flujo de datos con origen en MSEG y una combinación con MKPF mediante MBLNR y MJAHR. Filtre los tipos de movimiento pertinentes, como «101». Asigne MSEG.EBELN a PurchaseOrder y «Entrada de mercancías contabilizada» a Activity. Utilice MKPF.CPUDT y MKPF.CPUTM para obtener EventTime.
- Extraiga eventos basados en cambios (aprobaciones, modificaciones y eliminaciones): Cree un flujo de datos con origen en CDHDR y CDPOS, combinadas mediante CHANGENR. Esta fuente permite obtener varias actividades.
- Filtre OBJECTCLAS = 'EINKBELEG' y TABNAME = 'EKPO'.
- Para «Orden de compra aprobada», filtre los cambios en el campo de estado de liberación, por ejemplo, FNAME = 'FRGZU', cuyo nuevo valor (VALUE_NEW) indique la aprobación final.
- Para «Orden de compra eliminada», filtre los cambios en el indicador de eliminación (FNAME = 'LOEKZ') cuyo nuevo valor sea 'L'.
- Para «Orden de compra modificada», filtre otros cambios de campos pertinentes, excluyendo los campos de estado específicos utilizados para otras actividades.
- Para todos estos eventos, utilice CDHDR.UDATE y CDHDR.UTIME como EventTime.
- Extraiga los eventos de solicitudes de compra: Cree un flujo de datos desde EBAN para «Solicitud de compra creada». Para vincularlo a un caso de orden de compra, combine EBAN con EKPO mediante el número de solicitud (BANFN) y la partida (BNFPO). Para «Solicitud de compra aprobada», utilice CDHDR/CDPOS con OBJECTCLAS = 'BANF'. Asigne los datos con cuidado para asociar el evento a la orden de compra correspondiente.
- Extraiga «Orden de compra enviada al proveedor»: Cree un flujo de datos con origen en la tabla NAST. Filtre por OBJECTKEY, que contiene el número de orden de compra, el tipo de salida pertinente (KSCHL) y el estado de procesamiento correcto (VSTAT = '1'). Utilice ERDAT y UHR para EventTime.
- Combine 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 creados en los pasos anteriores. Asegúrese de que los nombres y los tipos de datos de las columnas sean uniformes en todos los flujos (PurchaseOrder, Activity, EventTime, etc.).
- Convierta los tipos y formatos de datos: Asegúrese de que la columna EventTime tenga un formato de marca de tiempo uniforme, por ejemplo, YYYY-MM-DD HH:MM:SS. Convierta OrderAmount a un formato decimal estándar.
- Defina el destino: Configure un destino o «sink» para el flujo de datos combinado. Suele ser un archivo plano, como CSV o Parquet. Configure el delimitador, los calificadores de texto y las opciones de encabezado.
- Ejecute y valide: Ejecute el trabajo ETL completo. Compruebe el archivo de salida para confirmar que estén presentes las 14 actividades, que el número de filas sea razonable y que los atributos clave estén completos.
- Programe y exporte: Una vez validado, programe la ejecución periódica del trabajo ETL, por ejemplo, cada noche, para mantener los datos actualizados. El archivo generado estará listo para cargarse 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 conector certificado por SAP 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: Configure el conector con el servidor de aplicaciones de 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 del pedido de compra) para incluir los últimos 3 a 12 meses. Aplique este filtro en el origen para evitar extraer demasiados 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 solo los tipos de pedido de compra pertinentes y excluir los traslados de stock u otros documentos internos que no formen parte del proceso estándar de compra a pago (P2P).
- Optimización del rendimiento: La extracción de datos 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 opción «Packet Size» del conector de SAP para optimizar la velocidad de transferencia de datos. En sistemas muy grandes, considere realizar una carga histórica inicial y, después, cargas delta programadas.
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 empezar?
Con este Template, tiene una guía para optimizar su proceso de compra a pago de órdenes de compra en SAP ECC. Empiece hoy a aprovechar sus datos para descubrir información útil y mejorar la eficiencia.
Optimice las órdenes de compra del proceso de compra a pago: comience hoy su prueba gratuita
Elimine cuellos de botella y reduzca el tiempo de ciclo en un 30 % o más.
No se requiere tarjeta de crédito. Empiece en unos minutos.