Ihr Datentemplate für Purchase-to-Pay: Einkaufsbestellungen
Ihr Datentemplate für Purchase-to-Pay: Einkaufsbestellungen
- Empfohlene Attribute zur Erfassung
- Wichtige Aktivitäten für das Tracking
- Extraktionsanleitung für SAP ECC
Purchase-to-Pay – Bestellattribute
| Name | Beschreibung | ||
|---|---|---|---|
| Aktivität Activity | Der Name des spezifischen Geschäftsereignis oder Schrittes, der innerhalb des BestellLebenszyklus aufgetreten ist. | ||
| Beschreibung Dieses Attribut beschreibt einen einzelnen Schritt im Prozess, wie 'Bestellung angelegt', 'Bestellung genehmigt' oder 'Wareneingang gebucht'. Die Abfolge dieser Aktivitäten bildet den Prozessfluss für jede einzelne Bestellung. Die Analyse der Reihenfolge, Häufigkeit und Dauer zwischen Aktivitäten ist die Grundlage für Process Mining. Sie hilft dabei, Engpässe, Wiederholungsschleifen und Abweichungen vom Standardprozess zu identifizieren, was gezielte Verbesserungen und Standardisierungsbemühungen ermöglicht. Bedeutung Aktivitäten definieren die Schritte des Prozesses. Die Analyse ihrer Abfolge und Zeitplanung macht den tatsächlichen Prozessfluss sichtbar, Engpässe und Abweichungen. Datenquelle Abgeleitet aus verschiedenen SAP-Tabellen und Transaktionsprotokollen, wie CDHDR/CDPOS für Änderungen, EKBE für Wareneingang/Rechnungseingang und EBAN für Anforderungen. Oft ist eine benutzerdefinierte Logik oder ein Extraktionsprogramm zur Generierung erforderlich. Beispiele Bestellung erstelltBestellung genehmigt`Wareneingang` gebucht | |||
| Bestellung PurchaseOrder | Der eindeutige Identifikator für das Bestell-Dokument (PO), der als primärer Case für die Verfolgung des Beschaffungsprozesses dient. | ||
| Beschreibung Die Bestellnummer ist der zentrale Identifikator, der alle Aktivitäten von ihrer Erstellung bis zum abschließenden Wareneingang und Abschluss verknüpft. Jede eindeutige Bestellnummer repräsentiert eine einzelne Instanz des Beschaffungsprozesses. Im Process Mining ist dieses Attribut unerlässlich für die Rekonstruktion des End-to-End-Prozesses jedes Einkaufs. Es ermöglicht eine detaillierte Analyse von Durchlaufzeiten, Prozessvariationen und Compliance-Prüfungen für jede individuelle Bestellung und bildet die Grundlage des gesamten Prozessmodells. Bedeutung Dies ist der zentrale Identifikator, der alle zusammengehörigen Ereignisse verbindet und somit die Analyse des gesamten Lebenszyklus jeder einzelnen Bestellung ermöglicht. Datenquelle Table: EKKO, Feld: EBELN Beispiele 450001762345000176244500017625 | |||
| Ereigniszeit EventTime | Das genaue Datum und die genaue Uhrzeit, zu der den Antrag bearbeitet.ie Aktivität stattgefunden hat. | ||
| Beschreibung Dieser Zeitstempel markiert den genauen Zeitpunkt, zu dem ein Event stattfand, z.B. die Genehmigung einer Bestellung oder den Antrag bearbeitet.ie Buchung eines Wareneingangs. Er stellt die chronologische Reihenfolge aller Aktivitäten innerhalb eines Case sicher. Zeitstempels sind wesentlich für Process Mining, da sie alle zeitbasierten Analysen ermöglichen. Dazu gehören die Berechnung von Durchlaufzeits zwischen Aktivitäten, die Identifizierung von Verzögerungen, die Analyse des Prozessdurchsatzes und die Messung der Leistung anhand von Service Level Agreements (SLAs). Bedeutung Dieser Zeitstempel ist maßgeblich für die Berechnung aller zeitbasierten Kennzahlen, wie Durchlaufzeits und Engpässe, sowie für die chronologische Reihenfolge der Ereignisse. Datenquelle Abgeleitet aus verschiedenen Datums- und Zeitfeldern in SAP-Tabellen, wie EKKO-AEDAT (Änderungsdatum), CDHDR-UDATE/UTIME (Änderungslog-Zeitstempel) oder EKBE-BUDAT (Buchungsdatum). Beispiele 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Auftragsbetrag OrderAmount | Der gesamte Geldwert der Bestellposition. | ||
| Beschreibung Dieses Attribut repräsentiert den Gesamtwert einer bestimmten Position in der Bestellung, berechnet als Menge multipliziert mit dem Nettopreis. Für den vollständigen Bestellwert müssen die Positionswerte aggregiert werden. Die Analyse des Prozesses nach Bestellwert ist maßgeblich, um Transaktionen mit hohem Wert zu identifizieren, die möglicherweise strengere Kontrollen oder unterschiedliche Genehmigungswege erfordern. Es ist die Grundlage für das Dashboard 'Bestellwertanalyse' und hilft, Prozessoptimierungsbemühungen auf die finanziell bedeutendsten Bestellungen zu priorisieren. Bedeutung Quantifiziert die finanziellen Auswirkungen jedes Einkaufs und ermöglicht eine wertbasierte Analyse, um hochwertige Bestellungen zu priorisieren oder Kosteneinsparungspotenziale zu identifizieren. Datenquelle Table: EKPO, Feld: NETWR (Nettobestellwert). Beispiele 1500.00250.7512345.50 | |||
| Benutzername UserName | Die Benutzer-ID der Person, welche die Aktivität ausgeführt hat. | ||
| Beschreibung Dieses Attribut erfasst den SAP-Benutzernamen des Mitarbeiters, der ein Dokument erstellt, geändert oder genehmigt hat. Bei automatisierten Schritten kann es eine System- oder Batch-Benutzer-ID anzeigen. Die Analyse nach Benutzer hilft, Schulungsbedarfe, leistungsstarke Personen oder potenzielle Compliance-Verstöße zu identifizieren. Sie ist wesentlich für den Aufbau von Dashboards im Zusammenhang mit der Arbeitslastverteilung, der Einhaltung der Genehmigungsmatrix und dem Verständnis der Leistung verschiedener Teams oder Einzelpersonen. Bedeutung Ordnet Benutzeraktionen bestimmten Personen zu, was die Analyse der Benutzerperformance, Arbeitslast und Einhaltung von Compliance-Protokollen ermöglicht. Datenquelle Table: EKKO, Feld: ERNAM (Erstellt von); Tabelle: CDHDR, Feld: USERNAME (Geändert von). Beispiele JSMITHMBROWNBATCH_USER | |||
| Buchungskreis CompanyCode | Der Identifikator für die juristische Einheit oder den Antrag bearbeitet.as Unternehmen, das den Einkauf initiiert. | ||
| Beschreibung Der Buchungskreis repräsentiert eine unabhängige juristische Einheit in SAP. Alle Transaktionen werden auf Buchungskreisebene gebucht, was ihn zu einer wesentlichen Organisationseinheit macht. Die Analyse des Prozesses nach Buchungskreis ermöglicht den Vergleich der Beschaffungseffizienz und Compliance über verschiedene Geschäftseinheiten oder Länder hinweg. Sie hilft dabei, Best Practices in einer Einheit zu identifizieren, die anderswo repliziert werden könnten, oder spezifische Einheiten aufzudecken, die Schwierigkeiten mit dem Prozess haben. Bedeutung Stellt die juristische Einheit dar, die den Vergleich der Prozessleistung und Compliance-Prüfungen über verschiedene Teile der Organisation hinweg ermöglicht. Datenquelle Table: EKKO, Feld: BUKRS Beispiele 10002100US01 | |||
| Dokumententyp DocumentType | Ein Code, der verschiedene Arten von Bestellungen klassifiziert. | ||
| Beschreibung Die Belegart ist eine Konfiguration in SAP, die den Nummernkreis, die Feldauswahl und den gesamten Prozessablauf für eine Bestellung steuert. Zum Beispiel kann es verschiedene Typn für Standardbestellungen, Dienstleistungsbestellungen oder Umlagerungsbestellungen geben. Dieses Attribut ist eine hilfreiche Dimension für die Analyse, da unterschiedliche Belegarten oft absichtlich unterschiedlichen Prozessen folgen. Das Filtern nach Belegart ermöglicht einen genaueren, direkten Vergleich von Durchlaufzeiten und Prozessabläufen. Bedeutung Unterscheidet zwischen verschiedenen Arten von Einkaufsprozessen (z. B. Standard, Dienstleistung, Retoure), die oft unterschiedliche Pfade und Leistungsfähigkeit-Erwartungen aufweisen. Datenquelle Table: EKKO, Feld: BSART Beispiele NBFOUB | |||
| Lieferantennummer VendorNumber | Der eindeutige Identifikator für den Lieferanten oder Anbieter. | ||
| Beschreibung Dies ist der Code, der den Antrag bearbeitet.en Lieferanten, von dem die Waren oder Dienstleistungen bezogen werden, eindeutig identifiziert. Es ist ein kritischer Teil der StammDaten im Beschaffungsprozess. Dieses Attribut ist unerlässlich für eine Lieferantenzentrierte Analyse. Es ermöglicht die Bewertung der Lieferantenlieferperformance, den Vergleich von Durchlaufzeiten verschiedener Lieferanten und die Analyse von Ausgabenmustern. Es ist die primäre Dimension für das Dashboard 'Lieferantenlieferperformance'. Bedeutung Ermöglicht eine Lieferanten-Leistungsfähigkeit-Analyse, die dabei hilft, leistungsstarke Lieferanten sowie solche zu identifizieren, die Verzögerungen oder Qualitätsprobleme verursachen. Datenquelle Table: EKKO, Feld: LIFNR Beispiele 100345V-20598700112 | |||
| Materialgruppe MaterialGroup | Eine Klassifizierung zur Gruppierung von Materialien oder Dienstleistungen mit ähnlichen Eigenschaften. | ||
| Beschreibung Die Warengruppe, oder Einkaufskategorie, dient der Klassifizierung der zu beschaffenden Waren oder Dienstleistungen. Beispiele sind 'IT-Hardware', 'Büromaterial' oder 'Professionelle Dienstleistungen'. Dieses Attribut ist maßgeblich für die Ausgabenanalyse und das Verständnis von Beschaffungsmustern. Es ermöglicht das Filtern des Prozesses, um zu analysierenn, wie verschiedene Kategorien gehandhabt, wer sie genehmigt und welche Lieferanten sie bereitstellen. Es ist eine Schlüsseldimension im Dashboard 'Bestellwertanalyse'. Bedeutung Ermöglicht die Segmentierung des Prozesses nach Produkt- oder Dienstleistungskategorie und zeigt so unterschiedliche Verhaltensweisen, Durchlaufzeiten oder Lieferanten für verschiedene Ausgabenarten auf. Datenquelle Table: EKPO, Feld: MATKL Beispiele 00101IT_HWCONSULT | |||
| Ablehnungsgrund RejectionReason | Der Ursachencode oder Text, der erklärt, warum eine Purchase Requisition oder Bestellung abgelehnt wurde. | ||
| Beschreibung Dieses Attribut erfasst den spezifischen Grund, der angegeben wird, wenn eine Bestellung während des Genehmigungs-Workflows abgelehnt wird. Diese Information ist maßgeblich, um die Grundursachen für Nacharbeit und Verzögerungen zu verstehen. Die Analyse der Ablehnungsgründe hilft, häufige Probleme wie Neine Preisgestaltung, Budgetüberschreitungen oder nicht konforme Lieferantenauswahl zu identifizieren. Diese Erkenntnis ermöglicht es dem Unternehmen, die Grundursachen anzugehen, die Qualität der ursprünglichen Bestellerstellung zu verbessern und den Genehmigungsprozess zu optimieren. Bedeutung Bietet direkten Einblick, warum Genehmigungen fehlschlagen, und ermöglicht gezielte Verbesserungen, um Nacharbeit zu reduzieren und Genehmigungs-Durchlaufzeits zu verkürzen. Datenquelle Diese Information kann schwierig zu finden sein. Sie kann in Langtextfeldern gespeichert sein oder von einer kundenspezifischen Workflow-Konfiguration abhängen. Oft erfordert sie spezifisches Implementierungswissen. Beispiele Falscher PreisBudget überschrittenDoppelte Anforderung | |||
| Angefordertes Lieferdatum RequestedDeliveryDate | Das Datum, an dem das Unternehmen den Lieferanten aufgefordert hat, die Waren oder Dienstleistungen zu liefern. | ||
| Beschreibung Dies ist das im Bestellauftrag angegebene gewünschte Lieferdatum. Es dient als Referenzwert, anhand dessen die tatsächliche Lieferleistung gemessen wird. Dieses Datum ist maßgeblich für die Berechnung des KPIs 'Pünktliche Wareneingangsquote'. Durch den Vergleich des tatsächlichen Wareneingangsdatums mit diesem angeforderten Datum können Unternehmen die Lieferantenleistungsstarkkeit und die interne Wareneingangseffizienz quantitativ messen, was das Dashboard 'Lieferantenlieferleistung' direkt unterstützt. Bedeutung Dies ist das Zieldatum für die Lieferung, unerlässlich für die Berechnung von KPIs für die Pünktlichkeitsleistung und die Bewertung der Lieferantenverlässlichkeit. Datenquelle Table: EKPO, Feld: EINDT Beispiele 2023-06-102023-07-222023-08-01 | |||
| Einkäufergruppe PurchasingGroup | Der spezifische Einkäufer oder den Antrag bearbeitet.ie Gruppe von Einkäufern, die für die Beschaffungsaktivität verantwortlich sind. | ||
| Beschreibung Die Einkäufergruppe repräsentiert die Person oder den Antrag bearbeitet.as Team von Einkäufern, die für eine bestimmte Einkaufsaktivität verantwortlich sind. Sie sind der Hauptansprechpartner für Lieferanten. Dieses Attribut bietet eine detailliertere Analyseebene als die Einkaufsorganisation. Es hilft, die Arbeitslastverteilung unter den Einkäufern zu verstehen und Leistungsunterschiede auf Einkäuferebene zu identifizieren, was Informationen für die Ressourcenallokation und Schulungsinitiativen liefern kann. Bedeutung Bietet eine detaillierte Sicht darauf, wer für einen Einkauf verantwortlich ist, was eine detaillierte Arbeitslast- und Leistungsanalyse auf Einkäufer- oder Teamebene ermöglicht. Datenquelle Table: EKKO, Feld: EKGRP Beispiele 001002N01 | |||
| Einkaufsorganisation PurchasingOrganization | Die Organisationseinheit, die für die Preisverhandlung und die Beschaffung von Materialien oder Dienstleistungen verantwortlich ist. | ||
| Beschreibung Die Einkaufsorganisation ist eine zentrale Organisationseinheit in SAP, die für Beschaffungsaktivitäten verantwortlich ist. Sie kann für das gesamte Unternehmen zentralisiert oder nach Werk oder Region dezentralisiert sein. Die Analyse der Prozessleistung nach Einkaufsorganisation hilft zu identifizieren, welche Beschaffungsteams am effizientesten sind. Sie ermöglicht den Vergleich von Kennzahlen wie Durchlaufzeit, Nacharbeitsquoten und Kosten über verschiedene Organisationseinheiten hinweg, wobei Best Practices und unterstützungsbedürftige Bereiche hervorgehoben werden. Bedeutung Identifiziert das verantwortliche Beschaffungsteam, ermöglicht Leistungsvergleiche und Analysen über verschiedene Organisationseinheiten hinweg. Datenquelle Table: EKKO, Feld: EKORG Beispiele 1000US01DE01 | |||
| Ist Änderung nach Genehmigung? IsPostApprovalChange | Ein Kennzeichen, das angibt, ob nach der Erstfreigabe eine Bestelländerung erfolgt ist. | ||
| Beschreibung Dieses Boolesche Attribut ist wahr, wenn eine Aktivität 'Bestellung geändert' nach einer Aktivität 'Bestellung genehmigt' für dieselbe Bestellung erkannt wird. Es hilft, problematische Änderungen zu isolieren, die spät im Prozess auftreten. Dieses berechnete Feld unterstützt direkt den KPI 'Änderungsrate nach Genehmigung der Bestellung' und das Dashboard 'Nachbearbeitung und Änderungen der Bestellung'. Es hilft, störende Änderungen zu quantifizieren und hervorzuheben, die zu Verzögerungen führen und eine erneute Genehmigung erfordern können, was auf Probleme in der ursprünglichen Spezifikation oder im Scoping-Prozess hinweist. Bedeutung Misst direkt Nacharbeit nach der Genehmigung, einen wichtigen KPI für Prozessstabilität und -effizienz. Hohe Raten deuten auf Probleme in der vorgelagerten Anforderungsdefinition hin. Datenquelle Dies ist ein berechnetes Attribut, das aus der Abfolge der Aktivitäten im Event Log abgeleitet wird. Beispiele JaNein | |||
| Letzte Datenaktualisierung LastDataUpdate | Der `Zeitstempel`, der angibt, wann die `Daten` zuletzt aus dem `Quellsystem` aktualisiert wurden. | ||
| Beschreibung Dieses Attribut zeichnet das Datum und die Uhrzeit der letzten Datenextraktion oder Aktualisierung auf. Es gibt Aufschluss über die Aktualität der analysierten Daten. Die Anzeige dieser Informationen in Dashboards ist maßgeblich, damit Benutzer verstehen, ob die Erkenntnisse auf Echtzeit-Daten oder einem historischen Schnappschuss basieren. Dies steuert die Erwartungen der Benutzer und stellt sicher, dass Entscheidungen auf Daten eines bekannten Alters getroffen werden. Bedeutung Informiert Benutzer über die Aktualität der Daten und stellt sicher, dass sie verstehen, ob die Analyse den aktuellsten Betriebszustand widerspiegelt. Datenquelle Dieser Zeitstempel wird durch den Datenextraktions- oder ETL-Prozess zum Zeitpunkt der Ausführung generiert und hinzugefügt. Beispiele 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Lieferantenname VendorName | Der rechtliche Name des Lieferanten oder Anbieters. | ||
| Beschreibung Der beschreibende Name des Lieferanten, der benutzerfreundlicher ist als die Lieferantennummer. Dieser wird in der Regel aus den LieferantenstammDaten bezogen. Während die Lieferantennummer für Verknüpfungen und die eindeutige Identifizierung verwendet wird, ist der Lieferantenname für benutzerorientierte Dashboards und Berichte wichtig. Er macht Analysen intuitiver und zugänglicher für Geschäftsbenutzer, die möglicherweise nicht mit den Lieferantencodes vertraut sind. Bedeutung Bietet einen menschenlesbaren Namen für den Lieferanten, wodurch Dashboards und Berichte für Geschäftsanwender wesentlich einfacher zu verstehen sind. Datenquelle Table: LFA1, Feld: NAME1. Dies erfordert einen Join von EKKO-LIFNR zu LFA1-LIFNR. Beispiele Staples Inc.Global Tech SolutionsBüromaterial GmbH | |||
| Pünktliche Lieferung IsOnTimeDelivery | Ein Kennzeichen, das angibt, ob der Wareneingang am oder vor dem angeforderten Lieferdatum erfolgte. | ||
| Beschreibung Dieses Boolesche Attribut ist wahr, wenn der Zeitstempel der Aktivität 'Wareneingang gebucht' am oder vor dem 'Angeforderten Lieferdatum' liegt. Es liefert ein klares, binäres Ergebnis für die Lieferperformance jeder Bestellposition. Dieses Attribut ist die Grundlage für den KPI 'Rate pünktlicher Wareneingänge'. Es vereinfacht die Analyse der Lieferantenleistung und der internen Wareneingangseffizienz, indem es eine einfache Aggregation und Filterung von pünktlichen gegenüber verspäteten Lieferungen ermöglicht. Bedeutung Bietet eine klare Erfolgs- oder Fehlermetrik für die Pünktlichkeit der Lieferung und unterstützt direkt Lieferantenleistungs-KPIs und Dashboards. Datenquelle Dies ist ein berechnetes Attribut, durch den Vergleich des Buchungsdatums des Wareneingangs (EKBE-BUDAT) mit dem angeforderten Lieferdatum (EKPO-EINDT) abgeleitet. Beispiele JaNein | |||
| Purchase Requisition PurchaseRequisition | Der Identifikator der Purchase Requisition, die der Bestellung vorausging. | ||
| Beschreibung Dieses Attribut verknüpft die Bestellung mit ihrer ursprünglichen Purchase Requisition. Nicht alle Bestellungen haben eine vorangehende Purchase Requisition. Diese Verknüpfung ist maßgeblich für die Analyse des Dashboards 'Purchase Requisitions-zu-Bestellungs-Konvertierung' und des KPIs 'Umwandlungsrate Purchase Requisition zu Bestellung'. Sie ermöglicht die Messung der Effizienz des vorgelagerten Prozesses: von der ersten Anfrage bis zur Erstellung einer formalen Bestellung: und die Identifizierung nicht-konformer Bestellungen, die ohne Purchase Requisition erstellt wurden. Bedeutung Verknüpft die Bestellung (PO) mit der ursprünglichen Anforderung, was die Analyse des PR-zu-PO-Konvertierungsprozesses ermöglicht und Bestellungen (POs) identifiziert, die ohne vorherige Anforderung erstellt wurden. Datenquelle Table: EKPO, Feld: BANFN Beispiele 1001589010015891 | |||
| Quellsystem SourceSystem | Das System, aus dem die Daten extrahiert wurden. | ||
| Beschreibung Dieses Attribut identifiziert die Herkunft der Daten, bei dem es sich in der Regel um einen SAP ECC-Instanz-Identifikator (z.B. 'ECC_PROD_100') handelt. In Umgebungen mit mehreren Systemen hilft es, Datenquellen zu unterscheiden. Für die Governance und Daten Lineage ist die Kenntnis des Quellsystems wichtig. Sie stellt ... sicher die Datenintegrität und unterstützt bei der Fehlerbehebung von Datenextraktions- oder Qualitätsproblemen, insbesondere wenn Daten aus verschiedenen ERP-Systemen oder Modulen zusammengeführt werden. Bedeutung Identifiziert die Datenherkunft, was wichtig ist für Daten Governance, Validierung und die Verwaltung von Analysen über mehrere Systeme hinweg. Datenquelle Dies ist in der Regel ein statischer Wert, der während des Datenextraktionsprozesses hinzugefügt wird, um den Datensatz mit seinem Herkunftssystem zu kennzeichnen. Beispiele SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Währung Currency | Der Währungscode für den Bestellwert. | ||
| Beschreibung Dieses Attribut gibt die Währung an, in der den Antrag bearbeitet.er Bestellwert ausgedrückt ist, wie USD, EUR oder GBP. Es bietet den wesentlichen Kontext für alle monetären Werte. Für globale Unternehmen ist die Währung wichtig für eine korrekte Finanzanalyse. Sie ermöglicht die ordnungsgemäße Aggregation und den Vergleich von Bestellwerten, und alle monetären KPIs müssen im Kontext ihrer Währung interpretiert werden. Bedeutung Bietet den notwendigen Kontext für alle Geldwerte und stellt ... sicher eine genaue Finanzanalyse, insbesondere in multinationalen Organisationen. Datenquelle Table: EKKO, Feld: WAERS Beispiele USDEURJPY | |||
| Werk Plant | Der physische Standort oder den Antrag bearbeitet.as Werk, an das die Waren geliefert werden sollen. | ||
| Beschreibung Das Werk ist eine Organisationseinheit, die eine Produktionsstätte, ein Lager oder einen anderen Standort darstellt, an dem Waren oder Dienstleistungen empfangen werden. Die Analyse nach Werk hilft, geografische Unterschiede im Beschaffungsprozess zu verstehen. Sie kann Unterschiede in den Lieferzeiten der Lieferanten zu bestimmten Standorten aufzeigen oder spezifische Werke hervorheben, die ineffiziente Wareneingangsprozesse haben, was die Analyse der Pünktlichkeit des Wareneingangs unterstützt. Bedeutung Gibt den Lieferort an, was nützlich ist, um regionale Prozessunterschiede und die Logistikleistung zu analysierenn. Datenquelle Table: EKPO, Feld: WERKS Beispiele 100011002000 | |||
Purchase-to-Pay – Bestellaktivitäten
| Aktivität | Beschreibung | ||
|---|---|---|---|
| `Purchase Requisition` erstellt | Diese Aktivität kennzeichnet die Erstellung einer formalen Anforderung für Waren oder Dienstleistungen. Es ist ein explizites Event, das erfasst wird, wenn ein Benutzer ein neues Purchase Requisitionsdokument speichert (unter Verwendung von Transaktionen wie ME51N), welches einen eindeutigen Datensatz in der Tabelle EBAN erzeugt. | ||
| Bedeutung Dies ist der primäre Startpunkt für den Beschaffungsprozess. Die Analyse der Zeit von diesem Event bis zur Bestellerstellung hilft, die Effizienz der Umwandlung interner Nachfrage in direkt anwendbare Bestellungen zu messen. Datenquelle Erfasst bei der Erstellung eines Eintrags in der Purchase Requisitionskopf-Tabelle (EBAN). Das Erstellungsdatum (EBAN-BADAT) und die Uhrzeit dienen als Zeitstempel für dieses Event. Erfassen Identifizieren Sie neue Einträge in der EBAN-Tabelle basierend auf dem Erstellungsdatum. Ereignistyp explicit | |||
| `Wareneingang` gebucht | Diese Aktivität kennzeichnet den physischen Wareneingang von Waren eines Lieferanten gegen eine spezifische Bestellung. Das Buchen des Wareneingangs ist eine explizite Aktion (z.B. über die Transaktion MIGO), die einen Materialbeleg erzeugt und den Lagerbestand aktualisiert. | ||
| Bedeutung Dies ist ein kritischer Meilenstein zur Nachverfolgung der Lieferantenlieferleistung und markiert den Beginn des Rechnungsprüfungsprozesses. Er wird verwendet, um Raten pünktlicher Lieferungen und die Pünktlichkeit des Wareneingangs zu berechnen. Datenquelle Erfasst bei der Erstellung eines Materialbelegs. Der Event-Zeitstempel ist das Buchungsdatum (MKPF-BUDAT) oder Erstellungsdatum (MKPF-CPUDT) aus der Materialbelegkopf-Tabelle (MKPF), verknüpft mit der Bestellung über die Positionstabelle (MSEG). Erfassen Verwenden Sie den Buchungs-/Erstellungs-Zeitstempel aus der Tabelle MKPF für Materialbelege, die sich auf die Bestellung beziehen. Ereignistyp explicit | |||
| Bestellung abgeschlossen | Zeigt an, dass eine Bestellposition als vollständig geliefert betrachtet wird. Dies ist ein abgeleitetes Ereignis, das in der Regel vom Indikator 'Lieferung erledigt' abgeleitet wird, der automatisch oder manuell an der Bestellposition gesetzt wird. | ||
| Bedeutung Diese Aktivität dient als logischer Endpunkt für den Auftragsabwicklungs-Teil des Prozesses. Sie ist unerlässlich für die Berechnung der End-to-End-Durchlaufzeit der Bestellung von der Erstellung bis zum Abschluss. Datenquelle Abgeleitet aus den Änderungsbelegen (CDHDR/CDPOS), die aufzeichnen, wann der Indikator 'Lieferung erledigt' (EKPO-ELIKZ) für eine Bestellposition auf 'X' gesetzt wird. Die Kennzeichnung der letzten Position als erledigt kann den Abschluss der gesamten Bestellung bedeuten. Erfassen Identifizieren Sie den Zeitstempel aus Änderungsbelegen, wenn das EKPO-ELIKZ-Flag gesetzt wird. Ereignistyp inferred | |||
| Bestellung an Lieferanten gesendet | Diese Aktivität kennzeichnet den Zeitpunkt, zu dem die genehmigte Bestellung offiziell an den Lieferanten übermittelt wird, zum Beispiel via EDI, E-Mail oder Druck. Es ist ein explizites Event, das in den Nachrichtensteuertabellen erfasst wird, wenn eine Ausgabenachricht erfolgreich verarbeitet wird. | ||
| Bedeutung Dies ist ein kritischer Meilenstein, der den Antrag bearbeitet.en Startpunkt für die Lieferanten-Durchlaufzeit markiert. Die Analyse der Zeit von diesem Event bis zum Wareneingang ist maßgeblich für die Bewertung der Lieferantenleistung und der Lieferpünktlichkeit. Datenquelle Erfasst in der Nachrichtenstatustabelle (NAST). Der Zeitstempel kann aus NAST-DATVR und NAST-UHRVR entnommen werden, wenn der Verarbeitungsstatus (NAST-VSTAT) '1' (erfolgreich verarbeitet) ist für die entsprechende Bestellnachrichtenart. Erfassen Verwenden Sie den Verarbeitungs-Zeitstempel aus der Tabelle NAST für die Ausgabenachricht der Bestellung. Ereignistyp explicit | |||
| Bestellung erstellt | Diese Aktivität kennzeichnet die Erstellung eines formellen Bestellbelegs, der einen bindenden Vertrag mit einem Lieferanten darstellt. Dies ist ein explizites Event, das protokolliert wird, wenn ein Benutzer eine Bestellung erstellt und speichert (z.B. über die Transaktion ME21N), was zu Einträgen in den Tabellen EKKO und EKPO führt. | ||
| Bedeutung Markiert den offiziellen Start des BestellLebenszyklus. Es dient als wichtiger Meilenstein zur Messung der PR-zu-PO-Konvertierungszeit und der gesamten Auftragserfüllungszeit. Datenquelle Erfasst vom Erstellungsdatum (EKKO-AEDAT) in der Bestellkopf-Tabelle (EKKO) für die entsprechende Bestellnummer (EKKO-EBELN). Erfassen Verwenden Sie den Erstellungs-Zeitstempel aus der Tabelle EKKO für jede neue Bestellung. Ereignistyp explicit | |||
| Bestellung genehmigt | Stellt die finale Genehmigung der Bestellung dar, die den Versand an den Lieferanten autorisiert. Dieser wichtige Meilenstein wird in der Regel aus einer Änderung des Freigabestatus der Bestellung in einen „vollständig freigegebenen“ oder „genehmigten“ Zustand abgeleitet. | ||
| Bedeutung Diese Aktivität ist maßgeblich für die Berechnung des KPI der Bestellgenehmigungsdurchlaufzeit und die Identifizierung von Engpässen im Genehmigungs-Workflow. Sie ist eine Voraussetzung für die meisten nachfolgenden Aktivitäten wie das Senden der Bestellung an den Lieferanten. Datenquelle Abgeleitet durch die Verfolgung der Änderungsbelege (CDHDR/CDPOS) für die Bestellkopf-Tabelle (EKKO), um festzustellen, wann der endgültige Freigabecode angewendet wird oder wann der gesamte Freigabestatusindikator (EKKO-FRGKE) auf 'freigegeben' gesetzt wird. Erfassen Identifizieren Sie den Zeitstempel, wenn sich der gesamte Freigabestatus der Bestellung (EKKO-FRGKE) in den endgültig genehmigten Zustand ändert. Ereignistyp inferred | |||
| `Waren zurückgesendet` | Stellt die Rücksendung zuvor empfangener Waren an den Lieferanten dar, oft aufgrund von Qualitätsproblemen oder Neinen Lieferungen. Dies ist ein explizites Event, das durch das Buchen eines Materialbelegs mit einer retourspezifischen Bewegungsart erfasst wird. | ||
| Bedeutung Diese Aktivität beleuchtet Probleme mit der Lieferantenqualität oder Bestellgenauigkeit und ist ein Schlüsselindikator für Prozessnacharbeit. Sie ist maßgeblich für die Berechnung des KPI der Wareneingangsdifferenzrate. Datenquelle Erfasst in den Materialbelegtabellen (MKPF/MSEG), wenn eine Rücklieferungsbewegungsart (z.B. '122' für Retoure an Lieferant) verwendet wird. Das Buchungsdatum (MKPF-BUDAT) dient als Zeitstempel. Erfassen Identifizieren Sie Materialbelege mit einer Retourenbewegungsart (z.B. 122), die sich auf die ursprüngliche Bestellung beziehen. Ereignistyp explicit | |||
| Bestellgenehmigung angefordert | Zeigt an, dass eine erstellte oder geänderte Bestellung gemäß ihrer konfigurierten Freigabestrategie zur Genehmigung eingereicht wurde. Dieses Ereignis wird abgeleitet, wenn die Freigabestrategie ausgelöst wird und die Bestellung einen Status der ausstehende Zahlungen identifizieren.enden Genehmigung erreicht. | ||
| Bedeutung Die Unterscheidung zwischen der Bestellerstellung und dem Beginn des Genehmigungsprozesses hilft, den KPI für die Genehmigungs-Durchlaufzeit präzise zu messen. Es werden Verzögerungen hervorgehoben, bevor der Genehmigungs-Workflow beginnt. Datenquelle Abgeleitet aus Änderungsbelegen (CDHDR/CDPOS) für die Bestellung (Objekt EINKBELEG), die die erste Setzung eines Freigabestatus zeigen, oder wenn der gesamte Freigabestatus (EKKO-FRGKE) erstmals auf einen Wert gesetzt wird, der anzeigt, dass ein Genehmigungsprozess aktiv ist. Erfassen Identifizieren Sie den ersten Änderungsbelegeintrag, der den Antrag bearbeitet.ie Freigabestrategie für die Bestellung auslöst. Ereignistyp inferred | |||
| Bestellung abgelehnt | Diese Aktivität tritt auf, wenn ein Genehmiger eine Bestellung während des Genehmigungs-Workflows ablehnt. Es ist ein abgeleitetes Event, das aus einer Statusänderung in den Freigabestrategie-Daten der Bestellung abgeleitet wird und eine Ablehnung anzeigt. | ||
| Bedeutung Die Verfolgung von Ablehnungen hilft, Probleme bei der BestellDatenqualität, Nichteinhaltung von Richtlinien oder Schwierigkeiten innerhalb der Genehmigungsmatrix zu identifizieren. Dies führt oft zu Nacharbeit und erhöht die gesamte Durchlaufzeit. Datenquelle Abgeleitet aus Änderungsbelegen (CDHDR/CDPOS) für den Bestellfreigabestatus. Eine Ablehnung wird in der Regel erfasst, wenn ein Freigabecode storniert oder ein spezifischer Ablehnungsstatus gesetzt wird. Erfassen Überwachen Sie Änderungsprotokolle auf die Stornierung eines Freigabecodes oder eine Statusänderung, die eine Ablehnung anzeigt. Ereignistyp inferred | |||
| Bestellung geändert | Stellt jede Änderung an einer Bestellung nach deren initialer Erstellung dar, wie Änderungen an Menge, Preis oder Lieferterminen. Diese Änderungen werden explizit im SAP Änderungsbelegsystem protokolliert. | ||
| Bedeutung Häufige Änderungen, insbesondere nach der Genehmigung, weisen auf Prozessineffizienzen, mangelhafte anfängliche Planung oder Scope Creep hin. Diese Aktivität ist wichtig für das Dashboard zu Bestellungs-Nachbearbeitungen und Änderungen sowie für die zugehörigen KPIs. Datenquelle Explizit protokolliert in den Änderungsbelegkopf- (CDHDR) und Positionstabellen (CDPOS) für das Bestellobjekt (EINKBELEG). Jede Änderung erstellt einen neuen Eintrag mit einem Zeitstempel. Erfassen Extrahieren Sie Änderungsereignisse und Zeitstempel aus den CDHDR- und CDPOS-Tabellen, die mit der Bestellnummer verknüpft sind. Ereignistyp explicit | |||
| Bestellung gelöscht | Stellt die Stornierung oder logische Löschung einer Bestellposition dar, die eine weitere Verarbeitung wie Wareneingänge oder Rechnungsstellung verhindert. Dies ist ein abgeleitetes Event, das erfasst wird, wenn das Löschkennzeichen für die Bestellposition gesetzt ist. | ||
| Bedeutung Dies ist eine abschließende Aktivität, die anzeigt, dass eine Bestellung storniert wurde. Die Analyse, warum und wann Bestellungen storniert werden, kann Probleme in der Bedarfsplanung oder Lieferantenauswahl aufdecken. Datenquelle Abgeleitet aus Änderungsbelegen (CDHDR/CDPOS), die zeigen, dass das Löschkennzeichen (EKPO-LOEKZ) für eine Bestellposition auf 'L' gesetzt wird. Erfassen Identifizieren Sie den Zeitstempel aus Änderungsbelegen, wenn das EKPO-LOEKZ-Flag gesetzt wird. Ereignistyp inferred | |||
| Dienstleistungsbestätigung erfasst | Bei dienstleistungsbasierten Bestellungen stellt diese Aktivität die Bestätigung dar, dass Dienstleistungen erbracht wurden. Es ist ein explizites Ereignis, das durch die Erstellung einer Leistungsbestätigung (z.B. über die Transaktion ML81N) erfasst wird. | ||
| Bedeutung Dies ist das Äquivalent eines Wareneingangs für Dienstleistungen und ist unerlässlich für die Verfolgung der Erfüllung von Leistungsbestellungen. Es löst den Finanzprozess für die Leistungszahlung aus. Datenquelle Erfasst vom Erstellungsdatum (ESSR-ERDAT) in der Kopf-Tabelle des Serviceerfassungsblattes (ESSR). Die Verknüpfung zur Bestellung befindet sich in der Tabelle ESLL. Erfassen Verwenden Sie den Erstellungs-Zeitstempel aus der Tabelle ESSR für Leistungserfassungsblätter, die mit der Bestellung verknüpft sind. Ereignistyp explicit | |||
| Purchase Requisition genehmigt | Stellt die formale Genehmigung einer Purchase Requisition dar, die deren Umwandlung in eine Bestellung autorisiert. Dieses Event wird aus Änderungen in den Freigabestatusfeldern innerhalb der Purchase RequisitionsDaten abgeleitet, wie sie vom SAP-Freigabestrategie-Workflow verfolgt werden. | ||
| Bedeutung Die Verfolgung von Genehmigungen ist maßgeblich, um Engpässe in der Vorbestellungsphase zu identifizieren und die Compliance mit Genehmigungsrichtlinien sicherzustellen. Verzögerungen hier wirken sich direkt auf die gesamte Beschaffungsdurchlaufzeit aus. Datenquelle Abgeleitet aus den Änderungsprotokollen für die Purchase Requisitionstabelle (EBAN), insbesondere durch die Überwachung von Änderungen an den Freigabestatusfeldern (z.B. EBAN-FRGZU) oder den Antrag bearbeitet.urch die Analyse von Änderungsbelegen in CDHDR/CDPOS für das Objekt EBAN. Erfassen Überwachen Sie Änderungsbelege für EBAN-Freigabestatusfelder, um den Zeitstempel der finalen Genehmigung zu identifizieren. Ereignistyp inferred | |||
| Qualitätsinspektion durchgeführt | Zeigt an, dass erhaltene Waren einer Qualitätsprüfung unterzogen wurden. Diese Aktivität wird in der Regel abgeleitet, wenn ein Prüflos, das zum Zeitpunkt des Wareneingangs erstellt wurde, einen Verwendungsentscheid im Qualitätsmanagement-Modul erhalten hat. | ||
| Bedeutung In Branchen, in denen Qualität wichtig ist, hilft diese Aktivität, die Dauer und die Resultate des Prüfprozesses zu analysierenn. Verzögerungen an dieser Stelle können Engpässe zwischen dem Wareneingang und der Verfügbarkeit für die Nutzung verursachen. Datenquelle Abgeleitet aus dem Qualitätsmanagement-Modul. Bei Wareneingang wird ein Prüflos erstellt (Tabelle QALS), und die Aktivität wird durch die Erstellung eines Verwendungsentscheids (Tabelle QAVE) gekennzeichnet, der einen Zeitstempel enthält. Erfassen Identifizieren Sie den Zeitstempel des Verwendungsentscheids in der Tabelle QAVE für das Prüflos, das mit dem Materialbeleg verknüpft ist. Ereignistyp inferred | |||
Extraktionsanleitungen
Schritte
- ABAP-Programm erstellen: Öffnen Sie den ABAP Editor mit dem Transaktionscode SE38. Geben Sie einen Namen für Ihr neues Programm ein, zum Beispiel Z_PM_PO_EXTRACT, und klicken Sie auf 'Anlegen'. Geben Sie einen Titel wie 'Prozess-Mining: BestellDaten-Extraktion' an und setzen Sie den Typ auf 'Ausführbares Programm'.
- Selektionsbild definieren: Definieren Sie im Programm die Selektionsbildparameter. Dies ermöglicht es Benutzern, die Daten zu filtern, die sie extrahieren möchten. Wichtige Parameter sind der Zeitbereich für das Bestelldatum, der Buchungskreis (BUKRS) und die Bestellbelegart (BSART).
- Datenstrukturen definieren: Deklarieren Sie eine interne Tabellenstruktur, die dem finalen Event Log-Format entspricht. Diese Struktur sollte alle erforderlichen und empfohlenen Attribute umfassen: PurchaseOrder, Activity, Ereigniszeitpunkt (Event Time), BenutzerName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode und DocumentTyp.
- Datenextraktionslogik implementieren: Schreiben Sie die zentrale ABAP-Logik, um Daten für jede der 14 erforderlichen Aktivitäten auszuwählen. Dies beinhaltet das Abfragen mehrerer SAP-Tabellen wie EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS und NAST. Verwenden Sie für jede Aktivität ein separates Unterprogramm (PERFORM), um den Code übersichtlich zu halten.
- Purchase RequisitionsDaten auswählen: Fragen Sie die Tabelle EBAN nach Ereignissen 'Purchase Requisition erstellt' ab und verknüpfen Sie diese über die Tabelle EKPO mit Bestellungen. Verwenden Sie die Änderungsbelegtabellen (CDHDR, CDPOS), um Ereignisse 'Purchase Requisition genehmigt' durch Verfolgung von Änderungen an den Freigabestatusfeldern zu identifizieren.
- Zentrale Bestellereignisse auswählen: Fragen Sie die Tabellen EKKO und EKPO nach dem Ereignis 'Bestellung erstellt' ab. Verwenden Sie die Änderungsbelegtabellen (CDHDR, CDPOS) auf dem Objekt EINKBELEG, um die Ereignisse 'Bestellung geändert', 'Bestellung genehmigt', 'Bestellung abgelehnt', 'Bestellung abgeschlossen' und 'Bestellung gelöscht' basierend auf Änderungen an spezifischen Feldern wie Freigabekennzeichen und Löschvormerkern zu extrahieren.
- Kommunikationsereignisse für Bestellungen auswählen: Fragen Sie die Tabelle NAST ab, um Datensätze zu finden, bei denen die Bestellung erfolgreich übermittelt wurde, und erfassen Sie so die Aktivität 'Bestellung an Lieferanten gesendet'.
- Wareneingangs- und Dienstleistungsereignisse auswählen: Fragen Sie die Tabelle EKBE nach Materialbelegbuchungen ab, um die Aktivitäten 'Wareneingang gebucht' und 'Warenrücksendung' basierend auf der Bewegungsartkategorie zu identifizieren. Fragen Sie ESSR und ESLL nach Leistungserfassungsblättern ab, um 'Leistungsbestätigung erfasst' zu erfassen.
- Ereignisse des Qualitätsmanagements auswählen: Wenn das Modul Qualitätsmanagement verwendet wird, fragen Sie die Tabellen QALS und QAVE ab, um zu identifizieren, wann eine Verwendungsentscheidung für ein mit einer Bestellung verknüpftes Prüflos getroffen wurde, was die Aktivität 'Qualitätsprüfung durchgeführt' darstellt.
- Daten zusammenführen und formatieren: Konsolidieren Sie die Daten aus allen einzelnen Selektionen in einer einzigen finalen internen Tabelle. Stellen Sie sicher, dass das Feld Ereigniszeitpunkt (Event Time) konsistent formatiert ist (z.B. YYYY-MM-DDTHH:MI:SS).
- Dateidownload implementieren: Implementieren Sie die Download-Funktionalität für die finale interne Tabelle. Das empfohlene Format ist eine tabulatorgetrennte oder CSV-Datei, was mit dem Funktionsbaustein GUI_DOWNLOAD erreicht werden kann.
- Ausführen und Speichern: Führen Sie das Programm über die Transaktion SE38 oder SA38 aus. Geben Sie die Selektionskriterien ein und starten Sie den Report. Wenn Sie dazu aufgefordert werden, speichern Sie die Ausgabedatei auf Ihrem lokalen Computer mit der Erweiterung .csv, bereit für den Upload.
Konfiguration
- Datumsbereich: Es ist maßgeblich, einen spezifischen Datumsbereich für die Datenextraktion zu definieren, in der Regel basierend auf dem Erstellungsdatum der Bestellung (EKKO-AEDAT). Ein Zeitraum von 3-6 Monaten ist oft ein guter Ausgangspunkt, um ein ausgewogenes Verhältnis zwischen Datenvolumen und Prozesseinblicken zu finden.
- Buchungskreis (BUKRS): Filtern Sie nach einem oder mehreren Buchungskreisen, um die Extraktion auf relevante juristische Einheiten zu begrenzen. Dies ist ein Schlüsselparameter für Leistungsfähigkeit und Relevanz.
- Einkaufsbelegart (BSART): Filtern Sie nach spezifischen Belegarten (z.B. 'NB' für Standard-Bestellung), um die Analyse auf Standardprozesse zu konzentrieren und bei Bedarf spezielle Beschaffungsarten auszuschließen.
- Datengranularität: Die Extraktion ist für die Positionsebene der Bestellung konzipiert. Die Case-ID ist die Bestellnummer (EBELN). Alle Ereignisse, auch solche auf Positionsebene (z.B. Wareneingänge), werden dieser Haupt-Case-ID zugeordnet.
- Leistungsfähigkeit-Überlegungen: Planen Sie das Programm bei großen Datenmengen als Hintergrundjob (SM36) ein, um Timeout-Fehler zu vermeiden. Stellen Sie sicher, dass Datenbankindizes auf Schlüsselfeldern, die in WHERE-Klauseln verwendet werden, vorhanden sind, insbesondere für Tabellen wie CDHDR und CDPOS.
- Voraussetzungen: Der Benutzer, der den Antrag bearbeitet.en Bericht ausführt, benötigt die Berechtigung für den Zugriff auf die ABAP Workbench (SE38) sowie Entwicklungs- und Ausführungsrechte für das Programm. Zudem ist Lesezugriff auf alle zugrunde liegenden Tabellen erforderlich, einschließlich EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR und QM-Tabellen.
a Beispielabfrage abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. Schritte
- Datenbankverbindung herstellen: Besorgen Sie sich Nur-Lese-ZugangsDaten und Verbindungsdetails (hostname, port, database name) für die zugrunde liegende SAP ECC-Datenbank. Stellen Sie sicher, dass Sie die notwendigen Client-Tools, wie DBeaver, SQL Developer oder SSMS, installiert haben.
- SAP-Schema identifizieren: Stellen Sie eine Verbindung zur Datenbank her und identifizieren Sie das primäre SAP-Schema, in dem sich die Tabellen befinden. Dies ist oft SAPSR3, SAPHANADB oder ein ähnlicher systemspezifischer Name. Sie müssen allen Tabellennamen in der Abfrage dieses Schema voranstellen, wenn es nicht das Standard-Schema für Ihren Benutzer ist.
- SQL-Abfrage prüfen: Öffnen Sie das bereitgestellte SQL script in Ihrem Client-Tool. Diese vollständige Abfrage wurde entwickelt, um 14 verschiedene Aktivitäten aus dem Purchase-to-Pay-Prozess durch Verknüpfung mehrerer SAP-Tabellen zu extrahieren.
- Abfrageparameter anpassen: Suchen Sie die PO_BASE Common Table Expression (CTE) am Anfang des Skripts. Ändern Sie die Platzhalterwerte, um den Umfang Ihrer Extraktion zu definieren:
- [START_DATE] und [END_DATE]: Legen Sie den Datumsbereich für die Analyse fest (z.B. '20230101' und '20230630'). Das Filtern nach dem Feld AEDAT (Geändert am) wird empfohlen.
- [COMPANY_CODE_1], [COMPANY_CODE_2]: Geben Sie die einzuschließenden SAP-Buchungskreise an.
- [DOC_TYPE_1], [DOC_TYPE_2]: Geben Sie die einzuschließenden Bestellbelegarten an.
- [Your SAP Schema]: Ersetzen Sie diesen Platzhalter im gesamten Skript durch Ihren tatsächlichen SAP-Schemanamen.
- Abfrage ausführen: Führen Sie das angepasste SQL script gegen die SAP-Datenbank aus. Die Ausführungszeit variiert je nach Datumsbereich, Datenvolumen und Datenbankleistung.
- Resultate überprüfen: Sobald die Abfrage abgeschlossen ist, führen Sie eine kurze Überprüfung der Ausgabe durch. Prüfen Sie auf eine angemessene Zeilenanzahl und stellen Sie sicher, dass Schlüsselspalten wie PurchaseOrder, Activity und Ereigniszeitpunkt (Event Time) wie erwartet gefüllt sind.
- Daten als CSV exportieren: Exportieren Sie das gesamte Ergebnis aus Ihrem SQL-Client in eine CSV-Datei. Verwenden Sie UTF-8-Kodierung, um Zeichenprobleme zu vermeiden.
- Für den Upload vorbereiten: Stellen Sie sicher, dass die Spaltenüberschriften in Ihrer CSV-Datei genau den erforderlichen Attributnamen entsprechen: PurchaseOrder, Activity, Ereigniszeitpunkt (Event Time), BenutzerName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentTyp.
- In das Process-Mining-Tool hochladen: Laden Sie die finale CSV-Datei in Ihre Process Mining-Anwendung zur Analyse und Visualisierung hoch.
Konfiguration
- Voraussetzungen: Direkter, schreibgeschützter Zugriff auf die zugrunde liegende SAP ECC-Datenbank ist erforderlich. Benutzer benötigen ausreichende Berechtigungen, um Tabellen wie EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS und NAST abzufragen.
- Datumsbereichsfilterung: Es ist maßgeblich, einen Datumsbereichsfilter anzuwenden, um das Datenvolumen zu begrenzen. Eine Filterung auf EKKO.AEDAT (Bestellungsänderungsdatum) für einen Zeitraum von 3-6 Monaten ist ein gängiger Ausgangspunkt. Große Datumsbereiche können zu extrem langen Abfrageausführungszeiten führen.
- SchlüsselDatenfilter: Um eine fokussierte Analyse zu sicherstellen, filtern Sie immer nach EKKO.BUKRS (Buchungskreis) und EKKO.BSART (Belegart). Dies grenzt den Umfang auf relevante juristische Einheiten und Geschäftsprozesse ein.
- Leistungsfähigkeit-Überlegungen: Die Abfrage verbindet mehrere große Tabellen, einschließlich der Änderungshistorientabellen (CDHDR, CDPOS). Dies kann Ressourcenintensiv sein. Es wird nachdrücklich empfohlen, diese Extraktion außerhalb der Spitzenzeiten oder gegen eine replizierte Nicht-ProduktionsDatenbank durchzuführen, um Leistungsfähigkeit-Beeinträchtigungen des Systems zu vermeiden.
- Änderungsbelegprotokollierung: Die Genauigkeit von Aktivitäten wie 'Genehmigt', 'Abgelehnt', 'Abgeschlossen' und 'Geändert' hängt davon ab, dass die Änderungsbelegprotokollierung für die relevanten Felder in SAP aktiv ist. Bestätigen Sie mit Ihrem SAP-Administrator, dass diese Protokollierung aktiviert ist (über Transaktion SCDO).
a Beispielabfrage sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator Schritte
- Voraussetzungen und Verbindung: Stellen Sie sicher, dass für Ihr Drittanbieter-ETL-Tool der SAP-zertifizierte Connector installiert und lizenziert ist. Konfigurieren Sie in der Administrationskonsole Ihres ETL-Tools eine neue Verbindung zu Ihrem SAP ECC-System. Hierfür benötigen Sie den Anwendungsserver-Host, die Systemnummer, die Mandanten-ID (Client ID) sowie einen dedizierten SAP-Benutzer mit entsprechenden RFC- und Tabellenleseberechtigungen.
- Quelltabellen identifizieren: Definieren Sie innerhalb Ihres ETL-Jobs oder Datenflusses die erforderlichen SAP-Tabellen als Datenquellen. Zu den wichtigsten Tabellen gehören EKKO (Bestellkopf), EKPO (Bestellposition), EBAN (Purchase Requisition), CDHDR (Änderungsbeleg-Kopf), CDPOS (Änderungsbeleg-Position), MSEG (Belegsegment Material), MKPF (Materialbeleg-Kopf), NAST (Nachrichtenstatus), ESSR (Leistungserfassungsblatt-Kopf) und QALS (Prüflos).
- 'Bestellung erstellt' extrahieren: Erstellen Sie einen Datenfluss mit der Tabelle EKKO als Quelle. Filtern Sie die Datensätze nach dem gewünschten Datumsbereich (z. B. über AEDAT) und dem organisatorischen Umfang (z. B. BUKRS für Buchungskreis, BSART für Belegart). Ordnen Sie EKKO.EBELN der Spalte PurchaseOrder und 'Bestellung erstellt' der Spalte Activity zu. Kombinieren Sie AEDAT und ERZET für die Ereigniszeitpunkt (Event Time). Mappen Sie zudem alle weiteren benötigten Attribute.
- 'Wareneingang gebucht' extrahieren: Erstellen Sie einen separaten Datenfluss auf Basis von MSEG und verknüpfen Sie diesen mit MKPF über MBLNR und MJAHR. Filtern Sie nach relevanten Bewegungsarten wie '101'. Ordnen Sie MSEG.EBELN der PurchaseOrder und 'Wareneingang gebucht' der Activity zu. Verwenden Sie MKPF.CPUDT und MKPF.CPUTM für die Ereigniszeitpunkt (Event Time).
- Änderungsbasierte Ereignisse extrahieren (Genehmigungen, Änderungen, Löschungen): Erstellen Sie einen Datenfluss basierend auf CDHDR und CDPOS, verknüpft über CHANGENR. Diese Quelle dient zur Ableitung mehrerer Aktivitäten.
- Filtern Sie nach OBJECTCLAS = 'EINKBELEG' und TABNAME = 'EKPO'.
- Für 'Bestellung genehmigt' filtern Sie nach Änderungen am Freigabestatus-Feld (z. B. FNAME = 'FRGZU'), wobei der neue Wert (VALUE_NEW) die finale Genehmigung darstellt.
- Für 'Bestellung gelöscht' filtern Sie nach Änderungen am Löschkennzeichen (FNAME = 'LOEKZ') mit dem neuen Wert 'L'.
- Für 'Bestellung geändert' filtern Sie nach weiteren relevanten Feldänderungen, ausgenommen der Statusfelder für andere Aktivitäten.
- Verwenden Sie für alle diese Ereignisse CDHDR.UDATE und CDHDR.UTIME als Ereigniszeitpunkt (Event Time).
- 'Purchase Requisition' extrahieren: Erstellen Sie einen Datenfluss aus EBAN für 'Purchase Requisition erstellt'. Um dies mit einem PurchaseOrder-Case zu verknüpfen, verbinden Sie EBAN mit EKPO über die Anforderungsnummer (BANFN) und die Position (BNFPO). Verwenden Sie für 'Purchase Requisition genehmigt' CDHDR/CDPOS mit OBJECTCLAS = 'BANF'. Achten Sie auf ein präzises Mapping, damit das Ereignis der korrekten Bestellung zugeordnet wird.
- 'Bestellung an Lieferanten gesendet' extrahieren: Erstellen Sie einen Datenfluss aus der Tabelle NAST. Filtern Sie nach OBJECTKEY (enthält die Bestellnummer), der relevanten Nachrichtenart (KSCHL) und einem erfolgreichen Verarbeitungsstatus (VSTAT = '1'). Verwenden Sie ERDAT und UHR für die Ereigniszeitpunkt (Event Time).
- Activity-Streams zusammenführen: Verwenden Sie eine 'Union'- oder 'Merge'-Transformation in Ihrem ETL-Tool, um die Resultate aller zuvor erstellten Datenflüsse zu kombinieren. Stellen Sie sicher, dass Spaltennamen und Datentypen über alle Streams hinweg konsistent sind (PurchaseOrder, Activity, Ereigniszeitpunkt (Event Time) usw.).
- Datentyp- und Formatkonvertierung: Vergewissern Sie sich, dass die Spalte Ereigniszeitpunkt (Event Time) in ein einheitliches Zeitstempel-Format konvertiert wird (z. B. YYYY-MM-DD HH:MM:SS). Wandeln Sie OrderAmount in ein Standard-Dezimalformat um.
- Zielverzeichnis festlegen: Konfigurieren Sie ein Ziel (Sink) für Ihren kombinierten Datenstrom. Üblicherweise ist dies eine Flatfile-Format wie eine CSV- oder Parquet-Datei. Legen Sie Trennzeichen, Textqualifizierer und Header-Optionen fest.
- Ausführung und Validierung: Starten Sie den ETL-Job. Überprüfen Sie die Ausgabedatei auf Vollständigkeit: Sind alle 14 Aktivitäten enthalten? Sind die Zeilenzahlen plausibel und die Schlüsselattribute korrekt befüllt?
- Zeitplanung und Export: Nach erfolgreicher Validierung planen Sie den ETL-Job für eine regelmäßige Ausführung (z. B. nächtlich), um die Daten aktuell zu halten. Die generierte Datei kann nun in Ihr Process-Mining-Tool hochgeladen werden.
Konfiguration
- Voraussetzungen: Ein kommerzielles ETL-Tool (z.B. Informatica PowerCenter, Talend, SAP Daten Dienste) mit dem entsprechenden SAP Certified Connector für ECC. Ein SAP-Dialog- oder Systembenutzer mit Berechtigungen für S_RFC und S_TABU_DIS für die erforderlichen Tabellen.
- SAP-Verbindung: Der Connector muss mit dem SAP Application Server, der Systemnummer, dem Mandanten, dem Benutzer und dem Passwort konfiguriert werden. Die Verwendung von Secure Network Communications (SNC) wird empfohlen.
- Datumsbereichsfilter: Es ist maßgeblich, einen Datumsbereichsfilter anzuwenden, um das Datenvolumen zu begrenzen. Eine gängige Praxis ist es, EKKO.AEDAT (Bestellungserstellungsdatum) für die letzten 3 bis 12 Monate zu filtern. Dieser Filter sollte an der Quelle angewendet werden, um die Extraktion übermäßiger Daten aus SAP zu verhindern.
- Filter für den Organisationsbereich: Filtern Sie immer nach EKKO.BUKRS (Buchungskreis) und ziehen Sie in Betracht, nach EKPO.WERKS (Werk) oder EKKO.EKORG (Einkaufsorganisation) zu filtern, um die Analyse auf eine spezifische Geschäftseinheit einzugrenzen.
- Leistungsfähigkeit-Optimierung: Die Extraktion aus Änderungsbelegtabellen (CDHDR, CDPOS) kann langsam sein. Stellen Sie sicher, dass Filter für OBJECTCLAS, OBJECTID und UDATE angewendet werden. Passen Sie die Einstellung 'Packet Size' im SAP Connector an, um die Datenübertragungsraten zu optimieren. Für sehr große Systeme sollten Sie einen initialen historischen Ladevorgang, gefolgt von geplanten Delta-Ladungen, in Betracht ziehen.
a Beispielabfrage config
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);