Ihr Supply Chain Management Daten-Template
Ihr Supply Chain Management Daten-Template
- Empfohlene Attribute zur Erfassung
- Wichtige Aktivitäten zur Verfolgung
- Extraktionsanleitung
Supply Chain Management Attribute
| Name | Beschreibung | ||
|---|---|---|---|
| Aktivitätsname ActivityName | Der Name der Geschäftsaktivität oder des Ereignisses, das zu einem bestimmten Zeitpunkt im Lieferkettenprozess stattfand. | ||
| Beschreibung Dieses Attribut beschreibt einen spezifischen Schritt oder Meilenstein innerhalb des Logistikauftragslebenszyklus, wie z.B. 'Bestellung ausgestellt' oder 'Warenausgang gebucht'. Diese Aktivitäten bilden die Abfolge von Ereignissen, die den Prozess konstituieren. Die Analyse der Abfolge von Aktivitäten ist der Kern des Process Mining. Sie ermöglicht die Entdeckung des tatsächlichen Prozessflusses, den Vergleich mit Standardarbeitsanweisungen und die Identifizierung von Prozessschritten, die Verzögerungen verursachen oder Nacharbeit erfordern. Bedeutung Es definiert die Schritte des Prozesses, was grundlegend für die Entdeckung von Prozesslandkarten, die Analyse von Varianten und die Messung von Durchlaufzeiten zwischen Aktivitäten ist. Datenquelle Generiert durch die Zuordnung von Transaktionscodes oder Statusänderungen aus verschiedenen SAP-Tabellen (z. B. EKKO, LIKP, VBUK) zu benutzerfreundlichen Aktivitätsnamen während der Datentransformation. Beispiele Bestellung ausgestelltWareneingang für Bestellung gebucht`Auslieferung erstellt`Liefernachweis bestätigt | |||
| Ereigniszeit EventTime | Der Zeitstempel, der angibt, wann die Aktivität stattfand, einschließlich Datum und Uhrzeit. | ||
| Beschreibung Dieses Attribut liefert das präzise Datum und die Uhrzeit für jede Aktivität im Prozess. Es dient als chronologisches Rückgrat des Event Logs und ordnet die Prozessschritte so, wie sie in der Realität stattgefunden haben. Die Event Time ist entscheidend für alle zeitbasierten Analysen. Sie wird verwendet, um Zykluszeiten zwischen Aktivitäten zu berechnen, die gesamte Durchlaufzeit eines Prozesses zu messen, Performance-Trends über die Zeit zu identifizieren und Engpässe genau zu lokalisieren. Bedeutung Dieser Zeitstempel ist unerlässlich für die Berechnung aller Dauern und Performance-Metriken, was die Analyse von Prozessengpässen und Durchlaufzeiten ermöglicht. Datenquelle Extrahiert aus Zeitstempelfeldern, die mit der Dokumentenerstellung oder Statusänderungen in zentralen SAP-Tabellen, wie CDHDR/CDPOS für Änderungsbelege, oder spezifischen Datums-/Zeitfeldern wie ERDAT/ERZET in Kopfzeilentabellen verknüpft sind. Beispiele 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Logistikauftrag LogisticsOrder | Der eindeutige Identifikator für einen einzelnen, End-to-End-Lieferkettenprozess, von der ersten Nachfrage bis zur endgültigen Lieferbestätigung. | ||
| Beschreibung Der Logistikauftrag dient als primärer Case-Identifikator und verknüpft alle Aktivitäten, die mit einer spezifischen Nachfrage oder einem Erfüllungsauftrag innerhalb der Lieferkette zusammenhängen. Dieser Ansatz ermöglicht die Verfolgung des gesamten Lebenszyklus einer Produktreise, von der Planung und Beschaffung bis zur Produktion und Distribution, und gewährleistet so eine umfassende Sicht auf den Prozess. Im Process Mining zeigt die Analyse nach Logistikauftrag den vollständigen Pfad zur Erfüllung einer Nachfrage. Sie hilft, gemeinsame Varianten, Engpässe und Abweichungen in der gesamten Lieferkette zu identifizieren, anstatt isolierte Prozesse wie Beschaffung oder Vertrieb getrennt zu betrachten. Bedeutung Dies ist der wesentliche Schlüssel, um alle zugehörigen Ereignisse zu einer einzigen Prozessinstanz zu verbinden und so eine End-to-End-Analyse der Lieferkette zu ermöglichen. Datenquelle Dies ist ein konzeptioneller Identifikator und muss möglicherweise durch die Verknüpfung verschiedener Belegnummern, wie einer Kundenauftragsnummer mit ihren nachfolgenden Bestell- und Liefernummern, konstruiert werden. Konsultieren Sie die SAP S/4HANA Supply Chain Dokumentation oder einen Fachexperten. Beispiele LO-4500078192LO-4500078193LO-4500078194 | |||
| Letzte Datenaktualisierung LastDataUpdate | Der Timestamp, wann die Daten zuletzt aktualisiert oder aus dem Quellsystem extrahiert wurden. | ||
| Beschreibung Dieses Attribut gibt an, wann die Daten für das Event Log zuletzt aktualisiert wurden. Es liefert ein 'Frische'-Datum für die analysierten Daten und stellt sicher, dass Benutzer über die Aktualität der Daten informiert sind. In jeder Analyse ist das Verständnis der Aktualität der Daten entscheidend für fundierte Entscheidungen. Dieser Zeitstempel hilft Benutzern, den Daten zu vertrauen und das Zeitfenster zu verstehen, das von den Dashboards und KPIs abgedeckt wird. Bedeutung Gewährleistet Transparenz über die Aktualität der Daten, sodass Benutzer wissen, wie aktuell die Prozessanalyse ist. Datenquelle Dies ist ein Metadatenfeld, das typischerweise vom Datenextraktions- oder ETL-Tool am Ende einer erfolgreichen Datenaktualisierung generiert und gefüllt wird. Beispiele 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Quellsystem SourceSystem | Das System, aus dem die Daten stammen. | ||
| Beschreibung Identifiziert die spezifische Quellsysteminstanz, in der die Event-Daten generiert wurden. In einer komplexen Systemlandschaft könnte ein Unternehmen mehrere SAP S/4HANA-Instanzen für verschiedene Regionen oder Geschäftseinheiten haben. Dieses Attribut ist wichtig für die Daten-Governance und zur Segmentierung der Analyse. Es ermöglicht Analysten, die Prozessleistung zwischen verschiedenen Systemen zu vergleichen oder Daten aus einer einzigen, autoritativen Quelle zu isolieren. Bedeutung Liefert einen kritischen Kontext für die Datenherkunft, was wichtig für die Datenvalidierung und den Vergleich von Prozessen über verschiedene Systemlandschaften hinweg ist. Datenquelle Dies ist typischerweise ein statischer Wert, der während des Datenextraktionsprozesses hinzugefügt wird, um den Ursprung zu identifizieren, z.B. die SAP System ID (SAPSID). Beispiele S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| `Materialnummer` MaterialNumber | Der eindeutige Identifikator für das Produkt oder Material, das bearbeitet wird. | ||
| Beschreibung Die Materialnummer, oft auch SKU genannt, ist der eindeutige Code für ein spezifisches Produkt innerhalb von SAP. Sie verknüpft Prozessaktivitäten mit den physischen oder digitalen Gütern, die gefertigt, beschafft oder versandt werden. Dieses Attribut ist entscheidend für die produktzentrierte Analyse. Es hilft, festzustellen, ob bestimmte Produkte anfälliger für Qualitätsprobleme, Produktionsverzögerungen oder Fehlbestände sind. Dashboards können nach Material gefiltert werden, um die Performance für spezifische Produktlinien zu untersuchen. Bedeutung Ermöglicht eine produktbezogene Analyse, um festzustellen, ob Prozessprobleme wie Verzögerungen oder Qualitätsmängel auf bestimmte Materialien konzentriert sind. Datenquelle In Positionstabellen der meisten Belege zu finden, z. B. VBAP für Kundenaufträge, EKPO für Bestellungen und LIPS für Lieferungen. Das Feld heißt typischerweise MATNR. Beispiele FG-100-ARM-2034-BSA-5500 | |||
| Angefordertes Lieferdatum RequestedDeliveryDate | Das Datum, an dem der Lieferant zur Lieferung der Waren aufgefordert wurde. | ||
| Beschreibung Dies ist das in der Bestellung angegebene Lieferdatum, das das Ziel für den Lieferanten darstellt. Es dient als Basis, an der die tatsächliche Lieferleistung gemessen wird. Dieses Datum ist entscheidend für die Berechnung des KPIs für die pünktliche Lieferquote des Lieferanten. Durch den Vergleich des tatsächlichen Wareneingangsdatums mit diesem angeforderten Datum kann ein Unternehmen objektiv messen, ob Lieferanten ihren Zusagen nachkommen. Bedeutung Dies ist das Basisdatum, das zur Berechnung des KPIs 'Pünktliche Lieferquote des Lieferanten' verwendet wird, was es entscheidend für das Lieferantenleistungsmanagement macht. Datenquelle In der Bestellpositionstabelle EKPO zu finden, mit dem Feldnamen EINDT (Lieferdatum). Beispiele 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Ausführender Benutzer ExecutingUser | Die `Benutzer-ID` der `Person`, die die `Aktivität` ausgeführt hat. | ||
| Beschreibung Dieses Attribut erfasst den SAP-Benutzernamen oder die ID des Mitarbeiters, der die jeweilige Aktivität ausgeführt hat, z.B. die Erstellung einer Bestellung oder die Buchung eines Wareneingangs. Es verknüpft Prozessschritte mit den beteiligten menschlichen Ressourcen. Die Analyse nach Benutzer hilft beim Verständnis der Arbeitslastverteilung, bei der Identifizierung von Schulungsbedarfen und beim Aufdecken von Leistungsunterschieden zwischen Einzelpersonen oder Teams. Sie ist auch wertvoll für die Compliance-Analyse, um zu sehen, wer kritische Prozessschritte ausgeführt hat. Bedeutung Ordnet Aktivitäten bestimmten Benutzern zu, was eine Arbeitslastanalyse, einen Performance-Vergleich und die Untersuchung nicht konformer Handlungen ermöglicht. Datenquelle In 'Erstellt von'- oder 'Geändert von'-Feldern vieler SAP-Tabellen zu finden, z. B. ERNAM in EKKO (Bestellkopf), LIKP (Lieferkopf) und VBRK (Rechnungskopf). Beispiele CBROWNJSMITHASINGH | |||
| Kundenname CustomerName | Der Name des Kunden, für den der Auftrag erfüllt wird. | ||
| Beschreibung Dieses Attribut identifiziert den Endkunden, der mit einem Kundenauftrag und nachfolgenden Erfüllungsaktivitäten verbunden ist. Es liefert Kontext für die Nachfrageseite des Lieferkettenprozesses. Im Process Mining hilft die Analyse nach Kunde, verschiedene Erfüllungsmuster oder Leistungsniveaus für Schlüsselkunden zu identifizieren. Sie wird in Dashboards wie der Liefernachweis-Verzögerungsanalyse verwendet, um festzustellen, ob bestimmte Kunden Bestätigungen konsequent verzögern. Bedeutung Ermöglicht die Segmentierung der Analyse nach Kunden, wodurch kundenspezifische Verhaltensweisen, Engpässe oder die Performance von Service Level Agreements aufgedeckt werden. Datenquelle Die Kundennummer (KUNNR) ist in Verkaufsbelegen (z.B. Tabelle VBAK) gespeichert. Der Name wird aus der zentralen Kundenstammtabelle KNA1 abgerufen. Beispiele Retail CorpLösungen innovierenFertigungspartner | |||
| Lieferantenname SupplierName | Der Name des Lieferanten oder Anbieters, der mit Beschaffungsaktivitäten verbunden ist. | ||
| Beschreibung Dieses Attribut identifiziert den Lieferanten, von dem Waren oder Dienstleistungen bezogen werden. Es ist typischerweise mit Aktivitäten wie 'Bestellanforderung erstellt' und 'Bestellung ausgestellt' verbunden. Der Lieferantenname ist entscheidend für das Dashboard zur Lieferantenleistung. Er ermöglicht das Filtern und Segmentieren der Daten, um pünktliche Lieferquoten, Durchlaufzeiten und Qualitätsniveaus über verschiedene Lieferanten hinweg zu vergleichen, was für strategisches Sourcing und Lieferantenbeziehungsmanagement von entscheidender Bedeutung ist. Bedeutung Ermöglicht eine Performance-Analyse nach Lieferanten, die entscheidend für die Optimierung des Beschaffungsprozesses und die Bewertung der Lieferantenverlässlichkeit ist. Datenquelle Die Lieferantennummer (LIFNR) ist in Einkaufsbelegen (z.B. Tabelle EKKN, EBAN) gespeichert. Der Name wird aus der zentralen Lieferantenstammtabelle LFA1 abgerufen. Beispiele Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Qualitätsprüfergebnis QualityInspectionResult | Das Ergebnis einer Qualitätsprüfung, z.B. 'Bestanden' oder 'Fehlgeschlagen'. | ||
| Beschreibung Dieses Attribut erfasst das Ergebnis einer Qualitätsprüfung, die an produzierten oder empfangenen Waren durchgeführt wurde. Das Ergebnis bestimmt, ob die Waren zum nächsten Schritt übergehen können oder ob sie Nacharbeit, Rücksendung oder Verschrottung erfordern. Dies ist ein kritisches Attribut für das Dashboard und den KPI für Ausschussquoten der Qualitätskontrolle. Die Analyse der Häufigkeit und Gründe für Fehler hilft, systemische Qualitätsprobleme bei spezifischen Produkten, Lieferanten oder Produktionslinien zu identifizieren. Bedeutung Unterstützt direkt die Berechnung qualitätsbezogener KPIs und hilft, Ursachen für schlechte Qualität in der Lieferkette zu identifizieren. Datenquelle Diese Informationen werden typischerweise im Qualitätsmanagement (QM)-Modul gespeichert. Daten können aus Prüflostabellen wie QALS und Verwendungsentscheidungscodes in QAVE stammen. Beispiele BestandenFehlgeschlagenNacharbeit erforderlichMit Abweichung bestanden | |||
| Werk Plant | Die Fertigungs- oder Distributionsstätte, in der die Aktivität stattfand. | ||
| Beschreibung Das Werk ist eine SAP-Organisationseinheit, die einen Standort darstellt, an dem Waren produziert, gelagert oder verteilt werden. Es liefert den geografischen oder funktionalen Kontext für Prozessaktivitäten. Die Analyse der Prozessperformance nach Werk ist eine häufige Anforderung. Sie ermöglicht Benchmarking und den Vergleich von Effizienz, Durchsatz und Compliance über verschiedene Betriebsstandorte hinweg, was hilft, Best Practices oder Standorte mit Verbesserungsbedarf zu identifizieren. Bedeutung Bietet eine geografische oder organisatorische Dimension für die Analyse und ermöglicht den Leistungsvergleich über verschiedene Standorte hinweg. Datenquelle In vielen Belegpositionstabellen zu finden, z. B. VBAP (Vertrieb), EKPO (Einkauf) und LIPS (Lieferung). Das Feld heißt typischerweise WERKS. Beispiele 100021003500 | |||
| `Verkaufsauftragsnummer` SalesOrderNumber | Der eindeutige Identifikator für das Kundenauftragsbeleg (SO). | ||
| Beschreibung Die Kundenauftragsnummer ist die offizielle Belegnummer, die einen Verkauf an einen Kunden bestätigt. Sie ist ein Schlüsselidentifikator im Order-to-Cash-Teil der Lieferkette. Dieses Attribut ist entscheidend für die Verfolgung der Erfüllung eines spezifischen Kundenauftrags. Es hilft, die ursprüngliche Kundenanfrage mit allen nachfolgenden Aktivitäten wie Lieferung und Fakturierung zu verknüpfen und unterstützt die Analyse der Auftragserfüllungsdurchlaufzeit. Bedeutung Dient als Schlüsselidentifikator für den Auftragsabwicklungsprozess und verknüpft die Kundennachfrage mit Logistik und finanzieller Abwicklung. Datenquelle Im Kundenauftragskopftabelle VBAK und Positionstabelle VBAP zu finden. Das Feld heißt VBELN. Beispiele 100023451000234610002347 | |||
| Bearbeitungszeit ProcessingTime | Die Dauer der aktiven Bearbeitung einer Aktivität. | ||
| Beschreibung Die Bearbeitungszeit ist die berechnete Dauer vom Start- bis zum Endzeitpunkt einer Aktivität. Sie stellt die tatsächliche Arbeits- oder 'Berührungszeit' für einen Prozessschritt dar, im Gegensatz zur Wartezeit zwischen den Schritten. Diese Metrik ist grundlegend, um Ineffizienzen zu identifizieren. Indem die Bearbeitungszeit von der Wartezeit isoliert wird, können Analysten feststellen, ob Verzögerungen durch langsame Ausführung von Aufgaben oder durch lange Warteschlangen und Übergabeverzögerungen zwischen Abteilungen oder Systemen verursacht werden. Bedeutung Hilft, aktive Arbeitszeit von unproduktiver Wartezeit zu unterscheiden, was entscheidend ist, um die wahren Ursachen von Prozessverzögerungen zu identifizieren. Datenquelle Berechnet durch Subtraktion der Startzeit von der Endzeit der Aktivität (Endzeit - Startzeit). Beispiele PT1H30MPT8HP2D | |||
| Bestellmenge OrderQuantity | Die Menge des Materials in der Bestellposition. | ||
| Beschreibung Dieses Attribut spezifiziert die Anzahl der Materialeinheiten, die in einer Kundenauftrags- oder Bestellposition angefordert wurden. Es liefert ein Volumenmaß für jede Transaktion. Die Analyse nach Menge hilft, die Analyse auf Aufträge mit hohem Volumen zu priorisieren, die einen größeren geschäftlichen Einfluss haben können. Es kann auch verwendet werden, um andere Metriken zu normalisieren, wie die Berechnung der Kosten pro Einheit, oder um zu verstehen, wie die Auftragsgröße die Bearbeitungszeiten beeinflusst. Bedeutung Bietet Volumenkontext für Transaktionen und ermöglicht eine Auswirkungsanalyse sowie die Segmentierung von Fällen nach Größe. Datenquelle In Positionstabellen zu finden, z. B. MENGE in EKPO (Bestellung) oder KWMENG in VBAP (Kundenauftrag). Beispiele 100500025 | |||
| Bestellnummer PurchaseOrderNumber | Der eindeutige Identifikator für das Bestellbeleg (PO). | ||
| Beschreibung Die Bestellnummer ist die offizielle Belegnummer, die zur Bestellung von Materialien bei einem Lieferanten verwendet wird. Sie ist ein Schlüsselidentifikator im Beschaffungsteil der Lieferkette. Dieses Attribut ermöglicht tiefgehende Analysen des Beschaffungsprozesses. Es wird im Dashboard für die End-to-End-Durchlaufzeit der Beschaffung und zur Berechnung des KPIs für die pünktliche Lieferquote des Lieferanten verwendet, um Bestellanforderungs-, Bestell-, Wareneingangs- und Zahlungsaktivitäten zu verknüpfen. Bedeutung Dient als Schlüsselidentifikator für die Detailanalyse des Beschaffungssubprozesses und die Verknüpfung verwandter Beschaffungsereignisse. Datenquelle Im Bestellkopftabelle EKKO und Positionstabelle EKPO zu finden. Das Feld heißt EBELN. Beispiele 450007819245000781934500078194 | |||
| Endzeit EndTime | Der Zeitstempel, der angibt, wann eine Aktivität abgeschlossen wurde, und zur Berechnung der Bearbeitungszeit verwendet wird. | ||
| Beschreibung Die Endzeit markiert den Abschluss einer spezifischen Aktivität. Während die Startzeit (EventTime) angibt, wann eine Aktivität beginnt, ist die Endzeit notwendig, um zu verstehen, wie lange eine Aktivität zur Ausführung benötigte, insbesondere bei nicht-instantane Aktivitäten. In der Analyse ermöglicht das Vorhandensein von Start- und Endzeit eine präzise Messung der Bearbeitungszeit im Vergleich zur Wartezeit. Dies hilft zu unterscheiden zwischen der Zeit, die aktiv an einer Aufgabe gearbeitet wird, und der Zeit, die auf den nächsten Schritt gewartet wird, was entscheidend für die Identifizierung von Effizienzpotenzialen ist. Bedeutung Ermöglicht die Berechnung präziser Aktivitätsbearbeitungszeiten und hilft, zwischen wertschöpfender Arbeit und Wartezeit zu unterscheiden. Datenquelle Kann aus Statusänderungen in SAP abgeleitet werden. Zum Beispiel ist der Start ein Status-Update 'In Bearbeitung' und das Ende ein Status-Update 'Abgeschlossen' aus Tabellen wie JEST/JCDS. Bei sofortigen Events kann EndTime gleich StartTime sein. Beispiele 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Ist Nacharbeit IsRework | Ein Kennzeichen, das angibt, ob eine Aktivität oder eine Abfolge von Aktivitäten Rework darstellt. | ||
| Beschreibung Dieses boolesche Attribut kennzeichnet Aktivitäten, die Wiederholungen früherer Schritte im Prozess darstellen und eine Form von Nacharbeit oder Korrektur anzeigen. Zum Beispiel, wenn auf eine 'Qualitätsprüfung' ein Schritt 'Produktionsauftrag erstellt' und dann eine weitere 'Qualitätsprüfung' folgt, könnte die zweite Prüfung als Nacharbeit gekennzeichnet werden. Die Identifizierung von Nacharbeit ist entscheidend für das Verständnis von Prozesseffizienz und versteckten Kosten. Dieses Flag hilft, die Häufigkeit und den Einfluss von Nacharbeitszyklen zu quantifizieren, unterstützt die Berechnung des KPIs für die Fehlerquote der Auftragsbearbeitung und hebt Bereiche für die Prozessverbesserung hervor. Bedeutung Hilft, Prozesseffizienzen zu quantifizieren, indem explizit Aktivitäten identifiziert und gezählt werden, die Teil einer Nacharbeitsschleife sind. Datenquelle Dies wird typischerweise innerhalb des Process Mining Tools berechnet, indem wiederholte Sequenzen von Aktivitäten innerhalb desselben Case identifiziert werden. Beispiele truefalsch | |||
| Name des Spediteurs CarrierName | Der Name des Transportunternehmens oder Spediteurs, der die Sendung abwickelt. | ||
| Beschreibung Der Spediteurname identifiziert den Logistikdienstleister, der für den Transport von Waren zwischen Standorten, z.B. von einem Lager zum Kunden, verantwortlich ist. Dieses Attribut ist für das Dashboard zur Analyse der Transportdurchlaufzeit unerlässlich. Es ermöglicht den Vergleich von Transitzeiten, Kosten und Zuverlässigkeit über verschiedene Spediteure hinweg, was eine bessere Logistikplanung und Spediteurauswahl ermöglicht. Bedeutung Ermöglicht eine Performance-Analyse nach Transportanbietern, was entscheidend für die Optimierung von Logistikkosten und Lieferzeiten ist. Datenquelle Die Spediteur-ID (Spediteur) wird in Versanddokumenten wie der Tabelle VTTK (Shipment Header) gespeichert. Der Name wird aus Stammdatentabellen wie LFA1 abgerufen. Beispiele DHLFedExMaersk Logistics | |||
| Verspätete Lieferung IsLateDelivery | Ein boolesches Flag, das anzeigt, ob eine Lieferantenlieferung nach dem angeforderten Lieferdatum erfolgte. | ||
| Beschreibung Dieses berechnete Flag liefert einen einfachen Wahr- oder Falsch-Indikator dafür, ob eine Lieferung pünktlich war. Es wird durch den Vergleich des Zeitstempels der Aktivität 'Wareneingang für Bestellung gebucht' mit dem Attribut 'Angefordertes Lieferdatum' abgeleitet. Dieses Attribut vereinfacht die Erstellung von Dashboards und KPIs im Zusammenhang mit der Lieferantenleistung. Es ermöglicht eine schnelle Filterung und Aggregation, um die Lieferanten-Pünktlichkeitsrate zu berechnen und zu identifizieren, welche Lieferanten, Materialien oder Regionen die häufigsten Verzögerungen aufweisen. Bedeutung Vereinfacht die Lieferantenleistungsanalyse durch ein klares, binäres Ergebnis für jede Lieferung, was für den KPI der pünktlichen Lieferung unerlässlich ist. Datenquelle Dies ist ein berechnetes Feld. Die Logik lautet: WENN ('Wareneingang für Bestellung gebucht'.EventTime > Bestellung.AngefordertesLieferdatum) DANN Wahr ANDERS Falsch. Beispiele truefalsch | |||
Supply Chain Management Aktivitäten
| Aktivität | Beschreibung | ||
|---|---|---|---|
| `Verkaufsauftrag` erstellt | Diese Aktivität markiert die Erstellung eines neuen Kundenauftrags, der formal die Anfrage eines Kunden nach Waren erfasst. Es ist ein explizites Ereignis, das aufgezeichnet wird, wenn ein Benutzer ein neues Kundenauftragsdokument im System speichert. | ||
| Bedeutung Dies ist der primäre Ausgangspunkt für den Order-to-Cash-Prozess. Die Analyse der Zeit von diesem Ereignis zu anderen enthüllt die gesamte Durchlaufzeit der Auftragserfüllung und identifiziert anfängliche Bearbeitungsverzögerungen. Datenquelle Dieses Ereignis wird explizit protokolliert. Es ist in den Änderungsbelegen für Kundenauftragstabellen (CDHDR/CDPOS) oder über den Erstellungszeitstempel in der Kundenauftragskopftabelle (VBAK, Feld ERDAT) zu finden. Erfassen Verwenden Sie das Erstellungsdatum (VBAK-ERDAT) und die Uhrzeit (VBAK-ERZET) für den Kundenauftragsbeleg. Ereignistyp explicit | |||
| Bestellung ausgestellt | Kennzeichnet die formale Erstellung und Ausstellung einer Bestellung an einen externen Lieferanten für benötigte Materialien. Diese Aktivität wandelt eine Bestellanforderung in eine rechtsverbindliche Verpflichtung mit einem Lieferanten um. | ||
| Bedeutung Als wichtiger Meilenstein ist diese Aktivität entscheidend für die Messung von Lieferantenlieferzeiten und Beschaffungsdurchlaufzeiten. Sie bildet die Grundlage für die Bewertung der Lieferpünktlichkeit von Lieferanten. Datenquelle Dies ist ein explizites Ereignis, das bei der Erstellung der Bestellung protokolliert wird. Der Erstellungszeitstempel ist in der Bestellkopftabelle (EKKO, Feld AEDAT) gespeichert. Erfassen Verwenden Sie das Beleg-Erstellungsdatum (EKKO-AEDAT) für die Bestellung. Ereignistyp explicit | |||
| Liefernachweis bestätigt | Stellt die formale Bestätigung vom Kunden oder Spediteur dar, dass die Waren wie spezifiziert empfangen wurden. Dies wird oft durch die Aktualisierung der Auslieferung mit POD-Informationen erfasst. | ||
| Bedeutung Diese Aktivität ist der definitive Abschluss des Erfüllungsprozesses. Sie ist entscheidend für eine präzise Abrechnung, Streitbeilegung und die Messung der letzten Etappe des Lieferzyklus. Datenquelle Dies ist ein explizites Ereignis. Das Liefernachweisdatum wird in der Lieferkopftabelle (LIKP, Feld PODAT) oder verwandten POD-Tabellen (VLPOD) erfasst. Erfassen Verwenden Sie das Liefernachweisdatum (LIKP-PODAT) aus dem Lieferbeleg. Ereignistyp explicit | |||
| Produzierte Güter | Diese Aktivität stellt die Bestätigung dar, dass die Herstellung der Waren abgeschlossen ist. Sie wird typischerweise als Wareneingang aus dem Produktionsauftrag erfasst, wodurch das fertige Produkt in den Lagerbestand übergeht. | ||
| Bedeutung Dies markiert das Ende des Produktionszyklus. Die Zeit zwischen der Erstellung des Produktionsauftrags und diesem Ereignis stellt die Fertigungsdurchlaufzeit dar, eine Schlüsselmetrik für die Produktionseffizienz. Datenquelle Dies kann explizit durch eine Materialbelegbuchung (Wareneingang aus Produktionsauftrag) erfasst oder aus der finalen Bestätigung des Produktionsauftrags (Tabelle AFRU) oder einer Statusänderung auf 'Geliefert' abgeleitet werden. Erfassen Ableiten aus dem Buchungsdatum des finalen Wareneingangsbelegs für den Fertigungsauftrag oder einer Statusänderung. Ereignistyp inferred | |||
| Warenausgang gebucht | Diese Aktivität stellt den rechtlichen und physischen Abgang von Waren aus dem Lager dar. Sie reduziert den Lagerbestand und bucht die Kosten der verkauften Waren, womit der offizielle Versand der Bestellung markiert wird. | ||
| Bedeutung Dies ist ein kritischer Meilenstein, der den Beginn der 'In-Transit'-Phase markiert. Es ist der definitive Zeitpunkt, an dem die Waren den Besitz des Unternehmens zur Lieferung verlassen haben. Datenquelle Dies ist ein explizites Ereignis, das einen Materialbeleg erstellt. Der Zeitstempel wird im Materialbelegkopf (MKPF, Feld BUDAT) erfasst und aktualisiert den Warenbewegungsstatus im Lieferbeleg (LIKP, Feld WBSTK). Erfassen Verwenden Sie das Buchungsdatum (MKPF-BUDAT) aus dem Warenausgangs-Materialbeleg, der mit der Auslieferung verknüpft ist. Ereignistyp explicit | |||
| Wareneingang für Bestellung gebucht | Stellt den physischen Wareneingang von Rohmaterialien oder Gütern von einem Lieferanten gegen eine Bestellung dar. Dieses Ereignis wird erfasst, wenn die Waren im Lager oder Werk empfangen werden. | ||
| Bedeutung Diese Aktivität schließt den Lieferantenlieferanteil des Beschaffungszyklus ab. Sie ist entscheidend für die Berechnung der pünktlichen Lieferraten der Lieferanten und das Verständnis der Inbound-Logistik-Performance. Datenquelle Dies ist ein explizites Ereignis, das über eine Materialbelegbuchung erfasst wird. Der Event TimeStamp befindet sich in der Materialbelegkopftabelle (MKPF, Feld BUDAT). Die Verknüpfung zur Bestellung (PO) ist in der Positionstabelle (MSEG). Erfassen Verwenden Sie das Buchungsdatum (MKPF-BUDAT) aus dem Materialbeleg, der mit der Bestellung verknüpft ist. Ereignistyp explicit | |||
| `Auslieferung erstellt` | Kennzeichnet die Erstellung eines Lieferbelegs, der das Kommissionieren und den Versand von Waren an den Kunden autorisiert. Diese Aktivität überführt den Prozess vom Auftragsmanagement zur Logistikausführung. | ||
| Bedeutung Dies ist ein wichtiger Schritt, der den physischen Erfüllungsprozess initiiert. Verzögerungen zwischen Auftrags- und Liefererstellung können auf Planungs- oder Verfügbarkeitsprobleme hinweisen. Datenquelle Dies ist ein explizites Ereignis. Der Erstellungszeitstempel wird in der Lieferkopftabelle (LIKP, Feld ERDAT) erfasst. Erfassen Verwenden Sie das Erstellungsdatum (LIKP-ERDAT) und die Uhrzeit (LIKP-ERZET) aus dem Lieferbelegkopf. Ereignistyp explicit | |||
| `Bestellanforderung` erstellt | Diese Aktivität kennzeichnet die Erstellung einer internen Anforderung zur Beschaffung notwendiger Güter oder Rohmaterialien. Sie wird oft ausgelöst, wenn der Lagerbestand nicht ausreicht, um einen Kundenauftrag zu erfüllen, oder unter einen Wiederbestellpunkt fällt. | ||
| Bedeutung Dies ist der erste Schritt im Beschaffungszyklus. Die Verfolgung seiner Erstellung hilft, Verzögerungen bei der Initiierung der Beschaffung zu identifizieren und unterstützt die Analyse des End-to-End-Einkaufsprozesses. Datenquelle Dies ist ein explizites Ereignis. Der Erstellungszeitstempel wird in der Bestellanforderungskopftabelle (EBAN, Feld BADAT) erfasst. Erfassen Verwenden Sie das Erstellungsdatum (EBAN-BADAT) für den Bestellanforderungsbeleg. Ereignistyp explicit | |||
| `Kommissionierung abgeschlossen` | Diese Aktivität markiert den Abschluss des physischen Prozesses der Zusammenstellung von Artikeln aus dem Lager für die Auslieferung. In vielen Systemen wird dies bestätigt, wenn der Kommissionierstatus des Lieferbelegs aktualisiert wird. | ||
| Bedeutung Effizientes Kommissionieren ist entscheidend für den Lagerdurchsatz. Die Verfolgung dieser Aktivität hilft, Engpässe im Lagerbetrieb zu identifizieren und die Kommissionierleistung zu messen. Datenquelle Dies ist oft kein einzelnes diskretes Ereignis, kann aber aus Statusänderungen abgeleitet werden. Es wird erfasst, wenn der Kommissionierstatus in der Lieferpositionstabelle (LIPS, Feld KOSTA) auf 'C' (vollständig bearbeitet) gesetzt wird. Erfassen Ableiten aus Änderungsbelegen, wenn der Kommissionierstatus (LIPS-KOSTA) auf vollständig kommissioniert aktualisiert wird. Ereignistyp inferred | |||
| `Lieferung` erstellt | Stellt die Erstellung eines Versanddokuments dar, das eine oder mehrere Lieferungen für die Transportplanung gruppiert. Dieses Dokument enthält Details zum Spediteur, zur Route und zum Transportmittel. | ||
| Bedeutung Diese Aktivität ist der Beginn der formalen Transportplanung. Die Analyse der Zeitspanne zwischen Warenausgang und Versandabschluss zeigt die Effizienz des Transportprozesses auf. Datenquelle Dies ist ein explizites Ereignis, das in der Versandkopftabelle (VTTK, Feld ERDAT) aufgezeichnet wird. Dies ist Teil des LE-TRA-Moduls, das möglicherweise nicht von allen Organisationen verwendet wird. Erfassen Verwenden Sie das Erstellungsdatum (VTTK-ERDAT) aus dem Versandbelegkopf. Ereignistyp explicit | |||
| Bestandsverfügbarkeit geprüft | Stellt die systemische oder manuelle Prüfung dar, ob die angeforderten Artikel zur Erfüllung des Kundenauftrags auf Lager sind. Dies ist oft ein automatisierter Schritt bei der Erstellung des Kundenauftrags, wird aber möglicherweise nicht als separates Ereignis protokolliert. | ||
| Bedeutung Das Verständnis der Zeit zwischen einer Bestellung und dieser Prüfung sowie deren Ergebnis hilft zu analysieren, wie sich Lagerbestände auf die Erfüllungszeiten auswirken. Verzögerungen hier führen oft zu Beschaffungs- oder Produktionsaktivitäten. Datenquelle Dies ist typischerweise kein explizites Ereignis. Es kann aus der Erstellung der ersten bestätigten Einteilung in der Kundenauftragspositionstabelle (VBEP) oder aus Statusänderungen innerhalb der Auftragsposition abgeleitet werden. Erfassen Ableiten aus der Bestätigungsstatusaktualisierung der Kundenauftragsposition (Tabelle VBEP). Ereignistyp inferred | |||
| Kundenrechnung erstellt | Diese Aktivität markiert die Erstellung des Fakturabelegs für den Kunden basierend auf den gelieferten Waren oder Dienstleistungen. Sie leitet den letzten finanziellen Abwicklungsteil des Prozesses ein. | ||
| Bedeutung Diese Aktivität ist zentral für die Analyse der Fakturierungszykluszeit. Verzögerungen zwischen Lieferbestätigung und Rechnungsstellung können den Cashflow negativ beeinflussen. Datenquelle Dies ist ein explizites Ereignis. Der Erstellungszeitstempel wird in der Fakturabelegkopftabelle (VBRK, Feld ERDAT) erfasst. Erfassen Verwenden Sie das Erstellungsdatum (VBRK-ERDAT) aus dem Fakturabelegkopf. Ereignistyp explicit | |||
| Produktionsauftrag erstellt | Zeigt an, dass ein Fertigungsauftrag zur Herstellung der für den Kundenauftrag benötigten Fertigwaren angelegt wurde. Dies ist der formale Beginn des internen Fertigungsprozesses. | ||
| Bedeutung Die Erstellung eines Produktionsauftrags markiert den Beginn der Fertigungsdurchlaufzeit. Die Analyse dessen hilft, Verzögerungen zwischen Nachfragesignal und Produktionsstart zu identifizieren. Datenquelle Dies ist ein explizites Ereignis. Das Erstellungsdatum wird in der Produktionsauftragskopftabelle (AUFK, Feld ERDAT) erfasst. Erfassen Verwenden Sie das Erstellungsdatum (AUFK-ERDAT) aus der Auftragskopftabelle. Ereignistyp explicit | |||
| Qualitätsinspektion durchgeführt | Stellt den Abschluss einer Qualitätskontrolle für produzierte Waren dar. Das Ergebnis dieser Prüfung, entweder bestanden oder nicht bestanden, wird in einer Verwendungsentscheidung festgehalten. | ||
| Bedeutung Diese Aktivität ist entscheidend für die Überwachung der Produktqualität und die Identifizierung von Produktionsproblemen. Hohe Ausschussquoten oder lange Inspektionszeiten können erhebliche Engpässe darstellen. Datenquelle Dies ist ein explizites Ereignis, das erfasst wird, wenn eine Verwendungsentscheidung für einen Qualitätsprüflos getroffen wird. Das Entscheidungsdatum befindet sich in der Tabelle QALS (Feld PASTRTERM) oder QAVE. Erfassen Verwenden Sie den Zeitstempel, wann die Verwendungsentscheidung für den Prüflos erfasst wird (QALS/QAVE Tabellen). Ereignistyp explicit | |||
| Ware am Zielort entladen | Diese Aktivität kennzeichnet das physische Entladen von Waren am Kundenstandort. Dieses Ereignis wird möglicherweise nicht explizit in SAP verfolgt und muss oft aus Spediteurdaten oder nachfolgenden Ereignissen abgeleitet werden. | ||
| Bedeutung Dies markiert das Ende der 'In-Transit'-Etappe der Reise. Die Dauer vom Warenausgang bis zu diesem Punkt ist die Transportzeit, die entscheidend für die Logistikoptimierung ist. Datenquelle Dies ist selten ein explizites Ereignis im Kern-ERP. Es kann aus Spediteur-EDI-Nachrichten, Daten aus dem Transportmanagement (TM)-Modul oder dem Zeitstempel des Liefernachweisdokuments abgeleitet werden, falls verfügbar. Erfassen Ableiten aus Spediteur-Status-Updates (z. B. EDI 214) oder Verwendung des Zeitstempels des Liefernachweises als guten Näherungswert. Ereignistyp inferred | |||
Extraktionsleitfäden
Schritte
- Voraussetzungen: Stellen Sie sicher, dass Sie über einen Benutzer mit ausreichenden Berechtigungen verfügen, um auf die erforderlichen SAP S/4HANA Core Data Services (CDS) Views zugreifen zu können. Dies erfordert in der Regel eine spezielle Rolle, die von Ihrem SAP-Sicherheitsteam zugewiesen wird. Sie benötigen außerdem einen SQL-Client, wie DBeaver oder SAP HANA Studio, der sich mit der SAP HANA-Datenbank verbinden kann.
- Datenbankverbindung herstellen: Konfigurieren Sie Ihren SQL-Client, um eine Verbindung zur SAP S/4HANA-Datenbank herzustellen. Sie benötigen den Datenbankserver-Host, den Port (z. B. 3xx15, wobei xx die Instanznummer ist), einen Datenbank-Benutzernamen und ein Passwort.
- SQL-Abfrage vorbereiten: Kopieren Sie die vollständige SQL-Abfrage, die im Abfrageabschnitt dieses Dokuments bereitgestellt wird, in den Editor Ihres SQL-Clients. Diese Abfrage ist darauf ausgelegt, alle angegebenen Aktivitäten aus verschiedenen Logistik- und Vertriebsmodulen zu extrahieren.
- Extraktionsparameter festlegen: Bevor Sie die Abfrage ausführen, suchen Sie die Platzhalterbedingungen innerhalb der
WHERE-Klauseln jeder Unterabfrage. Sie müssen'YourCompanyCode'durch den tatsächlichen Buchungskreis ersetzen, den Sie analysieren, und die Datumsbereichs-Platzhalter wie'JJJJ-MM-TT'anpassen, um den gewünschten Extraktionszeitraum zu definieren. - Abfrage ausführen: Führen Sie das komplette SQL-Skript aus. Die Ausführungszeit variiert je nach ausgewähltem Datumsbereich und Datenvolumen in Ihrem System. Es ist ratsam, dies außerhalb der Spitzenzeiten durchzuführen, um die Systemlast zu minimieren.
- Erste Ergebnisse überprüfen: Nachdem die Abfrage abgeschlossen ist, überprüfen Sie kurz die Ausgabe in Ihrem SQL-Client. Prüfen Sie auf eine angemessene Anzahl von Zeilen, stellen Sie sicher, dass Spalten wie LogisticsOrder, ActivityName und EventTime gefüllt sind und bestätigen Sie, dass verschiedene Aktivitätsnamen erscheinen.
- Daten als CSV exportieren: Exportieren Sie das gesamte Ergebnis-Set aus Ihrem SQL-Client in eine CSV-Datei. Wählen Sie UTF-8-Kodierung, um Probleme mit Sonderzeichen zu vermeiden.
- Format für den Upload: Stellen Sie sicher, dass die Spaltenüberschriften in der finalen CSV-Datei exakt den Attributnamen entsprechen, die für die Ingestion erforderlich sind (z. B.
LogisticsOrder,ActivityName,EventTime). Es sollten keine weiteren Datentransformationen erforderlich sein, wenn die SQL-Abfrage wie bereitgestellt verwendet wird.
Konfiguration
- Voraussetzungen: Der Zugriff auf die zugrunde liegende SAP HANA-Datenbank ist erforderlich. Der Datenbankbenutzer muss
SELECT-Berechtigungen für alle in der Abfrage referenzierten CDS-Views besitzen, einschließlich, aber nicht beschränkt auf I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment und I_BillingDocumentItem. - Datumsbereichsfilterung: Die bereitgestellte Abfrage enthält einen Platzhalter für einen Datumsbereichsfilter, typischerweise auf einem Erstellungsdatumsfeld (
CreationDateoderDocumentDate). Für eine erste Analyse wird ein Zeitraum von 3 bis 6 Monaten empfohlen, um einen repräsentativen Datensatz ohne übermäßige Systemlast zu gewährleisten. - Wichtige Geschäftsfilter: Es ist entscheidend, die Daten nach spezifischen Organisationseinheiten zu filtern, um die Relevanz sicherzustellen. Die Abfrage ist mit einem Platzhalter für
CompanyCodevorkonfiguriert. Je nach Analyseumfang möchten Sie möglicherweise auch Filter fürSalesOrganization,DistributionChanneloderPlanthinzufügen. - Performance-Überlegungen: Dies ist eine komplexe Abfrage, die mehrere große CDS-Views verbindet. Die Ausführung kann erhebliche Systemressourcen verbrauchen. Planen Sie Extraktionen außerhalb der Geschäftszeiten. Für sehr große Datensätze sollten Sie in Erwägung ziehen, die Abfrage in kleineren, sequenziellen monatlichen Batches auszuführen.
a Beispielabfrage sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; Schritte
- Voraussetzungen: Stellen Sie sicher, dass Sie über einen Benutzer mit ausreichenden Berechtigungen verfügen, um auf die erforderlichen SAP S/4HANA Core Data Services (CDS) Views zugreifen zu können. Dies erfordert in der Regel eine spezielle Rolle, die von Ihrem SAP-Sicherheitsteam zugewiesen wird. Sie benötigen außerdem einen SQL-Client, wie DBeaver oder SAP HANA Studio, der sich mit der SAP HANA-Datenbank verbinden kann.
- Datenbankverbindung herstellen: Konfigurieren Sie Ihren SQL-Client, um eine Verbindung zur SAP S/4HANA-Datenbank herzustellen. Sie benötigen den Datenbankserver-Host, den Port (z. B. 3xx15, wobei xx die Instanznummer ist), einen Datenbank-Benutzernamen und ein Passwort.
- SQL-Abfrage vorbereiten: Kopieren Sie die vollständige SQL-Abfrage, die im Abfrageabschnitt dieses Dokuments bereitgestellt wird, in den Editor Ihres SQL-Clients. Diese Abfrage ist darauf ausgelegt, alle angegebenen Aktivitäten aus verschiedenen Logistik- und Vertriebsmodulen zu extrahieren.
- Extraktionsparameter festlegen: Bevor Sie die Abfrage ausführen, suchen Sie die Platzhalterbedingungen innerhalb der
WHERE-Klauseln jeder Unterabfrage. Sie müssen'YourCompanyCode'durch den tatsächlichen Buchungskreis ersetzen, den Sie analysieren, und die Datumsbereichs-Platzhalter wie'JJJJ-MM-TT'anpassen, um den gewünschten Extraktionszeitraum zu definieren. - Abfrage ausführen: Führen Sie das komplette SQL-Skript aus. Die Ausführungszeit variiert je nach ausgewähltem Datumsbereich und Datenvolumen in Ihrem System. Es ist ratsam, dies außerhalb der Spitzenzeiten durchzuführen, um die Systemlast zu minimieren.
- Erste Ergebnisse überprüfen: Nachdem die Abfrage abgeschlossen ist, überprüfen Sie kurz die Ausgabe in Ihrem SQL-Client. Prüfen Sie auf eine angemessene Anzahl von Zeilen, stellen Sie sicher, dass Spalten wie LogisticsOrder, ActivityName und EventTime gefüllt sind und bestätigen Sie, dass verschiedene Aktivitätsnamen erscheinen.
- Daten als CSV exportieren: Exportieren Sie das gesamte Ergebnis-Set aus Ihrem SQL-Client in eine CSV-Datei. Wählen Sie UTF-8-Kodierung, um Probleme mit Sonderzeichen zu vermeiden.
- Format für den Upload: Stellen Sie sicher, dass die Spaltenüberschriften in der finalen CSV-Datei exakt den Attributnamen entsprechen, die für die Ingestion erforderlich sind (z. B.
LogisticsOrder,ActivityName,EventTime). Es sollten keine weiteren Datentransformationen erforderlich sein, wenn die SQL-Abfrage wie bereitgestellt verwendet wird.
Konfiguration
- Voraussetzungen: Der Zugriff auf die zugrunde liegende SAP HANA-Datenbank ist erforderlich. Der Datenbankbenutzer muss
SELECT-Berechtigungen für alle in der Abfrage referenzierten CDS-Views besitzen, einschließlich, aber nicht beschränkt auf I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment und I_BillingDocumentItem. - Datumsbereichsfilterung: Die bereitgestellte Abfrage enthält einen Platzhalter für einen Datumsbereichsfilter, typischerweise auf einem Erstellungsdatumsfeld (
CreationDateoderDocumentDate). Für eine erste Analyse wird ein Zeitraum von 3 bis 6 Monaten empfohlen, um einen repräsentativen Datensatz ohne übermäßige Systemlast zu gewährleisten. - Wichtige Geschäftsfilter: Es ist entscheidend, die Daten nach spezifischen Organisationseinheiten zu filtern, um die Relevanz sicherzustellen. Die Abfrage ist mit einem Platzhalter für
CompanyCodevorkonfiguriert. Je nach Analyseumfang möchten Sie möglicherweise auch Filter fürSalesOrganization,DistributionChanneloderPlanthinzufügen. - Performance-Überlegungen: Dies ist eine komplexe Abfrage, die mehrere große CDS-Views verbindet. Die Ausführung kann erhebliche Systemressourcen verbrauchen. Planen Sie Extraktionen außerhalb der Geschäftszeiten. Für sehr große Datensätze sollten Sie in Erwägung ziehen, die Abfrage in kleineren, sequenziellen monatlichen Batches auszuführen.
a Beispielabfrage sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; Schritte
- Voraussetzungen: Stellen Sie sicher, dass Sie einen Entwicklerschlüssel und die notwendigen Berechtigungen in Ihrem SAP S/4HANA-System besitzen, um ABAP-Programme zu erstellen und auszuführen (Zugriff auf Transaktion SE38) sowie aus Lieferkettentabellen wie VBAK, LIKP, EKKO und MKPF zu lesen.
- Programm erstellen: Öffnen Sie den ABAP Editor mit dem Transaktionscode
SE38. Geben Sie einen Namen für das neue Programm ein, z. B.Z_PM_SCM_EXTRACTION, und klicken Sie auf 'Anlegen'. Geben Sie einen aussagekräftigen Titel an und setzen Sie den Programmtyp auf 'Ausführbares Programm'. - Code einfügen: Kopieren Sie den vollständigen ABAP-Code aus dem untenstehenden 'Query'-Abschnitt und fügen Sie ihn in den ABAP Editor für Ihr neues Programm ein.
- Textelemente definieren: Navigieren Sie zu Springen > Textelemente > Selektionstexte. Aktivieren Sie alle vorgeschlagenen Selektionsbildbezeichnungen, um eine klare und benutzerfreundliche Oberfläche zu gewährleisten.
- Programm aktivieren: Speichern und aktivieren Sie das Programm, indem Sie STRG+S und dann STRG+F3 drücken oder das Aktivierungssymbol in der Symbolleiste verwenden. Beheben Sie eventuelle Syntaxfehler, die aufgrund systemspezifischer Konfigurationen auftreten können.
- Programm ausführen: Führen Sie das Programm aus, indem Sie F8 drücken oder die Schaltfläche 'Direkte Ausführung' verwenden. Es erscheint ein Selektionsbildschirm, über den Sie die zu extrahierenden Daten filtern können.
- Extraktionsparameter festlegen: Geben Sie auf dem Selektionsbildschirm den Datumsbereich für das Erstellungsdatum des Kundenauftrags an. Es wird dringend empfohlen, auch nach spezifischen Buchungskreisen oder Verkaufsorganisationen zu filtern, um das Datenvolumen zu steuern. Geben Sie den vollständigen Pfad für die Ausgabedatei auf dem SAP-Applikationsserver ein.
- Im Hintergrund ausführen: Bei großen Datensätzen, die mehrere Monate umfassen, ist es entscheidend, das Programm im Hintergrund auszuführen, um Transaktions-Timeouts zu verhindern. Wählen Sie im Menü Programm > Im Hintergrund ausführen und planen Sie den Job ein.
- Datendatei abrufen: Nachdem die Programmausführung abgeschlossen ist, verwenden Sie den Transaktionscode
AL11, um zu dem von Ihnen angegebenen Verzeichnis auf dem Anwendungsserver zu navigieren. Suchen Sie die generierte Datei und laden Sie sie mit TransaktionCG3Yauf Ihren lokalen Rechner herunter. - Für den Upload vorbereiten: Stellen Sie sicher, dass die heruntergeladene Datei im Klartextformat vorliegt, z. B. CSV mit Komma- oder Semikolon-Trennzeichen, und UTF-8-Kodierung verwendet. Die Datei ist nun bereit, in das Process Mining-Tool hochgeladen zu werden.
Konfiguration
- Datumsbereich für die Selektion (S_ERDAT): Dies ist der wichtigste Filter. Er definiert das Zeitfenster für die anfängliche Auswahl von Kundenaufträgen basierend auf deren Erstellungsdatum (
VBAK-ERDAT). Beginnen Sie mit einem fokussierten Zeitraum, z. B. den letzten 3 bis 6 Monaten, um ein überschaubares Datenvolumen zu gewährleisten. - Verkaufsorganisation (S_VKORG): Ein optionaler Filter, um die Extraktion auf bestimmte Verkaufsorganisationen zu beschränken. Dies ist nützlich, um die Analyse auf eine bestimmte Geschäftseinheit oder Region zu konzentrieren.
- Buchungskreis (S_BUKRS): Ein optionaler Filter, um die Daten auf bestimmte Buchungskreise zu begrenzen. Dies wird dringend empfohlen, um den Datenumfang zu reduzieren und die Performance zu verbessern.
- Ausgabedateipfad (P_FILE): Der vollständige Pfad auf dem SAP-Applikationsserver, auf dem die finale Event Log-Datei gespeichert wird. Der Benutzer, der das Programm ausführt, muss Schreibzugriff auf dieses Verzeichnis haben. Beispiel:
/usr/sap/trans/tmp/scm_event_log.csv. - Ausführungsmodus: Das Programm kann für kleine Testextraktionen im Vordergrund ausgeführt werden. Für jedes signifikante Datenvolumen ist die Hintergrundverarbeitung zwingend erforderlich, um Timeouts zu vermeiden und die Systemlast während Spitzenzeiten zu reduzieren.
- Systemberechtigungen: Der Benutzer, der den Bericht ausführt, benötigt Lesezugriff auf alle zugrundeliegenden Tabellen, einschließlich, aber nicht beschränkt auf VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 und LFA1.
a Beispielabfrage abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF.