Ihre Order-to-Cash - Rechnungsstellungs- und Fakturierungsdatenvorlage
Ihre Order-to-Cash - Rechnungsstellungs- und Fakturierungsdatenvorlage
- Empfohlene Attribute für eine umfassende Analyse
- Wichtige Prozessschritte und Meilensteine zur Verfolgung
- Praktische Anleitung zur Datenextraktion für SAP ECC
Order-to-Cash – Fakturierungs- & Rechnungsstellungs-Attribute
| Name | Beschreibung | ||
|---|---|---|---|
| Aktivität ActivityName | Der Name des Geschäfts-`Events` oder -Schritts, der innerhalb des Rechnungslebenszyklus aufgetreten ist. | ||
| Beschreibung Dieses Die Abfolge dieser Aktivitäten bildet den Bedeutung Es definiert die Schritte in der Datenquelle Dies ist ein konzeptionelles Beispiele Rechnung erstelltRechnung gebuchtZahlungserinnerung versandtRechnung ausgeglichen | |||
| Rechnungsnummer InvoiceNumber | Die eindeutige Kennung für den Fakturierungsbeleg, die als primäre `Case ID` für den Rechnungsstellungsprozess dient. | ||
| Beschreibung Die Rechnungsnummer, in SAP als Fakturabelegnummer bekannt, identifiziert jede Rechnung eindeutig. Im Die Analyse von Prozessen nach Rechnungsnummer ermöglicht eine vollständige Sicht auf den Lebenszyklus jeder Abrechnungstransaktion, von ihrer Entstehung bis zu ihrer endgültigen Abwicklung. Dies ist entscheidend für die Berechnung wichtiger Bedeutung Es ist der wesentliche Schlüssel zur Verfolgung des gesamten Rechnungslebenszyklus, der die Analyse von Durchlaufzeiten, Datenquelle SAP ECC Tabelle: VBRK, Feld: VBELN Beispiele 90001234900012359000123690001237 | |||
| Startzeit EventTime | Der Zeitstempel, der angibt, wann eine bestimmte Aktivität oder ein Ereignis stattgefunden hat. | ||
| Beschreibung Die Event Time erfasst das genaue Datum und die Uhrzeit jeder Aktivität im Rechnungslebenslauf. Dieser Zeitstempel ist die Grundlage für alle zeitbasierten Analysen im Process Mining, wie die Berechnung von Durchlaufzeiten, die Identifizierung von Engpässen und das Monitoring von Service Level Agreements (SLAs). Dieses Attribut wird üblicherweise durch die Kombination eines Datumsfelds, wie dem Buchungsdatum (BUDAT), mit einem Zeitfeld (UZEIT) aus verschiedenen SAP-Tabellen erstellt. Präzise Zeitstempel sind entscheidend für ein verlässliches Event Log und eine valide Performance-Analyse. Bedeutung Dieses Datenquelle Konstruiert aus verschiedenen Datums- und Zeitfeldern über mehrere Tabellen hinweg, wie z. B. Beispiele 2023-04-15T10:30:00Z2023-04-16T11:00:00Z2023-05-20T09:00:00Z | |||
| Benutzername UserName | Die ID des Benutzers, der die Aktivität ausgeführt oder das Dokument erstellt hat. | ||
| Beschreibung Dieses Mit diesen Bedeutung Ermöglicht die Analyse der Benutzerleistung, der Arbeitslastverteilung und hilft bei der Unterscheidung zwischen manuellen und automatisierten Aktivitäten zur Steigerung der Effizienz. Datenquelle SAP ECC Tabelle: VBRK, Feld: ERNAM (Erstellt von) oder BKPF, Feld: USNAM (Benutzername) oder CDHDR, Feld: USERNAME (Benutzer). Beispiele JSMITHBW_BATCHLROSSIMKUMAR | |||
| Buchungskreis CompanyCode | Die Kennung der juristischen Einheit, die die Rechnung ausgestellt hat. | ||
| Beschreibung Der Buchungskreis stellt eine unabhängige Rechts- und Rechnungswesen-Einheit in SAP dar. Alle Finanztransaktionen, einschließlich Rechnungen, werden einem spezifischen Buchungskreis zugeordnet. Dies ist ein grundlegendes organisatorisches Im Bedeutung Ermöglicht das Filtern und Vergleichen von Datenquelle SAP ECC Tabelle: VBRK, Feld: BUKRS Beispiele 10002000US01DE01 | |||
| Fakturabelegart BillingDocumentType | Ein Code, der die Art des Fakturabelegs kategorisiert, wie z. B. eine Rechnung, eine Gutschrift oder eine Lastschrift. | ||
| Beschreibung Der Fakturierungsbelegtyp klassifiziert Transaktionen in verschiedene Kategorien basierend auf ihrem Geschäftszweck. Zum Beispiel ist 'F2' eine Standardkundenrechnung, während 'G2' eine Gutschrift darstellt. Diese Klassifizierung ist in SAP konfiguriert, um zu steuern, wie verschiedene Fakturierungsbelege verarbeitet werden. Für Bedeutung Ermöglicht die Segmentierung und Analyse verschiedener Fakturierungsprozesse, wie z. B. Standardrechnungen versus Gutschriften, die oft sehr unterschiedliche Datenquelle SAP ECC Tabelle: VBRK, Feld: FKART Beispiele F2G2L2IV | |||
| Gesamtrechnungsbetrag TotalInvoiceAmount | Der Gesamtnettowert des Fakturierungsbelegs. | ||
| Beschreibung Dieses Es wird in verschiedenen Analysen verwendet, z.B. zur Segmentierung von Rechnungen in hochwertige und geringwertige Kategorien, um zu sehen, ob ihre Bedeutung Bietet wesentlichen finanziellen Kontext, der eine Analyse basierend auf dem Rechnungswert ermöglicht, z.B. um festzustellen, ob Rechnungen mit hohem Wert einem anderen Prozess folgen oder länger für den Ausgleich benötigen. Datenquelle SAP ECC Tabelle: VBRK, Feld: NETWR Beispiele 1500.7525000.00500.0012345.67 | |||
| Kundennummer CustomerNumber | Eine eindeutige Nummer, die den Kunden identifiziert, an den die Rechnung ausgestellt wird. | ||
| Beschreibung Die Kundennummer verknüpft eine Rechnung mit einem spezifischen Kunden oder Geschäftspartner. Dieses Analysten können dieses Feld verwenden, um die Bedeutung Ermöglicht kundenorientierte Analysen, um Zahlungsverhalten zu identifizieren, die DSO pro Kunde zu bewerten und Mahnstrategien individuell anzupassen. Datenquelle SAP ECC Tabelle: VBRK, Feld: KUNRG (Zahlungspflichtiger) oder KUNAG (Auftraggeber). Beispiele 100023200541CUST-A487910345 | |||
| `Verkaufsorganisation` SalesOrganization | Die `Organisationseinheit`, verantwortlich für den `Verkauf` von `Produkten` oder `Dienstleistungen`. | ||
| Beschreibung Die Verkaufsorganisation ist eine Organisationseinheit in SAP, die für den Vertrieb von Waren und Dienstleistungen sowie die Verhandlung von Verkaufsbedingungen verantwortlich ist. Sie ist ein Schlüsselfeld für die Strukturierung von Vertriebsaktivitäten. Im Bedeutung Ermöglicht Performance-Benchmarking über verschiedene Verkaufsorganisationen oder Regionen hinweg, um Best Practices und Optimierungspotenziale aufzudecken. Datenquelle SAP ECC Tabelle: VBRK, Feld: VKORG Beispiele 1000NA01EU01AP01 | |||
| Ausgleichsdatum ClearingDate | Das Datum, an dem die Zahlung einging und die Rechnung aus der Debitorenbuchhaltung ausgeglichen wurde. | ||
| Beschreibung Das Ausgleichsdatum ist der Tag, an dem ein offener Posten, wie eine Rechnung, im Finanzsystem als bezahlt oder 'ausgeglichen' gekennzeichnet wird. Dieses Datum stellt effektiv dar, wann der Dies ist eines der wichtigsten Daten im Bedeutung Markiert den letzten Schritt des Rechnungslebenszyklus, dient als Enddatum für die DSO- und gesamte Datenquelle SAP ECC Tabelle: BSAD, Feld: AUGDT Beispiele 2023-05-142023-06-012023-06-25 | |||
| Belegdatum DocumentDate | Das Datum auf dem Originaldokument, bereitgestellt vom Lieferanten oder Ersteller. | ||
| Beschreibung Das Belegdatum ist das Ausstellungsdatum des Originaldokuments. Für die Abrechnung ist dies typischerweise das Datum, an dem die Rechnung erstellt wurde, und wird oft als Grundlage für die Berechnung des Zahlungsfälligkeitsdatums verwendet. Dieses Datum ist entscheidend für die Finanzberichterstattung und für die Berechnung wichtiger Kennzahlen wie Bedeutung Dient als Grundlage für die Berechnung des Rechnungsalters und der DSO und bietet einen kritischen Referenzpunkt für Finanz- und Zahlungsbedingungenanalyse. Datenquelle SAP ECC Tabelle: VBRK, Feld: FKDAT (Rechnungsdatum) Beispiele 2023-04-152023-04-162023-05-20 | |||
| Buchungsdatum PostingDate | Das Datum, an dem das Dokument in den Finanzbuchhaltungsbüchern gebucht wird. | ||
| Beschreibung Das Buchungsdatum bestimmt die Abrechnungsperiode, in der die Transaktion im Hauptbuch erfasst wird. Es ist ein kritisches Datum für die Buchhaltung und Finanzberichterstattung. Verzögerungen zwischen dem Beleg-Erstellungsdatum und dem Buchungsdatum können auf Ineffizienzen bei der internen Bearbeitung von Fakturierungsbelegen hinweisen. Aus Bedeutung Markiert einen wichtigen finanziellen Meilenstein und ist entscheidend für die Buchhaltung. Die Zeitspanne zwischen Rechnungserstellung und -buchung ist ein Schlüsselmaß für die interne Verarbeitungseffizienz. Datenquelle SAP ECC Tabelle: BKPF, Feld: BUDAT Beispiele 2023-04-152023-04-172023-05-21 | |||
| Ist automatisiert IsAutomated | Ein `Flag`, das anzeigt, ob eine `Aktivität` von einem Systembenutzer oder durch Automatisierung durchgeführt wurde. | ||
| Beschreibung Dieses berechnete Dieses Bedeutung Unterstützt direkt die Berechnung der automatisierten Fakturierungsrate und hilft dabei, die Prozesseffizienz zu messen und die Auswirkungen von Datenquelle Abgeleitet aus dem Attribut UserName. Die Logik lautet etwa: WENN UserName IN ('BATCH', 'SYSTEM', 'RFCUSER'), DANN wahr, ANSONSTEN falsch. Beispiele truefalsch | |||
| Ist Nacharbeit IsRework | Ein `Flag`, das anzeigt, ob eine `Aktivität` ein Nacharbeits- oder Korrekturschritt ist. | ||
| Beschreibung Dieses berechnete Im Bedeutung Hilft, Prozessineffizienzen und Qualitätsprobleme zu quantifizieren, indem es aufzeigt, wie viel Aufwand für die Fehlerkorrektur betrieben wird, und unterstützt direkt Datenquelle Wird aus dem Aktivitätsnamen oder dem Transaktionscode abgeleitet. Beispiel: WENN ActivityName = 'Invoice Corrected' ODER TransactionCode = 'VF11', DANN wahr, ANSONSTEN falsch. Beispiele truefalsch | |||
| Letzte Datenaktualisierung LastDataUpdate | Der Zeitstempel der jüngsten Datenaktualisierung bzw. der letzten Extraktion aus dem Quellsystem. | ||
| Beschreibung Dieses In Bedeutung Informiert Benutzer über die Aktualität der Datenquelle Wird während des Beispiele 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Quellsystem SourceSystem | Identifiziert das Quellsystem, aus dem die Daten extrahiert wurden. | ||
| Beschreibung Dieses Für Bedeutung Bietet Kontext für den Ursprung der Datenquelle Dies ist typischerweise ein statischer Wert, der während des Beispiele SAP_ECC_PRODECC_EU_100SAP_US_FIN | |||
| Rechnungsfälligkeitsdatum InvoiceDueDate | Das Datum, bis zu dem der Kunde die Zahlung voraussichtlich leisten wird. | ||
| Beschreibung Das Rechnungsfälligkeitsdatum ist die Frist für die Zahlung gemäß den Zahlungsbedingungen. Dieses Dieses Bedeutung Dies ist der Datenquelle Berechnet basierend auf dem Beispiele 2023-05-152023-05-302023-06-20 | |||
| Transaktionscode TransactionCode | Der SAP-`Transaction Code`, der zur Durchführung einer Aktivität verwendet wurde. | ||
| Beschreibung Der Diese Informationen sind äußerst wertvoll für die Ursachenanalyse. Wenn beispielsweise Fehler häufig sind, können Analysten überprüfen, ob ein nicht standardmäßiger Bedeutung Bietet technischen Kontext dafür, wie eine Aktivität durchgeführt wurde, ermöglicht die Ursachenanalyse von Prozessabweichungen und hilft bei der Identifizierung von nicht standardmäßigen Benutzeraktionen. Datenquelle SAP ECC Tabelle: CDHDR, Feld: TCODE Beispiele VF01VF02FB01F-28 | |||
| Verkaufsbelegnummer SalesDocumentNumber | Die Kennung des ursprünglichen `Sales Order`, der zur Rechnung führte. | ||
| Beschreibung Dieses Durch die Verbindung des Abrechnungsprozesses mit dem vorhergehenden Bedeutung Verbindet den Abrechnungsprozess wieder mit dem Datenquelle SAP ECC Tabelle: VBRP, Feld: VGBEL Beispiele 100000451000004610000047 | |||
| Währung Currency | Der Währungscode für die in der Rechnung angegebenen Beträge. | ||
| Beschreibung Dieses Bei der Analyse von Bedeutung Bietet den notwendigen Kontext für alle monetären Werte und gewährleistet eine genaue Finanzanalyse, insbesondere in einer Mehrwährungsumgebung. Datenquelle SAP ECC Tabelle: VBRK, Feld: WAERK Beispiele USDEURGBPJPY | |||
| Zahlungsbedingungen PaymentTerms | Die Bedingungen, unter denen ein Verkäufer einen Verkauf abschließt, einschließlich des Zahlungsplans. | ||
| Beschreibung Zahlungsbedingungen definieren die Regeln, wann eine Zahlung fällig ist, z.B. 'Net 30' oder 'Net 60'. Diese Bedingungen werden mit dem Kunden vereinbart und sind ein Schlüsselfaktor für die Bestimmung des Die Analyse des Prozesses nach Zahlungsbedingungen kann aufzeigen, ob bestimmte Bedingungen mit längeren Zahlungszyklen oder höheren Raten verspäteter Zahlungen verbunden sind. Diese Erkenntnis kann dem Unternehmen helfen, bessere Bedingungen mit Kunden zu verhandeln oder seine Finanzplanung anzupassen. Sie ist auch eine wichtige Eingabe für die Berechnung des Rechnungsfälligkeitsdatums. Bedeutung Hilft bei der Analyse des Zahlungsverhaltens von Kunden und der Auswirkungen auf den Datenquelle SAP ECC Tabelle: VBRK, Feld: ZTERM Beispiele Z030Z060Z001 | |||
Order-to-Cash – Fakturierungs- & Rechnungsstellungs-Aktivitäten
| Aktivität | Beschreibung | ||
|---|---|---|---|
| `Rechnung an Kunden gesendet` | Zeigt an, dass die Rechnung über einen definierten Ausgabekanal wie Druck, E-Mail oder EDI an den Kunden versandt wurde. Dies wird typischerweise aus den Protokollen des `Output-Management-Systems` erfasst. | ||
| Bedeutung Dieses Datenquelle Kann aus dem Verarbeitungsdatum und der Uhrzeit in der Nachrichtenstatustabelle ( Erfassen Abgeleitet aus dem NAST-Tabelleneintrag mit Verarbeitungsstatus '1' (erfolgreich verarbeitet). Ereignistyp inferred | |||
| Kundenzahlung eingegangen | Eine Zahlung wurde vom Kunden erhalten und im `System` als Kassenbeleg oder Bankeinzahlung gebucht. Dies erzeugt einen separaten Zahlungsbeleg, der noch nicht der spezifischen Rechnung zugeordnet ist. | ||
| Bedeutung Dies ist ein wichtiger Meilenstein im Datenquelle Wird als neues Dokument in BKPF und BSEG erfasst, typischerweise mit einem Belegtyp, der auf Kundenzahlung hinweist, wie 'DZ'. Das Buchungsdatum (BUDAT) markiert das Erfassen Aus dem Buchungsdatum des Kundenzahlungsbelegs in der BKPF. Ereignistyp explicit | |||
| Rechnung ausgeglichen | Der endgültige Status einer erfolgreich bezahlten Rechnung, der anzeigt, dass der offene Posten durch eine entsprechende Zahlung oder Gutschrift abgeschlossen wurde. Die Rechnung gilt als vollständig beglichen. | ||
| Bedeutung Markiert den erfolgreichen Abschluss des Datenquelle Tritt auf, wenn die Felder für den Ausgleichsbeleg (AUGBL) und das Ausgleichsdatum (AUGDT) für die Rechnungsposition in der Tabelle BSEG gefüllt werden. Erfassen Das Ereignis tritt am Ausgleichsdatum (AUGDT) ein, das in der Tabelle BSEG für die Rechnungszeile erfasst wurde. Ereignistyp explicit | |||
| Rechnung erstellt | Markiert die Erstellung des Fakturierungsbelegs im System. Dieses `Event` wird erfasst, wenn ein neuer Eintrag in der Buchhaltungsbelegkopftabelle (BKPF) mit einem spezifischen Belegtyp für Rechnungen erstellt wird. | ||
| Bedeutung Dies ist der Startpunkt für den gesamten Rechnungsstellungsprozess. Die Analyse der Zeit ab diesem Datenquelle Erfasst in Tabelle BKPF. Das Erstellungsdatum (CPUDT) und die Uhrzeit (CPUTM) für eine spezifische Belegnummer (BELNR) markieren dieses Erfassen Aus dem Erstellungszeitstempel (CPUDT) in der Tabelle BKPF für den Rechnungsbeleg. Ereignistyp explicit | |||
| Rechnung gebucht | Die Rechnung wird formell im Nebenbuch der Debitorenbuchhaltung und im Hauptbuch erfasst. Dieses `Event` macht die Rechnung rechtsverbindlich und spiegelt die vom Kunden geschuldete Schuld wider. | ||
| Bedeutung Dies ist ein kritischer Meilenstein, der offiziell die Inkassouhr startet. Die Zeit zwischen Generierung und Buchung kann interne Verarbeitungsverzögerungen aufzeigen, die den Datenquelle Erfasst in Tabelle BKPF. Das Buchungsdatum (BUDAT) für die Belegnummer (BELNR) markiert dieses Erfassen Aus dem Buchungsdatum (BUDAT) in der Tabelle BKPF für den Rechnungsbeleg. Ereignistyp explicit | |||
| Rechnung abgeschrieben | Ein alternativer Endstatus, bei dem die Rechnung als uneinbringlich gilt und der ausstehende Betrag gegen ein uneinbringliches Forderungskonto ausgeglichen wird. Dies schließt die Rechnung ohne Kundenzahlung ab. | ||
| Bedeutung Stellt ein negatives Prozessergebnis und Umsatzverluste dar. Die Verfolgung dieser Datenquelle Abgeleitet durch Analyse der Ausgleichsbuchung für die Rechnung. Wenn der Ausgleichsbeleg auf ein spezifisches Sachkonto für Forderungsverluste gebucht wird, gilt die Rechnung als abgeschrieben. Erfassen Abgeleitet, wenn die Ausgleichstransaktion eine Buchung auf ein dafür vorgesehenes Sachkonto für Forderungsverluste beinhaltet. Ereignistyp inferred | |||
| Rechnung freigegeben | Stellt die formelle Genehmigung der Rechnung dar, die deren Buchung oder den Versand an den Kunden ermöglicht. Dies wird oft abgeleitet, wenn ein geparktes Dokument in ein gebuchtes Dokument umgewandelt wird. | ||
| Bedeutung Verfolgt den internen Genehmigungs- Datenquelle Kann durch den Übergang eines Belegs vom geparkten Erfassen Vergleichen Sie das Erstellungsdatum des geparkten Belegs ( Ereignistyp inferred | |||
| Rechnung geparkt | Das Rechnungsdokument wurde in einem vorläufigen Zustand gespeichert, ohne im Hauptbuch gebucht zu werden. Dies wird oft verwendet, wenn Informationen unvollständig sind oder vor der endgültigen Buchung überprüft werden müssen. | ||
| Bedeutung Verfolgt Vorbuchungsschritte und potenzielle Verzögerungen. Eine lange Dauer im geparkten Zustand kann auf Datenquelle Geparkte Dokumente werden in der Tabelle VBKPF gespeichert. Die Erstellung eines Dokuments hier, das später gebucht wird, kennzeichnet diese Aktivität. Erfassen Wird beim Speichern eines geparkten Dokuments mittels einer Transaktion wie FV70 protokolliert. Ereignistyp explicit | |||
| Rechnung korrigiert | Stellt eine `Rework`-Aktivität dar, bei der eine ursprüngliche Rechnung als fehlerhaft befunden und anschließend storniert wurde. Dies wird durch die Identifizierung von Stornobelegen erfasst, die mit der Originalrechnung verknüpft sind. | ||
| Bedeutung Hebt Prozessineffizienzen und Qualitätsprobleme hervor. Eine hohe Häufigkeit von Korrekturen signalisiert Probleme in den vorgelagerten Datenquelle Identifiziert durch das Auffinden eines Stornobelegs, bei dem BKPF-STBLG auf den Originalbeleg verweist. Die Erstellung dieses Stornobelegs ist das Erfassen Wird protokolliert, wenn ein Stornobeleg erstellt wird (z.B. über FB08). Ereignistyp explicit | |||
| Rechnungsfälligkeitsdatum erreicht | Ein berechnetes `Event`, das den Tag markiert, an dem die Rechnungszahlung gemäß den Zahlungsbedingungen offiziell fällig ist. Es ist keine von einem Benutzer oder System ausgeführte `Aktivität`, sondern ein kritischer Zeitpunkt. | ||
| Bedeutung Unerlässlich für die Analyse von Zahlungsverhalten und Compliance. Dies ist die Basis zur Bestimmung pünktlicher vs. verspäteter Zahlungen und zur Berechnung der Pünktlichkeitsquote. Datenquelle Abgeleitet durch Vergleich des aktuellen Datums mit dem Erfassen Vergleichen Sie das Systemdatum mit dem Ereignistyp calculated | |||
| Streitfall angelegt | Ein formeller Einspruch gegen die Rechnung wurde protokolliert, typischerweise aufgrund von Kundenbeschwerden. Dies wird im SAP `Dispute Management` `System` erfasst. | ||
| Bedeutung Identifiziert Rechnungen, die von Zahlungsverzögerungen bedroht sind, und hebt zugrunde liegende Probleme hervor, die zu Kundenunzufriedenheit führen. Dies markiert den Beginn eines wichtigen Prozesses zur Ausnahmebehandlung. Datenquelle Erfasst aus der Erstellung eines Erfassen Wird protokolliert, wenn ein Benutzer einen Streitfall über die Transaktion UDM_DISPUTE anlegt. Ereignistyp explicit | |||
| Zahlung auf Rechnung verbucht | Die eingegangene Kundenzahlung wurde der spezifischen offenen Rechnung zugeordnet und verrechnet, wodurch der Posten zum Ausgleich markiert wird. Dies ist der Abstimmungsschritt, der die Zahlung mit der Schuld verknüpft. | ||
| Bedeutung Diese Aktivität ist entscheidend für die Messung der Datenquelle Abgeleitet aus der Ausgleichstransaktion, z.B. F-32, welche die Ausgleichsfelder in der Rechnungsposition befüllt. Das Erfassen Abgeleitet aus dem Ausgleichsdatum (AUGDT) in der Rechnungspositionstabelle (BSEG). Ereignistyp inferred | |||
| Zahlungserinnerung versandt | Das System hat eine Mahnung oder Zahlungserinnerung für eine überfällige Rechnung generiert und an den Kunden gesendet. Dies wird aus den Mahnhistorien-`Logs` erfasst. | ||
| Bedeutung Hilft bei der Bewertung der Effektivität der Inkassostrategie. Die Analyse der Zeitspanne von der Mahnung bis zum Zahlungseingang ist entscheidend für den Datenquelle Erfasst in den Mahndaten-Tabellen, insbesondere MHNK (Mahnkopfdaten) und MHND (Mahnpositionen), die durch den Mahnlauf (Transaktion F150) generiert werden. Erfassen Wird bei Ausführung eines Mahnlaufs (F150) für den überfälligen Posten protokolliert. Ereignistyp explicit | |||
Extraktionsleitfäden
Schritte
- ABAP Editor aufrufen: Melden Sie sich an Ihrem SAP ECC-System an. Navigieren Sie mit dem Transaktionscode
SE38zum ABAP Editor. - Programm erstellen: Geben Sie im Feld 'Programm' einen Namen für Ihr neues Programm ein, z. B.
Z_PM_O2C_INVOICE_EXTRACT, und klicken Sie auf die Schaltfläche 'Erstellen'. Geben Sie einen aussagekräftigen Titel an und setzen Sie den Programmtyp auf 'Ausführbares Programm'. - Selektionsbild definieren: Definieren Sie im Programmquelltext die Parameter des Selektionsbilds. Dies ermöglicht Benutzern, die
Datenfür die Extraktion zu filtern. Schlüsselparameter umfassen den Datumsbereich der Belegbuchung (S_ERDAT), den Buchungskreis (S_BUKRS) und die Fakturabelegart (S_VBTYP). - Datenstrukturen definieren: Deklarieren Sie eine interne Tabellenstruktur, die die finalen
Event Log Datenaufnehmen wird. Diese Struktur muss Felder fürInvoiceNumber,ActivityName,EventTimeund empfohleneAttributewieUserName,BillingDocumentType,CustomerNumber,CompanyCodeundTotalInvoiceAmountenthalten. - Daten-Selektionslogik implementieren: Schreiben Sie die zentrale ABAP-Logik zur
Datenselektion. Wählen Sie zuerst die primären Fakturabelege aus den TabellenVBRKundBKPFbasierend auf den Eingaben des Benutzers im Selektionsbild aus. Speichern Sie diese in einer temporären internen Tabelle. Aktivitätenextrahieren: Durchlaufen Sie die initiale Liste der Fakturabelege. Führen Sie für jeden Beleg nachfolgende Selektionen aus verschiedenen Tabellen durch, um die 13 erforderlichenAktivitätenzu identifizieren. Fragen Sie beispielsweise die TabelleNASTnachEvents'Rechnung an Kunden gesendet',BSEGnach Informationen zur Ausbuchung (Invoice Cleared,Payment Applied) undMHNKnach Mahndaten('Zahlungserinnerung gesendet') ab.Event LogTabelle aufbauen: Füllen Sie für jede im vorherigen Schritt gefundeneAktivitäteinen neuen Datensatz in Ihrer finalen internenEvent LogTabelle. Stellen Sie sicher, dass dieInvoiceNumber,ActivityName,EventTimeund andereAttributekorrekt aus den Quelltabellen zugeordnet werden.- Auf Applikationsserver schreiben: Sobald die Schleife abgeschlossen und die finale
Event LogTabelle vollständig gefüllt ist, verwenden Sie die AnweisungenOPEN DATASET,LOOP AT... TRANSFERundCLOSE DATASET, um den Inhalt der internen Tabelle in eineFlatfileauf dem SAP Applikationsserver zu schreiben. Geben Sie einen logischen Dateipfad an, der zugänglich ist. - Datei abrufen: Verwenden Sie den Transaktionscode
AL11, um in den Verzeichnissen des Applikationsservers zu navigieren und die generierte Datei zu finden. Koordinieren Sie sich mit Ihrem SAP Basis-Team, um die Datei vom Server auf Ihren lokalen Rechner oder an einen freigegebenen Netzwerkstandort zudownloaden. - Endgültige Formatierung: Öffnen Sie die
gedownloadeteDatei und bestätigen Sie, dass es sich um eine kommagetrennte Wertedatei (CSV) mit einer Kopfzeile handelt. Stellen Sie sicher, dass die Datei mit UTF-8-Codierung gespeichert wird, um mitProcessMindfür denUploadkompatibel zu sein.
Konfiguration
- Voraussetzungen: Zugriff zum Erstellen und Ausführen von ABAP-Programmen (Transaktion SE38). Berechtigung zum Lesen aus FI- und SD-Tabellen, einschließlich
VBRK,VBRP,BKPF,BSEG,NAST,MHNKundUDM_CASE_ATTR00(für dasDispute Management). - Datumsbereichsauswahl: Das Programm sollte einen obligatorischen Datumsbereichsparameter haben, typischerweise basierend auf dem Belegbuchungsdatum (
ERDATin VBRK/BKPF). Für die erste Extraktion wird ein Bereich von 3-6 Monaten empfohlen, um denDatensatzüberschaubar zu halten. - Schlüsselfilter: Filtern Sie immer nach
CompanyCode(BUKRS), um den Umfang der Extraktion zu begrenzen. Es wird auch dringend empfohlen, nach Fakturabelegart (VBTYPaus VBRK) oder Buchhaltungsbelegart (BLARTaus BKPF) zu filtern, um nur relevante Rechnungsarten einzubeziehen, z. B. 'RV' für Standardbuchhaltungsrechnungen, und Gutschriften oder andere Belege auszuschließen. - Leistungsüberlegungen: Für große
Datensätze, die mehr als einige Monate umfassen, sollte das Programm als Hintergrundjob ausgeführt werden, umSession Timeoutszu vermeiden. Die ABAP-Logik sollte optimiert werden, um indizierte Tabellenlesezugriffe zu verwenden und verschachtelte Schleifen mitDatenbankselektionenzu vermeiden.Datenzuerst in interne Tabellen zu selektieren und dann zu verarbeiten, ist der bevorzugte Ansatz. - Ausgabedateikonfiguration: Der ABAP-Code muss den Ausgabedateipfad auf dem Applikationsserver und das Trennzeichen für die CSV-Datei angeben, typischerweise ein Komma oder Semikolon. Stellen Sie sicher, dass der Pfad ein global konfiguriertes und zugängliches Verzeichnis ist.
a Beispielabfrage abap
REPORT Z_PM_O2C_INVOICE_EXTRACT.
*&---------------------------------------------------------------------*
*& Tables
*&---------------------------------------------------------------------*
TABLES: VBRK, BKPF.
*&---------------------------------------------------------------------*
*& Type Definitions for Event Log Output
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoicenumber TYPE vbrk-vbeln,
activityname TYPE string,
eventtime TYPE timestamp,
username TYPE xubname,
billingdocumenttype TYPE vbrk-vbtyp,
customernumber TYPE vbrk-kunnr,
companycode TYPE vbrk-bukrs,
totalinvoiceamount TYPE vbrk-netwr,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: gt_event_log TYPE TABLE OF ty_event_log,
gs_event_log TYPE ty_event_log.
DATA: BEGIN OF gs_invoice,
vbeln TYPE vbrk-vbeln, " SD Doc (Invoice)
awkey TYPE bkpf-awkey, " Accounting Doc Reference Key
bukrs TYPE vbrk-bukrs, " Company Code
kunnr TYPE vbrk-kunnr, " Customer
vbtyp TYPE vbrk-vbtyp, " SD Doc Type
netwr TYPE vbrk-netwr, " Net Value
waerk TYPE vbrk-waerk, " Currency
fkdat TYPE vbrk-fkdat, " Billing Date
erdat TYPE vbrk-erdat, " Creation Date
erzet TYPE vbrk-erzet, " Creation Time
ernam TYPE vbrk-ernam, " Creator
belnr TYPE bkpf-belnr, " Acct Doc
gjahr TYPE bkpf-gjahr, " Fiscal Year
cpudt TYPE bkpf-cpudt, " Acct Doc Entry Date
cputm TYPE bkpf-cputm, " Acct Doc Entry Time
usnam TYPE bkpf-usnam, " Acct Doc User
stblg TYPE bkpf-stblg, " Reversal Doc
END OF gs_invoice.
DATA: gt_invoices LIKE TABLE OF gs_invoice.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbrk-erdat OBLIGATORY,
s_bukrs FOR vbrk-bukrs OBLIGATORY,
s_vbtyp FOR vbrk-vbtyp.
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/trans/tmp/invoice_extract.csv' OBLIGATORY.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" 1. Select base set of invoices
SELECT vbrk~vbeln, vbrk~bukrs, vbrk~kunnr, vbrk~vbtyp, vbrk~netwr, vbrk~waerk,
vbrk~fkdat, vbrk~erdat, vbrk~erzet, vbrk~ernam,
bkpf~belnr, bkpf~gjahr, bkpf~cpudt, bkpf~cputm, bkpf~usnam, bkpf~stblg, bkpf~awkey
INTO CORRESPONDING FIELDS OF TABLE gt_invoices
FROM vbrk
INNER JOIN bkpf ON bkpf~awkey = vbrk~vbeln AND bkpf~awtyp = 'VBRK'
WHERE vbrk~erdat IN s_erdat
AND vbrk~bukrs IN s_bukrs
AND vbrk~vbtyp IN s_vbtyp.
IF gt_invoices IS INITIAL.
MESSAGE 'No invoices found for the selected criteria.' TYPE 'I'.
RETURN.
ENDIF.
LOOP AT gt_invoices INTO gs_invoice.
CLEAR gs_event_log.
gs_event_log-invoicenumber = gs_invoice-vbeln.
gs_event_log-billingdocumenttype = gs_invoice-vbtyp.
gs_event_log-customernumber = gs_invoice-kunnr.
gs_event_log-companycode = gs_invoice-bukrs.
gs_event_log-totalinvoiceamount = gs_invoice-netwr.
" Activity: Invoice Generated (using accounting doc creation)
gs_event_log-activityname = 'Invoice Generated'.
gs_event_log-username = gs_invoice-usnam.
CONCATENATE gs_invoice-cpudt gs_invoice-cputm INTO DATA(lv_ts_gen).
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Posted (same as generated for non-parked docs)
gs_event_log-activityname = 'Invoice Posted'.
gs_event_log-username = gs_invoice-usnam.
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Approved (inferred by posting)
gs_event_log-activityname = 'Invoice Approved'.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Sent To Customer
SELECT SINGLE addat, aduhr FROM nast
INTO (DATA(lv_nast_date), DATA(lv_nast_time))
WHERE kappl = 'V3' AND objky = gs_invoice-vbeln AND vszst > '0'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Sent To Customer'.
gs_event_log-username = sy-uname.
CONVERT DATE lv_nast_date TIME lv_nast_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Corrected / Reversed
IF gs_invoice-stblg IS NOT INITIAL.
SELECT SINGLE cpudt, cputm, usnam FROM bkpf
INTO (DATA(lv_rev_date), DATA(lv_rev_time), DATA(lv_rev_user))
WHERE belnr = gs_invoice-stblg AND gjahr = gs_invoice-gjahr.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Corrected'.
gs_event_log-username = lv_rev_user.
CONVERT DATE lv_rev_date TIME lv_rev_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
" Activity: Payment Applied, Cleared, Due Date, Written Off (from BSEG)
SELECT SINGLE augdt, augbl, zfBDT, hkont FROM bseg
INTO (DATA(lv_augdt), DATA(lv_augbl), DATA(lv_zfbdt), DATA(lv_hkont))
WHERE bukrs = gs_invoice-bukrs
AND belnr = gs_invoice-belnr
AND gjahr = gs_invoice-gjahr
AND koart = 'D'. " Customer line
IF sy-subrc = 0.
" Due Date Reached (Calculated event)
IF lv_zfbdt IS NOT INITIAL.
gs_event_log-activityname = 'Invoice Due Date Reached'.
gs_event_log-username = 'System'.
CONVERT DATE lv_zfbdt INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Cleared, Applied, Write-Off
IF lv_augdt IS NOT INITIAL.
SELECT SINGLE usnam, cpudt, cputm, blart FROM bkpf
INTO (DATA(lv_clear_user), DATA(lv_clear_date), DATA(lv_clear_time), DATA(lv_clear_type))
WHERE belnr = lv_augbl AND bukrs = gs_invoice-bukrs.
IF sy-subrc = 0.
gs_event_log-username = lv_clear_user.
CONVERT DATE lv_clear_date TIME lv_clear_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
IF lv_clear_type = 'DZ'. " Standard Customer Payment
gs_event_log-activityname = 'Customer Payment Received'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Payment Applied To Invoice'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Invoice Cleared'. APPEND gs_event_log TO gt_event_log.
ELSE. " Assuming other clearing doc types could be write-offs
gs_event_log-activityname = 'Invoice Written Off'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
" Activity: Payment Reminder Issued (Dunning)
SELECT COUNT(*) FROM mhnk WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
IF sy-subrc = 0 AND sy-dbcnt > 0.
SELECT SINGLE lafdn FROM mhnk
INTO DATA(lv_dunning_date)
WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
gs_event_log-activityname = 'Payment Reminder Issued'.
gs_event_log-username = 'System'.
CONVERT DATE lv_dunning_date INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Parked (Example from VBKPF, may require system specific logic)
SELECT SINGLE cpudt, cputm, usnam FROM vbkpf
INTO (DATA(lv_park_date), DATA(lv_park_time), DATA(lv_park_user))
WHERE awkey = gs_invoice-vbeln AND awsys = 'LOG' AND bstat = 'V'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Parked'.
gs_event_log-username = lv_park_user.
CONVERT DATE lv_park_date TIME lv_park_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Dispute Case Created (Requires Dispute Management module)
SELECT SINGLE create_date, create_time, create_user FROM udm_case_attr00
INTO (DATA(lv_disp_date), DATA(lv_disp_time), DATA(lv_disp_user))
WHERE [Your logic to link invoice to dispute case, e.g., via a custom field or object link].
IF sy-subrc = 0.
gs_event_log-activityname = 'Dispute Case Created'.
gs_event_log-username = lv_disp_user.
CONVERT DATE lv_disp_date TIME lv_disp_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Write data to file
*&---------------------------------------------------------------------*
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
" Header
DATA(lv_header) = 'InvoiceNumber,ActivityName,EventTime,UserName,BillingDocumentType,CustomerNumber,CompanyCode,TotalInvoiceAmount'.
TRANSFER lv_header TO p_path.
LOOP AT gt_event_log INTO gs_event_log.
DATA(lv_line) = |
{ gs_event_log-invoicenumber }|
,{ gs_event_log-activityname }|
,{ gs_event_log-eventtime }|
,{ gs_event_log-username }|
,{ gs_event_log-billingdocumenttype }|
,{ gs_event_log-customernumber }|
,{ gs_event_log-companycode }|
,{ gs_event_log-totalinvoiceamount }|.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: 'Extraction complete. File created at:', p_path. Schritte
- Voraussetzungen und Zugriff: Stellen Sie sicher, dass Sie einen Datenbankbenutzer mit Lesezugriff auf die erforderlichen SAP ECC-Tabellen haben, einschließlich VBRK, BKPF, BSAD, NAST, CDHDR, CDPOS, SCASE, und andere, die in der Abfrage angegeben sind. Dieses Zugriffslevel wird typischerweise nur Systemadministratoren oder spezifischen
Datenanalyse-Teams gewährt. - Verbindung zur Datenbank herstellen: Verwenden Sie ein Standard-SQL-Client-Tool, wie
DBeaver,Oracle SQL DeveloperoderMicrosoft SQL Server Management Studio, um eine Verbindung zur SAP ECC-Datenbank herzustellen. - SQL-Abfrage vorbereiten: Kopieren Sie die vollständige SQL-Abfrage aus dem Abschnitt 'Abfrage' in den Editor Ihres SQL-Clients.
- Platzhalter anpassen: Die Abfrage enthält mehrere Platzhalter, die Sie durch spezifische Werte Ihrer Umgebung ersetzen müssen. Dazu gehören:
'JJJJMMTT': Ersetzen Sie alle Instanzen durch das Start- und Enddatum für Ihren gewünschten Analysezeitraum. Es ist entscheidend, dieDatenauf einen überschaubaren Zeitraum zu filtern.'XXXX': Ersetzen Sie durch den/die spezifischen Buchungskreis(e), die Sie analysieren möchten.[Ihre Rechnungs-Ausgabeart]: Geben Sie den Code der Ausgabeart an, der zum Versenden von Rechnungen an Kunden verwendet wird, z. B. 'RD00'.[Ihr Sachkonto für uneinbringliche Forderungen]: Geben Sie die Sachkontonummer ein, die zum Abschreiben uneinbringlicher Rechnungen verwendet wird.[IhrDispute CaseRechnungsattribut]: Geben Sie denAttributnamenan, der zum Speichern der Rechnungsnummer in IhrerDispute ManagementKonfiguration verwendet wird, z. B. 'INVOICE_ID'.
TimestampFunktionen überprüfen: Die Abfrage verwendet eine generischeCAST(CONCAT(date_field, time_field) AS TIMESTAMP)Syntax. Möglicherweise müssen Sie dies an Ihr spezifisches Datenbanksystem anpassen, z. B.TO_TIMESTAMPfürOracleoderDATETIMEFROMPARTSfürSQL Serververwenden.- Abfrage ausführen: Führen Sie die modifizierte Abfrage aus. Die Ausführung kann eine erhebliche Zeit in Anspruch nehmen, abhängig von der Größe Ihrer SAP-Tabellen und dem ausgewählten Datumsbereich.
- Ergebnisse überprüfen: Sobald die Abfrage abgeschlossen ist, überprüfen Sie die Ausgabe, um sicherzustellen, dass sie die erwarteten Spalten enthält:
InvoiceNumber,ActivityName,EventTimeund die empfohlenenAttribute. Prüfen Sie auf Fehler oder leere Ergebnisse. - Als CSV exportieren: Exportieren Sie das komplette Ergebnis aus Ihrem
SQL Clientin eine CSV-Datei. Stellen Sie sicher, dass die Datei die UTF-8-Kodierung verwendet, um Probleme mit Sonderzeichen zu vermeiden. - Für
Uploadvorbereiten: Bevor Sie in einProcess MiningTooluploaden, bestätigen Sie, dass die CSV-Spaltenüberschriften exakt den erforderlichenAttributnamenentsprechen, z. B.InvoiceNumber,ActivityName,EventTime,UserName.
Konfiguration
- Datenbankverbindung: Eine direkte, schreibgeschützte SQL-Verbindung zur zugrunde liegenden SAP ECC-Datenbank ist erforderlich. Diese Methode umgeht die SAP-Anwendungsschicht vollständig.
- Berechtigung: Der Datenbankbenutzer muss über
SELECT-Berechtigungen für alle in der Abfrage verwendeten Tabellen verfügen, die die Module FI, SD und potenziell FSCM umfassen. - Datumsbereich: Es ist entscheidend, die Abfrage nach einem bestimmten Datumsbereich zu filtern, um eine angemessene Leistung und Datenmenge zu gewährleisten. Wir empfehlen, mit einem Zeitraum von 3 bis 6 Monaten zu beginnen. Die Platzhalter für den Datumsfilter
'JJJJMMTT'müssen in mehreren Teilen der Abfrage gesetzt werden. - Buchungskreisfilter: Die Abfrage ist so konzipiert, dass sie nach Buchungskreis (
BUKRS) gefiltert wird. Die Analyse von einem oder wenigen Buchungskreisen gleichzeitig ist gängige Praxis. - Belegartenkonfiguration: Die Logik zur Identifizierung von
Eventswie Rechnungsberichtigungen, Abschreibungen oder versendeten Belegen hängt von Standard-SAP-Konfigurationen ab. Möglicherweise müssen Sie die Abfrage anpassen, wenn Ihr Unternehmen benutzerdefinierte Belegarten (BLART), Ausgabearten (KSCHL) oder Sachkonten für diese Prozesse verwendet. - Leistungsüberlegungen: Die Ausführung dieser Abfrage in einem aktiven SAP-Produktionssystem kann erhebliche Ressourcen verbrauchen und die Betriebsleistung beeinträchtigen. Es wird dringend empfohlen, große Extraktionen außerhalb der Spitzenzeiten oder auf einer dedizierten Berichtsreplik der Datenbank durchzuführen.
a Beispielabfrage sql
WITH InvoiceBase AS (
SELECT
VBRK.VBELN AS InvoiceNumber,
VBRK.FKART AS BillingDocumentType,
VBRK.KUNRG AS CustomerNumber,
VBRK.BUKRS AS CompanyCode,
VBRK.NETWR AS TotalInvoiceAmount,
VBRK.ERNAM AS CreatorName,
VBRK.ERDAT AS CreationDate,
VBRK.ERZET AS CreationTime
FROM VBRK
WHERE VBRK.ERDAT BETWEEN '20230101' AND '20231231' -- Filter by Invoice Creation Date
AND VBRK.BUKRS IN ('1000') -- Filter by Company Code
AND VBRK.FKART NOT IN ('S1', 'S2') -- Exclude cancelled invoices
)
-- 1. Invoice Generated
SELECT
ib.InvoiceNumber,
'Invoice Generated' AS ActivityName,
CAST(CONCAT(ib.CreationDate, ib.CreationTime) AS TIMESTAMP) AS EventTime,
ib.CreatorName AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM InvoiceBase ib
UNION ALL
-- 2. Invoice Parked
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Parked' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = 'V' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 3. Invoice Posted
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Posted' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = '' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 4. Invoice Approved (from Parked to Posted)
SELECT
SUBSTRING(h.OBJECTID, 4, 10) AS InvoiceNumber,
'Invoice Approved' as ActivityName,
CAST(CONCAT(h.UDATE, h.UTIME) AS TIMESTAMP) AS EventTime,
h.USERNAME AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM CDHDR h
JOIN CDPOS p ON h.MANDANT = p.MANDANT AND h.OBJECTCLAS = p.OBJECTCLAS AND h.OBJECTID = p.OBJECTID AND h.CHANGENR = p.CHANGENR
JOIN InvoiceBase ib ON SUBSTRING(h.OBJECTID, 4, 10) = ib.InvoiceNumber
WHERE h.OBJECTCLAS = 'BELEGV'
AND p.TABNAME = 'BKPF'
AND p.FNAME = 'BSTAT'
AND p.VALUE_OLD = 'V'
AND p.VALUE_NEW = ' '
AND h.UDATE BETWEEN '20230101' AND '20231231'
UNION ALL
-- 5. Invoice Sent To Customer
SELECT
n.OBJKY AS InvoiceNumber,
'Invoice Sent To Customer' AS ActivityName,
CAST(CONCAT(n.DATVR, n.UHRVR) AS TIMESTAMP) AS EventTime,
n.VSTAT AS UserName, -- User who processed is not directly available, using processing status as a proxy
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM NAST n
JOIN InvoiceBase ib ON n.OBJKY = ib.InvoiceNumber
WHERE n.KSCHL = '[Your Invoice Output Type]' -- E.g., 'RD00'
AND n.VSTAT = '1' -- Processed successfully
AND n.DATVR BETWEEN '20230101' AND '20231231'
UNION ALL
-- 6. Invoice Corrected (Reversed)
SELECT
SUBSTRING(orig_doc.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Corrected' AS ActivityName,
CAST(CONCAT(rev_doc.CPUDT, rev_doc.CPUTM) AS TIMESTAMP) AS EventTime,
rev_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
rev_doc.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF orig_doc
JOIN BKPF rev_doc ON orig_doc.STBLG = rev_doc.BELNR AND orig_doc.BUKRS = rev_doc.BUKRS AND orig_doc.GJAHR = rev_doc.STJAH
JOIN InvoiceBase ib ON SUBSTRING(orig_doc.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE orig_doc.AWTYP = 'VBRK' AND orig_doc.STBLG IS NOT NULL AND rev_doc.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 7. Invoice Due Date Reached
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Due Date Reached' AS ActivityName,
CAST(CONCAT(bs.ZFBDT, '000000') AS TIMESTAMP) AS EventTime,
'System' AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSEG bs
JOIN BKPF b ON bs.MANDT = b.MANDT AND bs.BUKRS = b.BUKRS AND bs.BELNR = b.BELNR AND bs.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND bs.KOART = 'D' AND bs.ZFBDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 8. Payment Reminder Issued
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Payment Reminder Issued' AS ActivityName,
CAST(CONCAT(h.LAUFD, '000000') AS TIMESTAMP) AS EventTime,
h.LAUFI AS UserName, -- Dunning Run ID
ib.BillingDocumentType,
ib.CustomerNumber,
d.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM MHND d
JOIN MHNK h ON d.MANDT = h.MANDT AND d.LAUFD = h.LAUFD AND d.LAUFI = h.LAUFI
JOIN BKPF b ON d.MANDT = b.MANDT AND d.BUKRS = b.BUKRS AND d.BELNR = b.BELNR AND d.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE h.LAUFD BETWEEN '20230101' AND '20231231'
UNION ALL
-- 9. Dispute Case Created
SELECT
attr.ATTR_VALUE AS InvoiceNumber,
'Dispute Case Created' AS ActivityName,
sc.CREATE_TIME AS EventTime,
sc.CREATED_BY AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM SCMG_T_CASE_ATTR attr
JOIN SCASE sc ON attr.CASE_GUID = sc.CASE_GUID
JOIN InvoiceBase ib ON attr.ATTR_VALUE = ib.InvoiceNumber
WHERE attr.ATTR_NAME = '[Your Dispute Case Invoice Attribute]' -- e.g., 'INVOICE_ID'
AND CAST(sc.CREATE_TIME AS DATE) BETWEEN '20230101' AND '20231231'
UNION ALL
-- 10, 11, 12. Clearing Events (Payment, Clearing, Write-Off)
SELECT
InvoiceNumber,
ActivityName,
EventTime,
UserName,
BillingDocumentType,
CustomerNumber,
CompanyCode,
TotalInvoiceAmount
FROM (
SELECT
bsad.XBLNR AS InvoiceNumber,
CASE
WHEN clearing_item.HKONT = '[Your Bad Debt G/L Account]' THEN 'Invoice Written Off'
ELSE 'Customer Payment Received'
END AS ActivityName,
CAST(CONCAT(clearing_doc.CPUDT, clearing_doc.CPUTM) AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
LEFT JOIN BSEG clearing_item ON clearing_doc.MANDT = clearing_item.MANDT AND clearing_doc.BUKRS = clearing_item.BUKRS AND clearing_doc.BELNR = clearing_item.BELNR AND clearing_doc.GJAHR = clearing_item.GJAHR AND clearing_item.HKONT = '[Your Bad Debt G/L Account]' -- e.g. '148000'
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Payment Applied To Invoice' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '000000') AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Invoice Cleared' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '235959') AS TIMESTAMP) AS EventTime, -- Add time to separate from 'Payment Applied'
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
) AS ClearingEvents Schritte
- Voraussetzungen: Stellen Sie sicher, dass Sie ein lizenziertes ETL-Tool mit einem zertifizierten SAP-Konnektor verwenden (z. B. Informatica, Talend etc.). Sie benötigen SAP-Zugangsdaten mit Leseberechtigung für die relevanten Finanz-, Vertriebs- und Systemtabellen (BKPF, BSEG, VBRK, NAST, MHNK, UDM_CASE_ATTR00, CDHDR, CDPOS).
- SAP-Verbindung herstellen: Erstellen Sie in Ihrem ETL-Tool eine neue Verbindung zu Ihrem SAP ECC-System. Konfigurieren Sie Serverdetails, Mandant, Benutzer und Passwort und testen Sie die Verbindung.
- Datenquellen definieren: Definieren Sie für jede zu extrahierende Aktivität die entsprechenden SAP-Tabellen als Quelle in Ihrem ETL-Job, zum Beispiel VBRK für die Rechnungserstellung oder NAST für die Kundenkommunikation.
- Extraktionslogik für jede Aktivität aufbauen: Erstellen Sie separate Datenflüsse für alle 13 erforderlichen Aktivitäten. Filtern Sie die Datensätze nach Buchungskreis (BUKRS), Belegart (BLART) und dem gewünschten Zeitraum (z. B. Erstellungsdatum ERDAT).
- Felder mappen und Daten transformieren: Ordnen Sie die SAP-Quellfelder der Zielstruktur des Event Logs zu: InvoiceNumber, ActivityName, EventTime, UserName sowie weitere Attribute. Verwenden Sie Transformationslogik, um den 'ActivityName' pro Datenfluss festzulegen.
- Komplexe Aktivitäten verarbeiten: Für berechnete Events wie 'Invoice Due Date Reached' nutzen Sie das Basisdatum (ZFBDT) und die Zahlungsbedingungen oder ziehen Sie direkt das Nettofälligkeitsdatum (NETDT) aus der BSEG. Nutzen Sie Change-Log-Tabellen wie CDHDR/CDPOS für Genehmigungsschritte.
- Aktivitätsdaten zusammenführen: Nutzen Sie eine 'Union'- oder 'Merge'-Transformation, um die Ergebnisse aller 13 Datenflüsse in einem Datensatz zu vereinen. Achten Sie auf konsistente Spaltennamen und Datentypen.
- Zielort konfigurieren: Legen Sie das Ziel für Ihr Event Log fest. Dies kann eine CSV-Datei, eine Datenbanktabelle oder eine direkte Verbindung zu einer Staging-Area sein.
- Extraktionszeitplan festlegen: Konfigurieren Sie die Zeitparameter. Für den Initial-Load empfehlen wir 6-12 Monate an Historiendaten; für Delta-Loads extrahieren Sie die Daten seit dem letzten Lauf.
- Ausführen und Exportieren: Starten Sie den ETL-Job. Prüfen Sie nach Abschluss die CSV-Datei auf das korrekte Format für den Upload in ProcessMind.
Konfiguration
- SAP-Verbindung: Eine Applikationsserver-Verbindung zum Ziel-SAP-ECC-System ist erforderlich. Der SAP-Benutzer benötigt RFC-Zugriff und Berechtigungen für Tabellen wie VBRK, BKPF, BSEG, NAST und andere in der Abfrage angegebene.
- ETL-Tool-Lizenz: Eine gültige Lizenz für das kommerzielle ETL-Tool und seinen spezifischen SAP-Konnektor ist obligatorisch.
- Datumsbereich: Es wird empfohlen,
Datenfür einen Zeitraum von 3 bis 6 Monaten zu extrahieren, um eine repräsentative Stichprobe für die Analyse zu gewährleisten, ohne das System übermäßig zu belasten. Verwenden Sie einen konfigurierbaren Parameter für die Start- und Enddaten. - Schlüsselfilter: Filtern Sie immer nach Buchungskreis (BUKRS), um den Umfang der Extraktion zu begrenzen. Es ist auch entscheidend, nach den relevanten Fakturabelegarten (VBRK-FKART) und Buchhaltungsbelegarten (BKPF-BLART) zu filtern, um nur Standardrechnungen einzubeziehen und andere Belegarten wie Gutschriften oder interne Belege auszuschließen.
- Leistung: Das Extrahieren aus großen Tabellen wie BSEG kann langsam sein. Verwenden Sie selektive Filter, vermeiden Sie die Extraktion unnötiger Felder und planen Sie die Extraktion außerhalb der Spitzenzeiten, um die Leistungsbeeinträchtigung des SAP-Quellsystems zu minimieren.
a Beispielabfrage config
// ETL Data Extraction Logic for SAP Order-to-Cash Invoicing
// This represents the configuration logic within a graphical ETL tool.
// == Global Parameters ==
// $StartDate: '[Start Date]' (e.g., '2023-01-01')
// $EndDate: '[End Date]' (e.g., '2023-06-30')
// $CompanyCodes: '[Company Code(s)]' (e.g., '1000', '2000')
// $BillingDocTypes: '[Billing Document Type(s)]' (e.g., 'F1', 'F2')
// == Source 1: Invoice Generated ==
// Tables: VBRK
DATA_SOURCE generated_invoices FROM VBRK WHERE
ERDAT >= $StartDate AND ERDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND FKART IN ($BillingDocTypes)
MAP {
InvoiceNumber: VBELN,
ActivityName: 'Invoice Generated',
EventTime: ERDAT + ERZET, // Combine date and time
UserName: ERNAM,
BillingDocumentType: FKART,
CustomerNumber: KUNAG,
CompanyCode: BUKRS,
TotalInvoiceAmount: NETWR
}
// == Source 2: Invoice Posted ==
// Tables: BKPF joined with VBRK
DATA_SOURCE posted_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Posted',
EventTime: A.BUDAT + A.CPUTM, // Posting date and entry time
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 3: Invoice Parked ==
// Tables: BKPF joined with VBRK
DATA_SOURCE parked_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.CPUDT >= $StartDate AND A.CPUDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = 'V'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Parked',
EventTime: A.CPUDT + A.CPUTM,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 4: Invoice Approved (Transition from Parked to Posted) ==
// Tables: BKPF joined with VBRK
DATA_SOURCE approved_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
AND EXISTS (SELECT 1 FROM VBELEGV C WHERE C.BELNR = A.BELNR) // Check if it was ever parked
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Approved',
EventTime: A.BUDAT + A.CPUTM, // Use posting date as approval date
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 5: Invoice Sent To Customer ==
// Tables: NAST joined with VBRK
DATA_SOURCE sent_invoices FROM NAST as A
INNER JOIN VBRK as B ON (A.OBJKY = B.VBELN)
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND B.BUKRS IN ($CompanyCodes)
AND A.VSTAT = '1' // Successfully processed
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Sent To Customer',
EventTime: A.ERDAT + A.ERUHR,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: B.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 6: Invoice Corrected (Reversed) ==
// Tables: VBRK (for the reversal document)
DATA_SOURCE corrected_invoices FROM VBRK as A
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.SFAKN <> '' // SFAKN is the original cancelled invoice
MAP {
InvoiceNumber: A.SFAKN, // Case ID is the original invoice
ActivityName: 'Invoice Corrected',
EventTime: A.ERDAT + A.ERZET,
UserName: A.ERNAM,
BillingDocumentType: A.FKART,
CustomerNumber: A.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: NULL // Amount belongs to the reversal doc, not original
}
// == Source 7: Invoice Due Date Reached ==
// Tables: BSEG joined with VBRK
DATA_SOURCE due_invoices FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.NETDT >= $StartDate AND A.NETDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.KOART = 'D' // Customer line item
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Due Date Reached',
EventTime: A.NETDT, // Net due date
UserName: 'System',
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 8: Payment Reminder Issued ==
// Tables: MHNK, MHND, VBRK
DATA_SOURCE reminders FROM MHNK as A
INNER JOIN MHND as D ON (A.LAUFD = D.LAUFD AND A.LAUFI = D.LAUFI)
INNER JOIN VBRK as B ON (SUBSTRING(D.XBLNR, 1, 10) = B.VBELN) // XBLNR may need parsing
WHERE A.LAUFD >= $StartDate AND A.LAUFD <= $EndDate
AND D.BUKRS IN ($CompanyCodes)
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Reminder Issued',
EventTime: A.LAUFD, // Dunning date
UserName: A.IDAPS,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: D.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 9: Dispute Case Created ==
// Tables: UDM_CASE_ATTR00
DATA_SOURCE disputes FROM UDM_CASE_ATTR00 as A
WHERE A.CREATE_TIMESTAMP >= $StartDate // Timestamp format may vary
AND A.FIN_COMP_CODE IN ($CompanyCodes)
AND A.PROCESS = 'FIN_FSCM_DIS'
MAP {
InvoiceNumber: A.BILL_DOC_ID,
ActivityName: 'Dispute Case Created',
EventTime: A.CREATE_TIMESTAMP,
UserName: A.CREATE_USER,
BillingDocumentType: NULL,
CustomerNumber: A.BP_NUMBER,
CompanyCode: A.FIN_COMP_CODE,
TotalInvoiceAmount: A.DISPUTED_AMOUNT
}
// == Source 10: Customer Payment Received ==
// Tables: BKPF
DATA_SOURCE payments FROM BKPF
WHERE BUDAT >= $StartDate AND BUDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND BLART = 'DZ' // Example for Customer Payment
MAP {
InvoiceNumber: NULL, // Invoice not yet known
ActivityName: 'Customer Payment Received',
EventTime: BUDAT + CPUTM,
UserName: USNAM,
BillingDocumentType: NULL,
CustomerNumber: NULL, // Requires join to BSEG to get customer
CompanyCode: BUKRS,
TotalInvoiceAmount: NULL
}
// == Source 11 & 12: Payment Applied To Invoice & Invoice Cleared ==
// Tables: BSEG joined with VBRK
DATA_SOURCE cleared_items FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.AUGBL <> ''
// Generate two records from this source
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Applied To Invoice',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM, // User from header of original invoice doc
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
UNION WITH {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Cleared',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 13: Invoice Written Off ==
// Tables: BSEG (for the invoice line) and BKPF (for clearing doc type)
DATA_SOURCE written_off FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
INNER JOIN BKPF as C ON (A.AUGBL = C.BELNR AND A.BUKRS = C.BUKRS AND A.AUGGJ = C.GJAHR)
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND C.BLART = '[Your Write-Off Document Type]' // e.g., 'AB'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Written Off',
EventTime: A.AUGDT,
UserName: C.USNAM, // User who posted the write-off
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Final Union of all sources ==
OUTPUT generated_invoices
UNION ALL posted_invoices
UNION ALL parked_invoices
UNION ALL approved_invoices
UNION ALL sent_invoices
UNION ALL corrected_invoices
UNION ALL due_invoices
UNION ALL reminders
UNION ALL disputes
UNION ALL payments
UNION ALL cleared_items
UNION ALL written_off