Ihr Daten-Template für Supply Chain Management
Ihr Daten-Template für Supply Chain Management
- Empfohlene Attribute für die Datenerfassung
- Wichtige Aktivitäten für die Nachverfolgung
- Hinweise zur Extraktion
Attribute für Supply Chain Management
| Name | Beschreibung | ||
|---|---|---|---|
| Aktivitätsname ActivityName | Der Name der geschäftlichen Aktivität oder des Ereignisses, das zu einem bestimmten Zeitpunkt im Lieferkettenprozess stattgefunden hat. | ||
| Beschreibung Dieses Attribut beschreibt einen bestimmten Schritt oder Meilenstein im Lebenszyklus des Logistikauftrags, zum Beispiel „Bestellung ausgestellt“ oder „Warenausgang gebucht“. Diese Aktivitäten bilden die Ereignisfolge des Prozesses. Die Analyse der Aktivitätsfolge ist der Kern von Process Mining. Sie zeigt den tatsächlichen Prozessablauf, ermöglicht den Vergleich mit Standardarbeitsanweisungen und hilft, Prozessschritte zu erkennen, die Verzögerungen verursachen oder Nacharbeit erfordern. Warum das wichtig ist Das Attribut legt die Prozessschritte fest. Es ist grundlegend, um Prozessmodelle zu entdecken, Varianten zu analysieren und Zykluszeiten zwischen Aktivitäten zu messen. Woher beziehen Wird bei der Datentransformation erzeugt, indem Transaktionscodes oder Statusänderungen aus verschiedenen SAP-Tabellen, zum Beispiel EKKO, LIKP und VBUK, benutzerfreundlichen Aktivitätsnamen zugeordnet werden. Beispiele Bestellung ausgegebenWareneingang zur Bestellung gebuchtAuslieferung erstelltAbliefernachweis bestätigt | |||
| Ereigniszeit EventTime | Der Timestamp, der angibt, wann die Aktivität stattgefunden hat, einschließlich Datum und Uhrzeit. | ||
| Beschreibung Dieses Attribut enthält für jede Aktivität im Prozess das genaue Datum und die genaue Uhrzeit. Es bildet das chronologische Gerüst des Event Logs und ordnet die Prozessschritte so, wie sie tatsächlich stattgefunden haben. Die Ereigniszeit ist für alle zeitbasierten Analysen entscheidend. Sie dient dazu, Zykluszeiten zwischen Aktivitäten und die gesamte Durchlaufzeit eines Prozesses zu berechnen, Leistungstrends im Zeitverlauf zu erkennen und festzustellen, wann Engpässe am ehesten auftreten. Warum das wichtig ist Dieser Timestamp ist für die Berechnung sämtlicher Zeitspannen und Leistungskennzahlen erforderlich. So lassen sich Engpässe und Durchlaufzeiten analysieren. Woher beziehen Wird aus Timestamp-Feldern zu Beleganlagen oder Statusänderungen in zentralen SAP-Tabellen extrahiert, etwa aus CDHDR/CDPOS für Änderungsbelege oder aus Datums- und Uhrzeitfeldern wie ERDAT/ERZET in Kopftabellen. Beispiele 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Logistikauftrag LogisticsOrder | Die eindeutige Kennung für einen durchgängigen Lieferkettenprozess, von der ersten Nachfrage bis zur abschließenden Lieferbestätigung. | ||
| Beschreibung Der Logistikauftrag dient als primäre Case-ID und verknüpft alle Aktivitäten, die zu einer bestimmten Nachfrage oder einem Auftrag zur Auftragsabwicklung in der Lieferkette gehören. So lässt sich der gesamte Lebenszyklus eines Produkts verfolgen, von der Planung und Beschaffung über die Produktion bis zur Distribution. Das ermöglicht einen umfassenden Überblick über den Prozess. In Process Mining zeigt die Analyse nach Logistikauftrag den vollständigen Weg, auf dem eine Nachfrage erfüllt wurde. Sie hilft, häufige Varianten, Engpässe und Abweichungen in der gesamten Lieferkette zu erkennen, statt isoliert einzelne Prozesse wie Beschaffung oder Vertrieb zu betrachten. Warum das wichtig ist Diese Kennung ist entscheidend, um alle zugehörigen Ereignisse zu einer Prozessinstanz zusammenzuführen und die Lieferkette durchgängig zu analysieren. Woher beziehen Diese Kennung ist ein Konzept und muss möglicherweise durch die Verknüpfung verschiedener Belegnummern gebildet werden, etwa indem eine Kundenauftragsnummer mit den zugehörigen Bestell- und Liefernummern verknüpft wird. Ziehen Sie die Dokumentation zu SAP S/4HANA Supply Chain oder eine fachkundige Person hinzu. Beispiele LO-4500078192LO-4500078193LO-4500078194 | |||
| Letzte Datenaktualisierung LastDataUpdate | Der Timestamp, zu dem die Daten zuletzt aktualisiert oder aus dem Quellsystem extrahiert wurden. | ||
| Beschreibung Dieses Attribut gibt an, wann die Daten des Event Logs zuletzt aktualisiert wurden. Es zeigt, wie aktuell die analysierten Daten sind, und macht transparent, auf welchen Zeitraum sie sich beziehen. Für fundierte Entscheidungen ist es wichtig zu wissen, wie aktuell die Daten sind. Dieser Timestamp hilft Benutzern, die Daten einzuordnen und den Zeitraum der Dashboards und Kennzahlen zu verstehen. Warum das wichtig ist Macht transparent, wie aktuell die Daten sind, damit Benutzer den Aktualitätsstand der Prozessanalyse einschätzen können. Woher beziehen Dieses Metadatenfeld wird üblicherweise vom Datenextraktions- oder ETL-Tool nach einer erfolgreichen Datenaktualisierung erzeugt und befüllt. Beispiele 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Quellsystem SourceSystem | Das System, aus dem die Daten stammen. | ||
| Beschreibung Gibt die konkrete Instanz des Quellsystems an, in der die Ereignisdaten erzeugt wurden. In einer komplexen Systemlandschaft kann ein Unternehmen mehrere SAP-S/4HANA-Instanzen für verschiedene Regionen oder Geschäftseinheiten betreiben. Dieses Attribut ist wichtig für die Data Governance und die Segmentierung der Analyse. Es ermöglicht den Vergleich der Prozessleistung zwischen verschiedenen Systemen oder die Beschränkung der Analyse auf eine einzelne, maßgebliche Datenquelle. Warum das wichtig ist Liefert wichtige Informationen zur Datenherkunft. Das ist für die Datenvalidierung und den Vergleich von Prozessen in unterschiedlichen Systemlandschaften relevant. Woher beziehen In der Regel wird während der Datenextraktion ein statischer Wert ergänzt, der die Herkunft angibt, zum Beispiel die SAP-System-ID (SAPSID). Beispiele S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Angefordertes Lieferdatum RequestedDeliveryDate | Das Datum, zu dem der Lieferant die Waren liefern sollte. | ||
| Beschreibung Dies ist das im Bestellbeleg angegebene Lieferdatum und damit der Zieltermin für den Lieferanten. Es dient als Vergleichswert für die tatsächliche Lieferleistung. Dieses Datum ist für die Berechnung der Kennzahl zur Liefertreue von Lieferanten erforderlich. Durch den Vergleich des tatsächlichen Wareneingangsdatums mit dem angeforderten Lieferdatum lässt sich objektiv messen, ob Lieferanten ihre Zusagen einhalten. Warum das wichtig ist Dieses Datum dient als Grundlage für die Berechnung der Kennzahl „Liefertreue von Lieferanten“ und ist daher für das Lieferantenmanagement entscheidend. Woher beziehen Zu finden in der Bestellpositionstabelle EKPO im Feld 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 Mitarbeitenden, der die jeweilige Aktivität ausgeführt hat, etwa eine Bestellung angelegt oder einen Wareneingang gebucht hat. So werden Prozessschritte den beteiligten Mitarbeitenden zugeordnet. Die Analyse nach Benutzer hilft, die Arbeitslast zu verteilen, Schulungsbedarf zu erkennen und Leistungsunterschiede zwischen Personen oder Teams festzustellen. Auch für Compliance-Analysen ist das Attribut hilfreich, um nachzuvollziehen, wer kritische Prozessschritte ausgeführt hat. Warum das wichtig ist Ordnet Aktivitäten bestimmten Benutzern zu. Das ermöglicht die Analyse der Arbeitslast und den Leistungsvergleich sowie die Untersuchung von Handlungen, die nicht den Vorgaben entsprechen. Woher beziehen Zu finden in den Feldern „Erstellt von“ oder „Geändert von“ vieler SAP-Tabellen, zum Beispiel ERNAM in EKKO (Bestellkopf), LIKP (Lieferkopf) und VBRK (Fakturakopf). Beispiele CBROWNJSMITHASINGH | |||
| Kundenname CustomerName | Der Name des Kunden, für den der Auftrag abgewickelt wird. | ||
| Beschreibung Dieses Attribut gibt den Endkunden eines Kundenauftrags und der anschließenden Auftragsabwicklung an. Es liefert Kontext zur Nachfrageseite des Lieferkettenprozesses. In Process Mining hilft die Analyse nach Kunde, unterschiedliche Muster oder Leistungsniveaus bei wichtigen Kunden zu erkennen. Dashboards wie die Analyse der Verzögerungen beim Abliefernachweis zeigen damit, ob bestimmte Kunden Bestätigungen regelmäßig verspätet übermitteln. Warum das wichtig ist Ermöglicht die Segmentierung der Analyse nach Kunde und macht kundenspezifische Verhaltensmuster, Engpässe oder die Einhaltung von Service-Level-Vereinbarungen sichtbar. Woher beziehen Die Kundennummer (KUNNR) ist in Verkaufsbelegen gespeichert, zum Beispiel in der Tabelle VBAK. Der Name wird aus dem zentralen Kundenstamm KNA1 abgerufen. Beispiele Retail CorpInnovate SolutionsManufacturing Partners | |||
| Lieferantenname SupplierName | Der Name des Lieferanten, der mit Beschaffungsaktivitäten verknüpft ist. | ||
| Beschreibung Dieses Attribut gibt den Lieferanten an, bei dem Waren oder Dienstleistungen beschafft werden. Es ist üblicherweise mit Aktivitäten wie „Bestellanforderung angelegt“ und „Bestellung ausgestellt“ verknüpft. Der Lieferantenname ist eine wichtige Grundlage für das Dashboard zur Lieferleistung. Damit können Sie Daten filtern und segmentieren, um Liefertreue, Durchlaufzeiten und Qualitätsniveau verschiedener Lieferanten zu vergleichen. Das ist für die strategische Beschaffung und das Lieferantenmanagement entscheidend. Warum das wichtig ist Ermöglicht die Leistungsanalyse nach Lieferant. Das ist wichtig, um den Beschaffungsprozess zu optimieren und die Zuverlässigkeit der Lieferanten zu bewerten. Woher beziehen Die Lieferantennummer (LIFNR) ist in Einkaufsbelegen gespeichert, zum Beispiel in den Tabellen EKKN und EBAN. Der Name wird aus dem zentralen Lieferantenstamm LFA1 abgerufen. Beispiele Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Materialnummer MaterialNumber | Die eindeutige Kennung des Produkts oder Materials, das bearbeitet wird. | ||
| Beschreibung Die Materialnummer, häufig auch SKU genannt, ist der eindeutige Code eines bestimmten Produkts in SAP. Sie verknüpft Prozessaktivitäten mit den physischen oder digitalen Waren, die gefertigt, beschafft oder versandt werden. Dieses Attribut ist für produktbezogene Analysen wichtig. Es hilft festzustellen, ob bestimmte Produkte häufiger von Qualitätsproblemen, Produktionsverzögerungen oder Fehlbeständen betroffen sind. Dashboards lassen sich nach Material filtern, um die Leistung einzelner Produktlinien zu untersuchen. Warum das wichtig ist Ermöglicht Analysen auf Produktebene, um festzustellen, ob sich Prozessprobleme wie Verzögerungen oder Qualitätsmängel auf bestimmte Materialien konzentrieren. Woher beziehen Zu finden in Positionstabellen der meisten Belege, zum Beispiel VBAP für Kundenaufträge, EKPO für Bestellungen und LIPS für Lieferungen. Das Feld heißt üblicherweise MATNR. Beispiele FG-100-ARM-2034-BSA-5500 | |||
| Qualitätsprüfergebnis QualityInspectionResult | Das Ergebnis einer Qualitätsprüfung, zum Beispiel „Bestanden“ oder „Nicht bestanden“. | ||
| Beschreibung Dieses Attribut erfasst das Ergebnis einer Qualitätsprüfung von produzierten oder eingegangenen Waren. Das Ergebnis entscheidet, ob die Waren zum nächsten Schritt weitergeleitet werden können oder nachbearbeitet, zurückgesendet oder verschrottet werden müssen. Dieses Attribut ist eine wichtige Grundlage für das Dashboard und die Kennzahl zu Ablehnungsquoten in der Qualitätskontrolle. Die Analyse der Häufigkeit und Ursachen von Fehlern hilft, systematische Qualitätsprobleme bei bestimmten Produkten, Lieferanten oder Fertigungslinien zu erkennen. Warum das wichtig ist Unterstützt direkt die Berechnung qualitätsbezogener Kennzahlen und hilft, Ursachen für Qualitätsmängel in der Lieferkette zu ermitteln. Woher beziehen Diese Informationen sind üblicherweise im Modul Qualitätsmanagement (QM) gespeichert. Die Daten können aus Prüflostabellen wie QALS und aus Verwendungsentscheidungen in QAVE stammen. Beispiele BestandenNicht bestandenNacharbeit erforderlichMit Abweichung bestanden | |||
| Werk Plant | Der Fertigungs- oder Vertriebsstandort, an dem die Aktivität stattgefunden hat. | ||
| Beschreibung Das Werk ist eine Organisationseinheit in SAP und bezeichnet einen Standort, an dem Waren produziert, gelagert oder vertrieben werden. Es liefert den geografischen oder funktionalen Kontext für Prozessaktivitäten. Die Analyse der Prozessleistung nach Werk ist häufig erforderlich. Sie ermöglicht den Vergleich von Effizienz, Durchsatz und Compliance zwischen verschiedenen Standorten. So lassen sich bewährte Vorgehensweisen und Standorte mit Verbesserungsbedarf erkennen. Warum das wichtig ist Liefert eine geografische oder organisatorische Dimension für die Analyse und ermöglicht den Leistungsvergleich zwischen verschiedenen Standorten. Woher beziehen Zu finden in vielen Belegpositionstabellen, zum Beispiel VBAP (Vertrieb), EKPO (Einkauf) und LIPS (Lieferung). Das Feld heißt üblicherweise WERKS. Beispiele 100021003500 | |||
| Bestellmenge OrderQuantity | Die Materialmenge in einer Bestellposition. | ||
| Beschreibung Dieses Attribut gibt die Anzahl der Materialeinheiten an, die in einer Kundenauftrags- oder Bestellposition angefordert werden. Es zeigt das Volumen des jeweiligen Vorgangs. Die Analyse nach Menge hilft, Vorgänge mit hohem Volumen zu priorisieren, da sie größere geschäftliche Auswirkungen haben können. Außerdem lässt sich die Menge zur Normierung anderer Kennzahlen verwenden, etwa zur Berechnung der Kosten pro Einheit oder zur Analyse, wie sich die Auftragsgröße auf die Bearbeitungszeiten auswirkt. Warum das wichtig ist Liefert Kontext zum Vorgangsvolumen und ermöglicht Wirkungsanalysen sowie die Segmentierung von Cases nach Größe. Woher beziehen Zu finden in Positionstabellen, zum Beispiel als MENGE in EKPO (Bestellung) oder KWMENG in VBAP (Kundenauftrag). Beispiele 100500025 | |||
| Bestellnummer PurchaseOrderNumber | Die eindeutige Kennung des Bestellbelegs. | ||
| Beschreibung Die Bestellnummer ist die offizielle Belegnummer, mit der Materialien bei einem Lieferanten bestellt werden. Sie ist eine wichtige Kennung im Beschaffungsprozess der Lieferkette. Mit diesem Attribut können Sie den Beschaffungsprozess detailliert untersuchen. Es wird im Dashboard zur durchgängigen Beschaffungsdauer verwendet und dient zur Berechnung der Kennzahl zur Liefertreue von Lieferanten. Dabei verknüpft es Aktivitäten zu Bestellanforderung, Bestellung, Wareneingang und Zahlung. Warum das wichtig ist Dient als wichtige Kennung, um den Beschaffungs-Subprozess im Detail zu untersuchen und zugehörige Beschaffungsereignisse zu verknüpfen. Woher beziehen Zu finden in der Bestellkopftabelle EKKO und der Positionstabelle EKPO. Das Feld heißt EBELN. Beispiele 450007819245000781934500078194 | |||
| Endzeit EndTime | Der Timestamp, der angibt, wann eine Aktivität abgeschlossen wurde. Er dient zur Berechnung der Verarbeitungszeit. | ||
| Beschreibung Die Endzeit markiert den Abschluss einer bestimmten Aktivität. Die Startzeit (EventTime) gibt an, wann eine Aktivität beginnt. Die Endzeit zeigt, wie lange ihre Ausführung gedauert hat, insbesondere bei Aktivitäten, die nicht sofort abgeschlossen sind. Wenn Start- und Endzeit vorliegen, lassen sich Verarbeitungs- und Wartezeiten genau messen. So können Sie unterscheiden, wie viel Zeit für die aktive Bearbeitung einer Aufgabe und wie viel für das Warten auf den nächsten Schritt anfällt. Das ist wichtig, um Effizienzpotenziale zu erkennen. Warum das wichtig ist Ermöglicht die genaue Berechnung der Verarbeitungszeiten einzelner Aktivitäten und hilft, wertschöpfende Arbeit von Wartezeit zu unterscheiden. Woher beziehen Lässt sich aus Statusänderungen in SAP ableiten. Beispielsweise kann der Start durch eine Statusänderung auf „In Bearbeitung“ und das Ende durch eine Statusänderung auf „Abgeschlossen“ in Tabellen wie JEST/JCDS bestimmt werden. Bei sofort abgeschlossenen Ereignissen kann EndTime dem Wert von StartTime entsprechen. Beispiele 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Kundenauftragsnummer SalesOrderNumber | Die eindeutige Kennung des Kundenauftragsbelegs. | ||
| Beschreibung Die Kundenauftragsnummer ist die offizielle Belegnummer, die einen Verkauf an einen Kunden bestätigt. Sie ist eine wichtige Kennung im Auftragsabwicklungsprozess der Lieferkette. Mit diesem Attribut lässt sich die Abwicklung eines bestimmten Kundenauftrags verfolgen. Es verknüpft die ursprüngliche Kundenanfrage mit allen nachfolgenden Aktivitäten wie Lieferung und Rechnungsstellung und unterstützt so die Analyse der Durchlaufzeit der Auftragsabwicklung. Warum das wichtig ist Dient als wichtige Kennung für den Subprozess der Auftragsabwicklung und verknüpft die Kundennachfrage mit Logistik und finanziellem Ausgleich. Woher beziehen Zu finden in der Kundenauftragskopftabelle VBAK und der Positionstabelle VBAP. Das Feld heißt VBELN. Beispiele 100023451000234610002347 | |||
| Lieferung verspätet IsLateDelivery | Ein boolesches Kennzeichen dafür, ob eine Lieferantenlieferung nach dem angeforderten Lieferdatum eingegangen ist. | ||
| Beschreibung Dieses berechnete Kennzeichen zeigt mit einem einfachen Ja- oder Nein-Wert an, ob eine Lieferung pünktlich war. Es wird ermittelt, indem der Timestamp der Aktivität „Wareneingang zur Bestellung gebucht“ mit dem Attribut „Angefordertes Lieferdatum“ verglichen wird. Das Attribut vereinfacht die Erstellung von Dashboards und Kennzahlen zur Lieferantenleistung. Durch schnelles Filtern und Aggregieren lassen sich die Liefertreue berechnen und Lieferanten, Materialien oder Regionen mit besonders häufigen Verzögerungen ermitteln. Warum das wichtig ist Vereinfacht die Analyse der Lieferantenleistung durch ein eindeutiges Ergebnis für jede Lieferung. Das ist für die Kennzahl zur Liefertreue entscheidend. Woher beziehen Dies ist ein berechnetes Feld. Die Logik lautet: IF ('Wareneingang zur Bestellung gebucht'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Beispiele truefalse | |||
| Nacharbeit IsRework | Ein Kennzeichen dafür, ob eine Aktivität oder eine Folge von Aktivitäten Nacharbeit darstellt. | ||
| Beschreibung Dieses boolesche Attribut kennzeichnet Aktivitäten, die frühere Prozessschritte wiederholen und damit auf Nacharbeit oder eine Korrektur hindeuten. Folgt beispielsweise auf eine „Qualitätsprüfung“ der Schritt „Fertigungsauftrag angelegt“ und danach eine weitere „Qualitätsprüfung“, kann die zweite Prüfung als Nacharbeit gekennzeichnet werden. Nacharbeit zu erkennen ist wichtig, um Ineffizienzen und versteckte Kosten zu verstehen. Das Kennzeichen hilft, Häufigkeit und Auswirkungen von Nacharbeits-Schleifen zu quantifizieren. Es unterstützt die Berechnung der Kennzahl zur Fehlerquote bei der Auftragsbearbeitung und zeigt Verbesserungsbedarf im Prozess auf. Warum das wichtig ist Hilft, Prozessineffizienzen zu quantifizieren, indem Aktivitäten in Nacharbeits-Schleifen ausdrücklich erkannt und gezählt werden. Woher beziehen Wird üblicherweise im Process-Mining-Tool berechnet, indem wiederholte Aktivitätsfolgen innerhalb desselben Cases erkannt werden. Beispiele truefalse | |||
| Name des Frachtführers CarrierName | Der Name des Transportunternehmens oder Spediteurs, der die Lieferung übernimmt. | ||
| Beschreibung Der Name des Frachtführers gibt den Logistikdienstleister an, der Waren zwischen Standorten transportiert, zum Beispiel vom Lager zum Kunden. Dieses Attribut ist eine wichtige Grundlage für das Dashboard zur Analyse der Transportdauer. Damit lassen sich Transportzeiten, Kosten und Zuverlässigkeit verschiedener Frachtführer vergleichen. Das unterstützt eine bessere Logistikplanung und die Auswahl geeigneter Frachtführer. Warum das wichtig ist Ermöglicht die Leistungsanalyse nach Transportdienstleister. Das ist wichtig, um Logistikkosten und Lieferzeiten zu optimieren. Woher beziehen Die Frachtführer-ID (Spediteur) ist in Transportbelegen gespeichert, zum Beispiel in der Tabelle VTTK (Transportkopf). Der Name wird aus Stammdatentabellen wie LFA1 abgerufen. Beispiele DHLFedExMaersk Logistics | |||
Aktivitäten im Supply Chain Management
| Aktivität | Beschreibung | ||
|---|---|---|---|
| Abliefernachweis bestätigt | Diese Aktivität steht für die formelle Bestätigung des Kunden oder Frachtführers, dass die Waren wie vereinbart eingegangen sind. Häufig wird sie erfasst, indem der Auslieferung POD-Informationen hinzugefügt werden. | ||
| Warum das wichtig ist Diese Aktivität markiert das endgültige Ende des Auftragsabwicklungsprozesses. Sie ist wichtig für eine korrekte Rechnungsstellung, die Klärung von Streitfällen und die Messung des letzten Abschnitts der Lieferung. Woher beziehen Dieses Ereignis wird ausdrücklich erfasst. Das Datum des Abliefernachweises steht in der Lieferkopftabelle (LIKP, Feld PODAT) oder in zugehörigen POD-Tabellen (VLPOD). Erfassung Verwenden Sie das Datum des Abliefernachweises (LIKP-PODAT) aus dem Lieferbeleg. Ereignistyp explicit | |||
| Bestellung ausgegeben | Diese Aktivität kennzeichnet die formelle Erstellung und Ausgabe einer Bestellung an einen externen Lieferanten für benötigte Materialien. Damit wird eine Bestellanforderung in eine rechtlich bindende Verpflichtung gegenüber einem Lieferanten überführt. | ||
| Warum das wichtig ist Als wichtiger Meilenstein ist diese Aktivität entscheidend für die Messung der Lieferzeiten und Beschaffungszyklen. Sie bildet die Grundlage für die Bewertung der Termintreue von Lieferanten. Woher beziehen Dieses Ereignis wird bei der Erstellung der Bestellung ausdrücklich protokolliert. Der Erstellungs-Timestamp ist im Bestellkopf gespeichert (EKKO, Feld AEDAT). Erfassung Verwenden Sie das Erstellungsdatum des Belegs (EKKO-AEDAT) für die Bestellung. Ereignistyp explicit | |||
| Kundenauftrag erstellt | Diese Aktivität kennzeichnet die Erstellung eines neuen Kundenauftrags, in dem der Warenbedarf eines Kunden verbindlich erfasst wird. Das Ereignis wird ausdrücklich protokolliert, wenn ein Benutzer einen neuen Kundenauftrag im System speichert. | ||
| Warum das wichtig ist Dies ist der zentrale Startpunkt des Order-to-Cash-Prozesses. Die Zeitspanne zwischen diesem Ereignis und nachfolgenden Ereignissen zeigt die gesamte Durchlaufzeit der Auftragsabwicklung und macht Verzögerungen zu Beginn des Prozesses sichtbar. Woher beziehen Dieses Ereignis wird ausdrücklich protokolliert. Es findet sich in den Änderungsbelegen der Kundenauftragstabellen (CDHDR/CDPOS) oder anhand des Erstellungs-Timestamps im Kundenauftragskopf (VBAK, Feld ERDAT). Erfassung Verwenden Sie das Erstellungsdatum (VBAK-ERDAT) und die Erstellungszeit (VBAK-ERZET) des Kundenauftrags. Ereignistyp explicit | |||
| Waren produziert | Diese Aktivität bestätigt den Abschluss der Warenfertigung. Sie wird üblicherweise als Wareneingang aus dem Fertigungsauftrag erfasst. Dabei wird das Fertigerzeugnis in den Bestand übernommen. | ||
| Warum das wichtig ist Damit endet der Fertigungszyklus. Die Zeit zwischen der Erstellung des Fertigungsauftrags und diesem Ereignis entspricht der Fertigungsdurchlaufzeit und ist eine wichtige Kennzahl für die Produktionseffizienz. Woher beziehen Dieses Ereignis lässt sich ausdrücklich über eine Materialbelegbuchung erfassen (Wareneingang aus dem Fertigungsauftrag). Alternativ kann es aus der letzten Rückmeldung zum Fertigungsauftrag (Tabelle AFRU) oder einer Statusänderung zu „Geliefert“ abgeleitet werden. Erfassung Leiten Sie das Ereignis aus dem Buchungsdatum des letzten Materialbelegs für den Wareneingang aus dem Fertigungsauftrag oder aus einer Statusänderung ab. Ereignistyp inferred | |||
| Warenausgang gebucht | Diese Aktivität steht für den rechtlichen und physischen Abgang der Waren aus dem Lager. Sie verringert den Bestand und bucht die Kosten der verkauften Waren. Damit ist der Versand des Auftrags offiziell erfasst. | ||
| Warum das wichtig ist Dieser wichtige Meilenstein markiert den Beginn der Transportphase. Ab diesem Zeitpunkt befinden sich die Waren für die Auslieferung nicht mehr im Besitz des Unternehmens. Woher beziehen Dieses explizite Ereignis erzeugt einen Materialbeleg. Der Timestamp wird im Kopf des Materialbelegs erfasst (MKPF, Feld BUDAT) und aktualisiert den Warenbewegungsstatus im Lieferbeleg (LIKP, Feld WBSTK). Erfassung Verwenden Sie das Buchungsdatum (MKPF-BUDAT) aus dem Materialbeleg zum Warenausgang, der mit der Auslieferung verknüpft ist. Ereignistyp explicit | |||
| Wareneingang zur Bestellung gebucht | Dieses Ereignis bezeichnet den physischen Eingang von Rohstoffen oder Waren eines Lieferanten zu einer Bestellung. Es wird protokolliert, wenn die Waren im Lager oder Werk eintreffen. | ||
| Warum das wichtig ist Mit dieser Aktivität ist der Teil des Beschaffungszyklus abgeschlossen, der die Lieferung durch den Lieferanten umfasst. Sie ist wichtig, um die Termintreue von Lieferanten zu berechnen und die Leistung der Eingangslogistik zu verstehen. Woher beziehen Dieses Ereignis wird bei der Buchung eines Materialbelegs ausdrücklich erfasst. Der Ereignis-Timestamp steht im Kopf des Materialbelegs (MKPF, Feld BUDAT). Die Verknüpfung zur Bestellung befindet sich in der Positionstabelle (MSEG). Erfassung Verwenden Sie das Buchungsdatum (MKPF-BUDAT) des Materialbelegs, der der Bestellung zugeordnet ist. Ereignistyp explicit | |||
| Auslieferung erstellt | Dieses Ereignis bezeichnet die Erstellung eines Lieferbelegs, der die Kommissionierung und den Versand der Waren an den Kunden veranlasst. Damit wechselt der Prozess von der Auftragsverwaltung zur logistischen Abwicklung. | ||
| Warum das wichtig ist Dieser wichtige Schritt leitet die physische Auftragsabwicklung ein. Verzögerungen zwischen der Auftragserstellung und der Erstellung der Lieferung können auf Planungs- oder Verfügbarkeitsprobleme hinweisen. Woher beziehen Dieses Ereignis wird ausdrücklich protokolliert. Der Erstellungs-Timestamp ist im Lieferkopf gespeichert (LIKP, Feld ERDAT). Erfassung Verwenden Sie das Erstellungsdatum (LIKP-ERDAT) und die Erstellungszeit (LIKP-ERZET) aus dem Kopf des Lieferbelegs. Ereignistyp explicit | |||
| Bestandsverfügbarkeit geprüft | Diese Aktivität bezeichnet die manuelle oder systemseitige Prüfung, ob die angeforderten Artikel für den Kundenauftrag auf Lager sind. Sie erfolgt häufig automatisch bei der Auftragserstellung, wird aber möglicherweise nicht als separates Ereignis protokolliert. | ||
| Warum das wichtig ist Die Zeitspanne zwischen Auftrag und Bestandsprüfung sowie das Prüfergebnis zeigen, wie sich die Bestände auf die Auftragsabwicklung auswirken. Verzögerungen führen hier häufig zu Beschaffungs- oder Produktionsaktivitäten. Woher beziehen Dieses Ereignis wird üblicherweise nicht ausdrücklich protokolliert. Es lässt sich möglicherweise aus der Erstellung der ersten bestätigten Einteilung in der Kundenauftragspositionstabelle (VBEP) oder aus Statusänderungen in der Auftragsposition ableiten. Erfassung Leiten Sie das Ereignis aus der Aktualisierung des Bestätigungsstatus der Kundenauftragseinteilung ab (Tabelle VBEP). Ereignistyp inferred | |||
| Bestellanforderung erstellt | Diese Aktivität bezeichnet die Erstellung einer internen Anforderung zur Beschaffung benötigter Waren oder Rohstoffe. Sie wird häufig ausgelöst, wenn der Bestand für einen Kundenauftrag nicht ausreicht oder unter den Meldebestand fällt. | ||
| Warum das wichtig ist Dies ist der erste Schritt im Beschaffungszyklus. Wenn Sie die Erstellung verfolgen, erkennen Sie Verzögerungen beim Beschaffungsstart und können den gesamten Einkaufsprozess analysieren. Woher beziehen Dieses Ereignis wird ausdrücklich protokolliert. Der Erstellungs-Timestamp ist im Kopf der Bestellanforderung gespeichert (EBAN, Feld BADAT). Erfassung Verwenden Sie das Erstellungsdatum (EBAN-BADAT) des Belegs der Bestellanforderung. Ereignistyp explicit | |||
| Fertigungsauftrag erstellt | Dieses Ereignis zeigt an, dass ein Fertigungsauftrag für die Herstellung der im Kundenauftrag benötigten Fertigerzeugnisse erstellt wurde. Damit beginnt offiziell der interne Fertigungsprozess. | ||
| Warum das wichtig ist Mit der Erstellung eines Fertigungsauftrags beginnt die Durchlaufzeit der Fertigung. Die Analyse zeigt Verzögerungen zwischen dem Bedarfssignal und dem Produktionsstart. Woher beziehen Dieses Ereignis wird ausdrücklich protokolliert. Das Erstellungsdatum ist im Kopf des Fertigungsauftrags gespeichert (AUFK, Feld ERDAT). Erfassung Verwenden Sie das Erstellungsdatum (AUFK-ERDAT) aus der Auftragstabelle. Ereignistyp explicit | |||
| Kommissionierung abgeschlossen | Diese Aktivität kennzeichnet den Abschluss der physischen Entnahme der Artikel aus dem Lager für die Auslieferung. In vielen Systemen wird sie bestätigt, wenn der Kommissionierstatus des Lieferbelegs aktualisiert wird. | ||
| Warum das wichtig ist Eine effiziente Kommissionierung ist entscheidend für den Lagerdurchsatz. Wenn Sie diese Aktivität verfolgen, können Sie Engpässe im Lagerbetrieb erkennen und die Kommissionierleistung messen. Woher beziehen Dabei handelt es sich häufig nicht um ein einzelnes, klar abgegrenztes Ereignis. Es lässt sich vielmehr aus Statusänderungen ableiten. Erfasst wird es, wenn der Kommissionierstatus in der Lieferpositionstabelle (LIPS, Feld KOSTA) auf „C“ (vollständig bearbeitet) gesetzt wird. Erfassung Aus den Änderungsbelegen ableiten, wann der Kommissionierstatus (LIPS-KOSTA) auf vollständig kommissioniert gesetzt wird. Ereignistyp inferred | |||
| Kundenrechnung erstellt | Diese Aktivität markiert das Anlegen des Fakturabelegs für die gelieferten Waren oder erbrachten Leistungen. Damit beginnt der abschließende finanzielle Ausgleich des Vorgangs. | ||
| Warum das wichtig ist Diese Aktivität ist wichtig für die Analyse der Fakturierungsdauer. Verzögerungen zwischen der Lieferbestätigung und der Rechnungsstellung können den Cashflow beeinträchtigen. Woher beziehen Dieses Ereignis wird ausdrücklich erfasst. Der Timestamp der Anlage steht in der Fakturakopftabelle (VBRK, Feld ERDAT). Erfassung Verwenden Sie das Anlagedatum (VBRK-ERDAT) aus dem Kopf des Fakturabelegs. Ereignistyp explicit | |||
| Qualitätsprüfung durchgeführt | Diese Aktivität bezeichnet den Abschluss einer Qualitätsprüfung der produzierten Waren. Das Ergebnis der Prüfung, bestanden oder nicht bestanden, wird in einem Verwendungsentscheid festgehalten. | ||
| Warum das wichtig ist Diese Aktivität ist wichtig, um die Produktqualität zu überwachen und Produktionsprobleme zu erkennen. Hohe Zurückweisungsraten oder lange Prüfzeiten können erhebliche Engpässe verursachen. Woher beziehen Dieses Ereignis wird ausdrücklich erfasst, wenn für ein Prüflos ein Verwendungsentscheid getroffen wird. Das Entscheidungsdatum steht in der Tabelle QALS (Feld PASTRTERM) oder in der Tabelle QAVE. Erfassung Verwenden Sie den Timestamp, zu dem der Verwendungsentscheid für das Prüflos erfasst wird (Tabellen QALS/QAVE). Ereignistyp explicit | |||
| Transportbeleg angelegt | Diese Aktivität steht für das Anlegen eines Transportbelegs, der eine oder mehrere Lieferungen für die Transportplanung zusammenfasst. Der Beleg enthält Angaben zu Frachtführer, Route und Transportart. | ||
| Warum das wichtig ist Mit dieser Aktivität beginnt die formelle Transportplanung. Die Zeit zwischen Warenausgang und Abschluss des Transports zeigt, wie effizient der Transportprozess abläuft. Woher beziehen Dieses explizite Ereignis wird in der Transportkopftabelle erfasst (VTTK, Feld ERDAT). Es gehört zum Modul LE-TRA, das nicht in allen Unternehmen eingesetzt wird. Erfassung Verwenden Sie das Anlagedatum (VTTK-ERDAT) aus dem Kopf des Transportbelegs. Ereignistyp explicit | |||
| Waren am Bestimmungsort entladen | Diese Aktivität bezeichnet das physische Entladen der Waren am Standort des Kunden. SAP erfasst dieses Ereignis möglicherweise nicht ausdrücklich. Häufig muss es aus Frachtführerdaten oder nachfolgenden Ereignissen abgeleitet werden. | ||
| Warum das wichtig ist Damit endet der Transportabschnitt der Lieferung. Die Zeit vom Warenausgang bis zu diesem Punkt entspricht der Transportdauer und ist eine wichtige Kennzahl für die Optimierung der Logistik. Woher beziehen Im ERP-Kernsystem wird dieses Ereignis nur selten ausdrücklich erfasst. Es lässt sich möglicherweise aus EDI-Mitteilungen des Frachtführers, Daten aus dem Transportation-Management-Modul (TM) oder, sofern verfügbar, dem Timestamp des Abliefernachweises ableiten. Erfassung Leiten Sie das Ereignis aus Statusmeldungen des Frachtführers ab, zum Beispiel EDI 214, oder verwenden Sie den Timestamp des Abliefernachweises als Näherungswert. Ereignistyp inferred | |||
Anleitungen zur Extraktion
Schritte
- Voraussetzungen: Stellen Sie sicher, dass Sie über einen Benutzer mit ausreichenden Berechtigungen für den Zugriff auf die benötigten SAP-S/4HANA-Core-Data-Services-Views (CDS-Views) verfügen. Dafür ist in der Regel eine bestimmte Rolle erforderlich, die Ihr SAP-Sicherheitsteam zuweist. Außerdem benötigen Sie einen SQL-Client wie DBeaver oder SAP HANA Studio, der eine Verbindung zur SAP-HANA-Datenbank herstellen kann.
- Datenbankverbindung herstellen: Richten Sie Ihren SQL-Client für die Verbindung mit der SAP-S/4HANA-Datenbank ein. Sie benötigen den Hostnamen des Datenbankservers, den Port (z. B. 3xx15, wobei xx die Instanznummer bezeichnet), einen Datenbankbenutzernamen und ein Passwort.
- SQL-Abfrage vorbereiten: Kopieren Sie die vollständige SQL-Abfrage aus dem Abfrageabschnitt dieses Dokuments in den Editor Ihres SQL-Clients. Mit dieser Abfrage werden alle angegebenen Aktivitäten aus verschiedenen Logistik- und Vertriebsmodulen extrahiert.
- Extraktionsparameter festlegen: Suchen Sie vor dem Ausführen der Abfrage in den
WHERE-Klauseln jeder Unterabfrage nach den Platzhaltern. Ersetzen Sie'YourCompanyCode'durch den tatsächlichen Buchungskreis, den Sie analysieren, und passen Sie die Platzhalter für den Zeitraum wie'YYYY-MM-DD'an. - Abfrage ausführen: Führen Sie das vollständige SQL-Skript aus. Die Ausführungszeit hängt vom gewählten Zeitraum und dem Datenvolumen in Ihrem System ab. Führen Sie die Abfrage möglichst außerhalb der Spitzenzeiten aus, um die Systemlast zu verringern.
- Erste Ergebnisse prüfen: Überfliegen Sie nach Abschluss der Abfrage die Ausgabe in Ihrem SQL-Client. Prüfen Sie, ob die Zeilenanzahl plausibel ist, Spalten wie LogisticsOrder, ActivityName und EventTime Werte enthalten und verschiedene Aktivitätsnamen angezeigt werden.
- Daten als CSV exportieren: Exportieren Sie das gesamte Ergebnis aus Ihrem SQL-Client in eine CSV-Datei. Wählen Sie die UTF-8-Kodierung, damit Sonderzeichen korrekt dargestellt werden.
- Datei für den Upload vorbereiten: Stellen Sie sicher, dass die Spaltenüberschriften in der fertigen CSV-Datei genau den für den Import erforderlichen Attributnamen entsprechen, zum Beispiel
LogisticsOrder,ActivityNameundEventTime. Wenn Sie die SQL-Abfrage wie angegeben verwenden, sind keine weiteren Datentransformationen erforderlich.
Konfiguration
- Voraussetzungen: Sie benötigen Zugriff auf die zugrunde liegende SAP-HANA-Datenbank. Der Datenbankbenutzer muss über
SELECT-Berechtigungen für alle in der Abfrage referenzierten CDS-Views verfügen, darunter I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment und I_BillingDocumentItem. - Filter für den Zeitraum: Die Abfrage enthält einen Platzhalter für einen Zeitraumfilter, üblicherweise auf einem Erstellungsdatumsfeld (
CreationDateoderDocumentDate). Für eine erste Analyse empfiehlt sich ein Zeitraum von 3 bis 6 Monaten. So erhalten Sie einen repräsentativen Datensatz, ohne das System übermäßig zu belasten. - Wichtige Geschäftsfilter: Filtern Sie die Daten unbedingt nach bestimmten Organisationseinheiten, damit die Ergebnisse relevant sind. Die Abfrage enthält bereits einen Platzhalter für
CompanyCode. Je nach Analyseumfang können Sie zusätzlich nachSalesOrganization,DistributionChanneloderPlantfiltern. - Leistungshinweise: Diese komplexe Abfrage verknüpft mehrere umfangreiche CDS-Views und kann erhebliche Systemressourcen beanspruchen. Planen Sie Extraktionen außerhalb der Geschäftszeiten. Bei sehr großen Datenmengen empfiehlt es sich, die Abfrage in kleinere, aufeinanderfolgende Monatsläufe aufzuteilen.
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
- Vergewissern Sie sich, dass direkter Lesezugriff auf das SAP-HANA-Schema mit den relevanten Logistik-, Vertriebs-, Beschaffungs-, Bestands-, Produktions-, Qualitäts-, Liefer-, Versand-, Liefernachweis- und Abrechnungsdaten verfügbar ist. Lassen Sie sich den Schemanamen, die Verbindungsdaten und die Berechtigungen vom SAP-Basis- oder Datenplattformteam geben. Schreiben Sie nicht in das Quellsystem.
- Prüfen Sie das genaue S/4HANA-Datenmodell im Zielsystem. Für Bestellungen werden EKKO und EKPO verwendet, für Auslieferungen LIKP und LIPS. Für Kundenaufträge, Bestellanforderungen, Materialbelege, Fertigungsaufträge, Qualitätsprüfergebnisse, Sendungen, Liefernachweise und Abrechnungen müssen weitere Objekte konfiguriert werden. Ersetzen Sie jeden Platzhalter für ein Objekt oder eine Spalte in eckigen Klammern durch Objekte, die Sie im Systemdatenverzeichnis geprüft haben.
- Legen Sie die Zuordnungsregel für LogisticsOrder fest. Bevorzugt wird eine geprüfte Belegflussbeziehung vom Kundenauftrag zu nachgelagerten Lieferungen, Materialbelegen, Fertigungs- oder Beschaffungsbelegen und Abrechnungsbelegen. Falls keine direkte Beziehung verfügbar ist, richten Sie eine dokumentierte Zuordnungstabelle oder eine geschäftsspezifische Zuordnung ein. Ordnen Sie Cases nicht allein anhand der Materialnummer oder des Datums zu.
- Legen Sie den Extraktionszeitraum mit [Start date parameter] und [End date parameter] fest. Wenden Sie den Zeitraum einheitlich auf die Ereigniszeitstempel an. Berücksichtigen Sie weiterhin Belege, die vor dem Zeitraum erstellt wurden, wenn sie zum Verständnis von Ereignissen innerhalb des Zeitraums erforderlich sind.
- Konfigurieren Sie Buchungskreis, Vertriebsorganisation, Werk, Einkaufsorganisation, Belegart und weitere Geschäftsfilter im gekennzeichneten Filterabschnitt. Verwenden Sie Filter erst, nachdem Sie ihre Werte im Zielsystem geprüft haben.
- Ersetzen Sie in jedem Aktivitätszweig die Platzhalter für Tabellen und Spalten in eckigen Klammern durch geprüfte Namen. Jeder Zweig muss dieselben Spalten und kompatible Datentypen zurückgeben. Die Abfrage erzeugt ausdrücklich eine Zeile für jede der 15 erforderlichen Aktivitäten, da ProcessMind fehlende Ereignisse nicht ableitet.
- Führen Sie die Abfrage in SAP HANA Database Explorer, der SQL-Konsole von SAP HANA cockpit oder einem zugelassenen SQL-Client aus. Testen Sie jeden Aktivitätszweig einzeln, bevor Sie die vollständige UNION-ALL-Abfrage ausführen. Prüfen Sie die Ausführungspläne und beschränken Sie den ersten Test auf einen kurzen Zeitraum.
- Prüfen Sie Belegbeziehungen, Zeitstempel, Benutzerkennungen, Lieferanten- und Kundenwerte, Material- und Werkswerte sowie Qualitätsprüfergebnisse. Untersuchen Sie doppelte Zeilen, die durch Verknüpfungen auf Positionsebene entstehen, und wenden Sie die festgelegte Ereignisebene an, zum Beispiel ein Ereignis pro Beleg oder pro Belegposition.
- Exportieren Sie das Ergebnis als UTF-8-CSV oder in einem anderen von ProcessMind unterstützten Tabellenformat. Behalten Sie exakt die folgenden Ausgabespaltennamen bei: LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate und QualityInspectionResult. Stellen Sie sicher, dass EventTime ein Zeitstempel ist und LastDataUpdate einheitlich befüllt wird.
- Laden Sie die Datei in ProcessMind hoch und ordnen Sie LogisticsOrder als Case-ID, ActivityName als Aktivität und EventTime als Ereigniszeitstempel zu. Vergewissern Sie sich, dass alle 15 Aktivitätsbezeichnungen als explizite Ereignisse behandelt werden, und planen Sie nach der Prüfung des inkrementellen Extraktionsverhaltens eine kontrollierte Aktualisierung.
Konfiguration
- Zeitraum: Beginnen Sie mit Daten aus einem Zeitraum von 3 bis 6 Monaten. Verwenden Sie für erste Tests einen kürzeren Zeitraum und erweitern Sie ihn erst, nachdem Sie Leistung und Belegbeziehungen geprüft haben.
- Quellschema: Tragen Sie unter [SAP HANA schema name] das Schema ein, das die geprüften S/4HANA-Tabellen oder -Views enthält. Gehen Sie nicht davon aus, dass klassische ERP-Tabellen in jeder S/4HANA-Installation unter demselben Namen verfügbar sind.
- Belegumfang: Richten Sie [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] und [Document Type filter] entsprechend dem Prozessumfang ein.
- Zuordnung: Konfigurieren Sie [Your document flow or correlation object] so, dass jedes Ereignis genau einer LogisticsOrder zugeordnet wird. Melden Sie fehlende oder mehrdeutige Zuordnungen, statt sie stillschweigend vorzunehmen.
- Ereignisebene: Legen Sie fest, ob ein Ereignis pro Beleg, Belegposition oder geschäftlich relevanter Statusänderung erfasst wird. Wenden Sie dieselbe Regel auf alle Zweige an und entfernen Sie ausschließlich technisch bedingte Duplikate.
- Rangfolge der Zeitstempel: Verwenden Sie für jede Aktivität den geprüften Buchungs-, Erstellungs-, Bestätigungs-, Statusänderungs-, Prüf-, Liefer-, Entlade-, POD- oder Abrechnungszeitstempel. Ersetzen Sie die Geschäftsereigniszeit nicht durch den Extraktionszeitpunkt.
- Quellbezeichnung: Setzen Sie [Source system label] auf einen stabilen Wert, zum Beispiel die freigegebene Kennung des SAP-S/4HANA-Systems.
- Aktualisierungszeitstempel: Setzen Sie [Last data update expression] auf den freigegebenen Extraktionszeitstempel oder den Zeitstempel der Quellsystemaktualisierung.
- Leistung: Schränken Sie den Zeitraum und die Organisationseinheiten früh ein, wählen Sie nur erforderliche Spalten aus, vermeiden Sie uneingeschränkte Verknüpfungen auf Positionsebene und prüfen Sie den Ausführungsplan. Für wiederkehrende Ladevorgänge empfiehlt sich eine persistierte Extraktions-View oder Staging-Tabelle.
- Berechtigungen: Erforderlich sind Leseberechtigungen für die relevanten Objekte im SAP-HANA-Schema sowie die Berechtigung zum Ausführen von SQL. Für die fachliche Prüfung benötigen Sie Zugriff auf die relevanten Vertriebs-, Beschaffungs-, Bestands-, Produktions-, Qualitäts-, Logistik-, Transport- und Abrechnungsdaten.
- Fachlicher Umfang: Prüfen Sie, ob das eingesetzte System die durch die angeforderten Aktivitäten dargestellten Geschäftsprozesse umfasst. Daten zu Sendungen, Entladung, POD, Qualität, Produktion und Abrechnung können in separaten Anwendungen oder Erweiterungen gespeichert sein.
- Sicherheit: Halten Sie die Vorgaben Ihrer Organisation für Kunden-, Lieferanten-, Material-, Finanz- und Benutzerdaten ein. Maskieren oder beschränken Sie sensible Felder, falls erforderlich.
a Beispielabfrage sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; Schritte
- Voraussetzungen: Stellen Sie sicher, dass Sie über einen Entwicklerschlüssel und die erforderlichen Berechtigungen in Ihrem SAP-S/4HANA-System verfügen, um ABAP-Programme anzulegen und auszuführen (Zugriff auf die Transaktion SE38) und Lieferkettentabellen wie VBAK, LIKP, EKKO und MKPF zu lesen.
- Programm anlegen: Öffnen Sie den ABAP Editor über den Transaktionscode
SE38. Geben Sie einen Namen für das neue Programm ein, zum BeispielZ_PM_SCM_EXTRACTION, und wählen Sie „Anlegen“. Geben Sie einen aussagekräftigen Titel ein und legen Sie den Programmtyp „Ausführbares Programm“ fest. - Code einfügen: Kopieren Sie den vollständigen ABAP-Code aus dem Abfrageabschnitt unten und fügen Sie ihn in den ABAP Editor Ihres neuen Programms ein.
- Textelemente festlegen: Navigieren Sie zu Springen > Textelemente > Selektionstexte. Aktivieren Sie alle vorgeschlagenen Bezeichnungen für den Selektionsbildschirm, damit die Benutzeroberfläche verständlich und benutzerfreundlich ist.
- Programm aktivieren: Speichern und aktivieren Sie das Programm mit STRG+S und anschließend STRG+F3 oder über das Aktivierungssymbol in der Symbolleiste. Beheben Sie Syntaxfehler, die durch systemspezifische Konfigurationen entstehen können.
- Programm ausführen: Starten Sie das Programm mit F8 oder über die Schaltfläche „Direktverarbeitung“. Ein Selektionsbildschirm wird angezeigt, auf dem Sie die zu extrahierenden Daten filtern können.
- Extraktionsparameter festlegen: Geben Sie auf dem Selektionsbildschirm den Zeitraum für das Erstellungsdatum des Kundenauftrags an. Es empfiehlt sich dringend, zusätzlich nach bestimmten Buchungskreisen oder Vertriebsorganisationen zu filtern, um das Datenvolumen zu begrenzen. Geben Sie den vollständigen Pfad zur Ausgabedatei auf dem SAP-Anwendungsserver ein.
- Im Hintergrund ausführen: Bei großen Datenmengen über mehrere Monate sollten Sie das Programm unbedingt im Hintergrund ausführen, um Zeitüberschreitungen zu vermeiden. Wählen Sie im Menü Programm > Im Hintergrund ausführen und planen Sie den Job ein.
- Datendatei abrufen: Wechseln Sie nach Abschluss der Programmausführung mit dem Transaktionscode
AL11zum angegebenen Verzeichnis auf dem Anwendungsserver. Suchen Sie die erzeugte Datei und laden Sie sie mit der TransaktionCG3Yauf Ihren lokalen Rechner herunter. - Für den Upload vorbereiten: Stellen Sie sicher, dass die heruntergeladene Datei als Klartext vorliegt, zum Beispiel als CSV mit Komma oder Semikolon als Trennzeichen, und UTF-8-kodiert ist. Anschließend können Sie die Datei in das Process-Mining-Tool hochladen.
Konfiguration
- Selektionszeitraum (S_ERDAT): Dies ist der wichtigste Filter. Er legt den Zeitraum für die erste Auswahl der Kundenaufträge anhand ihres Erstellungsdatums (
VBAK-ERDAT) fest. Beginnen Sie mit einem überschaubaren Zeitraum, etwa den letzten 3 bis 6 Monaten, damit das Datenvolumen handhabbar bleibt. - Vertriebsorganisation (S_VKORG): Mit diesem optionalen Filter beschränken Sie die Extraktion auf bestimmte Vertriebsorganisationen. So können Sie die Analyse auf eine Geschäftseinheit oder Region ausrichten.
- Buchungskreis (S_BUKRS): Mit diesem optionalen Filter begrenzen Sie die Daten auf bestimmte Buchungskreise. Das wird dringend empfohlen, um den Datenumfang zu reduzieren und die Leistung zu verbessern.
- Pfad der Ausgabedatei (P_FILE): Der vollständige Pfad auf dem SAP-Anwendungsserver, unter dem die fertige Event-Log-Datei gespeichert wird. Der ausführende Benutzer benötigt Schreibzugriff auf dieses Verzeichnis. Beispiel:
/usr/sap/trans/tmp/scm_event_log.csv. - Ausführungsmodus: Für kleine Testextraktionen kann das Programm im Vordergrund ausgeführt werden. Bei größeren Datenmengen ist die Hintergrundverarbeitung erforderlich, um Zeitüberschreitungen zu vermeiden und die Systemlast während der Spitzenzeiten zu verringern.
- Systemberechtigungen: Der ausführende Benutzer benötigt Lesezugriff auf alle zugrunde liegenden Tabellen, darunter 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. Möchten Sie loslegen?
Verwenden Sie dieses Template, um Ihre Daten vorzubereiten und noch heute mit der Optimierung Ihrer Lieferkettenleistung zu beginnen. Wir unterstützen Sie bei jedem Schritt.
Optimieren Sie jetzt Ihr Supply Chain Management
Erhalten Sie durchgängige Transparenz und verbessern Sie die Prognosegenauigkeit innerhalb weniger Tage auf 90 %.
14 Tage kostenlos testen, keine Kreditkarte erforderlich.