Su Template de datos de compra a pago: pedido de compra
Su Template de datos de compra a pago: pedido de compra
- Atributos recomendados para un análisis detallado
- Actividades clave que debe seguir en el proceso
- Guía paso a paso para extraer los datos
Atributos de compra a pago: pedido de compra
| Nombre | Descripción | ||
|---|---|---|---|
| Actividad ActivityName | Nombre del evento o paso de negocio que tuvo lugar en el proceso de órdenes de compra. | ||
| Descripción Este atributo describe una acción específica o un cambio de estado durante el ciclo de vida de la orden de compra, 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. Analizar la secuencia y la frecuencia de las actividades es la base de Process Mining. Permite descubrir el proceso real, compararlo con el modelo diseñado, identificar cuellos de botella (por ejemplo, largas esperas después de «Factura recibida») y cuantificar el retrabajo (por ejemplo, actividades repetidas de «Orden de compra modificada»). Por qué es importante Define los pasos del proceso y permite visualizar y analizar el flujo integral, estudiar sus variantes e identificar cuellos de botella. Dónde obtenerlo Suele derivarse de una combinación de tablas y campos, como los campos de estado de EKKO/EKPO o los logs de documentos de cambio de CDHDR/CDPOS, para representar hitos clave del negocio. Ejemplos Orden de compra creadaOrden de compra aprobadaEntrada de mercancías contabilizadaFactura recibida | |||
| Hora del evento EventTime | Marca de tiempo que indica cuándo tuvo lugar la actividad. | ||
| Descripción Este atributo registra la fecha y hora exactas de cada actividad del proceso. Es fundamental para todos los análisis temporales de Process Mining. La hora del evento permite ordenar cronológicamente las actividades y reconstruir el flujo del proceso. También sirve de base para calcular todas las métricas de duración, como los tiempos de ciclo entre actividades, los tiempos de espera y los tiempos de procesamiento, que son esenciales para analizar el rendimiento e identificar cuellos de botella. Por qué es importante Esta marca de tiempo es fundamental para ordenar correctamente los eventos y calcular todas las métricas de rendimiento, incluidos los tiempos de ciclo, los tiempos de entrega y los tiempos de espera. Dónde obtenerlo Campos de marca de tiempo asociados a actividades específicas, como la fecha de creación (EKKO-AEDAT para los cambios) o la fecha de contabilización (MKPF-BUDAT para las entradas de mercancías). A menudo es necesario combinar datos de varias tablas. Ejemplos 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Orden de compra PurchaseOrderNumber | Identificador único de la orden de compra (PO), que sirve como ID del caso principal para hacer un seguimiento del ciclo de compras. | ||
| Descripción El número de orden de compra es el identificador central que vincula todas las actividades relacionadas, desde la creación inicial hasta la recepción final de las mercancías y la finalización. Actúa como identificador del caso para el análisis de Process Mining. Al agrupar los eventos por este número, el análisis permite reconstruir el recorrido de cada orden de compra. Esto es esencial para calcular los tiempos de ciclo, analizar las variantes del proceso e identificar cuellos de botella o desviaciones específicas de una orden. Por qué es importante Es la clave esencial para conectar todos los eventos de compras en un único proceso integral y analizar en detalle el ciclo de vida de cada orden de compra. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo EBELN. Ejemplos 450001712345000171244500017125 | |||
| Sistema de origen SourceSystem | Identifica el sistema de origen del que se extrajeron los datos. | ||
| Descripción Este atributo especifica el sistema de origen de los datos de eventos, por ejemplo, «SAP S/4HANA Production» o «SAP ECC». En entornos con varios sistemas, este campo es fundamental para rastrear el origen de los datos, resolver problemas y garantizar que los datos de distintas fuentes se interpreten correctamente. Ayuda a comprender el contexto de los datos y permite filtrar el análisis por entornos de sistema específicos. Por qué es importante Aporta contexto esencial sobre el origen de los datos, fundamental para la gobernanza, la validación y el análisis de datos en entornos con varios sistemas. Dónde obtenerlo Suele ser un valor estático que se añade durante el proceso de extracción, transformación y carga (ETL) para identificar el origen del conjunto de datos. Ejemplos S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Última actualización de los datos LastDataUpdate | Marca de tiempo de la última actualización o extracción de los datos del sistema de origen. | ||
| Descripción Este atributo indica la actualidad de los datos analizados. Muestra la fecha y hora de la extracción más reciente de datos de SAP S/4HANA. Conocer la hora de la última actualización de los datos es fundamental para que los usuarios entiendan si el análisis es oportuno. Les ayuda a interpretar correctamente los resultados, ya que permite saber si consultan información en tiempo real o una instantánea de un momento específico. Esto influye en la pertinencia de las acciones que se tomen a partir del análisis. Por qué es importante Informa a los usuarios sobre la actualidad de los datos para que comprendan el contexto y la pertinencia de los resultados del análisis. Dónde obtenerlo Es una marca de tiempo de metadatos que se añade durante el proceso de extracción, transformación y carga (ETL) de los datos. Ejemplos 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Fecha de entrega solicitada RequestedDeliveryDate | Fecha en que la empresa solicitó al proveedor la entrega de los bienes o servicios. | ||
| Descripción Este atributo especifica la fecha de entrega prevista acordada en la orden de compra. Sirve como referencia para medir el rendimiento de las entregas del proveedor. En Process Mining, esta fecha se compara con la fecha real de entrada de mercancías (marca de tiempo de «Entrada de mercancías contabilizada») para calcular el KPI «Tasa de entregas a tiempo del proveedor». Analizar las desviaciones respecto de esta fecha ayuda a evaluar la fiabilidad del proveedor y gestionar los riesgos de la cadena de suministro. Por qué es importante Sirve como referencia para medir el rendimiento de las entregas a tiempo del proveedor, un KPI clave para la gestión de la cadena de suministro y la planificación operativa. Dónde obtenerlo Se encuentra en la tabla de líneas de programación EKET, en el campo EINDT. Ejemplos 2023-06-012023-06-152023-07-01 | |||
| ID del proveedor VendorId | Identificador único del proveedor que suministra los bienes o servicios. | ||
| Descripción El ID del proveedor es un dato maestro clave que vincula una orden de compra con un proveedor específico. Se utiliza durante todo el proceso de compras para la comunicación, la entrega y el pago. En Process Mining, este atributo permite segmentar el análisis del rendimiento por proveedor. Es esencial para Dashboards como «Rendimiento del tiempo de entrega del proveedor» y «Tasa de devolución de mercancías por proveedor», que ayudan a identificar a los proveedores más fiables y a quienes pueden estar causando demoras o problemas de calidad. Por qué es importante Permite analizar el rendimiento por proveedor, identificar a los de mejor y peor desempeño y optimizar la cadena de suministro. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo LIFNR. Ejemplos 100023100045100088 | |||
| Importe neto total TotalNetAmount | Valor total de la orden de compra, sin incluir impuestos ni costes de transporte. | ||
| Descripción Este atributo representa el valor monetario neto de la orden de compra. Es una cifra financiera clave que indica el importe de la transacción de compras. Este importe es fundamental para el análisis financiero, por ejemplo, para clasificar las órdenes de compra por valor (alto o bajo) y comprobar si siguen rutas de proceso distintas. También permite priorizar el análisis y centrarse en órdenes de alto valor, que pueden implicar más riesgo financiero o tener un mayor impacto en el negocio. Por qué es importante Permite realizar análisis financieros, segmentar las órdenes de compra por valor y priorizar las mejoras de procesos en las áreas con mayor gasto. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo NETWR. Ejemplos 1500.0025000.50125.75 | |||
| Solicitud de compra PurchaseRequisitionNumber | Identificador de la solicitud de compra (PR) que dio origen a la orden de compra. | ||
| Descripción Este atributo vincula la orden de compra con la solicitud que le dio origen. No todas las órdenes tienen una solicitud previa, ya que algunas se crean directamente. Este vínculo es esencial para analizar el proceso de compras integral desde la solicitud inicial. Permite calcular KPI como «Tiempo de aprobación de la solicitud de compra» y es fundamental para identificar compras fuera de los canales aprobados, en las que se crean órdenes sin una solicitud previa aprobada. Por qué es importante Vincula la orden de compra con la solicitud inicial, permite analizar el proceso de principio a fin e identificar compras fuera de los canales aprobados que no cumplen las políticas. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA (nivel de posición de la orden de compra), en el campo BANFN. Ejemplos 1001005110010052 | |||
| Tipo de documento de orden de compra DocumentType | Clasificación que distingue los distintos tipos de órdenes de compra, como las estándar, las de servicios o las de traslado de existencias. | ||
| Descripción El tipo de documento es un elemento clave de configuración de SAP que controla el flujo del proceso, el rango de numeración y los campos de una orden de compra. Permite adaptar el proceso de compras a distintos escenarios. Analizar el proceso por tipo de documento es fundamental para comprender sus variaciones. Por ejemplo, el proceso de una orden estándar de mercancías puede diferir mucho del de una orden de servicios o de traslado de existencias. Este atributo permite filtrar y comparar esos flujos para encontrar oportunidades de mejora específicas. Por qué es importante Clasifica las órdenes de compra para comparar distintos procesos de compras y comprender las variaciones en los flujos y los tiempos de ciclo. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo BSART. Ejemplos NBFOUB | |||
| Usuario UserName | Identificador del usuario que realizó una actividad específica. | ||
| Descripción Este atributo registra el ID de usuario de SAP responsable de crear, modificar o aprobar un documento. Permite rastrear las acciones realizadas en el sistema. El análisis por usuario ayuda a identificar necesidades de formación, distribuir las cargas de trabajo y evaluar el rendimiento individual. Por ejemplo, permite detectar si ciertos usuarios suelen estar asociados a tiempos de aprobación prolongados o a cambios frecuentes después de la aprobación. Esta información puede orientar la gestión de recursos y las iniciativas de mejora de procesos. Por qué es importante Permite asignar responsabilidades y analizar el rendimiento individual o por equipo, así como identificar oportunidades de formación o limitaciones de recursos. Dónde obtenerlo Esta información se encuentra en campos como ERNAM (creado por) de EKKO o en el campo de usuario de las tablas de documentos de cambio (CDHDR-USERNAME). Ejemplos CB9980000012JSMITHRROE | |||
| Categoría de posición ItemCategory | Clasifica una posición de la orden de compra, por ejemplo, como estándar, en consignación, de subcontratación o de servicios. | ||
| Descripción La categoría de posición determina cómo se gestiona y procesa la compra de un material o servicio específico. Influye en pasos posteriores, como la entrada de mercancías y la verificación de facturas. Este atributo es importante para analizar las variantes del proceso según lo que se compra. Por ejemplo, el proceso de una posición de servicios, que requiere una hoja de entrada de servicios, difiere considerablemente del de una posición estándar de existencias. Analizar los datos por categoría de posición ayuda a explicar estas diferencias y permite aplicar mejoras específicas. Por qué es importante Explica las variaciones del proceso al distinguir entre distintos tipos de aprovisionamiento, como bienes, servicios o subcontratación. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA, en el campo PSTYP. Ejemplos 093 | |||
| Centro Plant | Instalación o ubicación operativa donde se entregan los bienes o se prestan los servicios. | ||
| Descripción En SAP, un centro es una ubicación física donde se producen o almacenan bienes, o se prestan servicios. Es un elemento clave para la logística y la planificación. Segmentar el análisis del proceso por centro puede revelar diferencias regionales o específicas de cada ubicación en el proceso de aprovisionamiento. Por ejemplo, permite identificar si algunos centros tienen tiempos de entrega más largos o más devoluciones de bienes, lo que puede indicar problemas locales de logística o control de calidad. Por qué es importante Permite analizar el proceso por ubicación y detectar diferencias de rendimiento entre centros operativos, plantas o almacenes. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA, en el campo WERKS. Ejemplos 10101710DE01 | |||
| Código de sociedad CompanyCode | Identificador de la entidad jurídica o sociedad para la que se crea el pedido de compra. | ||
| Descripción El código de sociedad representa una unidad contable independiente dentro de una organización. Todas las transacciones financieras relacionadas con un pedido de compra se contabilizan en un código de sociedad específico. Este atributo organizativo fundamental permite filtrar y comparar los procesos de aprovisionamiento de distintas entidades jurídicas. El análisis por código de sociedad puede revelar incoherencias en la ejecución de los procesos, diferencias de eficiencia o distintos niveles de cumplimiento en la organización. Por qué es importante Permite segmentar el análisis del proceso por entidad jurídica y facilita la comparación del rendimiento y el cumplimiento entre distintas áreas de la empresa. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo BUKRS. Ejemplos 101017102000 | |||
| Entrega puntual del proveedor SupplierOnTimeDelivery | Indicador calculado que señala si la entrada de mercancías se contabilizó en la fecha de entrega solicitada o antes. | ||
| Descripción Este atributo booleano se calcula comparando la marca de tiempo de la actividad 'Goods Receipt Posted' con la 'Requested Delivery Date'. Si la entrada de mercancías se registra en la fecha solicitada o antes, el atributo se marca como 'true'. Este atributo respalda directamente el KPI «Tasa de entregas puntuales del proveedor». Simplifica el análisis porque permite filtrar fácilmente las entregas puntuales o tardías, algo esencial para los Dashboards de rendimiento de proveedores y la evaluación de proveedores. Por qué es importante Mide directamente la fiabilidad del proveedor, sirve de base para el KPI de entregas puntuales y facilita una gestión eficaz del rendimiento de los proveedores. Dónde obtenerlo Se calcula comparando la marca de tiempo de la actividad 'Goods Receipt Posted' con el atributo 'RequestedDeliveryDate'. Ejemplos truefalse | |||
| Es un reproceso IsRework | Indicador calculado que señala si el pedido de compra requirió un reproceso, por ejemplo, por un cambio posterior a la aprobación o una devolución de bienes. | ||
| Descripción Este atributo booleano se calcula analizando la secuencia de actividades de cada pedido de compra. Se marca como 'true' si se produce un evento 'Purchase Order Changed' después de un evento 'Purchase Order Approved' o si aparece un evento 'Goods Returned'. Este indicador simplifica el cálculo del KPI «Tasa de procesamiento directo». Permite filtrar y visualizar fácilmente todos los pedidos de compra que requirieron intervención manual o correcciones, y ayuda a cuantificar el coste y la frecuencia de los reprocesos. Por qué es importante Ayuda a cuantificar la ineficiencia del proceso al señalar los casos que requirieron reprocesos, algo fundamental para calcular las tasas de procesamiento directo e identificar las causas de las desviaciones. Dónde obtenerlo Campo calculado a partir de la secuencia de actividades. La lógica comprueba si un evento 'Purchase Order Changed' se produce después de una aprobación o si existe un evento 'Goods Returned'. Ejemplos truefalse | |||
| Es una compra fuera de contrato IsMaverickSpend | Indicador calculado que señala si se creó un pedido de compra sin una solicitud de compra previa y aprobada. | ||
| Descripción Este indicador booleano se calcula durante el procesamiento de datos. Se establece en 'true' si el pedido de compra no tiene una solicitud de compra asociada o si su creación omite el flujo de aprobación estándar. Este atributo respalda directamente el Dashboard «Identificación de compras fuera de contrato» y los KPI relacionados. Ayuda a cuantificar las compras que no cumplen las políticas, para que las empresas puedan centrarse en determinados departamentos o grupos de usuarios y reforzar las políticas y los controles de aprovisionamiento. Por qué es importante Identifica directamente las compras que no cumplen las políticas, ayuda a cuantificar las desviaciones del proceso y permite hacer cumplir los controles financieros y las políticas de aprovisionamiento. Dónde obtenerlo Campo calculado a partir de la ausencia de un valor en 'PurchaseRequisitionNumber' para determinados tipos de documento o del análisis de la secuencia de eventos. Ejemplos truefalse | |||
| Grupo de compras PurchasingGroup | Grupo específico de compradores responsable de determinadas actividades de aprovisionamiento. | ||
| Descripción Un grupo de compras está formado por uno o varios compradores responsables de determinadas actividades de compra, materiales o proveedores. Son el principal punto de contacto para los proveedores. Este atributo permite analizar la carga de trabajo y el rendimiento con más detalle que la organización de compras. Puede ayudar a detectar equipos sobrecargados, medir la eficiencia de distintos grupos de compradores y determinar cuáles tienden más a desviarse del proceso, por ejemplo, mediante compras fuera de contrato. Por qué es importante Ofrece una visión detallada del rendimiento de los grupos de compradores y permite analizar la carga de trabajo, la eficiencia y el cumplimiento del proceso a nivel de equipo. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo EKGRP. Ejemplos 001002N00 | |||
| Número de material MaterialNumber | Identificador del material o bien específico que se adquiere. | ||
| Descripción En SAP, el número de material es un código único asignado a cada registro maestro de material. Se utiliza en todas las transacciones relacionadas con ese material, incluidas las de aprovisionamiento, gestión de inventario y ventas. El análisis por número o grupo de materiales permite estudiar las compras por categoría de producto. Puede ayudar a detectar si los procesos de aprovisionamiento de ciertos materiales son menos eficientes, tienen tiempos de entrega más largos o generan más devoluciones, y aportar información útil para la gestión de categorías. Por qué es importante Permite analizar las compras por categoría de producto y detectar problemas en los procesos o en el rendimiento de los proveedores relacionados con productos o materiales específicos. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA, en el campo MATNR. Ejemplos RM100-100FG210SERV-CONSULT | |||
| Organización de compras PurchasingOrganization | Unidad organizativa responsable de adquirir materiales y servicios y negociar con los proveedores. | ||
| Descripción La organización de compras es una unidad organizativa clave del aprovisionamiento. Puede estructurarse a nivel corporativo, de sociedad o de centro, y es responsable de todas las actividades de compra. Analizar el proceso por organización de compras ayuda a evaluar la eficiencia y el rendimiento de los distintos equipos o regiones de aprovisionamiento. También permite detectar diferencias en las negociaciones con proveedores, el cumplimiento de los procesos o los retrasos en las aprobaciones entre unidades organizativas. Por qué es importante Permite comparar el rendimiento de distintos departamentos o regiones de aprovisionamiento, lo que ayuda a identificar buenas prácticas y oportunidades de mejora. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, en el campo EKORG. Ejemplos 10101710US01 | |||
Actividades de compra a pago: pedido de compra
| Actividad | Descripción | ||
|---|---|---|---|
| Entrada de mercancías contabilizada | Representa la recepción física de mercancías del proveedor y el registro correspondiente en el sistema. Es una transacción explícita que actualiza el historial de la orden de compra. | ||
| Por qué es importante Este es un hito importante: pone fin al tiempo de entrega del proveedor e inicia el proceso interno de verificación de facturas. Es esencial para hacer un seguimiento de las entregas a tiempo. Dónde obtenerlo Se registra como documento de material en las tablas MKPF (cabecera) y MSEG (posición), y se vincula al historial de la orden de compra en la tabla EKBE mediante un tipo de movimiento específico (por ejemplo, 101). Capturar Fecha de contabilización (BUDAT) de la cabecera del documento de material (MKPF), vinculada mediante EKBE. Tipo de evento explicit | |||
| Factura recibida | Representa el ingreso en SAP de la factura de un proveedor y su vinculación con la orden de compra correspondiente. Es una contabilización financiera explícita que crea un documento contable. | ||
| Por qué es importante Este es un hito clave que conecta el proceso de compras con el de cuentas por pagar. Permite analizar el tiempo transcurrido entre la entrada de mercancías y el procesamiento de la factura. Dónde obtenerlo Se crea un documento contable en la tabla BKPF (cabecera); sus posiciones se almacenan en BSEG o en el libro mayor universal ACDOCA. El documento se vincula a la orden de compra en la tabla RSEG. Capturar Fecha de entrada del documento (CPUDT) de la tabla de cabecera de documentos contables BKPF. Tipo de evento explicit | |||
| Orden de compra aprobada | Indica que la orden de compra ha recibido todas las aprobaciones internas necesarias y está autorizada para enviarse al proveedor. El evento se infiere a partir de un cambio de estado en la estrategia de liberación de la orden. | ||
| Por qué es importante Este es un hito clave para medir la eficiencia de las aprobaciones y el retrabajo posterior. Analizar el tiempo entre la creación y la aprobación de la orden permite detectar demoras en el proceso interno. Dónde obtenerlo Se infiere a partir del indicador de liberación (FRGKE) de la tabla EKKO. La marca de tiempo se determina consultando el historial de cambios (CDHDR/CDPOS) para identificar cuándo se actualizó este campo al estado de «liberado». Capturar Se infiere a partir de los registros de cambios del campo del indicador de liberación (FRGKE) de la tabla EKKO. Tipo de evento inferred | |||
| Orden de compra completada | Esta actividad indica que una posición de la orden de compra se considera cerrada desde el punto de vista logístico. Se infiere cuando están activados los indicadores «Entrega completada» y «Factura final». | ||
| Por qué es importante Este es el punto final del análisis del ciclo de vida de la orden de compra. Medir el tiempo hasta este evento permite calcular el tiempo de ciclo integral de las operaciones de compras. Dónde obtenerlo Se infiere a partir de los indicadores de estado de la tabla de posiciones de órdenes de compra EKPO. El evento se produce cuando los indicadores «Entrega completada» (ELIKZ) y «Factura final» (EREKZ) están activados. Capturar Se infiere a partir de los registros de cambios cuando los campos ELIKZ y EREKZ de EKPO indican que ambos estados se han completado. Tipo de evento inferred | |||
| Orden de compra creada | Marca la creación del documento oficial de orden de compra, que puede crearse con o sin referencia a una solicitud de compra. Es un evento explícito que se registra cuando se guarda por primera vez el documento de la orden en el sistema. | ||
| Por qué es importante Esta actividad puede servir como punto de partida alternativo del proceso, especialmente para analizar las compras fuera de los canales aprobados. Es un evento fundamental para hacer un seguimiento del tiempo total de procesamiento de las órdenes de compra. Dónde obtenerlo Se registra en la tabla de cabecera de órdenes de compra EKKO. La fecha de creación (AEDAT) y la hora del documento se almacenan directamente en esta tabla. Capturar Marca de tiempo de creación (AEDAT) del documento de orden de compra en la tabla EKKO. Tipo de evento explicit | |||
| Solicitud de compra aprobada | Representa la aprobación formal de una solicitud de compra por parte de un gerente o aprobador designado. Por lo general, se infiere a partir de un cambio de estado del documento de solicitud, que indica que está listo para convertirse en una orden de compra. | ||
| Por qué es importante Este es un hito clave para medir los tiempos del ciclo de aprobación e identificar cuellos de botella. Las demoras en esta etapa afectan directamente la rapidez con que se puede crear y enviar una orden de compra al proveedor. Dónde obtenerlo Se infiere a partir de los campos de estado de liberación de la tabla EBAN (por ejemplo, FRGZU, indicador de liberación). La marca de tiempo se obtiene de los documentos de cambio (CDHDR/CDPOS), que registran cuándo se estableció el estado de liberación final. Capturar Se infiere a partir de los registros de cambios (CDHDR/CDPOS) de los campos de estado de liberación de la tabla EBAN. Tipo de evento inferred | |||
| Solicitud de compra creada | Esta actividad marca la solicitud formal de bienes o servicios e inicia el proceso de compras. El evento se registra explícitamente cuando un usuario guarda una nueva solicitud de compra (por ejemplo, mediante la transacción ME51N). | ||
| Por qué es importante Este es el punto de partida principal de muchos ciclos de órdenes de compra. Analizar el tiempo transcurrido desde este evento hasta la creación de la orden permite detectar demoras en el abastecimiento y el procesamiento interno. Dónde obtenerlo Se registra en la tabla EBAN (solicitud de compra). La marca de tiempo de creación puede consultarse en las tablas del historial de cambios CDHDR y CDPOS para el objeto EBAN. Capturar Evento registrado al crear un documento en la tabla EBAN. Tipo de evento explicit | |||
| Confirmación de servicios registrada | Esta actividad marca la confirmación de que se ha prestado un servicio especificado en una orden de compra. Se registra explícitamente al crear una hoja de entrada de servicios. | ||
| Por qué es importante En las compras de servicios, equivale a la entrada de mercancías. Es fundamental para hacer un seguimiento de los plazos de prestación y permitir pagos puntuales a los proveedores. Dónde obtenerlo Se registra al crear una hoja de entrada de servicios, cuyos datos se almacenan en las tablas ESSR (cabecera) y ESLL (líneas). La fecha de creación sirve como marca de tiempo. Capturar Fecha de creación del documento de hoja de entrada de servicios en la tabla ESSR. Tipo de evento explicit | |||
| Factura pagada | Marca la liquidación final de la factura del proveedor mediante una ejecución de pagos o un pago manual. Es una transacción financiera explícita que crea un documento de compensación. | ||
| Por qué es importante Aunque técnicamente forma parte del proceso de pagos, incluir esta actividad ofrece una visión completa del ciclo de compras a pago. Es clave para analizar las condiciones y el rendimiento de los pagos. Dónde obtenerlo El pago se registra como documento de compensación en BKPF/ACDOCA. La fecha de compensación (AUGDT) de la posición de la factura en la tabla BSEG o ACDOCA indica el evento de pago. Capturar Fecha de compensación (AUGDT) del documento de factura, disponible en BSEG o ACDOCA. Tipo de evento explicit | |||
| Mercancías devueltas | Indica que se devolvieron al proveedor mercancías recibidas anteriormente, normalmente por problemas de calidad, daños o envíos incorrectos. Se registra explícitamente como un movimiento de mercancías de anulación. | ||
| Por qué es importante Esta actividad pone de manifiesto el retrabajo y posibles problemas de calidad del proveedor o de precisión de la orden. Una frecuencia elevada de devoluciones para un proveedor o material específico indica que existe un problema. Dónde obtenerlo Se registra como documento de material con un tipo de movimiento de devolución específico (por ejemplo, 122). El evento queda registrado en MKPF/MSEG y vinculado a la orden de compra en la tabla de historial EKBE. Capturar Fecha de contabilización del documento de material con un tipo de movimiento de devolución en EKBE. 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 o del documento completo. Se registra cuando un usuario activa un indicador de eliminación en el documento. | ||
| Por qué es importante Esta actividad es un posible punto final alternativo del proceso e indica un fallo o una cancelación. Analizar por qué se eliminan las órdenes de compra puede revelar problemas en la planificación de la demanda o la definición de requisitos. Dónde obtenerlo Se obtiene del indicador de eliminación (LOEKZ) de las tablas de cabecera (EKKO) o de posiciones (EKPO) de la orden de compra. La marca de tiempo se deriva de los documentos de cambio (CDHDR/CDPOS). Capturar Marca de tiempo de los documentos de cambio (CDHDR/CDPOS) cuando se activa el indicador de eliminación (LOEKZ). Tipo de evento explicit | |||
| Orden de compra enviada al proveedor | Representa el momento en que se comunica la orden de compra al proveedor, por ejemplo, mediante EDI, correo electrónico o impresión. Este evento suele registrarse en los logs de gestión de salidas del sistema. | ||
| Por qué es importante Esta actividad marca el inicio real del tiempo de entrega del proveedor. Es fundamental para medir con precisión su rendimiento desde el momento en que recibe la orden. Dónde obtenerlo Se obtiene de la tabla de control de salidas NAST, que registra los mensajes enviados para un documento de compras. Puede utilizarse la fecha y la hora del tipo de salida correspondiente (por ejemplo, EDI o correo electrónico). Capturar Marca de tiempo del primer mensaje de salida enviado correctamente para la orden de compra en la tabla NAST. Tipo de evento inferred | |||
| Orden de compra modificada | Esta actividad indica que la orden de compra se modificó después de su creación inicial, por ejemplo, para cambiar la cantidad, el precio o la fecha de entrega. El sistema la registra explícitamente en los logs de cambios. | ||
| Por qué es importante Hacer un seguimiento de los cambios, sobre todo después de la aprobación, es fundamental para identificar ineficiencias, retrabajo y posibles problemas de cumplimiento. Los cambios frecuentes pueden indicar que las especificaciones iniciales eran deficientes. Dónde obtenerlo Se registra en las tablas de documentos de cambio CDHDR (cabecera) y CDPOS (posición) para los objetos de órdenes de compra (EINKBELEG). Cada cambio genera una entrada detallada en el log. Capturar Evento registrado cuando se modifican campos clave de las tablas EKKO o EKPO, según consta en CDHDR/CDPOS. Tipo de evento explicit | |||
Guías de extracción
Pasos
- Requisitos previos y acceso: Asegúrese de contar con un usuario que tenga las autorizaciones necesarias para consultar las vistas Core Data Services (CDS) del sistema SAP S/4HANA. Puede acceder mediante SAP HANA Studio, ABAP Development Tools (ADT) para Eclipse o una herramienta de extracción de datos de terceros compatible con conexiones SQL a la base de datos SAP HANA.
- Identifique los datos de conexión del sistema: Obtenga los parámetros de conexión necesarios para su sistema SAP S/4HANA, incluidos el host, el número de instancia y sus credenciales de autenticación.
- Conéctese a la base de datos: Use el cliente SQL que prefiera para conectarse a la base de datos SAP S/4HANA donde se encuentran las vistas CDS.
- Prepare la consulta SQL: Copie en su editor SQL la consulta completa que aparece en la sección de consultas de este documento. Está diseñada para extraer todas las actividades y los atributos necesarios.
- Configure los parámetros de filtrado: Localice los valores de marcador de posición de la consulta. Sustituya _start_date y _end_date por el intervalo de fechas que desea analizar (por ejemplo, '20230101' y '20231231'). Modifique el filtro poh.CompanyCode para incluir los códigos de empresa que desea analizar.
- Ejecute la consulta: Ejecute la consulta SQL modificada en la base de datos S/4HANA. Según el volumen de datos y el intervalo de fechas especificado, la ejecución puede tardar un tiempo.
- Revise los resultados preliminares: Cuando termine la consulta, revise rápidamente los resultados en su cliente SQL. Compruebe que aparezcan distintas actividades, que las marcas de tiempo estén completas y que el ID del caso (PurchaseOrderNumber) sea coherente.
- Exporte los datos: Exporte el conjunto completo de resultados desde su herramienta SQL a un archivo CSV (valores separados por comas). Asegúrese de que el archivo use codificación UTF-8 para evitar problemas con los caracteres.
- Prepare los datos para cargarlos: Antes de cargarlos en ProcessMind, abra el archivo CSV y compruebe que los encabezados de columna coincidan exactamente con los atributos definidos en los requisitos de datos (PurchaseOrderNumber, ActivityName, EventTime, etc.). Ajuste los nombres de las columnas si la herramienta de exportación los modificó.
- Cargue los datos en ProcessMind: Cargue el archivo CSV final en su proyecto de ProcessMind. Durante la importación, asigne las columnas del archivo a los campos correspondientes de ID del caso, actividad y marca de tiempo.
Configuración
- Vistas CDS principales utilizadas: La lógica de extracción se basa en un conjunto de vistas CDS estándar con una semántica rica. Entre las vistas principales se incluyen:
- I_PurchaseOrderItemAPI01: Datos básicos de las partidas de órdenes de compra.
- I_PurchaseRequisitionItemAPI01: Detalles de las solicitudes de compra.
- I_MaterialDocumentItem: Movimientos de mercancías, como recepciones y devoluciones.
- I_ServiceEntrySheetAPI01: Eventos de confirmación de servicios.
- I_SupplierInvoiceAPI01: Información de facturas de proveedores.
- I_OperationalAcctgDocItem: Vinculación de facturas con documentos financieros para hacer seguimiento de los pagos.
- I_ChangeDocument: Cambios en las órdenes de compra.
- Filtrado por intervalo de fechas: Es fundamental aplicar un filtro de fechas para controlar el rendimiento y el volumen de datos. La consulta usa los marcadores de posición _start_date y _end_date sobre la fecha de creación de la orden de compra (PurchaseOrderDate). Se recomienda comenzar con un intervalo de entre 3 y 6 meses de datos.
- Filtrado por organización: La consulta siempre debe filtrarse por CompanyCode para limitar la extracción a las unidades de negocio pertinentes. Para afinar aún más los resultados, puede añadir filtros por PurchaseOrderType o PurchasingOrganization a la expresión de tabla común PO_base.
- Requisitos previos: El usuario que ejecute la consulta necesita autorización SELECT para todas las vistas CDS indicadas. Por lo general, el acceso a estas vistas se concede mediante roles específicos de negocio o análisis en S/4HANA. Sin los permisos adecuados, la consulta fallará.
Consulta de ejemplo sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Pasos
- Confirme que dispone de acceso SQL directo al esquema SAP HANA que contiene EKKO y EKPO, y obtenga las autorizaciones de lectura necesarias. Sustituya los marcadores de posición del esquema y la conexión por los valores configurados para su sistema.
- Defina el intervalo de extracción con [Start timestamp] y [End timestamp]. Para la carga inicial, se recomienda un intervalo de tres a seis meses. Aplique filtros por código de empresa y tipo de documento solo si el alcance de los informes lo requiere.
- Identifique las órdenes de compra en EKKO y EKPO y conserve el número de orden, el proveedor, el tipo de documento, el código de empresa, la fecha y hora de creación, y los atributos de las partidas. Agregue los valores netos de EKPO para calcular TotalNetAmount por orden de compra.
- Extraiga de EBAN los eventos de creación y aprobación de solicitudes de compra. Use el número de solicitud y la referencia de partida disponibles en EKPO para asociar las solicitudes con las órdenes de compra. Como los indicadores y las marcas de tiempo de aprobación de las solicitudes varían según la configuración de cada versión, configure las expresiones de estado y marca de tiempo de aprobación según la estrategia de liberación activa de SAP en [Configure based on your system].
- Extraiga los eventos de creación, aprobación, modificación, eliminación y finalización de órdenes de compra. Para la creación, use la fecha y hora de creación de EKKO. La aprobación, las modificaciones y las eliminaciones requieren fuentes del historial de liberaciones o cambios. Configure las expresiones de origen correspondientes mediante [Your table name] y [Your column name] cuando el historial pertinente no esté disponible en el esquema seleccionado.
- Extraiga los eventos de comunicación con proveedores, recepción de mercancías, confirmación de servicios, devolución de mercancías, recepción de facturas y pago de facturas desde las fuentes pertinentes de salidas, documentos de materiales, entradas de servicios, facturas, contabilidad y compensación. La consulta incluye marcadores de posición explícitos para objetos específicos del sistema, ya que EKKO y EKPO por sí solas no contienen estas fuentes.
- Normalice todos los eventos de origen con la misma estructura de registro de eventos. Cada fila debe incluir PurchaseOrderNumber, ActivityName, EventTime, SourceSystem, LastDataUpdate, VendorId, UserName, TotalNetAmount, PurchaseRequisitionNumber, RequestedDeliveryDate y DocumentType. Conserve las apariciones múltiples de una actividad cuando la fuente contenga varios eventos válidos.
- Valide las marcas de tiempo, elimine únicamente las filas de origen exactamente duplicadas y no infiera actividades que no tengan un registro de origen. ProcessMind lee el registro de eventos tal como está, por lo que cada actividad que aparezca en la visualización del proceso debe figurar en una fila explícita.
- Exporte los resultados como archivo delimitado o conjunto de resultados de base de datos, con una fila de encabezados y nombres de columna estables. Use un formato de marca de tiempo compatible con la configuración de carga de ProcessMind, conserve PurchaseOrderNumber como texto y cargue el registro de eventos completo mediante la conexión de datos configurada en ProcessMind.
Configuración
- Objetos de origen: EKKO y EKPO son las fuentes confirmadas para las cabeceras y partidas de las órdenes de compra. Configure los objetos adicionales para solicitudes, estado de liberación, historial de cambios, salidas, movimientos de mercancías, hojas de entrada de servicios, facturas, pagos y compensaciones según la versión de SAP S/4HANA y el modelo de datos activo.
- Identificador del caso: Use PurchaseOrderNumber como identificador del caso. Asocie los eventos de las partidas con el número de orden de compra y conserve las referencias de partida en una columna adicional específica de la fuente, si es necesario.
- Intervalo de fechas: Comience con un período de tres a seis meses. Para las cargas históricas, procese intervalos más pequeños y concilie los límites superpuestos para evitar omisiones.
- Filtros: Configure los filtros de Company Code, Document Type, VendorId, organización de compras, grupo de compras y fecha del evento según el alcance requerido. Los filtros de código de empresa y tipo de documento deben usar valores válidos en el sistema de destino.
- Semántica de los eventos: La creación y la eliminación pueden registrarse explícitamente cuando estén disponibles los campos o registros pertinentes del documento. La aprobación y la finalización son eventos basados en el estado y requieren marcas de tiempo de estado configuradas. No cree filas basándose únicamente en el estado actual si no dispone de una marca de tiempo del evento justificable.
- Rendimiento: Aplique cuanto antes los filtros de fecha del evento y alcance organizativo, agregue EKPO antes de combinarla con las fuentes de eventos siempre que sea posible y ejecute las cargas históricas grandes por intervalos. Asegúrese de que las estadísticas de la base de datos sean adecuadas y evite las combinaciones sin restricciones entre partidas, contabilidad e historial de cambios.
- Marca de tiempo de actualización: Asigne LastDataUpdate a la marca de tiempo de ejecución de la extracción en todas las filas de cada ejecución.
- Requisitos previos: Se requiere conectividad con SAP HANA, autorización de lectura para todos los objetos de origen configurados, acceso a los datos pertinentes de compras, gestión de inventario, adquisición de servicios, verificación de facturas y cuentas por pagar, y una conexión de ProcessMind que permita importar el archivo o conjunto de resultados seleccionado.
- Configuración específica del sistema: Sustituya todos los marcadores de posición entre corchetes de la consulta por una tabla, vista, columna o expresión aprobada del sistema SAP S/4HANA de destino. No incluya credenciales en la consulta ni en la configuración de extracción.
Consulta de ejemplo sql
WITH
params AS (
SELECT
CAST('[Start timestamp]' AS TIMESTAMP) AS start_ts,
CAST('[End timestamp]' AS TIMESTAMP) AS end_ts,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update,
CAST('[Source system]' AS NVARCHAR(100)) AS source_system
FROM DUMMY
),
po_base AS (
SELECT
h.MANDT,
h.EBELN AS PurchaseOrderNumber,
h.LIFNR AS VendorId,
h.BSART AS DocumentType,
h.BUKRS AS CompanyCode,
CAST(h.AEDAT AS DATE) AS POChangedDate,
CAST(h.AEDAT AS TIMESTAMP) AS POChangedTimestamp,
CAST(h.ERNAM AS NVARCHAR(100)) AS POCreatedBy,
CAST(h.BEDAT AS DATE) AS PODate,
CAST(h.EBELN AS NVARCHAR(20)) AS PurchaseOrderKey,
CAST(SUM(COALESCE(i.NETWR, 0)) AS DECIMAL(23, 2)) AS TotalNetAmount,
CAST(MIN(i.BEDNR) AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
CAST(MIN(i.EINDT) AS DATE) AS RequestedDeliveryDate
FROM EKKO h
INNER JOIN EKPO i
ON i.MANDT = h.MANDT
AND i.EBELN = h.EBELN
WHERE h.AEDAT >= (SELECT start_ts FROM params)
AND h.AEDAT < (SELECT end_ts FROM params)
AND h.BUKRS IN ([Company Code filter])
AND h.BSART IN ([Document Type filter])
GROUP BY
h.MANDT,
h.EBELN,
h.LIFNR,
h.BSART,
h.BUKRS,
h.AEDAT,
h.ERNAM,
h.BEDAT
),
po_items AS (
SELECT
i.MANDT,
i.EBELN AS PurchaseOrderNumber,
i.EBELP,
i.BANFN AS PurchaseRequisitionNumber,
i.BEDNR,
i.EINDT AS RequestedDeliveryDate
FROM EKPO i
),
events AS (
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(r.[Purchase requisition creation timestamp] AS TIMESTAMP) AS EventTime,
s.source_system AS SourceSystem,
s.last_data_update AS LastDataUpdate,
p.VendorId,
CAST(r.[Purchase requisition created by] AS NVARCHAR(100)) AS UserName,
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition source table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition creation timestamp] >= s.start_ts
AND r.[Purchase requisition creation timestamp] < s.end_ts
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(r.[Purchase requisition approval timestamp] AS TIMESTAMP) AS EventTime,
s.source_system,
s.last_data_update,
p.VendorId,
CAST(r.[Purchase requisition approver] AS NVARCHAR(100)),
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)),
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition approval history table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition approval timestamp] >= s.start_ts
AND r.[Purchase requisition approval timestamp] < s.end_ts
AND r.[Approval status] = '[Approved status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Created',
CAST(p.PODate AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
p.POCreatedBy,
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
CROSS JOIN params s
WHERE p.PODate >= CAST(s.start_ts AS DATE)
AND p.PODate < CAST(s.end_ts AS DATE)
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Approved',
CAST(a.[Purchase order approval timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(a.[Approver] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order release history table or view] a
ON a.[Client] = p.MANDT
AND a.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE a.[Purchase order approval timestamp] >= s.start_ts
AND a.[Purchase order approval timestamp] < s.end_ts
AND a.[Release status] = '[Approved release status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Sent to Vendor',
CAST(o.[Output timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(o.[Output user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order output source table or view] o
ON o.[Client] = p.MANDT
AND o.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE o.[Output timestamp] >= s.start_ts
AND o.[Output timestamp] < s.end_ts
AND o.[Output status] = '[Successfully processed output status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Changed',
CAST(c.[Change timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(c.[Changed by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order change history table or view] c
ON c.[Client] = p.MANDT
AND c.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE c.[Change timestamp] >= s.start_ts
AND c.[Change timestamp] < s.end_ts
AND c.[Change indicator] = '[Changed indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Receipt Posted',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods receipt movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Services Confirmation Entered',
CAST(v.[Service entry timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(v.[Entered by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your service entry sheet source table or view] v
ON v.[Client] = p.MANDT
AND v.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE v.[Service entry timestamp] >= s.start_ts
AND v.[Service entry timestamp] < s.end_ts
AND v.[Service entry status] = '[Accepted service entry status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Returned',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods return movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Received',
CAST(i.[Invoice posting timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Invoice posting timestamp] >= s.start_ts
AND i.[Invoice posting timestamp] < s.end_ts
AND i.[Invoice status] = '[Posted invoice status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Paid',
CAST(i.[Clearing timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Cleared by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice clearing source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Clearing timestamp] >= s.start_ts
AND i.[Clearing timestamp] < s.end_ts
AND i.[Clearing status] = '[Cleared status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Completed',
CAST(x.[Completion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(x.[Completion user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order item status source table or view] x
ON x.[Client] = p.MANDT
AND x.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE x.[Completion timestamp] >= s.start_ts
AND x.[Completion timestamp] < s.end_ts
AND x.[Delivery completed indicator] = '[Set indicator value]'
AND x.[Final invoice indicator] = '[Set indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Deleted',
CAST(d.[Deletion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(d.[Deleted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order deletion history table or view] d
ON d.[Client] = p.MANDT
AND d.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE d.[Deletion timestamp] >= s.start_ts
AND d.[Deletion timestamp] < s.end_ts
AND d.[Deletion indicator] = '[Set deletion indicator value]'
)
SELECT
PurchaseOrderNumber,
ActivityName,
EventTime,
SourceSystem,
LastDataUpdate,
VendorId,
UserName,
TotalNetAmount,
PurchaseRequisitionNumber,
RequestedDeliveryDate,
DocumentType
FROM events
WHERE PurchaseOrderNumber IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY PurchaseOrderNumber, EventTime, ActivityName; Pasos
- Especificación y diseño: Defina la estructura final del archivo de registro de eventos, incluidos todos los atributos obligatorios y recomendados. Documente las tablas SAP específicas (por ejemplo, EKKO, EKPO, EKBE, CDHDR, CDPOS, BKPF) que se usarán como fuente de datos para cada una de las 13 actividades requeridas.
- Creación del programa: En SAP GUI, abra el editor ABAP mediante el código de transacción SE38 o SE80. Cree un programa ejecutable nuevo, por ejemplo, Z_PM_PO_EXTRACT.
- Definición de la pantalla de selección: Programe la pantalla de selección del informe para que los usuarios puedan filtrar los datos que desean extraer. Incluya parámetros para el intervalo de fechas de creación de la orden de compra (P_AEDAT), el código de empresa (P_BUKRS) y el tipo de documento de compras (P_BSART).
- Declaraciones de datos: Defina las tablas internas y las estructuras de datos que necesita el programa. Incluya una tabla interna para el registro de eventos final, con la estructura definida en la especificación.
- Implementación de la lógica de selección de datos: Escriba la lógica ABAP principal para seleccionar los datos de cada una de las 13 actividades. Esto implica ejecutar una serie de instrucciones SELECT en las tablas SAP pertinentes y combinarlas cuando sea necesario. Para los eventos basados en cambios, lea las tablas de registro de cambios CDHDR y CDPOS.
- Transformación y asignación de datos: Para cada registro recuperado, asigne los campos de las tablas SAP a las columnas correspondientes de la tabla interna del registro de eventos final. Asigne ActivityName según el evento procesado (por ejemplo, 'Purchase Order Created'). Convierta los campos de fecha y hora a un formato de marca de tiempo uniforme para EventTime.
- Consolidación de los datos de eventos: Tras procesar los 13 tipos de actividad, reúna todos los datos en una única tabla interna unificada. Esta tabla representará el registro de eventos completo de las órdenes de compra seleccionadas.
- Implementación de la salida a archivo: Añada una función para escribir la tabla interna final en un archivo. Se recomienda usar el método cl_gui_frontend_services=>gui_download para que los usuarios puedan guardar el archivo como CSV en su equipo, o OPEN DATASET para guardarlo en el servidor de aplicaciones SAP y procesarlo en segundo plano.
- Creación de un código de transacción (opcional): Para facilitar el acceso al programa a los usuarios de negocio, use el código de transacción SE93 para crear un código de transacción personalizado (por ejemplo, ZPM_PO_EXTRACT) que ejecute el programa ABAP.
- Programación de un trabajo en segundo plano: Para grandes volúmenes de datos o extracciones automatizadas, use el código de transacción SM36 para programar el programa como trabajo en segundo plano. El archivo de salida se guardará en la ruta del servidor de aplicaciones especificada en la lógica del programa.
Configuración
- Criterios de selección: El programa debe incluir parámetros de selección para filtrar los datos de forma eficaz. Los filtros principales son:
- Intervalo de fechas: Es obligatorio indicar un intervalo para la fecha de creación de la orden de compra (EKKO-AEDAT). Se recomienda comenzar con un período de 3 a 6 meses para controlar el volumen de datos y el rendimiento del informe.
- Código de empresa (BUKRS): Es esencial para las organizaciones con varias entidades jurídicas, ya que permite limitar el alcance de la extracción.
- Tipo de documento de compras (BSART): Permite filtrar tipos específicos de órdenes de compra, como órdenes estándar, órdenes marco u órdenes de traslado de stock, para centrar el análisis.
- Lectura del registro de cambios: La extracción de actividades como 'Purchase Order Approved' o 'Purchase Order Changed' requiere leer las tablas de registro de cambios de SAP (CDHDR, CDPOS). Esta operación puede consumir muchos recursos. La lógica ABAP debe optimizarse para seleccionar únicamente las clases de objeto necesarias (EINKBELEG, BANF) y las combinaciones de tabla y campo pertinentes.
- Autorizaciones: El usuario o la cuenta técnica que ejecute este informe necesita amplias autorizaciones de lectura para tablas de varios módulos SAP, incluidos Materials Management (MM), Financial Accounting (FI) y tablas de todo el sistema. Entre ellas se encuentran EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR y CDPOS.
- Ejecución en segundo plano: Si la extracción abarca más de unos pocos meses de datos o se ejecuta en un sistema con un volumen alto de transacciones, ejecute siempre el programa en segundo plano para evitar que se agote el tiempo de espera de los procesos de diálogo.
Consulta de ejemplo abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log. ¿Listo para comenzar?
Esta plantilla ofrece una base sólida para iniciar su recorrido en Process Mining. Aproveche los datos de SAP S/4HANA para descubrir oportunidades de eficiencia y transformar hoy mismo su proceso de compras y pagos.
Optimice sus órdenes de compra: reduzca ahora el tiempo del ciclo de compras y pagos
Elimine ineficiencias y reduzca un 30 % el tiempo del ciclo de sus órdenes de compra.
No se requiere tarjeta de crédito. Configure todo en minutos.