Ihre Record to Report - Buchungseintrag-Datentemplate
Ihre Record to Report - Buchungseintrag-Datentemplate
- Empfohlene Attribute für eine umfassende Analyse
- Wichtige Buchungssatz-Aktivitäten zur Nachverfolgung
- Praktische Anleitung zur Datenextraktion für SAP ECC
Record to Report – Buchungssatz-Attribute
| Name | Beschreibung | ||
|---|---|---|---|
| Aktivitätsname ActivityName | Der Name der Geschäftsaktivität oder des Events, das zu einem bestimmten Zeitpunkt im Buchungssatz-Prozess stattfand. | ||
| Beschreibung Der Aktivitätsname beschreibt einen spezifischen Schritt im Lebenszyklus des Buchungssatzes, wie 'Buchungssatz erstellt', 'Buchungssatz genehmigt' oder 'Buchungssatz gebucht'. Dieses Attribut wird typischerweise aus mehreren Quellen in SAP abgeleitet, einschließlich Transaktionscodes (TCODE), Änderungsdokument-Logs (Tabellen CDHDR und CDPOS) und Belegstatusfeldern.\n\nDie Analyse von Aktivitäten ist der Kern des Process Mining. Sie ermöglicht die Visualisierung von Prozesslandkarten, die Berechnung von Übergangszeiten zwischen Schritten und die Identifizierung von Nacharbeits-Loops (z. B. 'Buchungssatz abgelehnt' gefolgt von 'Buchungssatz korrigiert'). Diese Daten sind grundlegend für Dashboards in Bezug auf Zykluszeiten, Nacharbeitsraten und Prozessvarianten. Bedeutung Es definiert die Schritte in der Prozesslandkarte und ermöglicht so die Visualisierung, Analyse und Optimierung des Buchungssatz-Workflows. Datenquelle Abgeleitet aus verschiedenen Quellen, einschließlich Transaktionscodes in BKPF (TCODE), Belegstatus und Workflow-Protokollen in Tabellen wie SWW_WI2OBJ oder Änderungsbelegen in CDHDR und CDPOS. Beispiele Buchungsjournaleintrag erstelltBuchungssatz genehmigtBuchungssatz abgelehntBuchungssatz gebucht | |||
| Buchungssatz-ID JournalEntryId | Der eindeutige Identifikator für ein Finanzbuchhaltungsdokument, der Buchungskreis, Belegnummer und Geschäftsjahr kombiniert. | ||
| Beschreibung Die Buchungssatz-ID ist der primäre Case Identifier zur Verfolgung des Lebenszyklus eines Buchungssatzes. Es handelt sich um einen zusammengesetzten Schlüssel, der typischerweise durch die Verkettung von Buchungskreis (BUKRS), Belegnummer (BELNR) und Geschäftsjahr (GJAHR) gebildet wird, um die Einzigartigkeit im gesamten SAP-System zu gewährleisten.\n\nIn der Prozessanalyse verknüpft diese ID alle zugehörigen Aktivitäten wie Erstellung, Parken, Einreichung, Genehmigung, Ablehnung und Buchung. Durch die Verfolgung dieses Identifikators können wir den End-to-End-Verlauf jedes Buchungssatzes rekonstruieren, Zykluszeiten messen und Prozessabweichungen oder Engpässe für spezifische Buchungen identifizieren. Bedeutung Dies ist der essenzielle Schlüssel zur Verfolgung eines Buchungssatzes von seiner Erstellung bis zu seiner finalen Buchung, was eine End-to-End-Prozessanalyse und Variantenvergleich ermöglicht. Datenquelle Dies ist ein abgeleitetes Attribut, typischerweise eine Verkettung von Feldern aus der BKPF-Tabelle: Buchungskreis (BUKRS), Belegnummer (BELNR) und Geschäftsjahr (GJAHR). Beispiele 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Ereigniszeit EventTime | Der Timestamp, der anzeigt, wann eine spezifische Aktivität oder ein Event für den Buchungssatz stattfand. | ||
| Beschreibung Die Event Time liefert das genaue Datum und die Uhrzeit für jede Aktivität im Buchungssatz-Prozess. Diese Daten sind entscheidend für die Berechnung aller zeitbasierten Metriken, wie Zykluszeiten, Bearbeitungsdauern und Verzögerungen zwischen den Schritten. Die Quelle dieses Timestamps variiert je nach Aktivität; es kann das Belegdatum/-zeit (CPUDT/CPUTM) oder Änderungszeitstempel aus Protokollen (CDHDR-UDATE/UTIME) sein. In der Analyse wird die Event Time verwendet, um Ereignisse chronologisch zu ordnen und die Grundlage der Prozesskarte zu bilden. Sie ist unerlässlich für die Berechnung aller zeitbezogenen KPIs, wie der durchschnittlichen Buchungssatz-Zykluszeit, der durchschnittlichen Genehmigungszeit und der Zeit von Genehmigung bis Buchung. Bedeutung Dieser Timestamp ist die Grundlage für alle zeitbezogenen Analysen und ermöglicht die Berechnung von Durchlaufzeiten, Dauern und Engpässen. Datenquelle Stammt aus verschiedenen Feldern, abhängig von der Aktivität, hauptsächlich dem Erstellungs-Timestamp (CPUDT, CPUTM) aus BKPF oder Änderungsdokument-Timestamps (UDATE, UTIME) aus CDHDR. Beispiele 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Letzte Datenaktualisierung LastDataUpdate | Der Zeitstempel, der angibt, wann die Daten zuletzt aus dem Quellsystem extrahiert oder aktualisiert wurden. | ||
| Beschreibung Dieses Attribut zeichnet Datum und Uhrzeit des letzten Datenabzugs aus SAP ECC auf. Es ist ein Metadatenfeld, das entscheidend ist, um die Aktualität und Währung der analysierten Daten zu verstehen.\n\nIn jedem Process Mining Dashboard oder jeder Analyse ist die Kenntnis der letzten Aktualisierungszeit entscheidend, damit Benutzer den Daten vertrauen und fundierte Entscheidungen treffen können. Es hilft, die Frage zu beantworten: 'Wie aktuell sind diese Informationen?'. Bedeutung Informiert Benutzer über die Aktualität der Daten und stellt sicher, dass sie den Zeitrahmen der Analyse verstehen und den Ergebnissen vertrauen können. Datenquelle Dies ist ein Metadatenfeld, das vom Datenextraktionstool oder ETL-Prozess zum Zeitpunkt der Datenaktualisierung generiert und gespeichert wird. Beispiele 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Quellsystem SourceSystem | Das `System`, aus dem die Prozessdaten extrahiert wurden. | ||
| Beschreibung Dieses Attribut identifiziert den Ursprung der Daten, der in diesem Fall die spezifische SAP ECC-Instanz ist. Es ist typischerweise ein statischer Wert, der während des Datenextraktionsprozesses hinzugefügt wird.\n\nObwohl einfach, ist dieses Attribut in Umgebungen mit mehreren ERPs oder Datenquellen wichtig. Es stellt sicher, dass die Datenherkunft klar ist und ermöglicht das Filtern oder Segmentieren der Analyse nach dem Herkunftssystem. Bedeutung Bietet eine klare Datenherkunft und ist essenziell für die Nachverfolgung der Datenqualität, insbesondere in Umgebungen mit mehreren Quellsystemen. Datenquelle Dies ist typischerweise ein statischer Wert, der während des Datentransformationsprozesses hinzugefügt wird und die spezifische SAP ECC-Instanz (z. B. 'ECC_PROD_100') identifiziert. Beispiele SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Benutzer User | Die SAP-Benutzer-ID der Person, die den Buchungssatz erstellt oder geändert hat. | ||
| Beschreibung Dieses Attribut erfasst den SAP-Benutzernamen, der für eine bestimmte Aktivität verantwortlich ist, wie das Erstellen, Parken oder Buchen eines Dokuments. Es wird direkt aus den Belegkopf- oder Änderungslog-Tabellen bezogen.\n\nDie Analyse des Benutzerattributs ist entscheidend für das Verständnis der Team- und Einzelleistung. Es unterstützt das Dashboard 'Benutzerproduktivität' durch die Verfolgung von Aktivitätsvolumen und Bearbeitungszeiten pro Benutzer. Es hilft auch zu identifizieren, wer an Nacharbeits-Loops, Stornierungen oder Compliance-Abweichungen beteiligt ist, was gezielte Schulungen oder Prozessverbesserungen ermöglicht. Bedeutung Identifiziert den für jede Aktivität verantwortlichen Benutzer, was die Analyse der Benutzerleistung, Arbeitslastverteilung und Nacharbeitsmuster ermöglicht. Datenquelle Typischerweise aus der Tabelle BKPF (Feld USNAM für den Ersteller) oder der Tabelle CDHDR (Feld USERNAME für den Ändern). Beispiele ABROWNCJONESDSMITH | |||
| Buchungsdatum PostingDate | Das Datum, an dem die Transaktion im Hauptbuch erfasst wird und die Finanzperiode beeinflusst. | ||
| Beschreibung Das Buchungsdatum bestimmt die Geschäftsperiode, in der der Buchungssatz verbucht wird. Es ist ein kritisches Datumsfeld aus Finanz- und Compliance-Sicht, da es mit den Abschlusszeitplänen und Vorschriften der Rechnungslegung übereinstimmen muss.\n\nIm Process Mining wird dieses Datum zur Überwachung der Compliance verwendet. Das Dashboard 'Compliance-Überwachung' und der KPI 'Compliance-Konformitätsrate' verwenden dieses Attribut, um zu überprüfen, ob Buchungen innerhalb der korrekten Periode gebucht werden. Es kann auch verwendet werden, um Trends im Buchungssatzvolumen über die Zeit zu analysieren. Bedeutung Entscheidend für die Finanzberichterstattung und Compliance-Analyse, um sicherzustellen, dass Buchungen in der korrekten Rechnungsperiode verbucht werden. Datenquelle Befindet sich in der Belegkopf-Tabelle BKPF, Feld BUDAT. Beispiele 2023-10-312023-11-302024-01-15 | |||
| Buchungskreis CompanyCode | Die Organisationseinheit, die eine unabhängige juristische Einheit repräsentiert, für die Finanzberichte erstellt werden. | ||
| Beschreibung Der Buchungskreis ist eine grundlegende Organisationseinheit in SAP Financials. Er repräsentiert ein rechtlich unabhängiges Unternehmen und ist ein Schlüsselfeld im Buchungssatz-Belegkopf.\n\nDieses Attribut ist essenziell für die Segmentierung der Prozessanalyse nach juristischer Entität. Es ermöglicht den Vergleich der Prozessleistung, Compliance-Raten und KPI-Ergebnisse über verschiedene Geschäftsbereiche hinweg. Zum Beispiel kann es helfen zu identifizieren, ob Genehmigungsverzögerungen oder hohe Stornierungsraten spezifisch für bestimmte Buchungskreise sind. Bedeutung Ermöglicht das Filtern und Vergleichen der Prozessleistung über verschiedene juristische Einheiten oder Geschäftsbereiche innerhalb der Organisation hinweg. Datenquelle Befindet sich in der Belegkopf-Tabelle BKPF, Feld BUKRS. Beispiele 10002000US01DE01 | |||
| Dokumententyp DocumentType | Eine Klassifizierung für Buchhaltungsbelege, die deren Verarbeitung und Speicherung steuert. | ||
| Beschreibung Der Belegtyp unterscheidet verschiedene Arten von Geschäftsvorfällen, wie einen Hauptbucheintrag (SA), eine Lieferantenrechnung (KR) oder eine Anlagenbuchung (AA). Er wird während der Systemkonfiguration definiert und jedem Buchungssatz zugewiesen.\n\nDies ist ein kritisches Attribut für die Analyse, da es die Segmentierung des Prozesses nach Art der Transaktion ermöglicht. Das Dashboard 'Buchungssatz-Durchsatz nach Typ' und der KPI 'Durchschnittliche Zykluszeit nach Buchungssatztyp' hängen direkt von diesem Feld ab. Es hilft aufzudecken, ob bestimmte Arten von Buchungen anfälliger für Verzögerungen, Nacharbeit oder Stornierungen sind. Bedeutung Ermöglicht die Segmentierung der Analyse nach Transaktionstyp und hilft zu identifizieren, ob Prozessprobleme spezifisch für bestimmte Arten von Buchungssätzen sind. Datenquelle Befindet sich in der Belegkopf-Tabelle BKPF, Feld BLART. Beispiele SAKRREAA | |||
| Ist storniert IsReversed | Ein boolesches Flag, das anzeigt, ob der Buchungssatz storniert wurde. | ||
| Beschreibung Dieses Flag identifiziert Buchungssätze, die nachträglich durch ein anderes Buchungsdokument storniert wurden. In SAP ist ein stornierter Beleg mit dem Stornobeleg verknüpft, was eine klare Audit-Trail bietet.\n\nDieses Attribut ist grundlegend für das Dashboard 'Buchungssatz-Stornierungsanalyse' und den KPI 'Buchungssatz-Stornierungsrate'. Es ermöglicht die Isolierung stornierter Buchungen, um die Ursachen, wie Dateneingabefehler oder inkorrekte Buchungsbehandlungen, zu untersuchen, mit dem Ziel, die Häufigkeit von Stornierungen zu reduzieren. Bedeutung Unterstützt direkt die Stornierungsanalyse, indem Buchungen markiert werden, die später rückgängig gemacht wurden, was hilft, Fehlerursachen zu identifizieren und die Datenintegrität zu verbessern. Datenquelle Abgeleitet aus dem Feld Stornobelegnummer (STBLG) in der Tabelle BKPF. Wenn STBLG nicht leer ist, ist das Flag wahr. Beispiele truefalsch | |||
| Transaktionscode TransactionCode | Der SAP-Transaktionscode, der zur Erstellung oder Verarbeitung des Buchungssatzes verwendet wird. | ||
| Beschreibung Der Transaktionscode (T-Code) ist ein eindeutiger Identifikator für eine spezifische Funktion oder ein Programm in SAP. Bei Buchungssätzen gibt er an, wie die Buchung erstellt wurde, zum Beispiel manuell (FB01, F-02), über Parken (FV50) oder über eine automatisierte Schnittstelle.\n\nDieses Attribut ist von unschätzbarem Wert für das Dashboard 'Optimierung manueller Aktivitäten'. Durch die Analyse des T-Codes können wir zwischen manuellen und automatisierten Aktivitäten unterscheiden, identifizieren, welche manuellen Prozesse am zeitaufwendigsten sind, und Möglichkeiten für die Automatisierung aufzeigen, um den manuellen Aufwand zu reduzieren und die Effizienz zu verbessern. Bedeutung Hilft, zwischen manuellen und automatisierten Prozessen zu unterscheiden und Möglichkeiten für Automatisierung und Prozessstandardisierung zu identifizieren. Datenquelle Befindet sich in der Belegkopf-Tabelle BKPF, Feld TCODE. Beispiele FB01F-02FV50FBD1 | |||
| `Genehmigungszeit` ApprovalTime | Die verstrichene Zeit von der Einreichung eines Buchungssatzes zur Genehmigung bis zu dessen Genehmigung oder Ablehnung. | ||
| Beschreibung Diese Kennzahl misst die Dauer des Genehmigungsprozesses, der oft maßgeblich zur gesamten Durchlaufzeit beiträgt. Sie berechnet sich aus der Zeitdifferenz zwischen der Aktivität 'Buchungseintrag eingereicht' und der entsprechenden Aktivität 'Buchungseintrag genehmigt' oder 'Buchungseintrag abgelehnt'. Die Genehmigungszeit ist die zentrale Kennzahl für das Dashboard 'Leistung der Buchungseintrag-Genehmigung' und den KPI 'Durchschnittliche Genehmigungszeit für Buchungseinträge'. Die Analyse dieser Dauer hilft dabei, Engpässe im Genehmigungs-Workflow zu identifizieren, die Leistung der Genehmiger zu messen und Prozessänderungen, wie die Anpassung von Genehmigungsschwellenwerten, zu begründen. Bedeutung Quantifiziert die Dauer der Genehmigungsphase und hilft, Verzögerungen im Überprüfungs- und Genehmigungs-Workflow genau zu identifizieren und zu beheben. Datenquelle Berechnet durch Subtraktion des Zeitstempels des Ereignisses 'Buchungssatz eingereicht' vom Ereignis 'Buchungssatz genehmigt' oder 'Buchungssatz abgelehnt'. Beispiele P1DT2HPT4H15MP3D | |||
| Durchlaufzeit CycleTime | Die gesamte verstrichene Zeit von der Erstellung der ersten Buchungssatz-Aktivität bis zur finalen Buchungsaktivität. | ||
| Beschreibung Die Zykluszeit ist ein Schlüsselindikator, der die End-to-End-Dauer des Buchungssatz-Prozesses misst. Sie wird berechnet, indem die Differenz zwischen dem Zeitstempel des letzten Buchungsereignisses und dem initialen Erstellungsereignis für einen einzelnen Buchungssatz ermittelt wird. Diese berechnete Metrik ist die primäre Messgröße auf dem Dashboard 'Buchungssatz End-to-End-Zykluszeit' und dem KPI 'Durchschnittliche Buchungssatz-Zykluszeit'. Sie bietet einen Überblick über die gesamte Prozesseffizienz und wird verwendet, um die Auswirkungen von Verbesserungsinitiativen über die Zeit zu verfolgen. Bedeutung Misst die gesamte End-to-End-Effizienz des Prozesses und liefert eine Schlüsselmetrik zur Identifizierung von Engpässen und zur Nachverfolgung von Verbesserungen. Datenquelle Berechnet durch Subtraktion des Zeitstempels des ersten Ereignisses vom Zeitstempel des letzten Ereignisses für jeden Case (JournalEntryId). Beispiele P2DT3H15MPT8H30MP5D | |||
| Gesamtbelegbetrag TotalDocumentAmount | Der Gesamtwert des Buchungssatzes in der Belegwährung. | ||
| Beschreibung Dieses Attribut repräsentiert den gesamten Finanzwert des Buchungssatzes. Es wird typischerweise durch die Summation der absoluten Werte aller Soll- oder Haben-Positionen, die mit dem Dokument verbunden sind, berechnet.\n\nDie Analyse des Prozesses nach Finanzwert kann wichtige Muster aufzeigen. Zum Beispiel können hochvolumige Buchungen einem anderen, strengeren Genehmigungspfad folgen. Dieses Attribut kann verwendet werden, um die Analyse zu filtern oder zu segmentieren, um zu sehen, ob Zykluszeiten, Ablehnungsraten oder Genehmigungsverzögerungen mit dem Betrag der Buchung korrelieren. Bedeutung Ermöglicht eine Analyse der finanziellen Auswirkungen, wie die Korrelation von Bearbeitungszeiten oder Ablehnungsraten mit dem monetären Wert von Buchungssätzen. Datenquelle Dies ist ein berechnetes Feld, das durch Aggregation des Betragsfeldes (WRBTR oder DMBTR) aus allen Positionen in der BSEG-Tabelle für einen gegebenen Buchungssatz abgeleitet wird. Beispiele 1500.0025000.75125.50 | |||
| Ist geparkt IsParked | Ein boolesches Flag, das anzeigt, ob der Buchungssatz als geparkter Beleg gespeichert wurde, bevor er gebucht wurde. | ||
| Beschreibung Das Parken eines Dokuments ermöglicht es einem Benutzer, einen unvollständigen Buchungssatz zu speichern, ohne dass dieser die Finanzsalden beeinflusst. Er kann dann von einem anderen Benutzer vervollständigt oder überprüft werden, bevor er gebucht wird. Dieses Flag identifiziert Buchungen, die einen Parkschritt durchlaufen haben.\n\nDie Analyse dieses Attributs hilft, die Nutzung der Parkfunktion zu verstehen. Sie kann aufzeigen, ob das Parken als informeller Überprüfungsschritt verwendet wird, was möglicherweise zu Verzögerungen führt. Sie unterstützt die Analyse der End-to-End-Zykluszeit, indem sie zwischen direkt gebuchten Buchungen und solchen, die zuerst geparkt werden, unterscheidet. Bedeutung Identifiziert Buchungen, die die Parkfunktion nutzen, was eine Verzögerungsquelle oder ein Indikator für einen informellen Prüfprozess sein kann. Datenquelle Abgeleitet aus dem Belegstatusfeld (BSTAT) in Tabelle BKPF. Ein 'V' kennzeichnet einen geparkten Beleg. Beispiele truefalsch | |||
| Ist Nacharbeit IsRework | Ein boolesches Flag, das anzeigt, ob ein Buchungssatz einen Nacharbeitszyklus durchlaufen hat, z. B. abgelehnt und dann korrigiert wurde. | ||
| Beschreibung Dieses Flag identifiziert Cases, die vom 'Idealpfad' abgewichen sind und korrigierende Maßnahmen erforderten. Es wird typischerweise auf 'true' gesetzt, wenn eine Abfolge von Aktivitäten wie 'Buchungssatz abgelehnt' gefolgt von 'Buchungssatz korrigiert' für einen gegebenen Buchungssatz beobachtet wird.\n\nDieses Attribut ist essenziell für die Berechnung des KPI 'Buchungssatz-Nacharbeitsrate' und für die Analyse auf dem Dashboard 'Nacharbeits- und Ablehnungsrate'. Es hilft, das Ausmaß der Ineffizienz im Prozess zu quantifizieren und bietet eine Grundlage für die Untersuchung der Ursachen von Nacharbeit, wie unklare Anforderungen oder unzureichende Dokumentation. Bedeutung Kennzeichnet Buchungen, die eine Korrektur erforderten, wodurch die Quantifizierung von Nacharbeit und die Analyse ihrer Grundursachen ermöglicht wird, um die "First-Time-Right"-Raten zu verbessern. Datenquelle Dies ist ein berechnetes Attribut, das durch Analyse der Abfolge von Aktivitäten für einen Case abgeleitet wird. Ein Nacharbeits-Loop wird identifiziert, wenn eine Ablehnungs- oder Korrekturaktivität auftritt. Beispiele truefalsch | |||
| Kostenstelle CostCenter | Eine Organisationseinheit innerhalb eines Kostenrechnungskreises, die einen Ort darstellt, an dem Kosten anfallen. | ||
| Beschreibung Die Kostenstelle ist ein zentrales Stammdatenelement aus dem Controlling (CO)-Modul, das oft auf Ebene der Buchungssatzposition zugewiesen wird. Sie wird verwendet, um Kosten für eine bestimmte Abteilung, Funktion oder Lokation zu verfolgen.\n\nDas Einbeziehen der Kostenstelle ermöglicht eine granularere Analyse des Buchungssatz-Prozesses. Es kann helfen festzustellen, ob bestimmte Abteilungen mehr Nacharbeit verursachen, längere Zykluszeiten haben oder für ein höheres Volumen manueller Buchungen verantwortlich sind. Dies ermöglicht eine abteilungsbezogene Sicht auf die Prozesseffizienz. Bedeutung Ermöglicht die Analyse der Prozessleistung nach Abteilung oder Funktionsbereich und hilft, lokalisierte Ineffizienzen zu identifizieren. Datenquelle Befindet sich in der Belegpositionstabelle BSEG, Feld KOSTL. Beispiele 4100CC_FINANCE_US10010101 | |||
| Stornogrund ReversalReason | Ein Code, der den Grund angibt, warum ein Buchungssatz storniert wurde. | ||
| Beschreibung Wenn ein Beleg storniert wird, ermöglicht SAP dem Benutzer, einen Stornogrund anzugeben. Dieser Code liefert strukturierte Informationen darüber, warum die Stornierung notwendig war, zum Beispiel ein falsches Buchungsdatum oder ein Dateneingabefehler. Dieses Attribut ist eine wichtige Eingabe für das Dashboard 'Buchungseintrag-Stornoanalyse'. Durch die Analyse der häufigsten Stornogründe können Unternehmen systemische Probleme in ihren Prozessen oder Schulungslücken identifizieren und gezielte Maßnahmen ergreifen, um zukünftige Fehler zu verhindern und die Stornoquote zu reduzieren. Bedeutung Bietet direkten Einblick, warum Stornierungen auftreten, und ermöglicht eine gezielte Ursachenanalyse zur Reduzierung zukünftiger Fehler. Datenquelle Befindet sich in der Belegkopf-Tabelle BKPF, Feld STGRD. Beispiele 010205 | |||
| Währungsschlüssel CurrencyKey | Der Währungscode für die im Buchungssatz erfassten Beträge. | ||
| Beschreibung Dieses Attribut spezifiziert die Währung des Buchungssatzes, wie USD, EUR oder JPY. Es bietet Kontext für alle finanziellen Beträge, die mit dem Dokument verbunden sind.\n\nObwohl nicht immer eine primäre Analysedimension, ist es entscheidend für die korrekte Interpretation monetärer Werte. Es kann auch verwendet werden, um die Analyse in globalen Organisationen zu segmentieren, um zu sehen, ob Prozesse für Buchungen in Fremd- im Vergleich zu lokalen Währungen unterschiedlich sind. Bedeutung Bietet den notwendigen Kontext für alle monetären Werte und gewährleistet eine genaue Finanzanalyse und -interpretation. Datenquelle Befindet sich in der Belegkopf-Tabelle BKPF, Feld WAERS. Beispiele USDEURGBPJPY | |||
Record to Report – Buchungssatz-Aktivitäten
| Aktivität | Beschreibung | ||
|---|---|---|---|
| Buchungssatz eingereicht | Diese Aktivität bedeutet, dass ein geparkter Buchungssatz von seinem Ersteller finalisiert wurde und nun zur Überprüfung und Genehmigung bereit ist. Sie wird typischerweise durch die Initiierung einer SAP Business Workflow-Aufgabe erfasst, die mit dem geparkten Dokument verbunden ist. | ||
| Bedeutung Dies markiert die Übergabe vom Ersteller an den Genehmiger und startet die Zeitmessung für Genehmigungszykluszeit-KPIs. Es ist ein wichtiger Meilenstein zur Messung der Effizienz des Genehmigungs-Workflows. Datenquelle Abgeleitet von der Startzeit der Genehmigungs-Workflow-Instanz, die mit dem Finanzdokumentobjekt verknüpft ist. Dies erfordert die Analyse von Workflow-Log-Tabellen wie SWW_WI2OBJ, um den für den spezifischen Buchungskreis, die Belegnummer und das Geschäftsjahr gestarteten Workflow zu finden. Erfassen Identifizieren Sie das Workflow-Start-Event für das geparkte Dokumentobjekt. Ereignistyp inferred | |||
| Buchungssatz gebucht | Dies ist die zentrale Aktivität, bei der der Buchungssatz offiziell im Hauptbuch erfasst wird und die Finanzberichte beeinflusst. Dieses Event wird explizit erfasst, wenn der Belegstatus auf 'gebucht' gesetzt und ein Buchungsdatum zugewiesen wird. | ||
| Bedeutung Dies ist der wichtigste Meilenstein, der die erfolgreiche Verarbeitung eines Buchungssatzes signalisiert. Die End-to-End-Zykluszeit wird oft bis zu diesem Punkt gemessen, und es ist ein Schlüssel-Event für die Analyse des Finanzabschlusses. Datenquelle Identifiziert, wenn ein Dokument in der BKPF-Tabelle ein Buchungsdatum (BKPF-BUDAT) hat. Bei geparkten Dokumenten entspricht dies dem Zeitpunkt, an dem sich der Status BKPF-BSTAT von 'V' auf leer ändert. Der Timestamp der Buchung ist das Erfassungsdatum BKPF-CPUDT. Erfassen Identifizieren Sie, wann sich BKPF-BSTAT von 'V' auf leer ändert, oder bei Direktbuchungen das Erstellungsereignis. Ereignistyp explicit | |||
| Buchungssatz genehmigt | Diese Aktivität markiert die endgültige Genehmigung eines Buchungssatzes innerhalb eines Workflows, wodurch er zur Buchung berechtigt ist. Dieses Event wird aus dem Workflow-Log erfasst, wenn der letzte 'Freigabe'- oder 'Genehmigungs'-Schritt abgeschlossen ist. | ||
| Bedeutung Dies ist ein wichtiger Meilenstein, der den Genehmigungsprozess abschließt. Die Dauer bis zu dieser Aktivität ist ein kritischer KPI für die Genehmigungseffizienz, und die Zeit von diesem Event bis zur Buchung misst die Verzögerung nach der Genehmigung. Datenquelle Abgeleitet vom Abschluss-Timestamp des letzten Genehmigungsschritts im SAP Business Workflow-Log. Dies ist die letzte Genehmigungsaktion, bevor das Dokument gebucht oder zur Buchung bereitgestellt wird. Erfassen Identifizieren Sie den Abschluss des letzten 'Freigabe'- oder 'Genehmigungs'-Schritts in Workflow-Logs. Ereignistyp inferred | |||
| Buchungssatz geparkt | Diese Aktivität markiert die initiale Erstellung eines Buchungssatzes in einem vorläufigen Zustand, bevor er offiziell im Hauptbuch gebucht wird. Dies wird in SAP explizit erfasst, wenn ein Benutzer ein Dokument mittels einer Parktransaktion speichert und dabei den Dokumentstatus auf 'geparkt' setzt. | ||
| Bedeutung Dies ist ein kritisches Start-Event für Prozesse, die Überprüfung und Genehmigung umfassen. Die Analyse der Zeit zwischen Parken und Buchen hilft, Verzögerungen in den Vorbuchungs- und Genehmigungsphasen zu identifizieren. Datenquelle Dieses Event wird aus der Belegkopf-Tabelle BKPF identifiziert. Ein Dokument wird als geparkt betrachtet, wenn es mit dem Status BKPF-BSTAT = 'V' erstellt wird. Der Event-Timestamp ist das Erstellungsdatum und die Uhrzeit, BKPF-CPUDT und BKPF-CPUTM. Erfassen Identifizieren Sie die Dokumenterstellung in BKPF, bei der BKPF-BSTAT 'V' ist. Ereignistyp explicit | |||
| Buchungssatzstornierung verarbeitet | Diese Aktivität markiert die Stornierung eines zuvor gebuchten Buchungssatzes. Eine Stornierung ist ein neues Buchungsdokument, das den ursprünglichen Eintrag aufhebt. | ||
| Bedeutung Dies ist ein kritisches Event zur Messung der Datenqualität und Prozessgenauigkeit. Eine hohe Stornierungsrate deutet auf systemische Probleme in den anfänglichen Dateneingabe- oder Genehmigungsphasen hin, und jede Stornierung stellt Nacharbeit dar. Datenquelle Dieses Event wird im Kopf des Originaldokuments (BKPF-Tabelle) identifiziert. Wenn ein Dokument storniert wird, füllt SAP die Stornobelegnummer (BKPF-STBLG) und den Stornogrund (BKPF-STGRD). Der Event-Timestamp ist das Buchungsdatum des neuen Stornobelegs. Erfassen Identifizieren Sie, wann BKPF-STBLG im Originaldokument gefüllt wird; der Timestamp ist das Buchungsdatum des Stornodokuments. Ereignistyp explicit | |||
| Änderungen am Buchungssatz angefordert | Stellt einen Punkt im Workflow dar, an dem ein Genehmiger den Buchungssatz überprüft und zur Korrektur an den Ersteller zurückgesandt hat. Dieses Event wird aus Workflow-Logs erfasst, die eine Benutzerentscheidung 'Ablehnung' oder 'Zurücksenden' anzeigen. | ||
| Bedeutung Diese Aktivität ist essenziell für die Identifizierung von Nacharbeits-Loops, die eine primäre Quelle für Ineffizienz und Prozessabweichungen sind. Eine hohe Frequenz dieses Events weist auf Probleme mit der Buchungsqualität oder unklare Anforderungen hin. Datenquelle Dieses Event wird vom Timestamp eines spezifischen Benutzerentscheidungsschritts im SAP Business Workflow-Log abgeleitet, der einer 'Ablehnungs'- oder 'Zur Korrektur senden'-Aktion entspricht. Erfassen Identifizieren Sie den 'Ablehnungs'- oder 'Nacharbeits'-Entscheidungs-Timestamp in Workflow-Logs. Ereignistyp inferred | |||
| Buchungsjournaleintrag erstellt | Stellt die Erstellung eines Buchungssatzes dar, der direkt gebucht wird, ohne einen vorhergehenden Parkschritt. Dies wird erfasst, wenn ein Dokument in SAP über eine Direktbuchungstransaktion erstellt wird. | ||
| Bedeutung Diese Aktivität dient als alternativer Startpunkt für einfachere Buchungssatz-Prozesse, die keinen Genehmigungs-Workflow erfordern. Sie hilft, zwischen einfachen, direkten Buchungen und komplexeren, geparkten Buchungen zu unterscheiden. Datenquelle Dieses Event entspricht der Dokumenterstellung in der BKPF-Tabelle, bei der der Belegstatus BKPF-BSTAT leer (gebucht) ist. Der Event-Timestamp ist das Erstellungsdatum, BKPF-CPUDT. Für diese Dokumente treten die Events 'Erstellt' und 'Gebucht' gleichzeitig auf. Erfassen Identifizieren Sie die Dokumenterstellung in BKPF, bei der BKPF-BSTAT leer ist. Ereignistyp explicit | |||
| Buchungssatz abgelehnt | Diese Aktivität bedeutet die endgültige Ablehnung eines Buchungssatzes, wonach dieser nicht gebucht wird. Dies ist typischerweise ein terminaler Status in einem Genehmigungs-Workflow, der zur eventuellen Löschung des geparkten Dokuments führt. | ||
| Bedeutung Die Verfolgung von Ablehnungen ist entscheidend für das Qualitätsmanagement. Die Analyse der Gründe und Häufigkeit von Ablehnungen hilft, die „First-Time-Right“-Rate von Buchungseinträgen zu verbessern. Datenquelle Dies ist ein Ergebnis, das aus dem SAP Business Workflow-Log erfasst wird und eine endgültige Benutzerentscheidung 'Ablehnung' darstellt, die den Prozess beendet. Das geparkte Dokument kann anschließend gelöscht werden. Erfassen Identifizieren Sie den terminalen 'Ablehnungs'-Status im Workflow-Log für das Dokument. Ereignistyp inferred | |||
| Buchungssatz korrigiert | Diese Aktivität zeigt an, dass der ursprüngliche Ersteller einen geparkten Buchungssatz geändert hat, nachdem er zur Änderung zurückgesandt wurde. Dies wird durch das Erkennen von Änderungen am Dokument nach einem 'Änderungen angefordert'-Event abgeleitet. | ||
| Bedeutung Die Nachverfolgung von Korrekturen hilft, den Aufwand für Nacharbeit zu quantifizieren. Die Zeitspanne zwischen einer Änderungsanforderung und der Korrektur verdeutlicht Verzögerungen bei der Behebung von Problemen mit eingereichten Einträgen. Datenquelle Abgeleitet durch Analyse der Änderungsdokument-Logs (Tabellen CDHDR und CDPOS) für das geparkte Dokument. Eine nach einem Ablehnungsereignis im Workflow erfasste Änderung bedeutet, dass eine Korrektur vorgenommen wurde. Der Timestamp stammt aus der CDHDR-Tabelle. Erfassen Identifizieren Sie den Änderungslog-Eintrag in CDHDR/CDPOS nach einem Ablehnungsereignis. Ereignistyp inferred | |||
| Buchungssatzposition ausgeglichen | Diese Aktivität repräsentiert die Abstimmung einer offenpostenverwalteten Sachkontenposition, wie einem Bankverrechnungskonto. Sie tritt auf, wenn eine Position mit einer anderen abgeglichen und somit geschlossen wird. | ||
| Bedeutung Für Prozesse wie die Bankabstimmung ist die Zeit bis zum Ausgleich von Posten ein entscheidender KPI. Diese Aktivität hilft, die Effizienz von Abstimmungs- und Monatsabschlussprozessen zu analysieren. Datenquelle Dieses Event wird aus der Positionstabelle BSEG erfasst. Wenn eine Position ausgeglichen wird, werden die Felder Ausgleichsdatum (BSEG-AUGDT) und Ausgleichsbeleg (BSEG-AUGBL) gefüllt. Der Timestamp des Events ist das Ausgleichsdatum. Erfassen Identifizieren Sie, wann das Ausgleichsdatum (BSEG-AUGDT) für eine Position gefüllt wird. Ereignistyp explicit | |||
| Dokumentation angehängt | Diese Aktivität stellt dar, dass ein Benutzer unterstützende Dokumente, wie Rechnungen oder Tabellenkalkulationen, an den Buchungssatz anhängt. Dieses Event wird nicht explizit als Standardbuchhaltungs-Event protokolliert und wird typischerweise durch Überprüfung der Erstellung von Anhängen, die mit dem Buchhaltungsdokumentobjekt verknüpft sind, abgeleitet. | ||
| Bedeutung Die Nachverfolgung dieser Aktivität hilft, die Einhaltung von Richtlinien zu überprüfen, die eine Dokumentation erfordern. Verzögerungen beim Anhängen von Dokumenten können eine Hauptursache für verlängerte Genehmigungszyklen sein. Datenquelle Dies ist schwer zuverlässig als Timestamp-Event zu erfassen. Es kann potenziell durch Analyse der Generic Object Services (GOS) Anhangstabellen, wie SOOD, und Verknüpfung des Anhangserstellungs-Timestamps mit dem Buchungssatz-Objektschlüssel abgeleitet werden. Erfassen Ableitung vom Erstellungs-Timestamp verknüpfter Objekte in GOS-Tabellen (z. B. SOOD). Ereignistyp inferred | |||
| Geparkter Buchungssatz gelöscht | Stellt die Löschung eines geparkten Buchungssatzes dar, der nie gebucht wurde. Dies kann nach einer Ablehnung oder bei fehlerhafter Erstellung des Buchungssatzes geschehen. | ||
| Bedeutung Diese Aktivität markiert ein erfolgloses Prozessende. Die Analyse, warum geparkte Dokumente gelöscht werden, kann Probleme wie doppelte Buchungen oder Prozessmissverständnisse aufzeigen. Datenquelle Dieses Event wird erfasst, wenn der Status eines geparkten Dokuments in der BKPF-Tabelle geändert wird. Das Statusfeld BKPF-BSTAT wird auf 'Z' (Geparktes Dokument gelöscht) aktualisiert. Der Änderungs-Timestamp ist in den Belegänderungs-Logs (CDHDR) zu finden. Erfassen Identifizieren Sie, wann BKPF-BSTAT auf 'Z' aktualisiert wird. Ereignistyp explicit | |||
| Konzernübergreifende Buchung identifiziert | Eine berechnete Aktivität, die einen Buchungssatz kennzeichnet, der mehr als einen Buchungskreis betrifft. Dies wird durch die Analyse der Einzelposten eines einzelnen Finanzbelegs ermittelt. | ||
| Bedeutung Konzernübergreifende Transaktionen können komplexere Verarbeitungs- und Genehmigungsanforderungen haben. Ihre Identifizierung ermöglicht eine separate Analyse ihrer Zykluszeiten und Prozesspfade, um spezifische Engpässe zu finden. Datenquelle Berechnet durch die Untersuchung der Positionstabelle BSEG für eine gegebene Belegnummer (BELNR). Wenn die Positionen mehr als einen eindeutigen Buchungskreis (BSEG-BUKRS) enthalten, handelt es sich um eine konzernübergreifende Buchung. Erfassen Prüfen Sie, ob mehrere eindeutige Werte von BSEG-BUKRS für eine einzelne BKPF-BELNR existieren. Ereignistyp calculated | |||
| Manuelle Buchung identifiziert | Diese Aktivität identifiziert, ob ein Buchungssatz über eine manuelle Online-Transaktion im Vergleich zu einer automatisierten Schnittstelle oder einem Batch-Prozess erstellt wurde. Dies ist keine Benutzeraktion, sondern ein berechnetes Attribut der Buchung, abgeleitet aus Systemdaten. | ||
| Bedeutung Die Unterscheidung zwischen manuellen und automatisierten Buchungen ist entscheidend für eine gezielte Prozessverbesserung. Manuelle Prozesse stehen oft im Fokus von Standardisierungs- und Automatisierungsinitiativen. Datenquelle Dies wird durch die Analyse von Feldern in der Belegkopf-Tabelle BKPF berechnet. Transaktionscodes (BKPF-TCODE) wie 'FB01', 'FB50' oder 'FV50' weisen auf manuelle Erfassung hin, während andere T-Codes oder spezifische Batch-Input-Namen (BKPF-AWKEY) Automatisierung nahelegen. Erfassen Ableitung aus BKPF-TCODE oder anderen Quellsystemindikatoren im Belegkopf. Ereignistyp calculated | |||
Extraktionsleitfäden
Schritte
- ABAP-Programm erstellen: Gehen Sie im SAP-System zur Transaktion SE38 (ABAP Editor). Geben Sie einen Namen für das neue Programm ein, zum Beispiel Z_PM_JE_EXTRACTION, und klicken Sie auf Erstellen. Geben Sie einen passenden Titel an und legen Sie den Programmtyp auf 'Ausführbares Programm' fest.
- Selektionsbild definieren: Definieren Sie im Quellcode des Programms das Selektionsbild. Dies ermöglicht es Benutzern, Parameter wie einen Datumsbereich für die Belegserstellung, Buchungskreise und Belegarten anzugeben, um das Datenvolumen für die Extraktion zu begrenzen.
- Datenstrukturen deklarieren: Definieren Sie eine interne Tabellenstruktur, die die endgültigen Event Log-Daten aufnehmen wird. Diese Struktur muss alle erforderlichen Felder enthalten: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate sowie alle empfohlenen Attribute wie User, CompanyCode und PostingDate.
- Datenselektionslogik implementieren: Schreiben Sie die Kern-ABAP-SQL-Abfragen, um Daten für jede der 14 erforderlichen Aktivitäten zu extrahieren. Dies beinhaltet die Auswahl von Daten aus primären Tabellen wie BKPF (Kopf) und BSEG (Position), Änderungsbelegtabellen CDHDR und CDPOS, Workflow-Tabellen wie SWWLOGHIST und Abstimmungstabellen wie BSAS und BSAK.
- Geparkte und gebuchte Belege extrahieren: Für 'Journal Entry Parked'-Events wählen Sie aus BKPF, wo der Belegstatus (BSTAT) 'V' ist. Für 'Journal Entry Created' und 'Journal Entry Posted'-Events wählen Sie aus BKPF, wo der Status leer ist, was einen normalen, gebuchten Beleg anzeigt.
- Änderungs- und Löschereignisse extrahieren: Fragen Sie die Änderungsbelegtabellen CDHDR und CDPOS nach der Objektklasse 'BELEG' ab. Filtern Sie nach dem Belegschlüssel, um Änderungen zu finden, die den Aktivitäten 'Journal Entry Corrected' oder 'Parked Journal Entry Deleted' entsprechen.
- Workflow-Events extrahieren: Um Aktivitäten wie 'Journal Entry Submitted', 'Approved', 'Rejected' und 'Changes Requested' zu erfassen, fragen Sie die Workflow-Tabellen ab. Verwenden Sie die Tabelle SWW_WI2OBJ, um den Buchhaltungsbeleg mit einer Workflow-Instanz zu verknüpfen, und lesen Sie dann SWWLOGHIST für spezifische Benutzerentscheidungen oder Statusänderungen.
- Berechnete Events identifizieren: Für 'Manual Entry Identified' prüfen Sie den Transaktionscode (BKPF-TCODE) gegen eine Liste bekannter manueller Transaktionscodes. Für 'Cross-Company Posting Identified' analysieren Sie die BSEG-Positionen eines gegebenen Belegs, um festzustellen, ob mehrere Buchungskreise beteiligt sind.
- Daten konsolidieren und transformieren: Während die Daten jeder Aktivität ausgewählt werden, transformieren Sie sie in die endgültige Event Log-Struktur. Verketten Sie Buchungskreis, Belegnummer und Geschäftsjahr, um die JournalEntryId zu erstellen. Konvertieren Sie SAP-Datums- und Zeitangaben in einen einzelnen EventTime-Timestamp. Hängen Sie die Ergebnisse jeder Abfrage an die endgültige interne Tabelle an.
- Dateiexport implementieren: Verwenden Sie ABAP-Dateibehandlungsanweisungen, wie OPEN DATASET, LOOP AT, TRANSFER und CLOSE DATASET, um die konsolidierte interne Tabelle in eine CSV- oder Flachdatei im SAP-Anwendungsserver-Verzeichnis zu schreiben (anzeigbar über Transaktion AL11).
- Als Hintergrundjob einplanen: Gehen Sie zur Transaktion SM36 (Hintergrundjob definieren). Erstellen Sie einen neuen Job, definieren Sie einen Schritt, der Ihr ABAP-Programm ausführt, und legen Sie einen Zeitplan fest, z. B. nächtlich oder wöchentlich außerhalb der Spitzenzeiten, um den Extraktionsprozess zu automatisieren.
- Datei abrufen und formatieren: Verwenden Sie die Transaktion CG3Y oder arbeiten Sie mit Ihrem Systemadministrator zusammen, um die generierte Datei vom Anwendungsserver auf Ihren lokalen Rechner herunterzuladen. Stellen Sie sicher, dass die Dateikodierung und das Format für den Upload in Ihr Process Mining-Tool geeignet sind.
Konfiguration
- Datumsbereich: Es ist entscheidend, einen Datumsbereich festzulegen, um die Leistung zu steuern. Verwenden Sie das Belegdatum (BKPF-CPUDT) als Hauptfilter. Für eine initiale Analyse wird ein Zeitraum von 3 bis 6 Monaten empfohlen. Für Tests verwenden Sie einen Bereich von wenigen Tagen, der bekanntermaßen Daten enthält.
- Buchungskreis-Filter: Filtern Sie immer nach Buchungskreis (BKPF-BUKRS). Die Extraktion von Daten für alle Buchungskreise auf einmal kann extrem ressourcenintensiv sein. Beginnen Sie mit einem oder einer kleinen Gruppe relevanter Buchungskreise.
- Belegarten-Filter: Verwenden Sie den Belegarten-Filter (BKPF-BLART), um den Umfang auf spezifische Arten von Buchungsbelegen, wie 'SA' für Hauptbuchbelege, einzugrenzen, wenn Sie nicht alle Belegarten analysieren müssen.
- Workflow-Task-IDs: Die Logik zur Extraktion von Workflow-Events hängt von spezifischen Task-IDs ab, die in Ihrem System für Genehmigung, Ablehnung und Einreichung verwendet werden. Diese IDs müssen im Quellcode des Programms basierend auf den Workflow-Definitionen Ihres Unternehmens konfiguriert werden.
- Performance-Aspekte: Das Programm verbindet mehrere große Tabellen, insbesondere CDPOS und die Workflow-Historientabellen. Das Ausführen während der Hauptgeschäftszeiten kann die Systemleistung beeinträchtigen. Planen Sie es immer als Hintergrundjob für die Ausführung außerhalb der Spitzenzeiten ein. Erwägen Sie die Erstellung sekundärer Datenbankindizes, wenn Leistung ein wiederkehrendes Problem darstellt.
- Voraussetzungen: Diese Methode erfordert einen Benutzer mit ABAP-Entwicklungsberechtigungen (für SE38) und Berechtigungen zum Erstellen und Verwalten von Hintergrundjobs (für SM36). Der Benutzer oder Job benötigt auch Lesezugriff auf alle relevanten Finanz-, Workflow- und Systemtabellen (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST usw.).
a Beispielabfrage 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. Schritte
- Datenbankverbindung herstellen: Besorgen Sie sich schreibgeschützte Zugangsdaten für die SAP ECC-Datenbank. Verwenden Sie einen Standard-SQL-Client wie DBeaver, SAP HANA Studio oder SQL Server Management Studio, um eine Verbindung zur Datenbank herzustellen.
- SQL-Abfrage vorbereiten: Kopieren Sie die vollständige SQL-Abfrage, die im Abschnitt 'query' dieses Dokuments bereitgestellt wird, in Ihren SQL-Client.
- Extraktionsparameter festlegen: Vor der Ausführung müssen Sie die Platzhalter in der Abfrage konfigurieren. Ersetzen Sie
'[START_DATE]'und'[END_DATE]'durch den gewünschten Datumsbereich im Format 'JJJJMMTT'. Ersetzen Sie'[COMPANY_CODE_1]', '[COMPANY_CODE_2]'durch die spezifischen SAP-Buchungskreise, die Sie analysieren möchten. - Quellsystem definieren: Ersetzen Sie in der Haupt
SELECT-Anweisung den Platzhalter'[Your SAP System ID]'durch die tatsächliche SAP-System-ID (SID), um die Datenquelle korrekt zu identifizieren. - Abfrage ausführen: Führen Sie die konfigurierte SQL-Abfrage gegen die SAP-Datenbank aus. Die Ausführungszeit variiert je nach Datumsbereich und Größe Ihrer Datenbanktabellen.
- Erste Ergebnisse überprüfen: Sobald die Abfrage abgeschlossen ist, scannen Sie kurz die zurückgegebenen Zeilen, um sicherzustellen, dass die Daten wie erwartet befüllt werden. Überprüfen Sie auf eine Vielzahl von Aktivitäten und stellen Sie sicher, dass wichtige Felder wie
JournalEntryIdundEventTimenicht leer sind. - Timestamps handhaben: Die Abfrage verkettet Datums- und Zeitfelder zu einem
JJJJMMTTHHMMSS-String. Stellen Sie sicher, dass Ihr Nachbearbeitungs- oder Zielsystem dieses Format parsen kann, oder passen Sie die SQLCONCAT-Funktion an ein ISO 8601-Format wieJJJJ-MM-TTHH:MI:SSan, falls Ihre Datenbank dies unterstützt. - Daten exportieren: Exportieren Sie den vollständigen Ergebnissatz aus Ihrem SQL-Client in eine CSV-Datei. Stellen Sie sicher, dass Sie UTF-8-Kodierung verwenden, um Probleme mit Sonderzeichen zu vermeiden.
- Für den Upload vorbereiten: Bevor Sie die Daten in ein Process Mining-Tool hochladen, stellen Sie sicher, dass die Spaltenüberschriften dem erforderlichen Datenschema entsprechen.
JournalEntryId,ActivityNameundEventTimesind kritisch. Fügen Sie die SpalteLastDataUpdatehinzu und füllen Sie diese mit dem Zeitstempel der Extraktion. - Endgültige Validierung: Führen Sie die im Abschnitt 'validationSteps' beschriebenen Schritte aus, um sicherzustellen, dass die extrahierten Daten vollständig und genau sind, bevor Sie Ihre Analyse beginnen.
Konfiguration
- Datenbankberechtigungen: Der Datenbanknutzer benötigt Lesezugriff auf die folgenden SAP-Tabellen: BKPF, BSEG, CDHDR, CDPOS, T001 und V_USERNAME. Für Workflow-bezogene Aktivitäten ist auch der Zugriff auf SWW_WI2OBJ und SWWLOGHIST erforderlich. Dieses Zugriffslevel wird typischerweise nur spezialisierten technischen Teams gewährt.
- Datumsbereichsfilterung: Es ist entscheidend, die Daten nach einem spezifischen Datumsbereich zu filtern, um die Abfrageleistung sicherzustellen. Die bereitgestellte Abfrage verwendet Platzhalter für ein Start- und Enddatum, die auf das Belegdatum (
BKPF.CPUDT) angewendet werden. Für eine erste Analyse wird ein Bereich von 3 bis 6 Monaten empfohlen. - Entitätsfilterung: Um das Datenvolumen zu steuern und die Analyse zu fokussieren, filtern Sie immer nach Buchungskreis (
BKPF.BUKRS). Sie können auch das Filtern nach Belegart (BKPF.BLART) in Betracht ziehen, um nur relevante Buchungsbelegarten, zum Beispiel 'SA' für Hauptbuchbelege, einzubeziehen und operative Belege wie Rechnungen oder Zahlungen auszuschließen, wenn diese nicht im Umfang enthalten sind. - Performance-Aspekte: Direkte Abfragen gegen Kerntabellen wie BSEG und CDPOS können ressourcenintensiv sein. Es wird dringend empfohlen, diese Extraktion außerhalb der Hauptgeschäftszeiten durchzuführen, um Systemleistungseinschränkungen für Endbenutzer zu vermeiden. Vermeiden Sie es, Daten für mehr als ein Jahr in einem einzigen Durchlauf zu extrahieren.
- Workflow-Task-IDs: Die Abfrage enthält Platzhalter wie
'[WF_TASK_ID_SUBMIT]'und'[WF_TASK_ID_APPROVE]'. Diese müssen durch die tatsächlichen Task-IDs aus der spezifischen Workflow-Konfiguration Ihrer Buchungsbelege ersetzt werden. Diese können in Zusammenarbeit mit einem SAP-Workflow-Spezialisten oder durch Analyse der technischen Workflow-Definition in Transaktion PFTC identifiziert werden.
a Beispielabfrage 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' Schritte
- SAP-Verbindung herstellen: Konfigurieren Sie in Ihrem ETL-Tool eines Drittanbieters eine neue Quellverbindung zu Ihrem SAP ECC-System. Dies erfordert typischerweise die Details des Anwendungsservers, den Client, die Systemnummer und einen dedizierten SAP-Benutzer mit den erforderlichen RFC-Berechtigungen.
- Datenquellen definieren: Fügen Sie innerhalb Ihres Extraktionsprojekts die erforderlichen SAP-Tabellen als Datenquellen hinzu. Zu den primären Tabellen gehören BKPF (Buchhaltungsbelegkopf), BSEG (Buchhaltungsbelegsegment), VBSEGK (Geparkter Belegkopf), CDHDR (Änderungsbelegkopf), CDPOS (Änderungsbelegpositionen), SWW_WI2OBJ (Workflow-zu-Objekt-Verknüpfungen), SWWLOGHIST (Workflow-Protokoll) und SRGBTBREL (Beziehungen für GOS-Anhänge).
- Basisereignisse extrahieren (Erstellt & Geparkt): Erstellen Sie den ersten Datenfluss zur Extraktion initialer Ereignisse. Für 'Journal Entry Parked' verwenden Sie VBSEGK als Quelle. Für 'Journal Entry Created' verwenden Sie BKPF und stellen Sie sicher, dass Sie nach Belegen filtern, die keine Stornierungen sind und nicht initial geparkt wurden. Dies kann durch einen Anti-Join mit VBSEGK erfolgen.
- Workflow-Events extrahieren: Erstellen Sie einen Datenfluss, der BKPF mit SWW_WI2OBJ über den Objektschlüssel (Buchungskreis + Belegnummer + Geschäftsjahr) verbindet, um die Workflow-Instanz-ID zu finden. Verbinden Sie dieses Ergebnis mit SWWLOGHIST, um Ereignisse wie 'Eingereicht', 'Genehmigt', 'Abgelehnt' und 'Änderungen angefordert' basierend auf den Workflow-Aufgabenergebnissen und Benutzerentscheidungen, die im Protokoll erfasst sind, zu extrahieren.
- Änderungs- und Löschereignisse extrahieren: Verwenden Sie die Tabellen CDHDR und CDPOS, um Änderungen zu identifizieren. Für 'Journal Entry Corrected' filtern Sie nach Änderungen, die an geparkten Belegen vorgenommen wurden (Objektklasse 'FIPP'). Für 'Parked Journal Entry Deleted' suchen Sie in den Änderungsbelegen nach Löschmarkierungen für geparkte Belege.
- Anhangsereignisse extrahieren: Um 'Documentation Attached' zu erfassen, verbinden Sie BKPF mit SRGBTBREL, wobei der Objekttyp 'BKPF' und die Beziehung '[Ihr Anhangsbeziehungstyp]' ist. Das Erstellungsdatum der Verknüpfung dient als Ereigniszeit.
- Abstimmungs- und Stornierungsereignisse extrahieren: Für 'Journal Entry Line Item Cleared' fragen Sie die Tabelle BSEG ab, in der das Feld für den Ausgleichsbeleg (AUGBL) gefüllt ist. Die Ereigniszeit ist das Buchungsdatum des Ausgleichsbelegs (AUGDT). Für 'Journal Entry Reversal Processed' fragen Sie BKPF nach Belegen ab, die Stornierungen sind, identifiziert durch einen Wert im Feld für den stornierten Beleg (STBLG).
- Berechnete Ereignisse ableiten: Erstellen Sie separate Logikblöcke für berechnete Ereignisse. Für 'Manual Entry Identified', filter BKPF basierend auf einer Liste manueller Transaktionscodes (z. B. FB01, FB50, F-02). Für 'Cross-Company Posting Identified' gruppieren Sie die Tabelle BSEG nach Beleg-ID und identifizieren Belege mit mehr als einem eindeutigen Buchungskreis.
- Alle Ereignisflüsse kombinieren: Verwenden Sie eine UNION-Transformation in Ihrem ETL-Tool, um die Ausgaben aller einzelnen Ereignisflüsse (Erstellt, Geparkt, Genehmigt usw.) in einer einzigen Event Log-Tabelle zusammenzuführen. Stellen Sie sicher, dass die Spaltennamen und Datentypen über alle Flüsse hinweg konsistent sind.
- Auf das endgültige Schema abbilden: Bilden Sie die kombinierten Daten auf die erforderliche Event Log-Struktur ab, indem Sie die
JournalEntryId,ActivityName,EventTime,Userund andere erforderliche und empfohlene Attribute erstellen. Fügen Sie statische Spalten wieSourceSystemhinzu und verwenden Sie die Ausführungszeit des ETL-Jobs fürLastDataUpdate. - Inkrementelles Laden konfigurieren: Für fortlaufende Extraktionen konfigurieren Sie eine inkrementelle Ladestrategie. Verwenden Sie das letzte Erstellungs- oder Änderungsdatum (z. B. BKPF.CPUDT, CDHDR.UDATE) als Wasserzeichen, um nur neue oder aktualisierte Datensätze seit dem letzten Lauf abzurufen.
- Export für ProcessMind: Planen Sie den Extraktionsjob und konfigurieren Sie den letzten Ausgabeschritt so, dass das Event Log als CSV- oder Parquet-Datei an einem für ProcessMind zugänglichen Ort für den Upload gespeichert wird.
Konfiguration
- Voraussetzungen: Ein lizenziertes ETL-Tool eines Drittanbieters (z. B. Theobald Xtract Universal, Informatica, Talend) mit einem dedizierten SAP-Konnektor. Ein SAP-Benutzerkonto mit RFC-Zugriff und Berechtigungen zum Lesen von Finanztabellen (z. B. S_TABU_DIS für Tabellengruppen F_00, F_WF), Workflow-Daten und Änderungsbelegen.
- Verbindungsparameter: Sie benötigen die IP-Adresse oder den Hostnamen des SAP Application Servers, die Systemnummer und die Client-ID. Für den SAP-Benutzernamen und das Passwort sollte ein sicheres Credential Management verwendet werden.
- Wichtige Filter: Wenden Sie immer Filter für den Buchungskreis (BKPF.BUKRS) und das Geschäftsjahr (BKPF.GJAHR) an der Quelle an, um das Datenvolumen zu begrenzen. Es wird dringend empfohlen, nach dem Belegdatum (BKPF.CPUDT) zu filtern, um einen spezifischen Extraktionszeitraum zu definieren, z. B. die letzten 6 Monate.
- Datumsbereichsauswahl: Wählen Sie für die initiale Ladung einen repräsentativen Zeitraum von 3 bis 6 Monaten. Verwenden Sie für nachfolgende Delta-Ladungen einen Wasserzeichen auf einem Timestamp-Feld wie
CPUDT, um nur neue Datensätze abzurufen. - Performance-Aspekte: Joins auf BSEG, CDPOS und Workflow-Tabellen können sehr langsam sein. Stellen Sie sicher, dass Ihr ETL-Tool Filter nach Möglichkeit an die SAP-Quelle überträgt. Extrahieren Sie Daten in kleineren Blöcken oder Paketen, wenn das Tool dies zulässt, insbesondere bei großen historischen Ladungen.
- Workflow-Anpassung: Die Logik zur Identifizierung von Workflow-Aktivitäten wie 'Genehmigt' oder 'Abgelehnt' hängt stark von Ihren spezifischen Workflow-Templates ab. Sie müssen die korrekten Workflow-Task-IDs und Benutzerentscheidungsschlüssel aus Ihrem System identifizieren, um sie in den Filtern zu verwenden.
a Beispielabfrage 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