Su Template de datos para el proceso de registro a informe: asientos contables
Su Template de datos para el proceso de registro a informe: asientos contables
- Atributos recomendados para un análisis completo
- Actividades clave de los asientos contables que debe seguir
- Instrucciones prácticas para extraer datos de SAP ECC
Atributos del proceso de registro a informe: asientos contables
| Nombre | Descripción | ||
|---|---|---|---|
| Hora del evento EventTime | Marca de tiempo que indica cuándo ocurrió una actividad o un evento específico del asiento contable. | ||
| Descripción La hora del evento proporciona la fecha y hora exactas de cada actividad del proceso de asientos contables. Estos datos son fundamentales para calcular todas las métricas temporales, como los tiempos de ciclo, la duración del procesamiento y las demoras entre pasos. La fuente de la marca de tiempo depende de la actividad: puede ser la fecha y hora de creación del documento (CPUDT/CPUTM) o las marcas de tiempo de cambios registradas en los logs (CDHDR-UDATE/UTIME). En el análisis, la hora del evento permite ordenar cronológicamente los eventos y constituye la base del mapa del proceso. Es esencial para calcular todos los KPI relacionados con el tiempo, como el tiempo medio del ciclo del asiento contable, el tiempo medio de aprobación y el tiempo entre la aprobación y el registro. Por qué es importante Esta marca de tiempo es la base de todos los análisis relacionados con el tiempo y permite calcular tiempos de ciclo, duraciones y cuellos de botella. Dónde obtenerlo Se obtiene de distintos campos según la actividad, principalmente de la marca de tiempo de creación (CPUDT, CPUTM) de BKPF o de las marcas de tiempo de cambios (UDATE, UTIME) de CDHDR. Ejemplos 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| ID del asiento contable JournalEntryId | Identificador único de un documento de contabilidad financiera, que combina el código de sociedad, el número de documento y el ejercicio fiscal. | ||
| Descripción El ID del asiento contable es el identificador principal del caso para seguir su ciclo de vida. Es una clave compuesta, que suele formarse al concatenar el código de sociedad (BUKRS), el número de documento (BELNR) y el ejercicio fiscal (GJAHR), para que sea único en todo el sistema SAP. En el análisis de procesos, este ID vincula todas las actividades relacionadas, como la creación, el aparcamiento, el envío, la aprobación, el rechazo y el registro. Al seguir este identificador, se puede reconstruir el recorrido completo de cada asiento contable, medir los tiempos de ciclo e identificar desviaciones del proceso o cuellos de botella en asientos específicos. Por qué es importante Esta es la clave esencial para seguir un asiento contable desde su creación hasta su registro final, y permite analizar el proceso de principio a fin y comparar variantes. Dónde obtenerlo Es un atributo derivado, que suele obtenerse al concatenar campos de la tabla BKPF: código de sociedad (BUKRS), número de documento (BELNR) y ejercicio fiscal (GJAHR). Ejemplos 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Nombre de la actividad ActivityName | Nombre de la actividad de negocio o del evento que tuvo lugar en un momento específico del proceso de asientos contables. | ||
| Descripción El nombre de la actividad describe un paso específico del ciclo de vida del asiento contable, como «Asiento contable creado», «Asiento contable aprobado» o «Asiento contable registrado». Este atributo suele derivarse de varias fuentes de SAP, como los códigos de transacción (TCODE), los registros de cambios de documentos (tablas CDHDR y CDPOS) y los campos de estado del documento. El análisis de las actividades es la base de Process Mining. Permite visualizar mapas de procesos, calcular los tiempos entre pasos e identificar ciclos de corrección (por ejemplo, «Asiento contable rechazado» seguido de «Asiento contable corregido»). Estos datos son fundamentales para los Dashboards sobre tiempos de ciclo, tasas de corrección y variantes del proceso. Por qué es importante Define los pasos del mapa del proceso y permite visualizar, analizar y optimizar el flujo de trabajo de los asientos contables. Dónde obtenerlo Se deriva de varias fuentes, como los códigos de transacción de BKPF (TCODE), el estado del documento, los registros del flujo de trabajo en tablas como SWW_WI2OBJ y los documentos de cambios en CDHDR y CDPOS. Ejemplos Asiento contable creadoAsiento contable aprobadoAsiento contable rechazadoAsiento contable registrado | |||
| Sistema de origen SourceSystem | Sistema del que se extrajeron los datos del proceso. | ||
| Descripción Este atributo identifica el origen de los datos, que en este caso es una instancia específica de SAP ECC. Suele ser un valor estático que se añade durante la extracción de datos. Aunque es sencillo, este atributo es importante en entornos con varios ERP o fuentes de datos. Permite seguir claramente el linaje de los datos y filtrar o segmentar el análisis por sistema de origen. Por qué es importante Permite seguir claramente el linaje de los datos y es esencial para controlar su calidad, sobre todo en entornos con varios sistemas de origen. Dónde obtenerlo Suele ser un valor estático que se añade durante la transformación de datos e identifica la instancia específica de SAP ECC (por ejemplo, 'ECC_PROD_100'). Ejemplos SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Última actualización de los datos LastDataUpdate | Marca de tiempo que indica cuándo se extrajeron o actualizaron por última vez los datos del sistema de origen. | ||
| Descripción Este atributo registra la fecha y hora de la extracción más reciente de datos de SAP ECC. Es un campo de metadatos fundamental para saber si los datos analizados están actualizados. En cualquier Dashboard o análisis de Process Mining, conocer la hora de la última actualización es esencial para que los usuarios confíen en los datos y tomen decisiones informadas. Permite responder a la pregunta: «¿Qué tan actualizada está esta información?». Por qué es importante Informa a los usuarios sobre la actualidad de los datos, para que entiendan el período que abarca el análisis y puedan confiar en los resultados. Dónde obtenerlo Es un campo de metadatos que genera y almacena la herramienta de extracción de datos o el proceso ETL al actualizar los datos. Ejemplos 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Código de sociedad CompanyCode | Unidad organizativa que representa una entidad jurídica independiente para la que se preparan estados financieros. | ||
| Descripción El código de sociedad es una unidad organizativa fundamental de SAP Financials. Representa una empresa jurídicamente independiente y es un campo clave en la cabecera del documento de asiento contable. Este atributo es esencial para segmentar el análisis del proceso por entidad jurídica. Permite comparar el rendimiento del proceso, las tasas de cumplimiento y los resultados de los KPI entre distintas partes de la empresa. Por ejemplo, ayuda a determinar si las demoras en las aprobaciones o las altas tasas de anulación se concentran en determinados códigos de sociedad. Por qué es importante Permite filtrar y comparar el rendimiento del proceso entre distintas entidades jurídicas o unidades de negocio de la organización. Dónde obtenerlo Se encuentra en el campo BUKRS de la tabla de cabecera de documentos BKPF. Ejemplos 10002000US01DE01 | |||
| Código de transacción TransactionCode | Código de transacción de SAP utilizado para crear o procesar el asiento contable. | ||
| Descripción El código de transacción (código T) es un identificador único de una función o un programa específico de SAP. En los asientos contables, indica cómo se creó el asiento: por ejemplo, manualmente (FB01, F-02), mediante aparcamiento (FV50) o a través de una interfaz automatizada. Este atributo es muy útil para el Dashboard «Optimización de la actividad manual». Al analizar el código T, se pueden distinguir las actividades manuales de las automatizadas, identificar qué procesos manuales consumen más tiempo y detectar oportunidades de automatización para reducir el trabajo manual y mejorar la eficiencia. Por qué es importante Ayuda a distinguir los procesos manuales de los automatizados y a identificar oportunidades de automatización y estandarización de procesos. Dónde obtenerlo Se encuentra en el campo TCODE de la tabla de cabecera de documentos BKPF. Ejemplos FB01F-02FV50FBD1 | |||
| Está anulado IsReversed | Indicador booleano que señala si se ha anulado el asiento contable. | ||
| Descripción Este indicador identifica los asientos contables que se han anulado posteriormente mediante otro documento contable. En SAP, el documento anulado queda vinculado al documento de anulación, lo que proporciona un historial de auditoría claro. Este atributo es fundamental para el Dashboard «Análisis de anulaciones de asientos contables» y el KPI «Tasa de anulación de asientos contables». Permite aislar los asientos anulados para investigar las causas raíz, como errores de introducción de datos o tratamientos contables incorrectos, con el objetivo de reducir la frecuencia de las anulaciones. Por qué es importante Facilita directamente el análisis de anulaciones al identificar los asientos que se revirtieron posteriormente, lo que ayuda a determinar las causas raíz de los errores y a mejorar la integridad de los datos. Dónde obtenerlo Se obtiene del campo Reversal Document number (STBLG) de la tabla BKPF. Si STBLG no está vacío, el indicador es verdadero. Ejemplos truefalse | |||
| Fecha de registro PostingDate | Fecha en que la transacción se registra en el libro mayor y afecta al período financiero. | ||
| Descripción La fecha de registro determina el período fiscal en que se contabiliza el asiento contable. Es un campo de fecha fundamental desde el punto de vista financiero y del cumplimiento, ya que debe ajustarse a los calendarios de cierre contable y a las regulaciones. En Process Mining, esta fecha se utiliza para supervisar el cumplimiento. El Dashboard «Supervisión del cumplimiento» y el KPI «Tasa de cumplimiento normativo» usan este atributo para comprobar si los asientos se registran en el período correcto. También permite analizar las tendencias del volumen de asientos contables a lo largo del tiempo. Por qué es importante Es fundamental para los informes financieros y el análisis de cumplimiento, ya que permite comprobar que los asientos se registren en el período contable correcto. Dónde obtenerlo Se encuentra en el campo BUDAT de la tabla de cabecera de documentos BKPF. Ejemplos 2023-10-312023-11-302024-01-15 | |||
| Tipo de documento DocumentType | Clasificación de los documentos contables que determina cómo se procesan y almacenan. | ||
| Descripción El tipo de documento distingue distintas clases de transacciones de negocio, como un asiento en el libro mayor (SA), una factura de proveedor (KR) o un registro de activos (AA). Se define durante la configuración del sistema y se asigna a cada asiento contable. Este atributo es fundamental para el análisis, ya que permite segmentar el proceso según la naturaleza de la transacción. El Dashboard «Volumen de asientos contables por tipo» y el KPI «Tiempo medio de ciclo por tipo de asiento contable» dependen directamente de este campo. Ayuda a descubrir si ciertos tipos de asientos son más propensos a sufrir demoras, correcciones o anulaciones. Por qué es importante Permite segmentar el análisis por tipo de transacción y ayuda a identificar si los problemas del proceso afectan a determinados tipos de asientos contables. Dónde obtenerlo Se encuentra en el campo BLART de la tabla de cabecera de documentos BKPF. Ejemplos SAKRREAA | |||
| Usuario User | ID del usuario de SAP que creó o modificó el asiento contable. | ||
| Descripción Este atributo registra el nombre de usuario de SAP responsable de una actividad determinada, como crear, aparcar o registrar un documento. Se obtiene directamente de la cabecera del documento o de las tablas de registro de cambios. Analizar el atributo Usuario es clave para entender el rendimiento de los equipos y de cada persona. Permite hacer un seguimiento del volumen de actividad y los tiempos de procesamiento por usuario en el Dashboard de productividad de usuarios. También ayuda a identificar quién participa en ciclos de corrección, anulaciones o desviaciones de cumplimiento, lo que permite orientar la formación o las mejoras del proceso. Por qué es importante Identifica a la persona responsable de cada actividad y permite analizar el rendimiento, la distribución de la carga de trabajo y los patrones de corrección. Dónde obtenerlo Suele obtenerse de la tabla BKPF (campo USNAM para quien creó el documento) o de la tabla CDHDR (campo USERNAME para quien lo modificó). Ejemplos ABROWNCJONESDSMITH | |||
| Centro de coste CostCenter | Unidad organizativa de un área de controlling que representa una ubicación donde se generan costes. | ||
| Descripción El centro de coste es un dato maestro clave del módulo de Controlling (CO) y suele asignarse a nivel de posición del asiento contable. Se utiliza para hacer un seguimiento de los costes de un departamento, función o ubicación específicos. Incluir el centro de coste permite analizar el proceso de asientos contables con mayor detalle. Ayuda a determinar si ciertos departamentos generan más retrabajo, tienen tiempos de ciclo más largos o registran más asientos manuales. Así, es posible evaluar la eficiencia del proceso por departamento. Por qué es importante Permite analizar el rendimiento del proceso por departamento o área funcional y detectar ineficiencias locales. Dónde obtenerlo Se encuentra en el campo KOSTL de la tabla de posiciones de documentos BSEG. Ejemplos 4100CC_FINANCE_US10010101 | |||
| Clave de moneda CurrencyKey | El código de moneda de los importes registrados en el asiento contable. | ||
| Descripción Este atributo especifica la moneda del asiento contable, como USD, EUR o JPY. Proporciona contexto para los importes financieros asociados al documento. Aunque no siempre es una dimensión de análisis principal, resulta esencial para interpretar correctamente los valores monetarios. También permite segmentar el análisis en organizaciones globales y comprobar si los procesos varían entre los asientos en moneda extranjera y en moneda local. Por qué es importante Proporciona el contexto necesario para todos los valores monetarios y garantiza un análisis y una interpretación financiera precisos. Dónde obtenerlo Se encuentra en el campo WAERS de la tabla de cabecera de documentos BKPF. Ejemplos USDEURGBPJPY | |||
| Es retrabajo IsRework | Indicador booleano que señala si un asiento contable ha pasado por un ciclo de retrabajo, por ejemplo, si se rechazó y luego se corrigió. | ||
| Descripción Este indicador identifica los casos que se desviaron de la «ruta ideal» y requirieron medidas correctivas. Normalmente, se establece como verdadero cuando se observa una secuencia de actividades como «Asiento contable rechazado» seguida de «Asiento contable corregido» para un mismo asiento. Este atributo es esencial para calcular el KPI «Tasa de retrabajo de asientos contables» y analizar el Dashboard «Tasa de retrabajo y rechazo». Ayuda a cuantificar las ineficiencias del proceso y sirve de base para investigar las causas raíz del retrabajo, como requisitos poco claros o documentación insuficiente. Por qué es importante Identifica los asientos que requirieron correcciones, lo que permite cuantificar el retrabajo y analizar sus causas raíz para mejorar la tasa de resolución correcta a la primera. Dónde obtenerlo Es un atributo calculado que se obtiene al analizar la secuencia de actividades de un caso. Se identifica un ciclo de retrabajo cuando se produce una actividad de rechazo o corrección. Ejemplos truefalse | |||
| Está aparcado IsParked | Indicador booleano que señala si el asiento contable se guardó como documento aparcado antes de contabilizarse. | ||
| Descripción Aparcar un documento permite guardar un asiento contable incompleto sin que afecte a los saldos financieros. Después, otra persona puede completarlo o revisarlo antes de contabilizarlo. Este indicador identifica los asientos que han pasado por una etapa de aparcamiento. El análisis de este atributo ayuda a comprender cómo se utiliza la función de aparcamiento. Puede revelar si se usa como una etapa informal de revisión que provoca retrasos. También permite analizar el tiempo de ciclo de principio a fin y distinguir los asientos contabilizados directamente de los que se aparcaron primero. Por qué es importante Identifica los asientos que pasan por la función de aparcamiento, que puede ser una fuente de retrasos o indicar que existe un proceso informal de revisión. Dónde obtenerlo Se obtiene del campo de estado del documento (BSTAT) de la tabla BKPF. El valor «V» indica que el documento está aparcado. Ejemplos truefalse | |||
| Importe total del documento TotalDocumentAmount | Valor total del asiento contable en la moneda del documento. | ||
| Descripción Este atributo representa el valor financiero total del asiento contable. Por lo general, se calcula sumando los valores absolutos de todas las partidas de débito o crédito asociadas al documento. Analizar el proceso según el valor financiero puede revelar patrones importantes. Por ejemplo, los asientos de importe elevado pueden seguir una ruta de aprobación distinta y más rigurosa. Este atributo permite filtrar o segmentar el análisis para comprobar si los tiempos de ciclo, las tasas de rechazo o las demoras de aprobación guardan relación con el importe del asiento. Por qué es importante Permite analizar el impacto financiero, por ejemplo, relacionando los tiempos de procesamiento o las tasas de rechazo con el valor monetario de los asientos contables. Dónde obtenerlo Es un campo calculado que se obtiene al sumar el campo de importe (WRBTR o DMBTR) de todas las partidas del asiento contable correspondiente en la tabla BSEG. Ejemplos 1500.0025000.75125.50 | |||
| Motivo de anulación ReversalReason | Código que indica el motivo por el que se anuló un asiento contable. | ||
| Descripción Al anular un documento, SAP permite especificar un código de motivo. Este código aporta información estructurada sobre la causa de la anulación, por ejemplo, una fecha de contabilización incorrecta o un error de introducción de datos. Este atributo es un dato clave para el Dashboard «Análisis de anulaciones de asientos contables». El análisis de los motivos de anulación más frecuentes permite identificar problemas sistémicos en los procesos o deficiencias de formación, y tomar medidas específicas para prevenir errores futuros y reducir la tasa de anulaciones. Por qué es importante Permite conocer directamente por qué se producen las anulaciones y realizar un análisis específico de las causas raíz para reducir los errores futuros. Dónde obtenerlo Se encuentra en el campo STGRD de la tabla de cabecera de documentos BKPF. Ejemplos 010205 | |||
| Tiempo de aprobación ApprovalTime | Tiempo transcurrido desde que se envía un asiento contable para su aprobación hasta que se aprueba o se rechaza. | ||
| Descripción Esta métrica mide la duración del subproceso de aprobación, que suele contribuir de forma significativa al tiempo de ciclo total. Se calcula como la diferencia entre la actividad «Asiento contable enviado» y la actividad correspondiente «Asiento contable aprobado» o «Asiento contable rechazado». El tiempo de aprobación es la métrica principal del Dashboard «Rendimiento de la aprobación de asientos contables» y del KPI «Tiempo medio de aprobación de asientos contables». Analizar esta duración ayuda a identificar cuellos de botella en el flujo de trabajo de aprobación, medir el rendimiento de las personas aprobadoras y justificar cambios en el proceso, como ajustar los umbrales de aprobación. Por qué es importante Cuantifica la duración de la etapa de aprobación y ayuda a detectar y resolver retrasos en el flujo de trabajo de revisión y aprobación. Dónde obtenerlo Se calcula restando la marca de tiempo del evento «Asiento contable enviado» de la del evento «Asiento contable aprobado» o «Asiento contable rechazado». Ejemplos P1DT2HPT4H15MP3D | |||
Actividades del proceso de registro a informe: asientos contables
| Actividad | Descripción | ||
|---|---|---|---|
| Anulación del asiento contable procesada | Esta actividad marca la anulación de un asiento contable registrado anteriormente. La anulación es un nuevo documento contable que cancela el asiento original. | ||
| Por qué es importante Este es un evento crítico para medir la calidad de los datos y la precisión del proceso. Una tasa elevada de anulaciones apunta a problemas sistémicos en la entrada inicial de datos o en las etapas de aprobación, y cada anulación implica trabajo adicional. Dónde obtenerlo Este evento se identifica en la cabecera del documento original (tabla BKPF). Cuando se anula un documento, SAP rellena el número del documento de anulación (BKPF-STBLG) y el motivo de la anulación (BKPF-STGRD). La marca de tiempo del evento es la fecha de registro del nuevo documento de anulación. Capturar Identifique cuándo se rellena BKPF-STBLG en el documento original. La marca de tiempo corresponde a la fecha de registro del documento de anulación. Tipo de evento explicit | |||
| Asiento contable aparcado | Esta actividad marca la creación inicial de un asiento contable en estado preliminar, antes de registrarlo oficialmente en el libro mayor. SAP la registra de forma explícita cuando un usuario guarda un documento mediante una transacción de aparcamiento y establece el estado del documento como «aparcado». | ||
| Por qué es importante Este es un evento de inicio crítico para los procesos que incluyen revisión y aprobación. Analizar el tiempo entre el aparcamiento y el registro ayuda a detectar demoras en las fases previas al registro y de aprobación. Dónde obtenerlo Este evento se identifica en la tabla de cabecera de documentos BKPF. Se considera que un documento está aparcado cuando se crea con el estado BKPF-BSTAT = 'V'. La fecha y hora del evento corresponden a BKPF-CPUDT y BKPF-CPUTM. Capturar Identifique la creación del documento en BKPF cuando BKPF-BSTAT tenga el valor 'V'. Tipo de evento explicit | |||
| Asiento contable aprobado | Esta actividad marca la aprobación final de un asiento contable en un flujo de trabajo y lo habilita para su registro. El evento se captura en el registro del flujo de trabajo cuando se completa el último paso de «liberación» o «aprobación». | ||
| Por qué es importante Este es un hito clave que pone fin al proceso de aprobación. El tiempo hasta esta actividad es un KPI fundamental para medir la eficiencia de la aprobación, mientras que el tiempo desde este evento hasta el registro permite medir la demora posterior a la aprobación. Dónde obtenerlo Se infiere a partir de la marca de tiempo de finalización del último paso de aprobación en el registro de SAP Business Workflow. Esta es la última acción de aprobación antes de que se registre el documento o quede listo para registrarse. Capturar Identifique en los registros del flujo de trabajo la finalización del último paso de «liberación» o «aprobación». Tipo de evento inferred | |||
| Asiento contable enviado | Esta actividad indica que quien creó el asiento contable aparcado lo ha finalizado y que ya está listo para su revisión y aprobación. Por lo general, se registra cuando se inicia una tarea de SAP Business Workflow asociada al documento aparcado. | ||
| Por qué es importante Marca el traspaso del creador al aprobador e inicia el cómputo de los KPI del ciclo de aprobación. Es un hito clave para medir la eficiencia del flujo de trabajo de aprobación. Dónde obtenerlo Se infiere a partir de la hora de inicio de la instancia del flujo de trabajo de aprobación vinculada al objeto del documento financiero. Para ello, hay que analizar tablas de registro del flujo de trabajo, como SWW_WI2OBJ, y localizar el flujo iniciado para la sociedad, el número de documento y el ejercicio fiscal correspondientes. Capturar Identifique el evento de inicio del flujo de trabajo para el objeto del documento aparcado. Tipo de evento inferred | |||
| Asiento contable registrado | Esta es la actividad central en la que el asiento contable se registra oficialmente en el libro mayor y afecta a los estados financieros. SAP captura este evento de forma explícita cuando el estado del documento pasa a «registrado» y se le asigna una fecha de registro. | ||
| Por qué es importante Este es el hito más importante, ya que indica que el procesamiento del asiento contable se completó correctamente. El tiempo de ciclo de principio a fin suele medirse hasta este punto, que también es un evento clave para analizar el cierre financiero. Dónde obtenerlo Se identifica cuando un documento de la tabla BKPF tiene una fecha de registro (BKPF-BUDAT). En los documentos aparcados, esto corresponde al momento en que el estado BKPF-BSTAT cambia de 'V' a blanco. La marca de tiempo del registro es la fecha de entrada BKPF-CPUDT. Capturar Identifique el momento en que BKPF-BSTAT cambia de 'V' a blanco o, en el caso de registros directos, el evento de creación. Tipo de evento explicit | |||
| Asiento contable aparcado eliminado | Representa la eliminación de un asiento contable aparcado que nunca llegó a registrarse. Puede ocurrir después de un rechazo o si el asiento se creó por error. | ||
| Por qué es importante Esta actividad marca un final fallido del proceso. Analizar por qué se eliminan documentos aparcados puede revelar problemas como asientos duplicados o malentendidos sobre el proceso. Dónde obtenerlo Este evento se captura cuando cambia el estado de un documento aparcado en la tabla BKPF. El campo de estado BKPF-BSTAT se actualiza a 'Z' (documento aparcado eliminado). La marca de tiempo del cambio se encuentra en los registros de cambios del documento (CDHDR). Capturar Identifique cuándo BKPF-BSTAT se actualiza a 'Z'. Tipo de evento explicit | |||
| Asiento contable corregido | Esta actividad indica que quien creó originalmente el asiento contable modificó el documento aparcado después de que se lo devolvieran para hacer cambios. Se infiere al detectar cambios en el documento después del evento «Cambios solicitados». | ||
| Por qué es importante El seguimiento de las correcciones permite cuantificar el esfuerzo dedicado a corregir el trabajo. El tiempo entre la solicitud de cambios y la corrección pone de manifiesto las demoras en la resolución de problemas de los asientos enviados. Dónde obtenerlo Se infiere al analizar los registros de cambios de documentos (tablas CDHDR y CDPOS) del documento aparcado. Si se registra un cambio después de un evento de rechazo en el flujo de trabajo, significa que se hizo una corrección. La marca de tiempo se obtiene de la tabla CDHDR. Capturar Identifique una entrada en el registro de cambios de CDHDR/CDPOS posterior a un evento de rechazo. Tipo de evento inferred | |||
| Asiento contable creado | Representa la creación de un asiento contable que se registra directamente, sin un paso previo de aparcamiento. SAP registra este evento cuando se crea un documento mediante una transacción de registro directo. | ||
| Por qué es importante Esta actividad sirve como punto de inicio alternativo para los procesos de asientos contables más sencillos, que no requieren un flujo de trabajo de aprobación. Permite distinguir entre los registros directos sencillos y los asientos aparcados, que son más complejos. Dónde obtenerlo Este evento corresponde a la creación de un documento en la tabla BKPF cuando el estado BKPF-BSTAT está en blanco (registrado). La fecha del evento es BKPF-CPUDT. En estos documentos, los eventos «Creado» y «Registrado» ocurren al mismo tiempo. Capturar Identifique la creación del documento en BKPF cuando BKPF-BSTAT esté en blanco. Tipo de evento explicit | |||
| Asiento contable rechazado | Esta actividad indica el rechazo definitivo de un asiento contable, que ya no se registrará. Suele ser un estado terminal del flujo de trabajo de aprobación y, finalmente, puede llevar a la eliminación del documento aparcado. | ||
| Por qué es importante El seguimiento de los rechazos es fundamental para gestionar la calidad. Analizar sus motivos y frecuencia ayuda a mejorar la tasa de asientos contables correctos desde el primer intento. Dónde obtenerlo Este resultado se captura en el registro de SAP Business Workflow y representa una decisión final del usuario de «rechazar» que pone fin al proceso. Es posible que después se elimine el documento aparcado. Capturar Identifique el estado terminal de «rechazo» del documento en el registro del flujo de trabajo. Tipo de evento inferred | |||
| Cambios solicitados en el asiento contable | Representa el momento del flujo de trabajo en que el aprobador revisa el asiento contable y lo devuelve al creador para que lo corrija. Este evento se captura en los registros del flujo de trabajo, que indican una decisión del usuario de «rechazar» o «devolver». | ||
| Por qué es importante Esta actividad es esencial para identificar ciclos de corrección, una de las principales causas de ineficiencia y desviaciones del proceso. Si ocurre con frecuencia, puede indicar problemas con la calidad de los asientos o requisitos poco claros. Dónde obtenerlo Este evento se infiere a partir de la marca de tiempo de un paso de decisión específico del usuario en el registro de SAP Business Workflow, correspondiente a una acción de «rechazar» o «enviar para corregir». Capturar Identifique en los registros del flujo de trabajo la marca de tiempo de la decisión de «rechazo» o «corrección». Tipo de evento inferred | |||
| Documentación adjunta | Esta actividad representa la acción de un usuario que adjunta documentos de respaldo, como facturas o hojas de cálculo, al asiento contable. Este evento no se registra explícitamente como un evento contable estándar. Por lo general, se infiere al comprobar si se crearon archivos adjuntos vinculados al objeto del documento contable. | ||
| Por qué es importante El seguimiento de esta actividad ayuda a comprobar el cumplimiento de las políticas que exigen documentación. Las demoras al adjuntar documentos pueden ser una de las causas de ciclos de aprobación prolongados. Dónde obtenerlo Es difícil capturar este evento de forma fiable con una marca de tiempo. Se puede inferir analizando las tablas de archivos adjuntos de Generic Object Services (GOS), como SOOD, y vinculando la marca de tiempo de creación del archivo adjunto con la clave del objeto del asiento contable. Capturar Infiera el evento a partir de la marca de tiempo de creación de los objetos vinculados en las tablas de GOS (por ejemplo, SOOD). Tipo de evento inferred | |||
| Entrada manual identificada | Esta actividad identifica si un asiento contable se creó mediante una transacción manual en línea o a través de una interfaz automatizada o un proceso por lotes. No corresponde a una acción del usuario, sino a un atributo calculado del asiento a partir de los datos del sistema. | ||
| Por qué es importante Distinguir entre asientos manuales y automatizados es clave para orientar las mejoras del proceso. Los procesos manuales suelen ser el foco de las iniciativas de estandarización y automatización. Dónde obtenerlo Se calcula analizando los campos de la tabla de cabecera de documentos BKPF. Los códigos de transacción (BKPF-TCODE), como 'FB01', 'FB50' o 'FV50', indican una entrada manual, mientras que otros códigos T o nombres específicos de entrada por lotes (BKPF-AWKEY) sugieren automatización. Capturar Derive el dato de BKPF-TCODE o de otros indicadores del sistema de origen en la cabecera del documento. Tipo de evento calculated | |||
| Partida del asiento contable compensada | Esta actividad representa la conciliación de una partida abierta de una cuenta de mayor gestionada por partidas abiertas, como una cuenta de compensación bancaria. Ocurre cuando una partida se empareja con otra y queda cerrada. | ||
| Por qué es importante En procesos como la conciliación bancaria, el tiempo necesario para compensar partidas es un KPI fundamental. Esta actividad ayuda a analizar la eficiencia de los procedimientos de conciliación y cierre de mes. Dónde obtenerlo Este evento se captura en la tabla de partidas BSEG. Cuando se compensa una partida, se rellenan los campos de fecha de compensación (BSEG-AUGDT) y documento de compensación (BSEG-AUGBL). La fecha de compensación es la marca de tiempo del evento. Capturar Identifique cuándo se rellena la fecha de compensación (BSEG-AUGDT) de una partida. Tipo de evento explicit | |||
| Registro entre sociedades identificado | Actividad calculada que señala un asiento contable que afecta a más de una sociedad. Se determina analizando las partidas de un único documento financiero. | ||
| Por qué es importante Las transacciones entre sociedades pueden tener requisitos de procesamiento y aprobación más complejos. Identificarlas permite analizar por separado sus tiempos de ciclo y rutas del proceso para detectar cuellos de botella específicos. Dónde obtenerlo Se calcula examinando la tabla de partidas BSEG para un número de documento (BELNR) determinado. Si las partidas contienen más de un código de sociedad distinto (BSEG-BUKRS), se trata de un registro entre sociedades. Capturar Compruebe si hay varios valores únicos de BSEG-BUKRS para un mismo BKPF-BELNR. Tipo de evento calculated | |||
Guías de extracción
Pasos
- Cree el programa ABAP: En el sistema SAP, vaya al código de transacción SE38 (Editor ABAP). Introduzca un nombre para el nuevo programa, por ejemplo, Z_PM_JE_EXTRACTION, y haga clic en Crear. Asígnele un título adecuado y establezca el tipo de programa como «Programa ejecutable».
- Defina la pantalla de selección: Defina la pantalla de selección en el código fuente del programa. Así, las personas usuarias podrán especificar parámetros como el intervalo de fechas de creación de documentos, los códigos de empresa y los tipos de documento para limitar el volumen de datos que se extraerá.
- Declare las estructuras de datos: Defina una tabla interna que contenga los datos finales del Registro de eventos. Esta estructura debe incluir todos los campos obligatorios: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate y atributos recomendados como User, CompanyCode y PostingDate.
- Implemente la lógica de selección de datos: Escriba las consultas SQL de ABAP principales para extraer los datos de cada una de las 14 actividades obligatorias. Para ello, seleccione datos de tablas principales como BKPF (cabecera) y BSEG (posiciones), tablas de registro de cambios como CDHDR y CDPOS, tablas de flujo de trabajo como SWWLOGHIST y tablas de compensación como BSAS y BSAK.
- Extraiga los documentos aparcados y contabilizados: Para los eventos «Asiento contable aparcado», seleccione los registros de BKPF cuyo estado de documento (BSTAT) sea «V». Para los eventos «Asiento contable creado» y «Asiento contable contabilizado», seleccione los registros de BKPF cuyo estado esté en blanco, lo que indica que se trata de un documento normal y contabilizado.
- Extraiga los eventos de modificación y eliminación: Consulte las tablas de documentos de modificación CDHDR y CDPOS para la clase de objeto «BELEG». Filtre por la clave del documento para encontrar los cambios correspondientes a las actividades «Asiento contable corregido» o «Asiento contable aparcado eliminado».
- Extraiga los eventos del flujo de trabajo: Para registrar actividades como «Asiento contable enviado», «Aprobado», «Rechazado» y «Cambios solicitados», consulte las tablas del flujo de trabajo. Utilice la tabla SWW_WI2OBJ para vincular el documento contable con una instancia del flujo de trabajo y, después, lea SWWLOGHIST para obtener decisiones específicas de las personas usuarias o cambios de estado.
- Identifique los eventos calculados: Para «Asiento manual identificado», compruebe el código de transacción (BKPF-TCODE) y compárelo con una lista de códigos de transacción manuales conocidos. Para «Contabilización entre empresas identificada», analice las posiciones de BSEG de un documento para comprobar si intervienen varios códigos de empresa.
- Consolide y transforme los datos: A medida que seleccione los datos de cada actividad, transfórmelos a la estructura final del Registro de eventos. Concatene el código de empresa, el número de documento y el ejercicio para crear JournalEntryId. Convierta las fechas y horas de SAP en una sola marca de tiempo EventTime. Añada los resultados de cada consulta a la tabla interna final.
- Implemente la exportación de archivos: Utilice instrucciones de gestión de archivos de ABAP, como OPEN DATASET, LOOP AT, TRANSFER y CLOSE DATASET, para escribir la tabla interna consolidada en un archivo CSV o de texto plano en el directorio del servidor de aplicaciones SAP (visible mediante la transacción AL11).
- Programe un job en segundo plano: Vaya a la transacción SM36 (Definir job en segundo plano). Cree un job, defina un paso que ejecute el programa ABAP y establezca un horario, por ejemplo, cada noche o cada semana durante las horas de menor actividad, para automatizar la extracción.
- Recupere y dé formato al archivo: Utilice la transacción CG3Y o solicite ayuda a la persona administradora del sistema para descargar el archivo generado desde el servidor de aplicaciones a su equipo. Compruebe que la codificación y el formato sean adecuados para cargarlo en su herramienta de Process Mining.
Configuración
- Intervalo de fechas: Es fundamental definir un intervalo de fechas para gestionar el rendimiento. Utilice la fecha de creación del documento (BKPF-CPUDT) como filtro principal. Para un análisis inicial, se recomienda un período de 3 a 6 meses. Para las pruebas, utilice un intervalo de unos días del que sepa que contiene datos.
- Filtro de código de empresa: Filtre siempre por código de empresa (BKPF-BUKRS). Extraer de una sola vez los datos de todos los códigos de empresa puede consumir muchos recursos. Comience con uno o con un grupo pequeño de códigos de empresa pertinentes.
- Filtro de tipo de documento: Utilice el filtro de tipo de documento (BKPF-BLART) para limitar el alcance a tipos específicos de asientos contables, como «SA» para documentos de mayor, si no necesita analizar todos los tipos de documento.
- ID de tareas del flujo de trabajo: La lógica para extraer eventos del flujo de trabajo depende de los ID de tarea específicos que se utilizan en su sistema para las aprobaciones, los rechazos y los envíos. Debe configurar estos ID en el código fuente del programa según las definiciones del flujo de trabajo de su empresa.
- Consideraciones de rendimiento: El programa combina varias tablas grandes, en especial CDPOS y las tablas del historial del flujo de trabajo. Ejecutarlo durante las horas de mayor actividad puede afectar al rendimiento del sistema. Prográmelo siempre como job en segundo plano para que se ejecute en horas de menor actividad. Si el rendimiento es un problema recurrente, considere la posibilidad de crear índices secundarios en la base de datos.
- Requisitos previos: Este método requiere una persona usuaria con autorizaciones de desarrollo ABAP (para SE38) y permisos para crear y gestionar jobs en segundo plano (para SM36). La persona usuaria o el job también necesita acceso de lectura a todas las tablas financieras, del flujo de trabajo y del sistema pertinentes (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST, etc.).
Consulta de ejemplo abap
REPORT Z_PM_JE_EXTRACTION.
*&---------------------------------------------------------------------*
*& Data Structures for Final Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
username TYPE uname,
companycode TYPE bukrs,
documenttype TYPE blart,
postingdate TYPE budat,
transactioncode TYPE tcode,
isreversed TYPE abap_bool,
END OF ty_event_log.
DATA: lt_final_log TYPE STANDARD TABLE OF ty_event_log.
DATA: ls_event TYPE ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen Parameters
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_blart FOR bkpf-blart,
s_cpudt FOR bkpf-cpudt OBLIGATORY.
PARAMETERS: p_sysid TYPE sy-sysid DEFAULT sy-sysid.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA(lv_last_update) = cl_abap_context_info=>get_system_timestamp( ).
" 1. Journal Entry Parked
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
'Journal Entry Parked' AS activityname,
a~cpudt, a~cputm,
a~usnam AS username,
a~bukrs AS companycode,
a~blart AS documenttype,
a~bldat AS postingdate,
a~tcode AS transactioncode
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~bstat = 'V' " Parked Document
INTO TABLE @DATA(lt_parked).
IF sy-subrc = 0.
LOOP AT lt_parked ASSIGNING FIELD-SYMBOL(<fs_parked>).
ls_event-journalentryid = <fs_parked>-journalentryid.
ls_event-activityname = <fs_parked>-activityname.
CONVERT DATE <fs_parked>-cpudt TIME <fs_parked>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_parked>-username.
ls_event-companycode = <fs_parked>-companycode.
ls_event-documenttype = <fs_parked>-documenttype.
ls_event-postingdate = <fs_parked>-postingdate.
ls_event-transactioncode = <fs_parked>-transactioncode.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 2. Journal Entry Created (directly posted, not parked first)
" 9. Journal Entry Posted
" These two events happen at the same time for a direct posting.
SELECT CONCAT( bukrs, belnr, gjahr ) AS journalentryid,
cpudt, cputm, usnam, bukrs, blart, budat, tcode, stblg
FROM bkpf
WHERE bukrs IN s_bukrs
AND blart IN s_blart
AND cpudt IN s_cpudt
AND bstat = '' " Normal, posted document
INTO TABLE @DATA(lt_posted).
IF sy-subrc = 0.
LOOP AT lt_posted ASSIGNING FIELD-SYMBOL(<fs_posted>).
" Activity: Journal Entry Created
ls_event-journalentryid = <fs_posted>-journalentryid.
ls_event-activityname = 'Journal Entry Created'.
CONVERT DATE <fs_posted>-cpudt TIME <fs_posted>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_posted>-usnam.
ls_event-companycode = <fs_posted>-bukrs.
ls_event-documenttype = <fs_posted>-blart.
ls_event-postingdate = <fs_posted>-budat.
ls_event-transactioncode = <fs_posted>-tcode.
ls_event-isreversed = COND #( WHEN <fs_posted>-stblg IS NOT INITIAL THEN abap_true ELSE abap_false ).
APPEND ls_event TO lt_final_log.
" Activity: Journal Entry Posted
ls_event-activityname = 'Journal Entry Posted'.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 3. Documentation Attached (via GOS)
SELECT a~instid_a, c~cr_timestamp
FROM srgbtbrel AS a
INNER JOIN sood AS b ON a~instid_b = b~objid
INNER JOIN socf AS c ON b~filid = c~filid
WHERE a~typeid_a = 'BKPF'
AND a~bukrs IN s_bukrs
INTO TABLE @DATA(lt_attachments).
IF sy-subrc = 0.
LOOP AT lt_attachments ASSIGNING FIELD-SYMBOL(<fs_attach>).
ls_event-journalentryid = |{ <fs_attach>-instid_a(4) }{ <fs_attach>-instid_a+4(10) }{ <fs_attach>-instid_a+14(4) }|.
ls_event-activityname = 'Documentation Attached'.
ls_event-eventtime = <fs_attach>-cr_timestamp.
" Other attributes may need to be looked up from BKPF if needed.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 4, 5, 6, 7, 8: Workflow events (Submitted, Changes Requested, Corrected, Approved, Rejected)
" This is a simplified example. Real logic depends on specific workflow templates.
SELECT a~instid, b~wi_cd, b~wi_ct, b~wi_aagent, b~wi_text
FROM sww_wi2obj AS a
INNER JOIN swwloghist AS b ON a~wi_id = b~wi_id
WHERE a~typeid = 'BKPF'
AND a~catid = 'BO'
AND a~bukrs IN s_bukrs
AND b~wi_cd BETWEEN s_cpudt-low AND s_cpudt-high
INTO TABLE @DATA(lt_workflow).
IF sy-subrc = 0.
LOOP AT lt_workflow ASSIGNING FIELD-SYMBOL(<fs_wf>).
ls_event-journalentryid = |{ <fs_wf>-instid(4) }{ <fs_wf>-instid+4(10) }{ <fs_wf>-instid+14(4) }|.
ls_event-activityname = CASE <fs_wf>-wi_text. " Simplified logic based on work item text
WHEN '[Placeholder for Submit Text]' THEN 'Journal Entry Submitted'
WHEN '[Placeholder for Approve Text]' THEN 'Journal Entry Approved'
WHEN '[Placeholder for Reject Text]' THEN 'Journal Entry Rejected'
WHEN '[Placeholder for Rework Text]' THEN 'Journal Entry Changes Requested'
ELSE ''
ENDCASE.
IF ls_event-activityname IS NOT INITIAL.
CONVERT DATE <fs_wf>-wi_cd TIME <fs_wf>-wi_ct INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_wf>-wi_aagent.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
ENDIF.
" 10. Manual Entry Identified & 11. Cross-Company Posting Identified
SELECT bukrs, belnr, gjahr, tcode FROM bkpf
WHERE bukrs IN s_bukrs AND blart IN s_blart AND cpudt IN s_cpudt
INTO TABLE @DATA(lt_calc_base).
LOOP AT lt_calc_base ASSIGNING FIELD-SYMBOL(<fs_calc>).
ls_event-journalentryid = |{ <fs_calc>-bukrs }{ <fs_calc>-belnr }{ <fs_calc>-gjahr }|.
" Check for manual entry T-Codes
IF <fs_calc>-tcode = 'FB01' OR <fs_calc>-tcode = 'F-02' OR <fs_calc>-tcode = 'FB50'.
ls_event-activityname = 'Manual Entry Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
" Check for cross-company posting
SELECT SINGLE bukrs FROM bseg WHERE belnr = <fs_calc>-belnr AND gjahr = <fs_calc>-gjahr AND bukrs <> <fs_calc>-bukrs INTO @DATA(lv_cross_bukrs).
IF sy-subrc = 0.
ls_event-activityname = 'Cross-Company Posting Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 12. Journal Entry Line Item Cleared
SELECT a~bukrs, a~belnr, a~gjahr, a~augdt, a~augbl
FROM bsas AS a " G/L Cleared Items
WHERE a~bukrs IN s_bukrs
AND a~budat IN s_cpudt
INTO TABLE @DATA(lt_cleared_gl).
IF sy-subrc = 0.
LOOP AT lt_cleared_gl ASSIGNING FIELD-SYMBOL(<fs_clr>).
ls_event-journalentryid = |{ <fs_clr>-bukrs }{ <fs_clr>-belnr }{ <fs_clr>-gjahr }|.
ls_event-activityname = 'Journal Entry Line Item Cleared'.
CONVERT DATE <fs_clr>-augdt INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
" User is often not directly available for clearing events
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 13. Parked Journal Entry Deleted & 6. Journal Entry Corrected
SELECT objectid, changenr, username, udate, utime FROM cdhdr
WHERE objectclas = 'BELEG'
AND udate IN s_cpudt
INTO TABLE @DATA(lt_cdhdr).
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
SELECT SINGLE tcode FROM cdpos WHERE changenr = <fs_cdhdr>-changenr AND fname = 'BSTAT' AND value_new = 'Z' INTO @DATA(lv_deleted_tcode).
ls_event-journalentryid = |{ <fs_cdhdr>-objectid(4) }{ <fs_cdhdr>-objectid+4(10) }{ <fs_cdhdr>-objectid+14(4) }|.
CONVERT DATE <fs_cdhdr>-udate TIME <fs_cdhdr>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_cdhdr>-username.
IF sy-subrc = 0.
ls_event-activityname = 'Parked Journal Entry Deleted'.
APPEND ls_event TO lt_final_log.
ELSE.
ls_event-activityname = 'Journal Entry Corrected'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 14. Journal Entry Reversal Processed
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
a~cpudt, a~cputm, a~usnam
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~stblg IS NOT NULL " Document is a reversal
INTO TABLE @DATA(lt_reversals).
IF sy-subrc = 0.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
ls_event-journalentryid = <fs_rev>-journalentryid.
ls_event-activityname = 'Journal Entry Reversal Processed'.
CONVERT DATE <fs_rev>-cpudt TIME <fs_rev>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_rev>-usnam.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" Final step: Output to file
DATA(lv_filename) = |/tmp/je_extraction_{ sy-datum }_{ sy-uzeit }.csv|.
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'JournalEntryId,ActivityName,EventTime,SourceSystem,LastDataUpdate,User,CompanyCode,DocumentType,PostingDate,TransactionCode,IsReversed'.
TRANSFER lv_header TO lv_filename.
LOOP AT lt_final_log INTO ls_event.
DATA(lv_line) = |"{ ls_event-journalentryid }","|
|{ ls_event-activityname }","|
|{ ls_event-eventtime }","|
|{ ls_event-sourcesystem }","|
|{ ls_event-lastdataupdate }","|
|{ ls_event-username }","|
|{ ls_event-companycode }","|
|{ ls_event-documenttype }","|
|{ ls_event-postingdate }","|
|{ ls_event-transactioncode }","|
|{ ls_event-isreversed }"|.
TRANSFER lv_line TO lv_filename.
ENDLOOP.
CLOSE DATASET lv_filename.
ENDIF. Pasos
- Establezca la conexión con la base de datos: Obtenga credenciales de solo lectura para la base de datos de SAP ECC. Utilice un cliente SQL estándar, como DBeaver, SAP HANA Studio o SQL Server Management Studio, para conectarse a la base de datos.
- Prepare la consulta SQL: Copie en su cliente SQL la consulta SQL completa que se proporciona en la sección «query» de este documento.
- Configure los parámetros de extracción: Antes de ejecutar la consulta, configure los marcadores de posición. Sustituya «[START_DATE]» y «[END_DATE]» por el intervalo de fechas deseado, con el formato «YYYYMMDD». Sustituya «[COMPANY_CODE_1]» y «[COMPANY_CODE_2]» por los códigos de empresa SAP específicos que desea analizar.
- Defina el sistema de origen: En la instrucción
SELECTprincipal, sustituya el marcador de posición «[Your SAP System ID]» por el ID real del sistema SAP (SID) para identificar correctamente el origen de los datos. - Ejecute la consulta: Ejecute la consulta SQL configurada en la base de datos SAP. El tiempo de ejecución variará según el intervalo de fechas y el tamaño de las tablas de la base de datos.
- Revise los primeros resultados: Cuando termine la consulta, revise brevemente las filas devueltas para comprobar que los datos se hayan cargado como se esperaba. Compruebe que haya distintas actividades y que los campos clave, como
JournalEntryIdyEventTime, no estén vacíos. - Gestione las marcas de tiempo: La consulta concatena los campos de fecha y hora en una cadena con el formato
YYYYMMDDHHMMSS. Compruebe que el sistema de destino o el procesamiento posterior puedan interpretar este formato. Si la base de datos lo admite, también puede modificar la función SQLCONCATpara utilizar un formato ISO 8601, comoYYYY-MM-DDTHH:MI:SS. - Exporte los datos: Exporte todo el conjunto de resultados del cliente SQL a un archivo CSV. Utilice la codificación UTF-8 para evitar problemas con caracteres especiales.
- Prepare la carga: Antes de cargar los datos en una herramienta de Process Mining, compruebe que los encabezados de columna coincidan con el esquema de datos requerido.
JournalEntryId,ActivityNameyEventTimeson campos esenciales. Añada la columnaLastDataUpdatee indique la marca de tiempo de la extracción. - Validación final: Siga los pasos de la sección «validationSteps» para comprobar que los datos extraídos estén completos y sean precisos antes de comenzar el análisis.
Configuración
- Autorizaciones de la base de datos: La persona usuaria de la base de datos necesita acceso de lectura a las siguientes tablas SAP: BKPF, BSEG, CDHDR, CDPOS, T001 y V_USERNAME. Para las actividades relacionadas con el flujo de trabajo, también se necesita acceso a SWW_WI2OBJ y SWWLOGHIST. Por lo general, este nivel de acceso solo se concede a equipos técnicos especializados.
- Filtrado por intervalo de fechas: Es fundamental filtrar los datos por un intervalo de fechas específico para garantizar el rendimiento de la consulta. La consulta proporcionada utiliza marcadores de posición para las fechas de inicio y fin, que se aplican a la fecha de creación del documento (
BKPF.CPUDT). Para un análisis inicial, se recomienda un intervalo de 3 a 6 meses. - Filtrado por entidad: Para gestionar el volumen de datos y centrar el análisis, filtre siempre por código de empresa (
BKPF.BUKRS). También puede filtrar por tipo de documento (BKPF.BLART) para incluir solo los tipos de asientos contables pertinentes, por ejemplo, «SA» para documentos de mayor, y excluir documentos operativos, como facturas o pagos, si no forman parte del análisis. - Consideraciones de rendimiento: Las consultas directas a tablas principales como BSEG y CDPOS pueden consumir muchos recursos. Se recomienda encarecidamente ejecutar esta extracción fuera del horario de mayor actividad para no afectar al rendimiento del sistema para las personas usuarias. Evite extraer más de un año de datos en una sola ejecución.
- ID de tareas del flujo de trabajo: La consulta contiene marcadores de posición como «[WF_TASK_ID_SUBMIT]» y «[WF_TASK_ID_APPROVE]». Debe sustituirlos por los ID de tarea reales de la configuración del flujo de trabajo de asientos contables de su sistema. Puede identificarlos con ayuda de una persona especialista en SAP Workflow o analizar la definición técnica del flujo de trabajo en la transacción PFTC.
Consulta de ejemplo sql
WITH DOC_HEADERS AS (
SELECT
BUKRS,
BELNR,
GJAHR,
BLART,
BLDAT,
BUDAT,
CPUDT,
CPUTM,
USNAM,
TCODE,
BSTAT,
STBLG,
XRECH
FROM BKPF
WHERE CPUDT BETWEEN '[START_DATE]' AND '[END_DATE]'
AND BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]')
)
-- Event 1: Journal Entry Created (Directly Posted)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = '' OR H.BSTAT = 'U'
UNION ALL
-- Event 2: Journal Entry Parked
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = 'V'
UNION ALL
-- Event 3: Journal Entry Posted (from Parked state)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT <> 'V'
AND P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW <> 'V'
UNION ALL
-- Event 4: Parked Journal Entry Deleted
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Parked Journal Entry Deleted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND C.TCODE = 'FBV0'
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW = 'Z'
UNION ALL
-- Event 5: Journal Entry Reversal Processed
SELECT
CONCAT(H.BUKRS, H.STBLG, H.GJAHR) AS "JournalEntryId", -- Linking to the original document
'Journal Entry Reversal Processed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
TRUE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.STBLG IS NOT NULL AND H.STBLG <> ''
UNION ALL
-- Event 6: Journal Entry Line Item Cleared
SELECT
CONCAT(B.BUKRS, B.BELNR, B.GJAHR) AS "JournalEntryId",
'Journal Entry Line Item Cleared' AS "ActivityName",
TO_TIMESTAMP(B.AUGDT, 'YYYYMMDD') AS "EventTime", -- Clearing date used as event time
U.NAME_TEXT AS "User",
B.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode", -- Clearing transaction is in the clearing document header, complex to retrieve here
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM BSEG B
JOIN DOC_HEADERS H ON B.BUKRS = H.BUKRS AND B.BELNR = H.BELNR AND B.GJAHR = H.GJAHR
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE B.AUGBL IS NOT NULL AND B.AUGBL <> '' AND B.AUGDT <> '00000000'
UNION ALL
-- Event 7: Journal Entry Corrected (changes to a parked document)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT = 'V' AND C.TCODE IN ('FBV2', 'FBV4') -- FBV2 is change parked doc, FBV4 is change parked doc header
UNION ALL
-- Event 8: Documentation Attached (inferred from GOS attachment creation, requires configuration)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(CONCAT(REL.RECDATE, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SRGBTBREL REL ON REL.INSTID_A = CONCAT('BUS2081', H.BUKRS, H.BELNR, H.GJAHR) -- BUS2081 is object type for BKPF
LEFT JOIN V_USERNAME U ON REL.RECUNAM = U.BNAME
WHERE REL.TYPEID_A = 'BUS2081' AND REL.RELTYPE = 'ATTA'
UNION ALL
-- Events 9-13 from Workflow (Submitted, Changes Requested, Approved, Rejected) requires specific workflow config
-- This is a generic template. The WI_RH_TASK must be adapted to your system.
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
CASE
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_SUBMIT]' THEN 'Journal Entry Submitted'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_APPROVE]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Approved'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_REJECT]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Rejected'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_CHANGES_REQ]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Changes Requested'
ELSE NULL
END AS "ActivityName",
TO_TIMESTAMP(CONCAT(LOG.EVT_DATE, LOG.EVT_TIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SWW_WI2OBJ WIOBJ ON WIOBJ.INSTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND WIOBJ.TYPEID = 'BKPF'
JOIN SWWLOGHIST LOG ON WIOBJ.WI_ID = LOG.WI_ID
LEFT JOIN V_USERNAME U ON LOG.EXEC_USER = U.BNAME
WHERE LOG.WI_RH_TASK IN ('[WF_TASK_ID_SUBMIT]', '[WF_TASK_ID_APPROVE]', '[WF_TASK_ID_REJECT]', '[WF_TASK_ID_CHANGES_REQ]')
UNION ALL
-- Event 14: Manual Entry Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Manual Entry Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.TCODE IN ('FB01', 'F-02', 'FB50', 'F-04', 'F-22', 'F-43', 'FB60', 'FB70', 'FV50', 'FV60', 'FV70')
UNION ALL
-- Event 15: Cross-Company Posting Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Cross-Company Posting Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.XRECH = 'X' Pasos
- Establecer la conexión con SAP: En su herramienta ETL de terceros, configure una nueva conexión de origen con su sistema SAP ECC. Por lo general, necesitará los datos del servidor de aplicaciones, el cliente, el número de sistema y un usuario de SAP dedicado con las autorizaciones RFC necesarias.
- Definir las fuentes de datos: En su proyecto de extracción, añada las tablas de SAP necesarias como fuentes de datos. Las tablas principales son BKPF (cabecera del documento contable), BSEG (partida del documento contable), VBSEGK (cabecera del documento aparcado), CDHDR (cabecera del documento de modificación), CDPOS (posiciones del documento de modificación), SWW_WI2OBJ (vínculos entre Workflow y objetos), SWWLOGHIST (registro de Workflow) y SRGBTBREL (relaciones de los archivos adjuntos de GOS).
- Extraer los eventos iniciales (creado y aparcado): Cree el primer flujo de datos para extraer los eventos iniciales. Para «Asiento contable aparcado», use VBSEGK como origen. Para «Asiento contable creado», use BKPF y filtre los documentos que no sean anulaciones ni se hayan aparcado inicialmente. Puede hacerlo mediante una combinación anti-join con VBSEGK.
- Extraer los eventos de Workflow: Cree un flujo de datos que una BKPF con SWW_WI2OBJ mediante la clave del objeto (sociedad + número de documento + ejercicio) para encontrar el ID de la instancia de Workflow. Una este resultado con SWWLOGHIST para extraer eventos como «Enviado», «Aprobado», «Rechazado» y «Cambios solicitados», según los resultados de las tareas de Workflow y las decisiones de los usuarios registradas en el registro.
- Extraer los eventos de modificación y eliminación: Use las tablas CDHDR y CDPOS para identificar las modificaciones. Para «Asiento contable corregido», filtre las modificaciones realizadas en documentos aparcados (clase de objeto «FIPP»). Para «Asiento contable aparcado eliminado», busque indicadores de eliminación en los registros de modificaciones de los documentos aparcados.
- Extraer los eventos de archivos adjuntos: Para capturar «Documentación adjunta», una BKPF con SRGBTBREL cuando el tipo de objeto sea «BKPF» y la relación sea «[Your attachment relationship type]». La fecha de creación del vínculo sirve como hora del evento.
- Extraer los eventos de compensación y anulación: Para «Partida del asiento contable compensada», consulte la tabla BSEG cuando el campo del documento de compensación (AUGBL) tenga un valor. La hora del evento es la fecha de contabilización del documento de compensación (AUGDT). Para «Proceso de anulación del asiento contable ejecutado», consulte BKPF para encontrar documentos anulados, identificados por un valor en el campo del documento anulado (STBLG).
- Derivar los eventos calculados: Cree bloques de lógica independientes para los eventos calculados. Para «Registro manual identificado», filtre BKPF según una lista de códigos de transacción manuales (por ejemplo, FB01, FB50, F-02). Para «Contabilización entre sociedades identificada», agrupe la tabla BSEG por ID de documento e identifique los documentos que tengan más de una sociedad distinta.
- Combinar todos los flujos de eventos: Use una transformación UNION en su herramienta ETL para combinar los resultados de todos los flujos de eventos individuales (creado, aparcado, aprobado, etc.) en una sola tabla de registro de eventos. Asegúrese de que los nombres de las columnas y los tipos de datos sean coherentes en todos los flujos.
- Asignar el esquema final: Asigne los datos combinados a la estructura requerida del registro de eventos y cree
JournalEntryId,ActivityName,EventTime,Usuarioy los demás atributos obligatorios y recomendados. Añada columnas estáticas comoSourceSystemy use la hora de ejecución del trabajo ETL paraLastDataUpdate. - Configurar la carga incremental: Para las extracciones periódicas, configure una estrategia de carga incremental. Use la última fecha de creación o modificación (por ejemplo, BKPF.CPUDT, CDHDR.UDATE) como marca de agua para extraer solo los registros nuevos o actualizados desde la última ejecución.
- Exportar a ProcessMind: Programe el trabajo de extracción y configure el paso de salida final para guardar el registro de eventos como archivo CSV o Parquet en una ubicación a la que ProcessMind pueda acceder para cargarlo.
Configuración
- Requisitos previos: Una herramienta ETL de terceros con licencia (por ejemplo, Theobald Xtract Universal, Informatica, Talend) y un conector específico para SAP. Una cuenta de usuario de SAP con acceso RFC y autorización para leer tablas financieras (por ejemplo, S_TABU_DIS para los grupos de tablas F_00 y F_WF), datos de Workflow y registros de modificaciones.
- Parámetros de conexión: Necesitará la dirección IP o el nombre de host del servidor de aplicaciones de SAP, el número de sistema y el ID de cliente. Debe utilizar una gestión segura de credenciales para el nombre de usuario y la contraseña de SAP.
- Filtros clave: Aplique siempre filtros por sociedad (BKPF.BUKRS) y ejercicio (BKPF.GJAHR) en el origen para limitar el volumen de datos. Se recomienda encarecidamente filtrar por fecha de creación del documento (BKPF.CPUDT) para definir un período de extracción concreto, por ejemplo, los últimos 6 meses.
- Selección del intervalo de fechas: Para la carga inicial, seleccione un período representativo, como de 3 a 6 meses. Para las cargas delta posteriores, use una marca de agua en un campo de fecha y hora como
CPUDTpara obtener solo los registros nuevos. - Consideraciones de rendimiento: Las uniones de BSEG, CDPOS y las tablas de Workflow pueden ser muy lentas. Asegúrese de que su herramienta ETL aplique los filtros en el origen SAP siempre que sea posible. Si la herramienta lo permite, extraiga los datos en bloques o paquetes más pequeños, especialmente al cargar grandes volúmenes históricos.
- Personalización de Workflow: La lógica para identificar actividades de Workflow como «Aprobado» o «Rechazado» depende en gran medida de sus plantillas de Workflow específicas. Deberá identificar en su sistema los ID de tarea de Workflow y las claves de decisión de usuario correctos para utilizarlos en los filtros.
Consulta de ejemplo sql
/*
This is a logical representation of the extraction configuration in a third-party ETL tool.
It is not executable SQL but defines the sources, joins, and transformations for each activity.
Placeholders like [Your SAP Source], [Date Filter], and [Company Code Filter] must be configured in the tool.
*/
-- Extraction block for 'Journal Entry Parked'
SELECT
CONCAT(v.BUKRS, v.VBELN, v.GJAHR) AS JournalEntryId,
'Journal Entry Parked' AS ActivityName,
CAST(CONCAT(v.CPUDT, v.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
v.USNAM AS User,
v.BUKRS AS CompanyCode,
v.BLART AS DocumentType,
v.BUDAT AS PostingDate,
v.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].VBSEGK v
WHERE [Date Filter on v.CPUDT] AND [Company Code Filter on v.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Created'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Created' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
LEFT JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE h.BSTAT = '' AND v.VBELN IS NULL AND h.STBLG IS NULL
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Posted' (from parked)
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Posted' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Or a more precise posting time from change logs if available
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Submitted', 'Approved', 'Rejected', 'Changes Requested'
SELECT
CONCAT(SUBSTRING(o.INSTID, 3, 4), SUBSTRING(o.INSTID, 7, 10), SUBSTRING(o.INSTID, 17, 4)) AS JournalEntryId,
CASE
WHEN wl.WI_TEXT LIKE '%Submit%' THEN 'Journal Entry Submitted'
WHEN wl.WI_TEXT LIKE '%Approve%' THEN 'Journal Entry Approved'
WHEN wl.WI_TEXT LIKE '%Reject%' THEN 'Journal Entry Rejected'
WHEN wl.WI_TEXT LIKE '%Request Changes%' THEN 'Journal Entry Changes Requested'
END AS ActivityName,
CAST(CONCAT(wl.WI_CD, wl.WI_CT) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
wl.EXEC_USER AS User,
SUBSTRING(o.INSTID, 3, 4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SWW_WI2OBJ o
JOIN [Your SAP Source].SWWLOGHIST wl ON o.WI_ID = wl.WI_ID
WHERE o.TYPEID = 'BKPF' AND o.CATID = 'BO'
AND wl.WI_TEXT IN ('[Your Submit Task Name]', '[Your Approve Task Name]', '[Your Reject Task Name]', '[Your Changes Request Task Name]')
AND [Date Filter on wl.WI_CD]
UNION ALL
-- Extraction block for 'Journal Entry Corrected'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Journal Entry Corrected' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'U'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Parked Journal Entry Deleted'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Parked Journal Entry Deleted' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'D'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Documentation Attached'
SELECT
CONCAT(SUBSTRING(r.INSTID_A, 3, 4), SUBSTRING(r.INSTID_A, 7, 10), SUBSTRING(r.INSTID_A, 17, 4)) AS JournalEntryId,
'Documentation Attached' AS ActivityName,
-- Note: A precise timestamp is often unavailable. Using document creation time as a proxy.
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SRGBTBREL r
JOIN [Your SAP Source].BKPF h ON h.BUKRS = SUBSTRING(r.INSTID_A, 3, 4) AND h.BELNR = SUBSTRING(r.INSTID_A, 7, 10) AND h.GJAHR = SUBSTRING(r.INSTID_A, 17, 4)
WHERE r.TYPEID_A = 'BKPF' AND r.RELTYPE = '[Configure based on your system]'
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Reversal Processed'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Reversal Processed' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.STBLG IS NOT NULL AND h.STBLG <> ''
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Is Reversed' flag on original document
SELECT
CONCAT(h_orig.BUKRS, h_orig.BELNR, h_orig.GJAHR) AS JournalEntryId,
'Is Reversed' AS ActivityName, -- This is an attribute update, modeled as an event
CAST(CONCAT(h_rev.CPUDT, h_rev.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h_rev.USNAM AS User,
h_orig.BUKRS AS CompanyCode,
h_orig.BLART AS DocumentType,
h_orig.BUDAT AS PostingDate,
h_orig.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h_rev
JOIN [Your SAP Source].BKPF h_orig ON h_rev.STBLG = h_orig.BELNR AND h_rev.BUKRS = h_orig.BUKRS AND h_rev.GJAHR_S = h_orig.GJAHR
WHERE h_rev.STBLG IS NOT NULL AND h_rev.STBLG <> ''
AND [Date Filter on h_rev.CPUDT] AND [Company Code Filter on h_rev.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Line Item Cleared'
SELECT
CONCAT(i.BUKRS, i.BELNR, i.GJAHR) AS JournalEntryId,
'Journal Entry Line Item Cleared' AS ActivityName,
CAST(i.AUGDT AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
NULL AS User, -- User who performed clearing is on the clearing document header
i.BUKRS AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BSEG i
WHERE i.AUGBL IS NOT NULL AND i.AUGBL <> ''
AND [Date Filter on i.AUGDT] AND [Company Code Filter on i.BUKRS]
UNION ALL
-- Extraction block for 'Manual Entry Identified'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Manual Entry Identified' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.TCODE IN ('FB01', 'F-02', 'FB50', 'FV50', '[Add other manual T-Codes]')
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Cross-Company Posting Identified'
SELECT
JournalEntryId,
'Cross-Company Posting Identified' AS ActivityName,
EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
User,
CompanyCode,
DocumentType,
PostingDate,
TransactionCode,
IsReversed
FROM (
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed,
(SELECT COUNT(DISTINCT i.BUKRS) FROM [Your SAP Source].BSEG i WHERE i.BELNR = h.BELNR AND i.BUKRS = h.BUKRS AND i.GJAHR = h.GJAHR) as CompanyCodeCount
FROM [Your SAP Source].BKPF h
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
) AS CrossCompanyCheck
WHERE CompanyCodeCount > 1 ¿Todo listo para comenzar?
Utilice este Template de datos para iniciar su recorrido de Process Mining en el proceso de registro a informe: asientos contables. Obtenga información más detallada y mejore la eficiencia de sus operaciones financieras.
Optimice ahora el proceso de registro a informe: asientos contables
Reduzca un 30 % el tiempo de ciclo de los asientos contables y garantice informes impecables.
No se requiere tarjeta de crédito. Comience a mejorar hoy mismo.