Datentemplate: Purchase to Pay – Bestellung
Ihr Datentemplate für Procure-to-Pay – Einkaufsbestellungen
- Empfohlene Attribute zur Erfassung
- Wichtige Aktivitäten zur Verfolgung
- Extraktionsanleitung für SAP ECC
Beschaffungsprozess - Bestellattribute
| Name | Beschreibung | ||
|---|---|---|---|
Aktivität Activity | Der Name des spezifischen Geschäfts-Event 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 der Kern des Process Mining. Sie hilft dabei, Engpässe, Wiederholungsschleifen und Abweichungen vom Standardprozess zu identifizieren, was gezielte Verbesserungen und Standardisierungsbemühungen ermöglicht. Warum es wichtig ist Aktivitäten definieren die Schritte des Prozesses. Die Analyse ihrer Abfolge und Zeitplanung offenbart den tatsächlichen Prozessfluss, Engpässe und Abweichungen. Woher erhalten 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 genehmigtWareneingang 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-Verlaufs 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. Warum es wichtig ist Dies ist der zentrale Identifikator, der alle zusammengehörigen Events verbindet und somit die Analyse des gesamten Lebenszyklus jeder einzelnen Bestellung ermöglicht. Woher erhalten Tabelle: EKKO, Feld: EBELN Beispiele 450001762345000176244500017625 | |||
Ereigniszeit EventTime | Das genaue Datum und die genaue Uhrzeit, zu der die Aktivität stattgefunden hat. | ||
Beschreibung Dieser Timestamp markiert den genauen Zeitpunkt, zu dem ein Event stattfand, z.B. die Genehmigung einer Bestellung oder die Buchung eines Wareneingangs. Er stellt die chronologische Reihenfolge aller Aktivitäten innerhalb eines Case sicher. Timestamps sind fundamental für Process Mining, da sie alle zeitbasierten Analysen ermöglichen. Dazu gehören die Berechnung von Cycle Times zwischen Aktivitäten, die Identifizierung von Verzögerungen, die Analyse des Prozessdurchsatzes und die Messung der Leistung anhand von Service Level Agreements (SLAs). Warum es wichtig ist Dieser Timestamp ist entscheidend für die Berechnung aller zeitbasierten Kennzahlen, wie Cycle Times und Bottlenecks, sowie für die chronologische Reihenfolge der Events. Woher erhalten Abgeleitet aus verschiedenen Datums- und Zeitfeldern in SAP-Tabellen, wie EKKO-AEDAT (Änderungsdatum), CDHDR-UDATE/UTIME (Änderungslog-Timestamp) oder EKBE-BUDAT (Buchungsdatum). Beispiele 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
Auftragsbetrag OrderAmount | Der gesamte monetäre Wert 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 entscheidend, 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, Prozessverbesserungsbemühungen auf die finanziell bedeutendsten Bestellungen zu priorisieren. Warum es wichtig ist Quantifiziert die finanziellen Auswirkungen jedes Einkaufs und ermöglicht eine wertbasierte Analyse, um hochwertige Bestellungen zu priorisieren oder Kosteneinsparungspotenziale zu identifizieren. Woher erhalten Tabelle: EKPO, Feld: NETWR (Nettobestellwert). Beispiele 1500.00250.7512345.50 | |||
Benutzername UserName | Die Benutzer-ID der Person, die 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-Probleme zu identifizieren. Sie ist entscheidend 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. Warum es wichtig ist Ordnet Benutzeraktionen bestimmten Personen zu, was die Analyse der Benutzerperformance, Arbeitslast und Einhaltung von Compliance-Protokollen ermöglicht. Woher erhalten Tabelle: 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 das 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 fundamentalen 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. Warum es wichtig ist Stellt die juristische Einheit dar, die den Vergleich der Prozessleistung und Compliance-Prüfungen über verschiedene Teile der Organisation hinweg ermöglicht. Woher erhalten Tabelle: 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 Typen für Standardbestellungen, Dienstleistungsbestellungen oder Umlagerungsbestellungen geben. Dieses Attribut ist eine leistungsstarke 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. Warum es wichtig ist Unterscheidet zwischen verschiedenen Arten von Einkaufsprozessen (z. B. Standard, Dienstleistung, Retoure), die oft unterschiedliche Pfade und Performance-Erwartungen aufweisen. Woher erhalten Tabelle: EKKO, Feld: BSART Beispiele NBFOUB | |||
Lieferantennummer VendorNumber | Der eindeutige Identifikator für den Lieferanten oder Anbieter. | ||
Beschreibung Dies ist der Code, der den 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'. Warum es wichtig ist Ermöglicht eine Lieferanten-Performance-Analyse, die dabei hilft, zuverlässige Lieferanten sowie solche zu identifizieren, die Verzögerungen oder Qualitätsprobleme verursachen. Woher erhalten Tabelle: 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 entscheidend für die Ausgabenanalyse und das Verständnis von Beschaffungsmustern. Es ermöglicht das Filtern des Prozesses, um zu analysieren, wie verschiedene Kategorien gehandhabt, wer sie genehmigt und welche Lieferanten sie bereitstellen. Es ist eine Schlüsseldimension im Dashboard 'Bestellwertanalyse'. Warum es wichtig ist Ermöglicht die Segmentierung des Prozesses nach Produkt- oder Dienstleistungskategorie und zeigt so unterschiedliche Verhaltensweisen, Durchlaufzeiten oder Lieferanten für verschiedene Ausgabenarten auf. Woher erhalten Tabelle: EKPO, Feld: MATKL Beispiele 00101IT_HWCONSULT | |||
Ablehnungsgrund RejectionReason | Der Ursachencode oder Text, der erklärt, warum eine Bestellanforderung 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 entscheidend, um die Grundursachen für Nacharbeit und Verzögerungen zu verstehen. Die Analyse der Ablehnungsgründe hilft, häufige Probleme wie falsche 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. Warum es wichtig ist Bietet direkten Einblick, warum Genehmigungen fehlschlagen, und ermöglicht gezielte Verbesserungen, um Nacharbeit zu reduzieren und Genehmigungs-Cycle Times zu verkürzen. Woher erhalten Diese Information kann schwierig zu lokalisieren 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 | |||
Bestellanforderung PurchaseRequisition | Der Identifikator der Bestellanforderung, die der Bestellung vorausging. | ||
Beschreibung Dieses Attribut verknüpft die Bestellung mit ihrer ursprünglichen Bestellanforderung. Nicht alle Bestellungen haben eine vorangehende Bestellanforderung. Diese Verknüpfung ist entscheidend für die Analyse des Dashboards 'Bestellanforderungs-zu-Bestellungs-Konvertierung' und des KPIs 'Umwandlungsrate Bestellanforderung 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 Bestellanforderung erstellt wurden. Warum es wichtig ist 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. Woher erhalten Tabelle: EKPO, Feld: BANFN Beispiele 1001589010015891 | |||
Einkäufergruppe PurchasingGroup | Der spezifische Einkäufer oder die Gruppe von Einkäufern, die für die Beschaffungsaktivität verantwortlich sind. | ||
Beschreibung Die Einkäufergruppe repräsentiert die Person oder das Team von Einkäufern, die für eine bestimmte Einkaufsaktivität verantwortlich sind. Sie sind der Hauptansprechpartner für Lieferanten. Dieses Attribut bietet eine granularere 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. Warum es wichtig ist 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. Woher erhalten Tabelle: 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. Warum es wichtig ist Identifiziert das verantwortliche Beschaffungsteam, ermöglicht Leistungsvergleiche und Analysen über verschiedene Organisationseinheiten hinweg. Woher erhalten Tabelle: EKKO, Feld: EKORG Beispiele 1000US01DE01 | |||
End-to-End-Durchlaufzeit EndToEndCycleTime | Die gesamte verstrichene Zeit von der ersten bis zur letzten Aktivität einer Bestellung. | ||
Beschreibung Diese Kennzahl misst die Gesamtdauer des gesamten Bestellprozesses, vom frühesten erfassten Event (z.B. 'Bestellanforderung erstellt') bis zum finalen Event (z.B. 'Bestellung abgeschlossen'). Dies ist ein entscheidender KPI zur Messung der Gesamtprozesseffizienz. Er bietet einen umfassenden Überblick über die Leistung, und seine Analyse hilft, die längsten laufenden Cases und allgemeine Bottlenecks zu identifizieren. Er unterstützt direkt das Dashboard 'End-to-End Bestell-Cycle Time-Analyse' und den KPI 'Durchschnittliche End-to-End Bestell-Cycle Time'. Warum es wichtig ist Misst die Gesamtgeschwindigkeit und Effizienz des gesamten Beschaffungsprozesses und liefert einen wichtigen Leistungsindikator. Woher erhalten Dies ist ein berechnetes Attribut, durch Subtraktion des Timestamps des ersten Events vom Timestamp des letzten Events für jeden Case bestimmt. Beispiele 10 Tage 4 Stunden22 Tage 1 Stunde5 days 8 hours | |||
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. Warum es wichtig ist 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. Woher erhalten Dies ist ein berechnetes Attribut, das aus der Abfolge der Aktivitäten im Event Log abgeleitet wird. Beispiele truefalsch | |||
Ist 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 Timestamp 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. Warum es wichtig ist Bietet eine klare Erfolgs- oder Fehlermetrik für die Pünktlichkeit der Lieferung und unterstützt direkt Lieferantenleistungs-KPIs und Dashboards. Woher erhalten Dies ist ein berechnetes Attribut, durch den Vergleich des Buchungsdatums des Wareneingangs (EKBE-BUDAT) mit dem angeforderten Lieferdatum (EKPO-EINDT) abgeleitet. Beispiele truefalsch | |||
Letzte Datenaktualisierung LastDataUpdate | Der Timestamp, 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 entscheidend, 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. Warum es wichtig ist Informiert Benutzer über die Aktualität der Daten und stellt sicher, dass sie verstehen, ob die Analyse den aktuellsten Betriebszustand widerspiegelt. Woher erhalten Dieser Timestamp 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 typischerweise 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 entscheidend. Er macht Analysen intuitiver und zugänglicher für Geschäftsbenutzer, die möglicherweise nicht mit den Lieferantencodes vertraut sind. Warum es wichtig ist Bietet einen menschenlesbaren Namen für den Lieferanten, wodurch Dashboards und Berichte für Geschäftsanwender wesentlich einfacher zu verstehen sind. Woher erhalten Tabelle: LFA1, Feld: NAME1. Dies erfordert einen Join von EKKO-LIFNR zu LFA1-LIFNR. Beispiele Staples Inc.Global Tech SolutionsBüromaterial GmbH | |||
Quellsystem SourceSystem | Das System, aus dem die Daten extrahiert wurden. | ||
Beschreibung Dieses Attribut identifiziert die Herkunft der Daten, bei dem es sich typischerweise 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 Data Lineage ist die Kenntnis des Quellsystems entscheidend. Sie gewährleistet 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. Warum es wichtig ist Identifiziert die Datenherkunft, was entscheidend ist für Data Governance, Validierung und die Verwaltung von Analysen über mehrere Systeme hinweg. Woher erhalten Dies ist typischerweise 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 der 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 entscheidend 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. Warum es wichtig ist Bietet den notwendigen Kontext für alle Geldwerte und gewährleistet eine genaue Finanzanalyse, insbesondere in multinationalen Organisationen. Woher erhalten Tabelle: EKKO, Feld: WAERS Beispiele USDEURJPY | |||
Werk Plant | Der physische Standort oder das 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. Warum es wichtig ist Gibt den Lieferort an, was nützlich ist, um regionale Prozessunterschiede und die Logistikleistung zu analysieren. Woher erhalten Tabelle: EKPO, Feld: WERKS Beispiele 100011002000 | |||
Wunschliefertermin 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 entscheidend für die Berechnung des KPIs 'Pünktliche Wareneingangsquote'. Durch den Vergleich des tatsächlichen Wareneingangsdatums mit diesem angeforderten Datum können Unternehmen die Lieferantenzuverlässigkeit und die interne Wareneingangseffizienz quantitativ messen, was das Dashboard 'Lieferantenlieferleistung' direkt unterstützt. Warum es wichtig ist 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. Woher erhalten Tabelle: EKPO, Feld: EINDT Beispiele 2023-06-102023-07-222023-08-01 | |||
Beschaffungsprozess - Bestellaktivitäten
| Aktivität | Beschreibung | ||
|---|---|---|---|
Bestellanforderung 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 Bestellanforderungsdokument speichert (unter Verwendung von Transaktionen wie ME51N), welches einen eindeutigen Datensatz in der Tabelle EBAN erzeugt. | ||
Warum es wichtig ist 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 umsetzbare Bestellungen zu messen. Woher erhalten Erfasst bei der Erstellung eines Eintrags in der Bestellanforderungskopf-Tabelle (EBAN). Das Erstellungsdatum (EBAN-BADAT) und die Uhrzeit dienen als Timestamp für dieses Event. Erfassen Identifizieren Sie neue Einträge in der EBAN-Tabelle basierend auf dem Erstellungsdatum. Ereignistyp explicit | |||
Bestellung abgeschlossen | Zeigt an, dass eine Bestellposition als vollständig geliefert betrachtet wird. Dies ist ein abgeleitetes Ereignis, das typischerweise vom Indikator 'Lieferung erledigt' abgeleitet wird, der automatisch oder manuell an der Bestellposition gesetzt wird. | ||
Warum es wichtig ist 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. Woher erhalten 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. | ||
Warum es wichtig ist Dies ist ein kritischer Meilenstein, der den Startpunkt für die Lieferanten-Durchlaufzeit markiert. Die Analyse der Zeit von diesem Event bis zum Wareneingang ist entscheidend für die Bewertung der Lieferantenleistung und der Lieferpünktlichkeit. Woher erhalten Erfasst in der Nachrichtenstatustabelle (NAST). Der Timestamp 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-Timestamp 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. | ||
Warum es wichtig ist Markiert den offiziellen Start des Bestelllebenszyklus. Es dient als wichtiger Meilenstein zur Messung der PR-zu-PO-Konvertierungszeit und der gesamten Auftragserfüllungszeit. Woher erhalten Erfasst vom Erstellungsdatum (EKKO-AEDAT) in der Bestellkopf-Tabelle (EKKO) für die entsprechende Bestellnummer (EKKO-EBELN). Erfassen Verwenden Sie den Erstellungs-Timestamp 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 typischerweise aus einer Änderung des Freigabestatus der Bestellung in einen „vollständig freigegebenen“ oder „genehmigten“ Zustand abgeleitet. | ||
Warum es wichtig ist Diese Aktivität ist entscheidend 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. Woher erhalten 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 | |||
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. | ||
Warum es wichtig ist 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. Woher erhalten Erfasst bei der Erstellung eines Materialbelegs. Der Event-Timestamp 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-Timestamp aus der Tabelle MKPF für Materialbelege, die sich auf die Bestellung beziehen. Ereignistyp explicit | |||
Bestellanforderung genehmigt | Stellt die formale Genehmigung einer Bestellanforderung dar, die deren Umwandlung in eine Bestellung autorisiert. Dieses Event wird aus Änderungen in den Freigabestatusfeldern innerhalb der Bestellanforderungsdaten abgeleitet, wie sie vom SAP-Freigabestrategie-Workflow verfolgt werden. | ||
Warum es wichtig ist Die Verfolgung von Genehmigungen ist entscheidend, um Bottlenecks in der Vorbestellungsphase zu identifizieren und die Compliance mit Genehmigungsrichtlinien sicherzustellen. Verzögerungen hier wirken sich direkt auf die gesamte Beschaffungsdurchlaufzeit aus. Woher erhalten Abgeleitet aus den Änderungsprotokollen für die Bestellanforderungstabelle (EBAN), insbesondere durch die Überwachung von Änderungen an den Freigabestatusfeldern (z.B. EBAN-FRGZU) oder durch die Analyse von Änderungsbelegen in CDHDR/CDPOS für das Objekt EBAN. Erfassen Überwachen Sie Änderungsbelege für EBAN-Freigabestatusfelder, um den Timestamp der finalen Genehmigung zu identifizieren. Ereignistyp inferred | |||
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 ausstehenden Genehmigung erreicht. | ||
Warum es wichtig ist 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. Woher erhalten 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 die Freigabestrategie für die Bestellung auslöst. 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. | ||
Warum es wichtig ist Häufige Änderungen, insbesondere nach der Genehmigung, weisen auf Prozessineffizienzen, mangelhafte anfängliche Planung oder Scope Creep hin. Diese Aktivität ist essenziell für das Dashboard zu Bestellungs-Nachbearbeitungen und Änderungen sowie für die zugehörigen KPIs. Woher erhalten Explizit protokolliert in den Änderungsbelegkopf- (CDHDR) und Positionstabellen (CDPOS) für das Bestellobjekt (EINKBELEG). Jede Änderung erstellt einen neuen Eintrag mit einem Timestamp. 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. | ||
Warum es wichtig ist 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. Woher erhalten 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 | |||
Bestellung zurückgewiesen | 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. | ||
Warum es wichtig ist 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. Woher erhalten Abgeleitet aus Änderungsbelegen (CDHDR/CDPOS) für den Bestellfreigabestatus. Eine Ablehnung wird typischerweise 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 | |||
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. | ||
Warum es wichtig ist 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. Woher erhalten 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-Timestamp aus der Tabelle ESSR für Leistungserfassungsblätter, die mit der Bestellung verknüpft sind. Ereignistyp explicit | |||
Qualitätsinspektion durchgeführt | Zeigt an, dass erhaltene Waren einer Qualitätsprüfung unterzogen wurden. Diese Aktivität wird typischerweise abgeleitet, wenn ein Prüflos, das zum Zeitpunkt des Wareneingangs erstellt wurde, einen Verwendungsentscheid im Qualitätsmanagement-Modul erhalten hat. | ||
Warum es wichtig ist In Branchen, in denen Qualität entscheidend ist, hilft diese Aktivität, die Dauer und die Ergebnisse des Prüfprozesses zu analysieren. Verzögerungen an dieser Stelle können Bottlenecks zwischen dem Wareneingang und der Verfügbarkeit für die Nutzung verursachen. Woher erhalten 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 | |||
Ware zurückgesendet | Stellt die Rücksendung zuvor empfangener Waren an den Lieferanten dar, oft aufgrund von Qualitätsproblemen oder falschen Lieferungen. Dies ist ein explizites Event, das durch das Buchen eines Materialbelegs mit einer retourspezifischen Bewegungsart erfasst wird. | ||
Warum es wichtig ist Diese Aktivität beleuchtet Probleme mit der Lieferantenqualität oder Bestellgenauigkeit und ist ein Schlüsselindikator für Prozessnacharbeit. Sie ist entscheidend für die Berechnung des KPI der Wareneingangsdifferenzrate. Woher erhalten 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 Timestamp. Erfassen Identifizieren Sie Materialbelege mit einer Retourenbewegungsart (z.B. 122), die sich auf die ursprüngliche Bestellung beziehen. Ereignistyp explicit | |||
Extraktionsleitfäden
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, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode und DocumentType.
- 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.
- Bestellanforderungsdaten auswählen: Fragen Sie die Tabelle EBAN nach Ereignissen 'Bestellanforderung erstellt' ab und verknüpfen Sie diese über die Tabelle EKPO mit Bestellungen. Verwenden Sie die Änderungsbelegtabellen (CDHDR, CDPOS), um Ereignisse 'Bestellanforderung 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 EventTime 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 entscheidend, einen spezifischen Datumsbereich für die Datenextraktion zu definieren, typischerweise 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 Performance 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 Events, auch solche auf Positionsebene (z.B. Wareneingänge), werden dieser Haupt-Case ID zugeordnet.
- Performance-Ü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 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 umfassende Abfrage wurde entwickelt, um 14 verschiedene Aktivitäten aus dem Procure-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.
- Ergebnisse ü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 EventTime 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, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentType.
- 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 entscheidend, 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 gewährleisten, filtern Sie immer nach EKKO.BUKRS (Buchungskreis) und EKKO.BSART (Belegart). Dies grenzt den Umfang auf relevante juristische Einheiten und Geschäftsprozesse ein.
- Performance-Ü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 Performance-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 indicatorSchritte
- Voraussetzungen und Verbindung: Stellen Sie sicher, dass Ihr Drittanbieter-ETL-Tool den SAP Certified Connector installiert und lizenziert hat. Konfigurieren Sie in der Verwaltungskonsole Ihres ETL-Tools eine neue Verbindung zu Ihrem SAP ECC-System. Sie benötigen den Anwendungsserver-Host, die Systemnummer, den Mandant und einen dedizierten SAP-Benutzer mit den entsprechenden RFC- und Tabellenleseberechtigungen.\n2. Quelltabellen identifizieren: Definieren Sie in Ihrem ETL-Job oder Data Flow die benötigten SAP-Tabellen als Data Sources. Die primären Tabellen umfassen EKKO (Bestellkopf), EKPO (Bestellposition), EBAN (Bestellanforderung), CDHDR (Änderungsbelegkopf), CDPOS (Änderungsbelegposition), MSEG (Belegsegment: Material), MKPF (Materialbelegkopf), NAST (Nachrichtenstatus), ESSR (Leistungserfassungsblattkopf) und QALS (Prüflos).\n3. 'Bestellung angelegt' extrahieren: Erstellen Sie einen Data Flow, der aus der EKKO-Tabelle liest. Filtern Sie die Datensätze basierend auf Ihrem gewünschten Datumsbereich (z.B. über AEDAT) und dem organisatorischen Umfang (z.B. BUKRS für Buchungskreis, BSART für Belegart). Mappen Sie EKKO.EBELN auf PurchaseOrder, 'Bestellung angelegt' auf Activity, und kombinieren Sie AEDAT und ERZET für die EventTime. Mappen Sie weitere erforderliche Attribute.\n4. 'Wareneingang gebucht' extrahieren: Erstellen Sie einen separaten Data Flow, der aus MSEG liest und mit MKPF über MBLNR und MJAHR verknüpft wird. Filtern Sie nach relevanten Bewegungsarten, wie z.B. '101'. Mappen Sie MSEG.EBELN auf PurchaseOrder, 'Wareneingang gebucht' auf Activity, und verwenden Sie MKPF.CPUDT und MKPF.CPUTM für die EventTime.\n5. Änderungsbasierte Ereignisse (Genehmigungen, Änderungen, Löschungen) extrahieren: Erstellen Sie einen Data Flow, der aus CDHDR und CDPOS liest, verknüpft über CHANGENR. Diese einzelne Quelle kann verwendet werden, um mehrere Activities abzuleiten.\n * Filtern Sie OBJECTCLAS = 'EINKBELEG' und TABNAME = 'EKPO'. \n * Für 'Bestellung genehmigt' filtern Sie nach Änderungen am Freigabestatusfeld (z.B. FNAME = 'FRGZU'), wobei der neue Wert (VALUE_NEW) die endgültige Genehmigung anzeigt. \n * Für 'Bestellung gelöscht' filtern Sie nach Änderungen am Löschkennzeichen (FNAME = 'LOEKZ'), wobei der neue Wert 'L' ist.\n * Für 'Bestellung geändert' filtern Sie nach anderen relevanten Feldänderungen, ausgenommen der spezifischen Statusfelder, die für andere Activities verwendet werden.\n * Verwenden Sie für all diese Events CDHDR.UDATE und CDHDR.UTIME für die EventTime.\n6. Bestellanforderungsereignisse extrahieren: Erstellen Sie einen Data Flow aus EBAN für 'Bestellanforderung angelegt'. Um diese mit einem PurchaseOrder Case zu verknüpfen, verbinden Sie EBAN mit EKPO über die Bestellanforderungsnummer (BANFN) und die Position (BNFPO). Für 'Bestellanforderung genehmigt' verwenden Sie CDHDR/CDPOS mit OBJECTCLAS = 'BANF'. Dies erfordert eine sorgfältige Zuordnung, um sicherzustellen, dass das Event der späteren Bestellung korrekt zugeordnet wird.\n7. 'Bestellung an Lieferant gesendet' extrahieren: Erstellen Sie einen Data Flow, der aus der NAST-Tabelle liest. Filtern Sie nach OBJECTKEY (welches die Bestellnummer enthält), der relevanten Nachrichtenart (KSCHL) und einem erfolgreichen Verarbeitungsstatus (VSTAT = '1'). Verwenden Sie ERDAT und UHR für die EventTime.\n8. Aktivitätsströme zusammenführen: Verwenden Sie eine 'Union'- oder 'Merge'-Transformation in Ihrem ETL-Tool, um die Ergebnisse aller in den vorherigen Schritten erstellten individuellen Data Flows zu kombinieren. Stellen Sie sicher, dass die Spaltennamen und Datentypen in allen Streams konsistent sind (PurchaseOrder, Activity, EventTime usw.).\n9. Datentyp- und Formatkonvertierung: Stellen Sie sicher, dass die Spalte EventTime in ein konsistentes Timestamp-Format konvertiert wird (z.B. YYYY-MM-DD HH:MM:SS). Konvertieren Sie OrderAmount in ein standardisiertes Dezimalformat.\n10. Ziel definieren: Konfigurieren Sie ein Ziel oder einen 'Sink' für Ihren kombinierten Data Stream. Dies ist typischerweise eine Flat File, wie z.B. eine CSV- oder Parquet-Datei. Konfigurieren Sie den Delimiter, die Text Qualifiers und Header Options.\n11. Ausführen und Validieren: Führen Sie den kompletten ETL-Job aus. Führen Sie Validierungsprüfungen der Ausgabedatei durch, um sicherzustellen, dass alle 14 Activities vorhanden sind, die Zeilenanzahl angemessen ist und die Key Attributes korrekt ausgefüllt sind.\n12. Planen und Exportieren: Sobald die Validierung abgeschlossen ist, planen Sie den ETL-Job für die periodische Ausführung (z.B. nächtlich), um die Daten aktuell zu halten. Die generierte Datei ist nun bereit, in Ihr Process Mining-Tool hochgeladen zu werden.
Konfiguration
- Voraussetzungen: Ein kommerzielles ETL-Tool (z.B. Informatica PowerCenter, Talend, SAP Data Services) 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 entscheidend, 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.
- Performance-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]);