Su plantilla de datos de compras a pagos: orden de compra
Su plantilla de datos de compras a pagos: orden de compra
- Atributos recomendados para un análisis detallado
- Actividades clave que debe seguir dentro del proceso
- Guía paso a paso para extraer los datos
Purchase to Pay - Purchase Order: Atributos
| Nombre | Descripción | ||
|---|---|---|---|
| Actividad ActivityName | El nombre del evento empresarial o paso que tuvo lugar en el proceso de la orden de compra. | ||
| Descripción Este atributo describe una acción específica o un cambio de estado dentro del ciclo de vida de la orden de compra, como «Orden de compra creada», «Orden de compra aprobada» o «Recepción de mercancías contabilizada». La secuencia de estas actividades forma el flujo del proceso. Analizar la secuencia y la frecuencia de las actividades es el núcleo del process mining. Ayuda a 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, las variantes y los cuellos de botella. Dónde obtenerlo Normalmente se obtiene combinando tablas y campos, como los campos de estado de EKKO/EKPO o los registros de documentos de cambio de CDHDR/CDPOS, para representar hitos empresariales clave. Ejemplos Orden de compra creadaOrden de compra aprobadaRecepción de mercancías contabilizadaFactura recibida | |||
| Hora del evento EventTime | La 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 basados en el tiempo en process mining. La hora del evento se utiliza para ordenar cronológicamente las actividades y construir el flujo del proceso. Además, constituye la base para calcular todas las métricas basadas en la duración, como los tiempos de ciclo entre actividades, los tiempos de espera y los tiempos de procesamiento, que son fundamentales 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 plazos 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 cambios) o la fecha de contabilización (MKPF-BUDAT para recepciones 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 | El identificador único de la orden de compra (PO), que sirve como ID de caso principal para hacer seguimiento del ciclo de vida de las compras. | ||
| Descripción El número de la orden de compra es el identificador central que vincula todas las actividades relacionadas, desde la creación inicial hasta la recepción final de mercancías y la finalización. Actúa como identificador del caso para el análisis de process mining. En el análisis, agrupar los eventos por este número 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 sola orden. Por qué es importante Es la clave esencial para conectar todos los eventos de compras en un único proceso integral y permitir un análisis detallado del 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 la trazabilidad de los datos, la resolución de problemas y la correcta interpretación de los datos procedentes de distintas fuentes. Ayuda a comprender el contexto de los datos y puede utilizarse para filtrar el análisis por entornos de sistemas específicos. Por qué es importante Proporciona un 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 Normalmente es 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 datos LastDataUpdate | La marca de tiempo en la que los datos se actualizaron o extrajeron por última vez 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 desde SAP S/4HANA. Conocer la hora de la última actualización de datos es fundamental para que los usuarios comprendan la vigencia de su análisis. Les ayuda a interpretar correctamente los resultados, ya que permite saber si están consultando información en tiempo real o una instantánea de un momento concreto, lo que afecta la relevancia de las acciones basadas en el análisis. Por qué es importante Informa a los usuarios sobre la vigencia de los datos y garantiza que comprendan el contexto y la relevancia de sus resultados analíticos. 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 datos. Ejemplos 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Fecha de entrega solicitada RequestedDeliveryDate | La fecha en la que la empresa solicitó al proveedor entregar los bienes o servicios. | ||
| Descripción Este atributo especifica la fecha de entrega objetivo 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 recepción de mercancías, la marca de tiempo de «Recepción de mercancías contabilizada», para calcular el KPI «Tasa de entregas puntuales 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 puntuales del proveedor, un KPI fundamental 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 | El identificador único del proveedor que suministra los bienes o servicios. | ||
| Descripción El ID del proveedor es un dato maestro fundamental 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 por proveedor» y «Tasa de devoluciones de mercancías por proveedor», ya que ayuda a identificar a los proveedores más fiables y a aquellos que pueden estar provocando retrasos o problemas de calidad. Por qué es importante Permite realizar análisis centrados en los proveedores, evaluar su rendimiento, identificar a los proveedores con 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 | El valor total de la orden de compra, sin incluir impuestos ni costos de transporte. | ||
| Descripción Este atributo representa el valor monetario neto de la orden de compra. Es una cifra financiera clave que indica el tamaño de la transacción de compras. Este importe es fundamental para el análisis financiero, por ejemplo, para categorizar las órdenes de compra por valor, alto o bajo, y comprobar si sus rutas de proceso difieren. También puede utilizarse para priorizar el análisis y centrarse en órdenes de alto valor que pueden implicar un mayor riesgo financiero o tener un impacto más significativo en el negocio. Por qué es importante Permite realizar análisis financieros, segmentar las órdenes de compra por valor y priorizar los esfuerzos de mejora del proceso en las áreas de 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 | El identificador de la solicitud de compra (PR) que originó la orden de compra. | ||
| Descripción Este atributo vincula la orden de compra con la solicitud de compra de origen. No todas las órdenes de compra tendrán una solicitud de compra si se crean directamente. Este vínculo es esencial para analizar el proceso de compras integral, desde la solicitud inicial. Permite utilizar KPI como «Tiempo de aprobación de la solicitud de compra» y es fundamental para identificar el «gasto no autorizado», cuando se crean órdenes de compra sin una solicitud previa aprobada. Por qué es importante Conecta la orden de compra con la solicitud inicial, permite analizar el proceso integral e identificar gastos no autorizados que no cumplen con las políticas. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA, a nivel de posición de la orden de compra, en el campo BANFN. Ejemplos 1001005110010052 | |||
| Tipo de documento de la orden de compra DocumentType | Una clasificación que distingue distintos tipos de órdenes de compra, como órdenes de compra estándar, órdenes de compra de servicios u órdenes de traslado de stock. | ||
| Descripción El tipo de documento es un elemento de configuración clave en SAP que controla el flujo del proceso, el rango de numeración y los campos de una orden de compra. Permite a las empresas 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 de compra estándar de mercancías puede ser muy diferente del de una orden de servicios o una orden de traslado de stock. Este atributo permite filtrar y comparar estos flujos de proceso distintos para encontrar oportunidades de mejora específicas. Por qué es importante Categoriza las órdenes de compra, permite comparar distintos procesos de compras y ayuda a explicar las variaciones en los flujos y 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 | El 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. Proporciona trazabilidad de las acciones realizadas en el sistema. Analizar los datos por usuario ayuda a identificar necesidades de capacitación, distribución de la carga de trabajo y rendimiento individual. Por ejemplo, permite comprobar si determinados usuarios se asocian sistemáticamente con tiempos de aprobación prolongados o cambios frecuentes posteriores a la aprobación, lo que puede orientar la gestión de recursos y las iniciativas de mejora del proceso. Por qué es importante Proporciona responsabilidad y permite analizar el rendimiento a nivel individual o de equipo, lo que ayuda a identificar oportunidades de capacitació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 | |||
| ¿Es una compra no autorizada? IsMaverickSpend | Indicador calculado que señala si una orden de compra se creó sin una solicitud de compra aprobada previamente. | ||
| Descripción Este indicador booleano se obtiene durante el procesamiento de datos. Se establece en «true» si una orden de compra no tiene una solicitud de compra asociada o si su creación omite el Workflow de aprobación estándar. Este atributo respalda directamente el Dashboard «Identificación de compras no autorizadas» y los KPI relacionados. Ayuda a cuantificar el alcance de las compras que no cumplen las políticas, lo que permite a las empresas dirigirse a departamentos o grupos de usuarios específicos para reforzar las políticas y los controles de compras. Por qué es importante Identifica directamente las compras que no cumplen las políticas, ayuda a cuantificar las desviaciones del proceso y permite aplicar los controles financieros y las políticas de compras. Dónde obtenerlo Campo calculado a partir de la ausencia de un valor en «PurchaseRequisitionNumber» para determinados tipos de documento o mediante el análisis de la secuencia de eventos. Ejemplos truefalse | |||
| ¿Hay retrabajo? IsRework | Indicador calculado que señala si la orden de compra requirió retrabajo, por ejemplo, un cambio posterior a la aprobación o una devolución de productos. | ||
| Descripción Este atributo booleano se calcula mediante el análisis de la secuencia de actividades de cada orden de compra. Se marca como «true» si aparece un evento «Purchase Order Changed» después de un evento «Purchase Order Approved» o si existe un evento «Goods Returned». Este indicador simplifica el cálculo del KPI «Tasa de procesamiento directo». Permite filtrar y visualizar fácilmente todas las órdenes de compra que requirieron intervención manual o corrección, lo que ayuda a cuantificar el coste y la frecuencia del retrabajo. Por qué es importante Ayuda a cuantificar la ineficiencia del proceso al señalar los casos con retrabajo. Es fundamental para calcular las tasas de procesamiento directo e identificar las causas raíz 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» aparece después de una aprobación o si existe un evento «Goods Returned». Ejemplos truefalse | |||
| Categoría de posición ItemCategory | Clasifica una posición de la orden de compra, como estándar, consignación, subcontratación o servicio. | ||
| Descripción La categoría de posición determina cómo se controla y procesa la compra de un material o servicio específico. Influye en pasos posteriores, como la recepción 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 servicio, que requiere una hoja de entrada de servicios, difiere considerablemente del de una posición estándar de stock. 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 compras, como bienes, servicios o subcontratación. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA, campo PSTYP. Ejemplos 093 | |||
| Centro Plant | Instalación o ubicación operativa a la que se entregan los productos o en la que se prestan los servicios. | ||
| Descripción En SAP, un centro es una ubicación física donde se producen o almacenan productos, o donde se prestan servicios. Es un elemento clave para la logística y la planificación. La segmentación del análisis del proceso por centro puede revelar variaciones regionales o específicas de cada ubicación en el proceso de compras. Por ejemplo, puede mostrar si determinados centros experimentan plazos de entrega más largos o índices más elevados de devoluciones de productos, lo que apunta a problemas logísticos o de control de calidad locales. Por qué es importante Permite analizar el proceso por ubicación y destacar las diferencias de rendimiento entre distintos centros operativos, plantas o almacenes. Dónde obtenerlo Este atributo se encuentra en la tabla EKPO de SAP S/4HANA, campo WERKS. Ejemplos 10101710DE01 | |||
| 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 obtiene comparando la marca de tiempo de la actividad «Goods Receipt Posted» con la «Requested Delivery Date». Si la entrada de mercancías se produce en la fecha solicitada o antes, se marca como «true». Este atributo respalda directamente el KPI «Índice de entregas puntuales del proveedor». Simplifica el análisis al permitir 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 permite gestionar eficazmente el 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 | |||
| Grupo de compras PurchasingGroup | Grupo específico de compradores responsable de determinadas actividades de compras. | ||
| Descripción Un grupo de compras está formado por uno o varios compradores responsables de actividades de compras, materiales o proveedores específicos. Son el principal punto de contacto para los proveedores. Este atributo permite analizar la carga de trabajo y el rendimiento con mayor detalle que la organización de compras. Puede utilizarse para identificar equipos sobrecargados, medir la eficiencia de distintos grupos de compradores y comprender qué grupos presentan una mayor tendencia a desviaciones del proceso, como las compras no autorizadas. 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, campo EKGRP. Ejemplos 001002N00 | |||
| Número de material MaterialNumber | Identificador del material o producto específico que se adquiere. | ||
| Descripción El número de material es un código único asignado a cada registro maestro de materiales en SAP. Se utiliza en todas las transacciones relacionadas con ese material, incluidas las compras, la gestión de inventario y las ventas. El análisis por número de material o grupo de materiales permite analizar las compras por categoría. Puede ayudar a identificar si los procesos de compras de determinados tipos de materiales son menos eficientes, tienen plazos más largos o presentan una mayor tendencia a devoluciones, lo que proporciona información útil para la gestión de categorías. Por qué es importante Permite analizar las compras por categoría y ayuda a identificar problemas del proceso o del 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, campo MATNR. Ejemplos RM100-100FG210SERV-CONSULT | |||
| Organización de compras PurchasingOrganization | Unidad organizativa responsable de adquirir materiales y servicios y de negociar con los proveedores. | ||
| Descripción La organización de compras es una unidad organizativa clave en el área de compras. Puede estructurarse a nivel corporativo, de sociedad o de centro, y es responsable de todas las actividades de compras. El análisis del proceso por organización de compras ayuda a evaluar la eficiencia y el rendimiento de distintos equipos o regiones de compras. Puede poner de manifiesto diferencias en la negociación con proveedores, el cumplimiento del proceso o los retrasos en las aprobaciones entre unidades organizativas. Por qué es importante Permite comparar el rendimiento de distintos departamentos o regiones de compras, lo que ayuda a identificar buenas prácticas y áreas de mejora. Dónde obtenerlo Este atributo se encuentra en la tabla EKKO de SAP S/4HANA, campo EKORG. Ejemplos 10101710US01 | |||
| Sociedad CompanyCode | Identificador de la entidad jurídica o sociedad para la que se crea la orden de compra. | ||
| Descripción La sociedad representa una unidad contable independiente dentro de una organización. Todas las transacciones financieras relacionadas con una orden de compra se contabilizan en una sociedad específica. Se trata de un atributo organizativo fundamental que permite filtrar y comparar los procesos de compras entre distintas entidades jurídicas. El análisis por sociedad puede revelar incoherencias en la ejecución del proceso, distintos niveles de eficiencia o variaciones en los índices de cumplimiento dentro de 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, campo BUKRS. Ejemplos 101017102000 | |||
Purchase to Pay - Purchase Order: actividades
| Actividad | Descripción | ||
|---|---|---|---|
| Factura recibida | Representa la entrada de la factura de un proveedor en el sistema SAP 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 fundamental que conecta el proceso de compras con el proceso de cuentas por pagar. Permite analizar el tiempo transcurrido entre la recepción de mercancías y el procesamiento de la factura. Dónde obtenerlo Se crea un documento contable en la tabla BKPF (cabecera), mientras que sus posiciones se encuentran en BSEG o en el diario universal ACDOCA. El documento se vincula a la orden de compra en la tabla RSEG. Recopilar Fecha de entrada del documento (CPUDT) de la tabla de cabecera del documento contable 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 de compra. | ||
| Por qué es importante Este es un hito clave para medir la eficiencia de las aprobaciones y el retrabajo posterior a la aprobación. Analizar el tiempo entre la creación y la aprobación de la orden de compra permite identificar retrasos 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 este campo se actualizó al estado «liberado». Recopilar Se infiere a partir de los registros de cambios del campo 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 los indicadores «Entrega completada» y «Factura final» están establecidos. | ||
| Por qué es importante Este evento sirve como punto final para el análisis del ciclo de vida de la orden de compra. Medir el tiempo hasta este evento proporciona 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 la orden de compra, EKPO. El evento se produce cuando los indicadores «Entrega completada» (ELIKZ) y «Factura final» (EREKZ) están establecidos como verdaderos. Recopilar Se infiere a partir de los registros de cambios cuando los campos ELIKZ y EREKZ de EKPO aparecen marcados como completados. Tipo de evento inferred | |||
| Orden de compra creada | Marca la creación del documento oficial de la orden de compra, que puede crearse con o sin referencia a una solicitud de compra. Es un evento explícito que se captura cuando el documento de la orden de compra se guarda por primera vez en el sistema. | ||
| Por qué es importante Esta actividad puede servir como punto de inicio alternativo del proceso, especialmente para analizar compras no autorizadas. Es un evento fundamental para hacer seguimiento del tiempo total de procesamiento de la orden 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 se almacenan directamente en esta tabla para el documento. Recopilar Marca de tiempo de creación (AEDAT) en la tabla EKKO del documento de la orden de compra. Tipo de evento explicit | |||
| Recepción 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 que pone fin al plazo de entrega del proveedor e inicia el proceso interno de verificación de facturas. Es esencial para hacer seguimiento de las tasas de entrega a tiempo. Dónde obtenerlo Se registra como un 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. Recopilar Fecha de contabilización (BUDAT) de la cabecera del documento de material (MKPF), vinculada mediante EKBE. 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. Normalmente se infiere a partir de un cambio de estado en el documento de solicitud, que indica que está listo para convertirse en una orden de compra. | ||
| Por qué es importante Este es un hito fundamental para hacer seguimiento de los tiempos del ciclo de aprobación e identificar cuellos de botella. Los retrasos en esta etapa afectan directamente la rapidez con la 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. Recopilar 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 captura explícitamente cuando un usuario guarda un nuevo documento de solicitud de compra, por ejemplo, mediante la transacción ME51N. | ||
| Por qué es importante Este es el punto de inicio principal de muchos ciclos de vida de órdenes de compra. Analizar el tiempo transcurrido desde este evento hasta la creación de la orden de compra ayuda a identificar retrasos en el abastecimiento y el procesamiento interno. Dónde obtenerlo Se registra en la tabla EBAN (solicitud de compra). La marca de tiempo del evento de creación puede encontrarse en las tablas de historial de cambios CDHDR y CDPOS del objeto EBAN. Recopilar 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 captura explícitamente mediante la creación de una hoja de entrada de servicios. | ||
| Por qué es importante En las compras basadas en servicios, este evento equivale a una recepción de mercancías. Es fundamental para hacer seguimiento de los plazos de prestación del servicio y permitir pagos puntuales al proveedor. Dónde obtenerlo Se registra mediante la creación de 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. Recopilar 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 pagos. Es clave para analizar las condiciones y el rendimiento de los pagos. Dónde obtenerlo El pago se registra como un 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. Recopilar Fecha de compensación (AUGDT) del documento de factura, ubicada en BSEG o ACDOCA. Tipo de evento explicit | |||
| Mercancías devueltas | Indica que las mercancías recibidas anteriormente se devolvieron al proveedor, normalmente debido a problemas de calidad, daños o envíos incorrectos. Se captura como un movimiento explícito de reversión de mercancías. | ||
| Por qué es importante Esta actividad destaca el retrabajo y los 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 un problema. Dónde obtenerlo Se registra como un documento de material con un tipo de movimiento de devolución específico, por ejemplo, 122. El evento se registra en MKPF/MSEG y se vincula a la orden de compra en la tabla de historial EKBE. Recopilar 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 captura cuando un usuario establece un indicador de eliminación en el documento. | ||
| Por qué es importante Esta actividad es un 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 en la definición de requisitos. Dónde obtenerlo Se captura a partir 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 obtiene de los documentos de cambio (CDHDR/CDPOS). Recopilar Marca de tiempo de los documentos de cambio (CDHDR/CDPOS) cuando se establece el indicador de eliminación (LOEKZ). Tipo de evento explicit | |||
| Orden de compra enviada al proveedor | Representa el momento en que la orden de compra se comunica al proveedor, por ejemplo, mediante EDI, correo electrónico o impresión. Este evento suele capturarse en los registros de gestión de salidas del sistema. | ||
| Por qué es importante Esta actividad marca el inicio real del plazo de entrega del proveedor. Es esencial para medir con precisión el rendimiento del proveedor desde el momento en que recibe la orden. Dónde obtenerlo Se captura en la tabla de control de salidas NAST, que registra los mensajes enviados para un documento de compras. Puede utilizarse la fecha y hora del tipo de salida correspondiente, por ejemplo, EDI o correo electrónico. Recopilar 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 se realizó una modificación en la orden de compra después de su creación inicial, como un cambio en la cantidad, el precio o la fecha de entrega. Se captura explícitamente en los registros de cambios del sistema. | ||
| Por qué es importante Hacer seguimiento de los cambios, especialmente después de la aprobación, es fundamental para identificar ineficiencias del proceso, retrabajo y posibles problemas de cumplimiento. Los cambios frecuentes pueden indicar especificaciones iniciales 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 crea una entrada detallada en el registro. Recopilar Evento registrado para cambios en campos clave de las tablas EKKO o EKPO, documentados 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 adecuadas para consultar las vistas Core Data Services (CDS) del sistema SAP S/4HANA. El acceso puede realizarse 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: Utilice su cliente SQL preferido para establecer una conexión con la base de datos SAP S/4HANA donde residen las vistas CDS.
- Prepare la consulta SQL: Copie la consulta SQL completa proporcionada en la sección de consultas de este documento y péguela en su editor SQL. La consulta está diseñada para extraer todas las actividades y 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 específicos 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 algún tiempo.
- Revise los resultados preliminares: Cuando finalice la consulta, revise rápidamente los resultados en su cliente SQL. Compruebe que aparezcan distintas actividades, que las marcas de tiempo se hayan completado correctamente y que el ID de 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 utilice codificación UTF-8 para evitar problemas con los caracteres.
- Prepare la carga: Antes de cargar el archivo en ProcessMind, ábralo y verifique 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 ha modificado.
- Cargue los datos en ProcessMind: Cargue el archivo CSV finalizado en su proyecto de ProcessMind. Durante la importación, asigne las columnas del archivo a los campos correspondientes de ID de 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 y con una semántica enriquecida. Las vistas principales incluyen:
- I_PurchaseOrderItemAPI01: para los datos principales de las posiciones de las órdenes de compra.
- I_PurchaseRequisitionItemAPI01: para los detalles de las solicitudes de compra.
- I_MaterialDocumentItem: para movimientos de mercancías, como recepciones y devoluciones.
- I_ServiceEntrySheetAPI01: para eventos de confirmación de servicios.
- I_SupplierInvoiceAPI01: para información de facturas de proveedores.
- I_OperationalAcctgDocItem: para vincular facturas con documentos financieros y realizar el seguimiento de pagos.
- I_ChangeDocument: para capturar cambios en la orden de compra.
- Filtrado por intervalo de fechas: Es fundamental aplicar un filtro de intervalo de fechas para gestionar el rendimiento y el volumen de datos. La consulta utiliza 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 entre 3 y 6 meses de datos.
- Filtrado organizativo: La consulta siempre debe filtrarse por CompanyCode para limitar la extracción a las unidades de negocio relevantes. Puede añadir filtros adicionales sobre PurchaseOrderType o PurchasingOrganization a la expresión de tabla común PO_base para refinar aún más los resultados.
- Requisitos previos: El usuario que ejecute la consulta necesita autorización SELECT sobre todas las vistas CDS indicadas. Normalmente, el acceso a estas vistas se concede mediante roles empresariales o analíticos específicos en S/4HANA. Sin los permisos adecuados, la consulta fallará.
a 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 periodo de extracción mediante [Start timestamp] y [End timestamp]. Para la carga inicial, se recomienda un periodo de tres a seis meses. Aplique filtros de código de empresa y tipo de documento solo cuando el alcance del informe lo requiera.
- Identifique las órdenes de compra en EKKO y EKPO, conservando el número de orden de compra, proveedor, tipo de documento, código de empresa, fecha de creación, hora de creación y Atributos de nivel de posición. Agregue los valores netos de EKPO para calcular TotalNetAmount a nivel de orden de compra.
- Extraiga los eventos de creación y aprobación de solicitudes de compra desde EBAN, utilizando el número de solicitud y la referencia de posición disponible en EKPO para asociar las solicitudes con las órdenes de compra. Dado que los indicadores y las marcas de tiempo de aprobación varían según la configuración de liberació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. La creación utiliza la fecha y hora de creación de EKKO. La aprobación, modificación y eliminación 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 relevante no esté expuesto 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 aplicables 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 representan estas fuentes.
- Normalice cada evento de origen con la misma estructura de Registro de eventos. Cada fila debe contener 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 duplicadas de forma exacta 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 mostrada en la visualización del proceso debe estar presente como una fila explícita.
- Exporte el resultado como un archivo delimitado o un conjunto de resultados de base de datos con una fila de encabezados y nombres de columnas estables. Utilice 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 de ProcessMind.
Configuración
- Objetos de origen: EKKO y EKPO son las fuentes confirmadas para la cabecera y las posiciones de las órdenes de compra. 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 compensación deben configurarse según la versión de SAP S/4HANA y el modelo de datos activo.
- Identificador de caso: Utilice PurchaseOrderNumber como identificador de caso. Los eventos de nivel de posición deben asociarse al número de orden de compra, mientras que las referencias de posición deben conservarse en una columna adicional específica del origen, si es necesario.
- Intervalo de fechas: Comience con un periodo de tres a seis meses. Para cargas históricas, procese periodos 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 utilizar valores válidos en el sistema de destino.
- Semántica de los eventos: La creación y la eliminación pueden ser explícitas cuando estén disponibles los campos o registros relevantes del documento. La aprobación y la finalización son eventos basados en estados y requieren marcas de tiempo de estado configuradas. No cree filas únicamente a partir de un estado actual sin una marca de tiempo de evento justificable.
- Rendimiento: Filtre desde el principio por fechas de 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 en periodos. Asegúrese de que las estadísticas de la base de datos sean adecuadas y evite las combinaciones sin restricciones entre las fuentes de posiciones, contabilidad e historial de cambios.
- Marca de tiempo de actualización: Establezca LastDataUpdate en la marca de tiempo de ejecución de la extracción para cada fila de una ejecución.
- Requisitos previos: Los requisitos incluyen conectividad con SAP HANA, autorización de lectura para todos los objetos de origen configurados, acceso a los datos relevantes de compras, gestión de inventario, adquisición de servicios, verificación de facturas y cuentas por pagar, además de una conexión de ProcessMind capaz de importar el archivo o conjunto de resultados seleccionado.
- Configuración específica del sistema: Sustituya cada marcador de posición de origen entre corchetes de la consulta por una tabla, vista, columna o expresión aprobada del sistema SAP S/4HANA de destino. No exponga credenciales en la consulta ni en la configuración de extracción.
a 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 de datos 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 y CDPOS, BKPF, que se utilizarán como fuente de datos para cada una de las 13 actividades obligatorias.
- Creación del programa: En SAP GUI, acceda al 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: Codifique la pantalla de selección del informe. Esto permite que los usuarios filtren 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 necesarias para el programa. Esto incluye una tabla interna para el Registro de eventos final que coincida con la estructura definida en el paso de 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 una serie de instrucciones SELECT sobre las tablas SAP relevantes, combinadas 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. Establezca ActivityName según el evento que se esté procesando, por ejemplo, 'Purchase Order Created'. Convierta los campos de fecha y hora a un formato de marca de tiempo coherente para EventTime.
- Consolidación de los datos de eventos: Después de procesar los 13 tipos de actividad, asegúrese de que todos los datos se hayan recopilado en una única tabla interna unificada. Esta tabla representa ahora el Registro de eventos completo de las órdenes de compra seleccionadas.
- Implementación de la salida a archivo: Añada la funcionalidad para escribir la tabla interna final en un archivo. El enfoque recomendado es utilizar el método cl_gui_frontend_services=>gui_download para que los usuarios puedan guardar el archivo como CSV en su equipo local, o utilizar OPEN DATASET para guardarlo en el servidor de aplicaciones SAP y procesarlo en segundo plano.
- Creación del código de transacción (opcional): Para facilitar el acceso del personal de negocio al programa, utilice el código de transacción SE93 para crear un código de transacción personalizado, por ejemplo, ZPM_PO_EXTRACT, que ejecute su programa ABAP.
- Programación de un job en segundo plano: Para grandes volúmenes de datos o extracciones automatizadas, utilice el código de transacción SM36 para programar la ejecución del programa como job en segundo plano. El archivo de salida se escribirá 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 incluyen:
- Intervalo de fechas: Un intervalo obligatorio para la fecha de creación de la orden de compra (EKKO-AEDAT). Se recomienda comenzar con un periodo de 3 a 6 meses para gestionar el volumen de datos y el rendimiento del informe.
- Código de empresa (BUKRS): 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 Standard PO, Framework Order o Stock Transport Order, para centrar el análisis.
- Lectura del registro de cambios: La extracción de actividades como 'Purchase Order Approved' o 'Purchase Order Changed' depende de la lectura de 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 requeridas.
- 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. Esto incluye tablas como EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR y CDPOS.
- Ejecución en segundo plano: Para extracciones que cubran más de unos pocos meses de datos o se ejecuten en un sistema con un volumen elevado de transacciones, ejecute siempre el programa en segundo plano para evitar tiempos de espera de los procesos de diálogo.
a 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 de Process Mining. Empiece hoy mismo a aprovechar sus datos de SAP S/4HANA para descubrir eficiencias y transformar su proceso de compras a pagos.
Optimice sus órdenes de compra P2P: reduzca ahora el tiempo de ciclo
Elimine las ineficiencias y reduzca un 30 % el tiempo de ciclo de sus órdenes de compra P2P.
No necesita tarjeta de crédito. Configure todo en minutos.