Su Plantilla de Datos de Asientos Contables del Proceso de Cierre Contable (Record to Report)
Su Plantilla de Datos de Asientos Contables del Proceso de Cierre Contable (Record to Report)
- Atributos recomendados para un análisis integral
- Actividades clave de asientos contables a rastrear
- Guía práctica de extracción de datos para SAP ECC
Registro a Informe - Atributos de Asientos Contables
| Nombre | Descripción | ||
|---|---|---|---|
| Hora del Evento EventTime | La marca de tiempo que indica cuándo ocurrió una actividad o evento específico para el asiento contable. | ||
| Descripción La Hora del Evento proporciona la fecha y hora exactas para cada actividad en el proceso de asientos contables. Estos datos son críticos para calcular todas las métricas basadas en el tiempo, como los tiempos de ciclo, las duraciones de procesamiento y los retrasos entre pasos. La fuente de esta marca de tiempo varía según la actividad; puede ser la fecha/hora de creación del documento (CPUDT/CPUTM) o las marcas de tiempo de modificación de los logs (CDHDR-UDATE/UTIME). En el análisis, la Hora del Evento se utiliza para ordenar los eventos cronológicamente, formando la base del mapa de proceso. Es esencial para calcular todos los KPI relacionados con el tiempo, como el Tiempo de Ciclo Promedio del Asiento Contable, el Tiempo Promedio de Aprobación y el Tiempo desde la Aprobación hasta la Contabilización. Por qué es importante Este timestamp es la base para todos los análisis relacionados con el tiempo, permitiendo el cálculo de tiempos de ciclo, duraciones y cuellos de botella. Dónde obtener Obtenido de varios campos dependiendo de la actividad, principalmente de la marca de tiempo de creación (CPUDT, CPUTM) de BKPF o de las marcas de tiempo de documentos de cambio (UDATE, UTIME) de CDHDR. Ejemplos 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| ID de Asiento Contable JournalEntryId | El identificador único para un documento contable financiero, combinando el código de sociedad, el número de documento y el ejercicio fiscal. | ||
| Descripción El ID de Asiento Contable es el identificador de caso principal para rastrear el ciclo de vida de un asiento contable. Es una clave compuesta, típicamente formada por la concatenación del Código de Sociedad (BUKRS), el Número de Documento (BELNR) y el Ejercicio Fiscal (GJAHR) para asegurar la unicidad en todo el sistema SAP. En el análisis de procesos, este ID vincula todas las actividades relacionadas, como la creación, aparcamiento, envío, aprobación, rechazo y contabilización. Al rastrear este identificador, podemos construir el recorrido de extremo a extremo de cada asiento contable, medir los tiempos de ciclo e identificar desviaciones del proceso o cuellos de botella para asientos específicos. Por qué es importante Esta es la clave esencial para rastrear un asiento contable desde su creación hasta su contabilización final, permitiendo el análisis de procesos de extremo a extremo y la comparación de variantes. Dónde obtener Este es un atributo derivado, típicamente una concatenación de 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 | El nombre de la actividad o evento de negocio que ocurrió en un punto específico del proceso de asientos contables. | ||
| Descripción El Nombre de la Actividad describe un paso específico en el ciclo de vida del asiento contable, como 'Journal Entry Created', 'Journal Entry Approved' o 'Journal Entry Posted'. Este atributo se deriva típicamente de múltiples fuentes en SAP, incluyendo códigos de transacción (TCODE), logs de documentos de cambio (tablas CDHDR y CDPOS) y campos de estado de documentos. El análisis de actividades es el núcleo del process mining. Permite la visualización de mapas de procesos, el cálculo de tiempos de transición entre pasos y la identificación de bucles de reprocesamiento (por ejemplo, 'Journal Entry Rejected' seguido de 'Journal Entry Corrected'). Estos datos son fundamentales para los dashboards relacionados con los tiempos de ciclo, las tasas de reprocesamiento y las variantes de proceso. Por qué es importante Define los pasos en el mapa de procesos, haciendo posible visualizar, analizar y optimizar el flujo de trabajo de asientos contables. Dónde obtener Derivado de varias fuentes, incluyendo códigos de transacción en BKPF (TCODE), estado del documento y registros de workflow en tablas como SWW_WI2OBJ, o documentos de modificación en CDHDR y CDPOS. Ejemplos Asiento Contable CreadoAsiento Contable AprobadoAsiento Contable RechazadoAsiento Contable Contabilizado | |||
| Source System SourceSystem | El sistema del cual se extrajeron los `datos` del `proceso`. | ||
| Descripción Este atributo identifica el origen de los datos, que en este caso es la instancia específica de SAP ECC. Es típicamente un valor estático añadido durante el proceso de extracción de datos. Aunque simple, este atributo es importante en entornos con múltiples ERPs o fuentes de datos. Asegura que la trazabilidad de los datos sea clara y permite filtrar o segmentar el análisis por el sistema de origen. Por qué es importante Proporciona una clara trazabilidad de los datos y es esencial para el seguimiento de la calidad de los datos, especialmente en entornos con múltiples sistemas de origen. Dónde obtener Este es típicamente un valor estático añadido durante el proceso de transformación de datos, identificando la instancia específica de SAP ECC (por ejemplo, 'ECC_PROD_100'). Ejemplos SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Última actualización de datos LastDataUpdate | La 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 de datos más reciente de SAP ECC. Es un campo de metadatos crítico para comprender la actualidad y vigencia de los datos analizados. En cualquier dashboard o análisis de process mining, saber la última hora de actualización es crucial para que los usuarios confíen en los datos y tomen decisiones informadas. Ayuda a responder la pregunta: '¿Cuán actualizada está esta información?'. Por qué es importante Informa a los usuarios sobre la actualidad de los datos, asegurando que comprendan el marco de tiempo del análisis y puedan confiar en los resultados. Dónde obtener Este es un campo de metadatos generado y almacenado por la herramienta de extracción de datos o el proceso ETL en el momento de la actualización de datos. Ejemplos 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Código de Transacción TransactionCode | El código de transacción SAP utilizado para crear o procesar el asiento contable. | ||
| Descripción El Código de Transacción (T-Code) es un identificador único para una función o programa específico en SAP. Para 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 invaluable para el dashboard de 'Optimización de Actividades Manuales'. Al analizar el T-Code, podemos distinguir entre actividades manuales y automatizadas, identificar qué procesos manuales consumen más tiempo e identificar oportunidades de automatización para reducir el esfuerzo manual y mejorar la eficiencia. Por qué es importante Ayuda a diferenciar entre procesos manuales y automatizados, identificando oportunidades para la automatización y la estandarización de procesos. Dónde obtener Ubicado en la tabla de cabecera de documento BKPF, campo TCODE. Ejemplos FB01F-02FV50FBD1 | |||
| Fecha de Contabilización PostingDate | La fecha en la que la transacción se registra en el libro mayor, afectando el período financiero. | ||
| Descripción La Fecha de Contabilización determina el período fiscal en el que se contabiliza el asiento contable. Es un campo de fecha crítico desde una perspectiva financiera y de cumplimiento, ya que debe alinearse con los cronogramas y regulaciones de cierre de período contable. En process mining, esta fecha se utiliza para monitorear el cumplimiento. El dashboard 'Compliance Adherence Monitoring' y el KPI 'Compliance Conformance Rate' utilizan este atributo para verificar si los asientos se contabilizan dentro del período correcto. También puede utilizarse para analizar tendencias en los volúmenes de asientos contables a lo largo del tiempo. Por qué es importante Crucial para la elaboración de informes financieros y el análisis de cumplimiento, asegurando que los asientos se contabilicen en el período contable correcto. Dónde obtener Ubicado en la tabla de cabecera de documento BKPF, campo BUDAT. Ejemplos 2023-10-312023-11-302024-01-15 | |||
| Revertida IsReversed | Un indicador booleano que señala si el asiento contable ha sido revertido. | ||
| Descripción Este indicador identifica los asientos contables que han sido revertidos posteriormente por otro documento contable. En SAP, un documento revertido se vincula al documento de reversión, proporcionando una clara pista de auditoría. Este atributo es fundamental para el dashboard de 'Journal Entry Reversal Analysis' y el KPI de 'Journal Entry Reversal Rate'. Permite aislar los asientos revertidos para investigar las causas raíz, como errores de entrada de datos o tratamientos contables incorrectos, con el objetivo de reducir la frecuencia de las reversiones. Por qué es importante Apoya directamente el análisis de reversiones al marcar los asientos que fueron deshechos posteriormente, ayudando a identificar las causas raíz de los errores y a mejorar la integridad de los datos. Dónde obtener Derivado del campo de número de documento de reversión (STBLG) en la tabla BKPF. Si STBLG no está vacío, el indicador es verdadero. Ejemplos truefalse | |||
| Sociedad CompanyCode | La unidad organizativa que representa a una entidad legal independiente para la cual se preparan estados financieros. | ||
| Descripción El Código de Sociedad es una unidad organizativa fundamental en SAP Financials. Representa una empresa legalmente independiente y es un campo clave en la cabecera del documento de asiento contable. Este atributo es esencial para segmentar el análisis de procesos por entidad legal. Permite comparar el rendimiento del proceso, las tasas de cumplimiento y los resultados de los KPI entre diferentes partes del negocio. Por ejemplo, puede ayudar a identificar si los retrasos en la aprobación o las altas tasas de reversión son específicas de ciertos códigos de sociedad. Por qué es importante Permite filtrar y comparar el rendimiento del proceso entre diferentes entidades legales o unidades de negocio dentro de la organización. Dónde obtener Ubicado en la tabla de cabecera de documento BKPF, campo BUKRS. Ejemplos 10002000US01DE01 | |||
| Tipo de Documento DocumentType | Una clasificación para documentos contables que controla cómo se procesan y almacenan. | ||
| Descripción El Tipo de Documento distingue diferentes tipos de transacciones comerciales, como un asiento de libro mayor (SA), factura de proveedor (KR) o contabilización de activo (AA). Se define durante la configuración del sistema y se asigna a cada asiento contable. Este es un atributo crítico para el análisis ya que permite segmentar el proceso por la naturaleza de la transacción. El dashboard 'Journal Entry Throughput by Type' y el KPI 'Average Cycle Time by Journal Entry Type' dependen directamente de este campo. Ayuda a descubrir si ciertos tipos de asientos son más propensos a retrasos, reprocesamiento o reversiones. Por qué es importante Permite la segmentación del análisis por tipo de transacción, ayudando a identificar si los problemas del proceso son específicos de ciertos tipos de asientos contables. Dónde obtener Ubicado en la tabla de cabecera de documento BKPF, campo BLART. Ejemplos SAKRREAA | |||
| Usuario User | El ID de usuario SAP de la persona que creó o modificó el asiento contable. | ||
| Descripción Este atributo captura el nombre de usuario SAP responsable de una actividad determinada, como crear, aparcar o contabilizar un documento. Se obtiene directamente de la cabecera del documento o de las tablas de log de cambios. Analizar el atributo Usuario es clave para comprender el rendimiento del equipo e individual. Soporta el dashboard de Productividad del Usuario al rastrear los volúmenes de actividad y los tiempos de procesamiento por usuario. También ayuda a identificar quién está involucrado en bucles de reprocesamiento, reversiones o desviaciones de cumplimiento, permitiendo capacitación dirigida o mejoras de proceso. Por qué es importante Identifica al usuario responsable de cada actividad, permitiendo el análisis del rendimiento del usuario, la distribución de la carga de trabajo y los patrones de reprocesamiento. Dónde obtener Normalmente de la tabla BKPF (campo USNAM para el creador) o de la tabla CDHDR (campo USERNAME para quien realiza el cambio). Ejemplos ABROWNCJONESDSMITH | |||
| ¿Es Retrabajo? IsRework | Un indicador booleano que señala si un asiento contable ha pasado por un ciclo de reprocesamiento, como ser rechazado y luego corregido. | ||
| Descripción Este indicador identifica los casos que se han desviado del 'camino ideal' y han requerido una acción correctiva. Se establece típicamente como verdadero si se observa una secuencia de actividades como 'Journal Entry Rejected' seguido de 'Journal Entry Corrected' para un asiento contable dado. Este atributo es esencial para calcular el KPI de 'Journal Entry Rework Rate' y para el análisis en el dashboard de 'Rework and Rejection Rate'. Ayuda a cuantificar el grado de ineficiencia en el proceso y proporciona una base para investigar las causas raíz del reprocesamiento, como requisitos poco claros o documentación insuficiente. Por qué es importante Marca los asientos que requirieron corrección, permitiendo la cuantificación del reprocesamiento y el análisis de sus causas raíz para mejorar las tasas de 'correcto a la primera'. Dónde obtener Este es un atributo calculado, derivado del análisis de la secuencia de actividades para un caso. Se identifica un bucle de reprocesamiento si ocurre una actividad de rechazo o corrección. Ejemplos truefalse | |||
| Centro de Costos CostCenter | Una unidad organizativa dentro de una sociedad CO que representa un lugar donde se incurren costes. | ||
| Descripción El Centro de Costo es un elemento clave de datos maestros del módulo de Controlling (CO), a menudo asignado a nivel de partida individual del asiento contable. Se utiliza para rastrear costos para un departamento, función o ubicación específicos. Incluir el Centro de Costo permite un análisis más granular del proceso de asientos contables. Puede ayudar a determinar si ciertos departamentos generan más reprocesamiento, tienen tiempos de ciclo más largos o son responsables de un mayor volumen de asientos manuales. Esto permite una visión departamental de la eficiencia del proceso. Por qué es importante Permite el análisis del rendimiento del proceso por departamento o área funcional, ayudando a identificar ineficiencias localizadas. Dónde obtener Ubicado en la tabla de partidas individuales del documento BSEG, campo KOSTL. Ejemplos 4100CC_FINANCE_US10010101 | |||
| Clave de Moneda CurrencyKey | El código de moneda para 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 cualquier importe financiero asociado con el documento. Aunque no siempre es una dimensión de análisis principal, es crucial para interpretar correctamente los valores monetarios. También puede utilizarse para segmentar el análisis en organizaciones globales para ver si los procesos difieren para los asientos en monedas extranjeras frente a las locales. Por qué es importante Proporciona el contexto necesario para todos los valores monetarios, asegurando un análisis e interpretación financiera precisos. Dónde obtener Ubicado en la tabla de cabecera de documento BKPF, campo WAERS. Ejemplos USDEURGBPJPY | |||
| Está Aparcado IsParked | Un indicador booleano que señala si el asiento contable fue guardado como un documento preliminar antes de ser contabilizado. | ||
| Descripción Aparcar un documento permite a un usuario guardar un asiento contable incompleto sin que afecte los saldos financieros. Luego puede ser completado o revisado por otro usuario antes de su contabilización. Este indicador identifica los asientos que han pasado por un paso de aparcamiento. Analizar este atributo ayuda a comprender el uso de la funcionalidad de aparcamiento. Puede revelar si el aparcamiento se utiliza como un paso de revisión informal, causando potencialmente retrasos. Soporta el análisis del tiempo de ciclo de extremo a extremo, diferenciando entre asientos que se contabilizan directamente y aquellos que se aparcan primero. Por qué es importante Identifica los asientos que utilizan la funcionalidad de aparcamiento, lo que puede ser una fuente de retraso o un indicador de un proceso de revisión informal. Dónde obtener Derivado del campo de estado del documento (BSTAT) en la tabla BKPF. Una 'V' indica un documento preliminar. Ejemplos truefalse | |||
| Importe Total del Documento TotalDocumentAmount | El valor total del asiento contable en la moneda del documento. | ||
| Descripción Este atributo representa el valor financiero total del asiento contable. Se calcula típicamente sumando los valores absolutos de todas las partidas de débito o crédito asociadas con el documento. Analizar el proceso por valor financiero puede revelar patrones importantes. Por ejemplo, los asientos de alto valor pueden seguir una ruta de aprobación diferente y más estricta. Este atributo puede usarse para filtrar o segmentar el análisis para ver si los tiempos de ciclo, las tasas de rechazo o los retrasos en la aprobación se correlacionan con el importe del asiento. Por qué es importante Permite el análisis de impacto financiero, como correlacionar los tiempos de procesamiento o las tasas de rechazo con el valor monetario de los asientos contables. Dónde obtener Este es un campo calculado, derivado de la agregación del campo de importe (WRBTR o DMBTR) de todas las partidas individuales en la tabla BSEG para un asiento contable dado. Ejemplos 1500.0025000.75125.50 | |||
| Motivo de Reversión ReversalReason | Un código que indica el motivo por el cual un asiento contable fue revertido. | ||
| Descripción Cuando se anula un documento, SAP permite al usuario especificar un código de motivo. Este código proporciona información estructurada sobre por qué fue necesaria la anulación, por ejemplo, fecha de contabilización incorrecta o error de entrada de datos. Este atributo es una entrada clave para el dashboard de 'Análisis de Anulaciones de Asientos Contables'. Al analizar los motivos de anulación más comunes, las organizaciones pueden identificar problemas sistémicos en sus procesos o lagunas de formación, y tomar acciones específicas para prevenir futuros errores y reducir la tasa de anulación. Por qué es importante Proporciona una visión directa de por qué ocurren las reversiones, permitiendo un análisis de causa raíz dirigido para reducir errores futuros. Dónde obtener Ubicado en la tabla de cabecera de documento BKPF, campo STGRD. Ejemplos 010205 | |||
| Tiempo de aprobación ApprovalTime | El tiempo transcurrido desde que un asiento contable se envía para aprobación hasta que es aprobado o rechazado. | ||
| Descripción Esta métrica mide la duración del subproceso de aprobación, que a menudo contribuye significativamente al tiempo de ciclo general. Se calcula como la diferencia de tiempo 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 clave para el dashboard de 'Rendimiento de Aprobación de Asientos Contables' y el KPI de 'Tiempo Promedio 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 los aprobadores y justificar cambios en el proceso, como el ajuste de los umbrales de aprobación. Por qué es importante Cuantifica la duración de la etapa de aprobación, ayudando a identificar y abordar retrasos en el flujo de trabajo de revisión y aprobación. Dónde obtener Calculado restando la marca de tiempo del evento 'Asiento Contable Enviado' de la del evento 'Asiento Contable Aprobado' o 'Asiento Contable Rechazado'. Ejemplos P1DT2HPT4H15MP3D | |||
| Tiempo de Ciclo CycleTime | El tiempo total transcurrido desde la creación de la primera actividad del asiento contable hasta la actividad de contabilización final. | ||
| Descripción El Tiempo de Ciclo es un indicador clave de rendimiento que mide la duración de extremo a extremo del proceso de asientos contables. Se calcula tomando la diferencia entre la marca de tiempo del evento de contabilización final y el evento de creación inicial para un único asiento contable. Esta métrica calculada es la medida principal en el cuadro de mando 'Tiempo de Ciclo de Asientos Contables de Extremo a Extremo' y el KPI 'Tiempo de Ciclo Promedio de Asientos Contables'. Proporciona una visión general de la eficiencia global del proceso y se utiliza para rastrear el impacto de las iniciativas de mejora a lo largo del tiempo. Por qué es importante Mide la eficiencia general de extremo a extremo del proceso, proporcionando una métrica clave para identificar cuellos de botella y seguir las mejoras. Dónde obtener Calculado restando la marca de tiempo del primer evento de la marca de tiempo del último evento para cada caso (JournalEntryId). Ejemplos P2DT3H15MPT8H30MP5D | |||
Registro a Informe - Actividades de Asientos Contables
| Actividad | Descripción | ||
|---|---|---|---|
| Asiento Contable Aparcado | Esta actividad marca la creación inicial de un asiento contable en estado preliminar, antes de que se contabilice oficialmente en el libro mayor. Esto se captura explícitamente en SAP cuando un usuario guarda un documento utilizando una transacción de aparcamiento, estableciendo el estado del documento como 'aparcado'. | ||
| Por qué es importante Este es un evento de inicio crítico para procesos que implican revisión y aprobación. Analizar el tiempo entre el aparcamiento y la contabilización ayuda a identificar retrasos en las fases de pre-contabilización y aprobación. Dónde obtener Este evento se identifica desde la tabla de cabecera de documento BKPF. Un documento se considera aparcado cuando se crea con un estado BKPF-BSTAT = 'V'. La marca de tiempo del evento es la fecha y hora de creación, BKPF-CPUDT y BKPF-CPUTM. Capturar Identificar la creación de documentos en BKPF donde BKPF-BSTAT es 'V'. Tipo de evento explicit | |||
| Asiento Contable Aprobado | Esta actividad marca la aprobación final de un asiento contable dentro de un flujo de trabajo, haciéndolo elegible para su contabilización. Este evento se captura del log del flujo de trabajo cuando se completa el paso final de 'liberación' o 'aprobación'. | ||
| Por qué es importante Este es un hito clave que concluye el proceso de aprobación. La duración hasta esta actividad es un KPI crítico para la eficiencia de la aprobación, y el tiempo desde este evento hasta la contabilización mide el retraso posterior a la aprobación. Dónde obtener Inferido de la marca de tiempo de finalización del paso final de aprobación en el log de SAP Business Workflow. Esta es la última acción de aprobación antes de que el documento se contabilice o se prepare para su contabilización. Capturar Identificar la finalización del paso final de 'liberación' o 'aprobación' en los logs de flujo de trabajo. Tipo de evento inferred | |||
| Asiento Contable Contabilizado | Esta es la actividad central donde el asiento contable se registra oficialmente en el libro mayor, impactando los estados financieros. Este evento se captura explícitamente cuando el estado del documento se establece como 'contabilizado' y se asigna una fecha de contabilización. | ||
| Por qué es importante Este es el hito más importante, que significa el procesamiento exitoso de un asiento contable. El tiempo de ciclo de extremo a extremo a menudo se mide hasta este punto, y es un evento clave para el análisis del cierre financiero. Dónde obtener Se identifica cuando un documento en la tabla BKPF tiene una fecha de contabilización (BKPF-BUDAT). Para los documentos aparcados, esto corresponde al momento en que el estado BKPF-BSTAT cambia de 'V' a vacío. La marca de tiempo de la contabilización es la fecha de entrada BKPF-CPUDT. Capturar Identificar cuándo BKPF-BSTAT cambia de 'V' a vacío, o para contabilizaciones directas, el evento de creación. Tipo de evento explicit | |||
| Asiento Contable Enviado | Esta actividad significa que un asiento contable aparcado ha sido finalizado por su creador y ahora está listo para revisión y aprobación. Se captura típicamente por el inicio de una tarea de SAP Business Workflow asociada con el documento aparcado. | ||
| Por qué es importante Esto marca la transferencia del creador al aprobador, iniciando el conteo para los KPI de tiempo de ciclo de aprobación. Es un hito clave para medir la eficiencia del flujo de trabajo de aprobación. Dónde obtener Inferido de la hora de inicio de la instancia del flujo de trabajo de aprobación vinculada al objeto del documento financiero. Esto requiere analizar las tablas de log del flujo de trabajo como SWW_WI2OBJ para encontrar el flujo de trabajo iniciado para el código de sociedad, número de documento y ejercicio fiscal específicos. Capturar Identificar el evento de inicio de flujo de trabajo para el objeto de documento aparcado. Tipo de evento inferred | |||
| Reversión de Asiento Contable Procesada | Esta actividad marca la reversión de un asiento contable previamente contabilizado. Una reversión es un nuevo documento contable que anula 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 alta tasa de reversiones apunta a problemas sistémicos en las etapas iniciales de entrada de datos o aprobación, y cada reversión representa reprocesamiento. Dónde obtener Este evento se identifica en la cabecera del documento original (tabla BKPF). Cuando un documento se revierte, SAP rellena el número de documento de reversión (BKPF-STBLG) y el motivo de reversión (BKPF-STGRD). La marca de tiempo del evento es la fecha de contabilización del nuevo documento de reversión. Capturar Identificar cuándo BKPF-STBLG se rellena en el documento original; la marca de tiempo es la fecha de contabilización del documento de reversión. Tipo de evento explicit | |||
| Asiento Contable Aparcado Eliminado | Representa la eliminación de un asiento contable aparcado que nunca fue contabilizado. Esto puede ocurrir después de un rechazo o si el asiento fue creado por error. | ||
| Por qué es importante Esta actividad marca un final infructuoso del proceso. Analizar por qué se eliminan los documentos aparcados puede revelar problemas como asientos duplicados o malentendidos del proceso. Dónde obtener Este evento se captura cuando el estado de un documento aparcado en la tabla BKPF se cambia. El campo de estado BKPF-BSTAT se actualiza a 'Z' (documento aparcado eliminado). La marca de tiempo del cambio se puede encontrar en los logs de cambios del documento (CDHDR). Capturar Identificar cuándo BKPF-BSTAT se actualiza a 'Z'. Tipo de evento explicit | |||
| Asiento Contable Corregido | Esta actividad indica que el creador original ha modificado un asiento contable aparcado después de que fue devuelto para cambios. Se infiere al detectar cambios en el documento después de un evento de 'Changes Requested'. | ||
| Por qué es importante El seguimiento de las correcciones ayuda a cuantificar el esfuerzo dedicado a la reelaboración. El tiempo entre una solicitud de cambio y la corrección resalta los retrasos en la resolución de problemas con los asientos enviados. Dónde obtener Inferido mediante el análisis de los logs de documentos de cambio (tablas CDHDR y CDPOS) para el documento aparcado. Un cambio registrado después de un evento de rechazo en el flujo de trabajo significa que se ha realizado una corrección. La marca de tiempo proviene de la tabla CDHDR. Capturar Identificar la entrada del log de cambios en CDHDR/CDPOS después de un evento de rechazo. Tipo de evento inferred | |||
| Asiento Contable Creado | Representa la creación de un asiento contable que se contabiliza directamente, sin un paso previo de aparcamiento. Esto se captura cuando un documento se crea en SAP utilizando una transacción de contabilización directa. | ||
| Por qué es importante Esta actividad sirve como un punto de partida alternativo para procesos de asientos contables más simples que no requieren un flujo de trabajo de aprobación. Ayuda a diferenciar entre contabilizaciones simples y directas, y asientos aparcados más complejos. Dónde obtener Este evento corresponde a la creación del documento en la tabla BKPF donde el estado del documento BKPF-BSTAT está vacío (contabilizado). La marca de tiempo del evento es la fecha de creación, BKPF-CPUDT. Para estos documentos, los eventos 'Created' y 'Posted' ocurren simultáneamente. Capturar Identificar la creación de documentos en BKPF donde BKPF-BSTAT está vacío. Tipo de evento explicit | |||
| Asiento Contable Rechazado | Esta actividad significa el rechazo final de un asiento contable, después del cual no será contabilizado. Esto es típicamente un estado terminal en un flujo de trabajo de aprobación, llevando a la eventual eliminación del documento aparcado. | ||
| Por qué es importante El seguimiento de los rechazos es crucial para la gestión de calidad. Analizar las razones y la frecuencia de los rechazos ayuda a mejorar la tasa de acierto a la primera de los asientos contables. Dónde obtener Este es un resultado capturado del log de SAP Business Workflow, que representa una decisión final de usuario de 'rechazo' que termina el proceso. El documento aparcado puede ser eliminado posteriormente. Capturar Identificar el estado terminal de 'rechazo' en el log de flujo de trabajo para el documento. Tipo de evento inferred | |||
| Cambios Solicitados en Asiento Contable | Representa un punto en el flujo de trabajo donde un aprobador ha revisado el asiento contable y lo ha devuelto al creador para su corrección. Este evento se captura de los logs del flujo de trabajo indicando una decisión de usuario de 'rechazo' o 'devolución'. | ||
| Por qué es importante Esta actividad es esencial para identificar bucles de reprocesamiento, que son una fuente principal de ineficiencia y desviación del proceso. La alta frecuencia de este evento indica problemas con la calidad de los asientos o requisitos poco claros. Dónde obtener Este evento se infiere de la marca de tiempo de un paso específico de decisión de usuario en el log de SAP Business Workflow que corresponde a una acción de 'rechazo' o 'envío para corrección'. Capturar Identificar la marca de tiempo de la decisión de 'rechazo' o 'reprocesamiento' en los logs de flujo de trabajo. Tipo de evento inferred | |||
| Contabilización Intersociedad Identificada | Una actividad calculada que marca un asiento contable que afecta a más de una sociedad. Esto se determina analizando las partidas individuales de un único documento financiero. | ||
| Por qué es importante Las transacciones intersociedad pueden tener requisitos de procesamiento y aprobación más complejos. Identificarlas permite un análisis separado de sus tiempos de ciclo y rutas de proceso para encontrar cuellos de botella únicos. Dónde obtener Calculado examinando la tabla de partidas individuales BSEG para un número de documento (BELNR) dado. Si las partidas individuales contienen más de una sociedad (BSEG-BUKRS) distinta, el asiento es una contabilización intersociedad. Capturar Compruebe si existen múltiples valores únicos de BSEG-BUKRS para un único BKPF-BELNR. Tipo de evento calculated | |||
| Documentación Adjuntada | Esta actividad representa a un usuario adjuntando documentos de soporte, como facturas u hojas de cálculo, al asiento contable. Este evento no se registra explícitamente como un evento contable estándar y típicamente se infiere verificando la creación de adjuntos vinculados al objeto del documento contable. | ||
| Por qué es importante El seguimiento de esta actividad ayuda a verificar el cumplimiento de las políticas que exigen documentación. Los retrasos en la adjunción de documentos pueden ser una causa raíz de ciclos de aprobación prolongados. Dónde obtener Esto es difícil de capturar de forma fiable como un evento con marca de tiempo. Potencialmente puede inferirse analizando las tablas de adjuntos de Generic Object Services (GOS), como SOOD, y vinculando la marca de tiempo de creación del adjunto a la clave del objeto del asiento contable. Capturar Inferir de la marca de tiempo de creación de objetos vinculados en las tablas GOS (por ejemplo, SOOD). Tipo de evento inferred | |||
| Entrada Manual Identificada | Esta actividad identifica si un asiento contable fue creado a través de una transacción manual en línea o mediante una interfaz automatizada o un proceso por lotes. Esto no es una acción de usuario, sino un atributo calculado del asiento, derivado de los datos del sistema. | ||
| Por qué es importante Distinguir entre asientos manuales y automatizados es clave para la mejora del proceso dirigida. Los procesos manuales suelen ser el foco de las iniciativas de estandarización y automatización. Dónde obtener Esto se calcula analizando campos en la tabla de cabecera de documento BKPF. Los códigos de transacción (BKPF-TCODE) como 'FB01', 'FB50' o 'FV50' indican entrada manual, mientras que otros T-codes o nombres específicos de entrada por lotes (BKPF-AWKEY) sugieren automatización. Capturar Derivar de BKPF-TCODE u otros indicadores del sistema de origen en la cabecera del documento. Tipo de evento calculated | |||
| Partida de Asiento Contable Compensada | Esta actividad representa la conciliación de una partida individual de cuenta de mayor gestionada por partidas abiertas, como una cuenta de compensación bancaria. Ocurre cuando una partida individual se compara con otra, cerrándola. | ||
| Por qué es importante Para procesos como la conciliación bancaria, el tiempo de compensación de partidas es un KPI clave. Esta actividad ayuda a analizar la eficiencia de la conciliación y los procedimientos de cierre de mes. Dónde obtener Este evento se captura de la tabla de partidas individuales BSEG. Cuando una partida individual se compensa, los campos de fecha de compensación (BSEG-AUGDT) y documento de compensación (BSEG-AUGBL) se rellenan. La marca de tiempo del evento es la fecha de compensación. Capturar Identificar cuándo la fecha de compensación (BSEG-AUGDT) se rellena para una partida individual. Tipo de evento explicit | |||
Guías de Extracción
Pasos
- Crear el Programa ABAP: En el sistema SAP, vaya a la transacción SE38 (Editor ABAP). Introduzca un nombre para el nuevo programa, por ejemplo, Z_PM_JE_EXTRACTION, y haga clic en Crear. Proporcione un título adecuado y establezca el tipo de programa en 'Programa Ejecutable'.
- Definir Pantalla de Selección: En el código fuente del programa, defina la pantalla de selección. Esto permite a los usuarios especificar parámetros como un rango de fechas para la creación de documentos, sociedades y tipos de documento para limitar el volumen de datos para la extracción.
- Declarar Estructuras de Datos: Defina una estructura de tabla interna que contendrá los datos finales del registro de eventos. Esta estructura debe incluir todos los campos requeridos: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate, y cualquier atributo recomendado como User, CompanyCode y PostingDate.
- Implementar Lógica de Selección de Datos: Escriba las consultas ABAP SQL principales para extraer datos para cada una de las 14 actividades requeridas. Esto implica seleccionar datos de tablas primarias como BKPF (Cabecera) y BSEG (Posición), tablas de registro de modificaciones CDHDR y CDPOS, tablas de workflow como SWWLOGHIST, y tablas de compensación como BSAS y BSAK.
- Extraer Documentos Preliminares y Contabilizados: Para los eventos de 'Asiento Contable Preliminar', seleccione de BKPF donde el estado del documento (BSTAT) es 'V'. Para los eventos de 'Asiento Contable Creado' y 'Asiento Contable Contabilizado', seleccione de BKPF donde el estado está en blanco, indicando un documento normal y contabilizado.
- Extraer 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 modificaciones que correspondan a actividades de 'Asiento Contable Corregido' o 'Asiento Preliminar Eliminado'.
- Extraer Eventos de Workflow: Para capturar actividades como 'Asiento Contable Enviado', 'Aprobado', 'Rechazado' y 'Cambios Solicitados', consulte las tablas de workflow. Utilice la tabla SWW_WI2OBJ para vincular el documento contable a una instancia de workflow, luego lea SWWLOGHIST para decisiones de usuario o cambios de estado específicos.
- Identificar Eventos Calculados: Para 'Entrada Manual Identificada', compruebe el código de transacción (BKPF-TCODE) con una lista de códigos de transacción de entrada manual conocidos. Para 'Contabilización Intersociedad Identificada', analice las partidas individuales de BSEG para un documento dado para ver si hay múltiples sociedades involucradas.
- Consolidar y Transformar Datos: A medida que se seleccionan los datos de cada actividad, transfórmelos en la estructura final del registro de eventos. Concatene Sociedad, Número de Documento y Ejercicio Fiscal para crear el JournalEntryId. Convierta las fechas y horas de SAP en una única marca de tiempo EventTime. Agregue los resultados de cada consulta a la tabla interna final.
- Implementar Exportación de Archivos: Utilice sentencias de manejo de archivos ABAP, como OPEN DATASET, LOOP AT, TRANSFER y CLOSE DATASET, para escribir la tabla interna consolidada en un archivo CSV o plano en el directorio del servidor de aplicaciones SAP (visible a través de la transacción AL11).
- Programar como Job en Segundo Plano: Vaya a la transacción SM36 (Definir Job en Segundo Plano). Cree un nuevo job, defina un paso que ejecute su programa ABAP y establezca un horario, por ejemplo, cada noche o semanalmente durante las horas de menor actividad, para automatizar el proceso de extracción.
- Recuperar y Formatear Archivo: Utilice la transacción CG3Y o trabaje con su administrador de sistema para descargar el archivo generado desde el servidor de aplicaciones a su máquina local. Asegúrese de que la codificación y el formato del archivo sean adecuados para la carga en su herramienta de process mining.
Configuración
- Rango de Fechas: Es fundamental definir un rango 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 pruebas, utilice un rango de unos pocos días que se sepa que contiene datos.
- Filtro por Sociedad: Filtre siempre por sociedad (BKPF-BUKRS). Extraer datos de todas las sociedades a la vez puede consumir una cantidad extrema de recursos. Empiece con una o un grupo pequeño de sociedades relevantes.
- Filtro por Tipo de Documento: Utilice el filtro por tipo de documento (BKPF-BLART) para limitar el alcance a tipos específicos de asientos contables, como 'SA' para documentos de contabilidad general, si no necesita analizar todos los tipos de documentos.
- IDs de Tarea de Workflow: La lógica para extraer eventos de workflow depende de los IDs de tarea específicos utilizados en su sistema para la aprobación, el rechazo y el envío. Estos IDs deben configurarse en el código fuente del programa basándose en las definiciones de workflow de su empresa.
- Consideraciones de Rendimiento: El programa une varias tablas grandes, especialmente CDPOS y las tablas de historial de workflow. Ejecutarlo durante las horas pico de negocio puede afectar el rendimiento del sistema. Siempre prográmelo como un job en segundo plano para que se ejecute durante las horas de menor actividad. Considere crear índices secundarios de base de datos si el rendimiento es un problema recurrente.
- Requisitos Previos: Este método requiere un usuario con autorizaciones de desarrollo ABAP (para SE38) y permisos para crear y gestionar jobs en segundo plano (para SM36). El usuario o el job también necesita acceso de lectura a todas las tablas financieras, de workflow y del sistema relevantes (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST, etc.).
a 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
- Establecer Conexión a la Base de Datos: Obtenga credenciales de solo lectura para la base de datos 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.
- Preparar la Consulta SQL: Copie la consulta SQL completa proporcionada en la sección 'query' de este documento en su cliente SQL.
- Configurar Parámetros de Extracción: Antes de ejecutar, debe configurar los marcadores de posición dentro de la consulta. Reemplace
'[START_DATE]'y'[END_DATE]'con el rango de fechas deseado en formato 'YYYYMMDD'. Reemplace'[COMPANY_CODE_1]', '[COMPANY_CODE_2]'con las sociedades SAP específicas que desea analizar. - Definir Sistema de Origen: En la sentencia
SELECTprincipal, reemplace el marcador de posición'[Your SAP System ID]'con el ID de sistema SAP (SID) real para identificar correctamente la fuente de datos. - Ejecutar la Consulta: Ejecute la consulta SQL configurada contra la base de datos SAP. El tiempo de ejecución variará dependiendo del rango de fechas y del tamaño de sus tablas de base de datos.
- Revisar Resultados Iniciales: Una vez que la consulta se complete, revise brevemente las filas devueltas para asegurarse de que los datos se están poblando como se espera. Verifique que haya una variedad de actividades y que los campos clave como
JournalEntryIdyEventTimeno estén vacíos. - Manejar Marcas de Tiempo: La consulta concatena los campos de fecha y hora en una cadena
YYYYMMDDHHMMSS. Asegúrese de que su posprocesamiento o sistema de destino pueda analizar este formato, o ajuste la función SQLCONCATa un formato ISO 8601 comoYYYY-MM-DDTHH:MI:SSsi su base de datos lo soporta. - Exportar los Datos: Exporte el conjunto completo de resultados desde su cliente SQL a un archivo CSV. Asegúrese de usar codificación UTF-8 para evitar problemas con caracteres especiales.
- Preparar para Carga: Antes de cargar a una herramienta de process mining, confirme que los encabezados de las columnas coinciden con el esquema de datos requerido.
JournalEntryId,ActivityNameyEventTimeson críticos. Agregue la columnaLastDataUpdate, rellenándola con la marca de tiempo de cuándo se realizó la extracción. - Validación Final: Realice los pasos descritos en la sección 'validationSteps' para asegurarse de que los datos extraídos son completos y precisos antes de comenzar su análisis.
Configuración
- Autorizaciones de la Base de Datos: El usuario de la base de datos requiere acceso de lectura a las siguientes tablas de SAP: BKPF, BSEG, CDHDR, CDPOS, T001 y V_USERNAME. Para actividades relacionadas con el workflow, también es necesario el acceso a SWW_WI2OBJ y SWWLOGHIST. Este nivel de acceso se suele conceder únicamente a equipos técnicos especializados.
- Filtro por Rango de Fechas: Es fundamental filtrar los datos por un rango de fechas específico para asegurar el rendimiento de la consulta. La consulta proporcionada utiliza marcadores de posición para una fecha de inicio y una fecha de fin, que se aplican a la fecha de creación del documento (
BKPF.CPUDT). Se recomienda un rango de 3 a 6 meses para un análisis inicial. - Filtro por Entidad: Para gestionar el volumen de datos y enfocar el análisis, filtre siempre por Sociedad (
BKPF.BUKRS). También puede considerar filtrar por Tipo de Documento (BKPF.BLART) para incluir solo los tipos de asientos contables relevantes, por ejemplo, 'SA' para documentos de contabilidad general, y excluir documentos operativos como facturas o pagos si no están dentro del alcance. - Consideraciones de Rendimiento: Las consultas directas a tablas principales como BSEG y CDPOS pueden consumir muchos recursos. Se recomienda encarecidamente ejecutar esta extracción durante las horas de menor actividad empresarial para evitar afectar el rendimiento del sistema para los usuarios finales. Evite extraer datos de más de un año en una sola ejecución.
- IDs de Tarea de Workflow: La consulta contiene marcadores de posición como
'[WF_TASK_ID_SUBMIT]'y'[WF_TASK_ID_APPROVE]'. Estos deben reemplazarse con los IDs de tarea reales de la configuración de workflow de asientos contables específica de su sistema. Estos se pueden identificar trabajando con un especialista en SAP Workflow o analizando la definición técnica del workflow en la transacción PFTC.
a 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 Conexión SAP: En su herramienta ETL de terceros, configure una nueva conexión de origen a su sistema SAP ECC. Esto generalmente requiere los detalles del servidor de aplicaciones, el cliente, el número de sistema y un usuario SAP dedicado con las autorizaciones RFC necesarias.
- Definir Fuentes de Datos: Dentro de su proyecto de extracción, añada las tablas SAP requeridas como fuentes de datos. Las tablas principales incluyen BKPF (Cabecera de Documento Contable), BSEG (Segmento de Documento Contable), VBSEGK (Cabecera de Documento Preliminar), CDHDR (Cabecera de Documento de Modificación), CDPOS (Posiciones de Documento de Modificación), SWW_WI2OBJ (Enlaces de Workflow a Objeto), SWWLOGHIST (Log de Workflow) y SRGBTBREL (Relaciones para Anexos GOS).
- Extraer Eventos Base (Creado y Preliminar): Cree el primer flujo de datos para extraer los eventos iniciales. Para 'Asiento Contable Preliminar', use VBSEGK como fuente. Para 'Asiento Contable Creado', use BKPF, asegurándose de filtrar los documentos que no son reversiones y que no fueron preliminares inicialmente. Esto se puede hacer mediante un anti-join con VBSEGK.
- Extraer Eventos de Workflow: Cree un flujo de datos uniendo BKPF a SWW_WI2OBJ usando la clave de objeto (sociedad + número de documento + ejercicio fiscal) para encontrar el ID de instancia de workflow. Una este resultado con SWWLOGHIST para extraer eventos como 'Enviado', 'Aprobado', 'Rechazado' y 'Cambios Solicitados' basándose en los resultados de las tareas de workflow y las decisiones de usuario registradas en el log.
- Extraer Eventos de Modificación y Eliminación: Use las tablas CDHDR y CDPOS para identificar modificaciones. Para 'Asiento Contable Corregido', filtre las modificaciones realizadas a documentos preliminares (Clase de Objeto 'FIPP'). Para 'Asiento Preliminar Eliminado', busque marcadores de eliminación en los logs de modificaciones para documentos preliminares.
- Extraer Eventos de Anexos: Para capturar 'Documentación Adjuntada', una BKPF a SRGBTBREL donde el tipo de objeto sea 'BKPF' y la relación sea '[Su tipo de relación de anexo]'. La fecha de creación del enlace sirve como hora del evento.
- Extraer Eventos de Compensación y Reversión: Para 'Posición de Asiento Contable Compensada', consulte la tabla BSEG donde el campo de documento de compensación (AUGBL) esté rellenado. La hora del evento es la fecha de contabilización del documento de compensación (AUGDT). Para 'Reversión de Asiento Contable Procesada', consulte BKPF para los documentos que son reversiones, identificados por tener un valor en el campo de documento revertido (STBLG).
- Derivar Eventos Calculados: Cree bloques de lógica separados para eventos calculados. Para 'Entrada Manual Identificada', filtre BKPF basándose en una lista de códigos de transacción manuales (p. ej., FB01, FB50, F-02). Para 'Contabilización Intersociedad Identificada', agrupe la tabla BSEG por ID de documento e identifique documentos con más de una sociedad distinta.
- Combinar Todos los Flujos de Eventos: Utilice una transformación UNION en su herramienta ETL para fusionar las salidas de todos los flujos de eventos individuales (Creado, Preliminar, Aprobado, etc.) en una única tabla de registro de eventos. Asegúrese de que los nombres de las columnas y los tipos de datos sean consistentes en todos los flujos.
- Mapear al Esquema Final: Mapee los datos combinados a la estructura de registro de eventos requerida, creando el
JournalEntryId,ActivityName,EventTime,Usery otros atributos requeridos y recomendados. Añada columnas estáticas comoSourceSystemy utilice la hora de ejecución del job ETL paraLastDataUpdate. - Configurar Carga Incremental: Para extracciones continuas, configure una estrategia de carga incremental. Utilice la última fecha de creación o modificación (p. ej., BKPF.CPUDT, CDHDR.UDATE) como marca de agua para extraer solo registros nuevos o actualizados desde la última ejecución.
- Exportar para ProcessMind: Programe el job de extracción y configure el paso de salida final para guardar el registro de eventos como un archivo CSV o Parquet en una ubicación accesible por ProcessMind para su carga.
Configuración
- Requisitos Previos: Una herramienta ETL de terceros con licencia (p. ej., Theobald Xtract Universal, Informatica, Talend) con un conector SAP dedicado. Una cuenta de usuario SAP con acceso RFC y autorizaciones para leer tablas financieras (p. ej., S_TABU_DIS para grupos de tablas F_00, F_WF), datos de workflow y logs de modificaciones.
- Parámetros de Conexión: Necesitará la IP o el hostname del Servidor de Aplicaciones SAP, el Número de Sistema y el ID de Cliente. Se debe utilizar una gestión segura de credenciales para el usuario y la contraseña de SAP.
- Filtros Clave: Aplique siempre filtros por Sociedad (BKPF.BUKRS) y Ejercicio Fiscal (BKPF.GJAHR) en la fuente 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 específico, por ejemplo, los últimos 6 meses.
- Selección de Rango de Fechas: Para la carga inicial, seleccione un período representativo como 3 a 6 meses. Para cargas delta posteriores, utilice una marca de agua en un campo de fecha y hora como
CPUDTpara obtener solo nuevos registros. - Consideraciones de Rendimiento: Las uniones en BSEG, CDPOS y las tablas de workflow pueden ser muy lentas. Asegúrese de que su herramienta ETL traspase los filtros a la fuente SAP siempre que sea posible. Extraiga los datos en fragmentos o paquetes más pequeños si la herramienta lo permite, especialmente para grandes cargas históricas.
- Personalización del Workflow: La lógica para identificar actividades de workflow como 'Aprobado' o 'Rechazado' depende en gran medida de sus plantillas de workflow específicas. Necesitará identificar los IDs de tarea de workflow y las claves de decisión de usuario correctas de su sistema para utilizarlas en los filtros.
a Consulta de ejemplo config
/*
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