Datatemplate voor supplychainmanagement
Datatemplate voor supplychainmanagement
- Aanbevolen attributen om te verzamelen
- Belangrijke activiteiten om te volgen
- Richtlijnen voor data-extractie
Attributen voor supplychainmanagement
| Naam | Beschrijving | ||
|---|---|---|---|
| Activiteitsnaam ActivityName | De naam van de bedrijfsactiviteit of gebeurtenis die op een bepaald moment in het supplychainproces plaatsvond. | ||
| Beschrijving Dit attribuut beschrijft een specifieke stap of mijlpaal in de levenscyclus van de logistieke order, zoals 'Inkooporder uitgegeven' of 'Goederenafgifte geboekt'. Deze activiteiten vormen samen de reeks gebeurtenissen waaruit het proces bestaat. De activiteitenreeks analyseren is de kern van process mining. Zo ontdek je hoe het proces werkelijk verloopt, vergelijk je het met standaardprocedures en zie je welke processtappen vertraging veroorzaken of herstelwerk vragen. Waarom dit belangrijk is Dit attribuut bepaalt de processtappen. Die zijn nodig om procesmodellen te ontdekken, varianten te analyseren en doorlooptijden tussen activiteiten te meten. Waar vind je dit? Wordt aangemaakt door transactiecodes of statuswijzigingen uit verschillende SAP-tabellen (zoals EKKO, LIKP en VBUK) tijdens de datatransformatie om te zetten naar begrijpelijke activiteitsnamen. Voorbeelden Inkooporder verstuurdGoederenontvangst voor inkooporder geboektUitgaande levering aangemaaktBewijs van levering bevestigd | |||
| Logistieke order LogisticsOrder | De unieke identificatiecode voor één end-to-end supplychainproces, van de eerste vraag tot de definitieve leveringsbevestiging. | ||
| Beschrijving De logistieke order is de belangrijkste case-ID. Deze koppelt alle activiteiten aan een specifieke vraag of fulfilmentaanvraag binnen de supply chain. Zo kun je de volledige levenscyclus van een product volgen, van planning en inkoop tot productie en distributie. Dat geeft een compleet beeld van het proces. Met process mining laat analyse op basis van de logistieke order het volledige traject zien dat is afgelegd om aan een vraag te voldoen. Je ziet veelvoorkomende varianten, bottlenecks en afwijkingen in de hele supply chain, in plaats van afzonderlijke processen zoals inkoop of verkoop los van elkaar te bekijken. Waarom dit belangrijk is Deze essentiële sleutel koppelt alle gerelateerde gebeurtenissen aan één procesinstantie, zodat je de supply chain van begin tot eind kunt analyseren. Waar vind je dit? Dit is een conceptuele identificatiecode die je mogelijk moet samenstellen door verschillende documentnummers te koppelen, bijvoorbeeld een verkoopordernummer aan de bijbehorende inkooporder- en leveringsnummers. Raadpleeg de documentatie over SAP S/4HANA Supply Chain of een inhoudsdeskundige. Voorbeelden LO-4500078192LO-4500078193LO-4500078194 | |||
| Tijdstip van gebeurtenis EventTime | De timestamp waarop de activiteit plaatsvond, met datum en tijd. | ||
| Beschrijving Dit attribuut bevat de exacte datum en tijd van elke activiteit in het proces. Het vormt de chronologische basis van het event log en zet de processtappen in de volgorde waarin ze werkelijk plaatsvonden. De tijd van de gebeurtenis is nodig voor alle tijdsanalyses. Je gebruikt deze om doorlooptijden tussen activiteiten en de totale doorlooptijd van een proces te berekenen, trends in prestaties te volgen en te bepalen wanneer bottlenecks waarschijnlijk optreden. Waarom dit belangrijk is Deze timestamp is nodig om doorlooptijden en prestatiemaatstaven te berekenen en bottlenecks en doorlooptijden in processen te analyseren. Waar vind je dit? Gehaald uit timestampvelden voor het aanmaken van documenten of statuswijzigingen in centrale SAP-tabellen, zoals CDHDR/CDPOS voor wijzigingsdocumenten of datum- en tijdvelden zoals ERDAT/ERZET in koptabellen. Voorbeelden 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Bronsysteem SourceSystem | Het systeem waaruit de data afkomstig is. | ||
| Beschrijving Dit attribuut geeft aan uit welke specifieke instantie van het bronsysteem de gebeurtenisdata afkomstig is. In een complexe omgeving kan een bedrijf meerdere SAP S/4HANA-instanties hebben voor verschillende regio's of bedrijfseenheden. Dit attribuut is belangrijk voor datagovernance en om analyses op te splitsen. Analisten kunnen er procesprestaties tussen systemen mee vergelijken of data uit één gezaghebbende bron afzonderlijk bekijken. Waarom dit belangrijk is Geeft belangrijke context over de herkomst van de data. Dat is nodig om data te valideren en processen in verschillende systeemomgevingen te vergelijken. Waar vind je dit? Dit is meestal een vaste waarde die tijdens de data-extractie wordt toegevoegd om de herkomst aan te geven, bijvoorbeeld de SAP System ID (SAPSID). Voorbeelden S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Laatste data-update LastDataUpdate | De timestamp waarop de data voor het laatst is vernieuwd of uit het bronsysteem is gehaald. | ||
| Beschrijving Dit attribuut geeft aan wanneer de data in het event log voor het laatst is bijgewerkt. Zo zie je hoe actueel de geanalyseerde data is. Bij elke analyse is het belangrijk om te weten hoe recent de data is, zodat je beslissingen kunt nemen op basis van actuele informatie. Deze timestamp helpt je de data te beoordelen en te zien op welke periode de dashboards en KPI's betrekking hebben. Waarom dit belangrijk is Maakt duidelijk hoe actueel de data is, zodat je weet hoe recent de procesanalyse is. Waar vind je dit? Dit metadataveld wordt meestal aan het einde van een geslaagde data-update aangemaakt en ingevuld door de data-extractie- of ETL-tool. Voorbeelden 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Gewenste leverdatum RequestedDeliveryDate | De datum waarop de leverancier de goederen volgens afspraak moet leveren. | ||
| Beschrijving Dit is de leverdatum die in de inkooporder staat en die als streefdatum voor de leverancier geldt. Je vergelijkt deze datum met de werkelijke leverdatum om de prestaties te meten. Deze datum is nodig om de KPI voor tijdige levering door leveranciers te berekenen. Door de werkelijke datum van de goederenontvangst te vergelijken met de gewenste datum, kun je objectief vaststellen of leveranciers hun afspraken nakomen. Waarom dit belangrijk is Dit is de basisdatum voor de KPI 'Tijdige levering door leveranciers' en daarmee belangrijk voor het beheer van leveranciersprestaties. Waar vind je dit? Te vinden in regeltabel EKPO van de inkooporder, in veld EINDT (leverdatum). Voorbeelden 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Klantnaam CustomerName | De naam van de klant voor wie de order wordt afgehandeld. | ||
| Beschrijving Dit attribuut geeft aan welke eindklant bij een verkooporder en de daaropvolgende fulfilmentactiviteiten hoort. Het geeft context aan de vraagzijde van het supplychainproces. Met process mining kun je per klant verschillende fulfilmentpatronen en prestatieniveaus voor belangrijke accounts herkennen. In dashboards zoals Analyse van vertragingen bij het bewijs van levering zie je bijvoorbeeld of bepaalde klanten de ontvangstbevestiging steeds laat doorgeven. Waarom dit belangrijk is Maakt het mogelijk analyses per klant uit te splitsen. Zo worden klantgedrag, bottlenecks en prestaties ten opzichte van service level agreements zichtbaar. Waar vind je dit? Het klantnummer (KUNNR) staat in verkoopdocumenten, bijvoorbeeld in tabel VBAK. De naam wordt opgehaald uit de centrale klantstamgegevenstabel KNA1. Voorbeelden Retail CorpInnovate SolutionsManufacturing Partners | |||
| Materiaalnummer MaterialNumber | De unieke identificatiecode van het product of materiaal dat wordt verwerkt. | ||
| Beschrijving Het materiaalnummer, vaak een SKU genoemd, is de unieke code voor een product in SAP. Het koppelt procesactiviteiten aan de fysieke of digitale goederen die worden geproduceerd, ingekocht of verzonden. Dit attribuut is belangrijk voor productgerichte analyses. Je kunt ermee nagaan of bepaalde producten vaker kwaliteitsproblemen, productievertragingen of voorraadtekorten hebben. In dashboards kun je op materiaal filteren om de prestaties van specifieke productlijnen te onderzoeken. Waarom dit belangrijk is Maakt analyses per product mogelijk, zodat je kunt zien of problemen zoals vertragingen of kwaliteitsgebreken zich voordoen bij specifieke materialen. Waar vind je dit? Te vinden in regeltabellen van de meeste documenten, zoals VBAP voor verkooporders, EKPO voor inkooporders en LIPS voor leveringen. Het veld heet meestal MATNR. Voorbeelden FG-100-ARM-2034-BSA-5500 | |||
| Naam leverancier SupplierName | De naam van de leverancier die betrokken is bij de inkoopactiviteiten. | ||
| Beschrijving Dit attribuut geeft aan bij welke leverancier goederen of diensten worden ingekocht. Het hoort meestal bij activiteiten zoals 'Inkoopaanvraag aangemaakt' en 'Inkooporder uitgegeven'. De leveranciersnaam is nodig voor het dashboard Analyse van leveranciersprestaties. Je kunt de data filteren en uitsplitsen om tijdige leveringen, doorlooptijden en kwaliteitsniveaus van verschillende leveranciers te vergelijken. Dat helpt bij strategische inkoop en het beheer van leveranciersrelaties. Waarom dit belangrijk is Maakt het mogelijk prestaties per leverancier te analyseren. Dat helpt om het inkoopproces te verbeteren en de betrouwbaarheid van leveranciers te beoordelen. Waar vind je dit? Het leveranciersnummer (LIFNR) staat in inkoopdocumenten (bijvoorbeeld in de tabellen EKKN en EBAN). De naam wordt opgehaald uit de centrale leveranciersstamgegevenstabel LFA1. Voorbeelden Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Resultaat kwaliteitsinspectie QualityInspectionResult | De uitkomst van een kwaliteitsinspectie, bijvoorbeeld 'Goedgekeurd' of 'Afgekeurd'. | ||
| Beschrijving Dit attribuut registreert het resultaat van een kwaliteitscontrole op geproduceerde of ontvangen goederen. De uitkomst bepaalt of de goederen door kunnen naar de volgende stap of moeten worden hersteld, geretourneerd of afgevoerd. Dit attribuut is belangrijk voor het dashboard en de KPI voor afkeurpercentages bij kwaliteitscontrole. Door te analyseren hoe vaak en waarom goederen worden afgekeurd, kun je structurele kwaliteitsproblemen bij specifieke producten, leveranciers of productielijnen herkennen. Waarom dit belangrijk is Ondersteunt rechtstreeks de berekening van kwaliteits-KPI's en helpt de oorzaken van kwaliteitsproblemen in de supply chain te vinden. Waar vind je dit? Deze informatie staat meestal in de module Quality Management (QM). De data kan afkomstig zijn uit tabellen voor inspectiepartijen, zoals QALS, en uit gebruiksbeslissingscodes in QAVE. Voorbeelden GoedgekeurdAfgekeurdHerstelwerk nodigGoedgekeurd met afwijking | |||
| Uitvoerende gebruiker ExecutingUser | De gebruikers-ID van de persoon die de activiteit heeft uitgevoerd. | ||
| Beschrijving Dit attribuut bevat de SAP-gebruikersnaam of -ID van de medewerker die de activiteit heeft uitgevoerd, bijvoorbeeld het aanmaken van een inkooporder of het boeken van een goederenontvangst. Zo worden processtappen gekoppeld aan de betrokken medewerkers. Analyse per gebruiker helpt om de werkverdeling te begrijpen, opleidingsbehoeften te herkennen en prestatieverschillen tussen personen of teams te zien. Ook is dit nuttig voor complianceanalyse: je kunt nagaan wie belangrijke processtappen heeft uitgevoerd. Waarom dit belangrijk is Koppelt activiteiten aan specifieke gebruikers, zodat je de werkbelasting kunt analyseren, prestaties kunt vergelijken en niet-conforme handelingen kunt onderzoeken. Waar vind je dit? Te vinden in de velden 'Gemaakt door' of 'Gewijzigd door' in veel SAP-tabellen, zoals ERNAM in EKKO (kop van de inkooporder), LIKP (kop van de levering) en VBRK (kop van de factuur). Voorbeelden CBROWNJSMITHASINGH | |||
| Vestiging Plant | De productie- of distributielocatie waar de activiteit plaatsvond. | ||
| Beschrijving De vestiging is een organisatorische eenheid in SAP voor een locatie waar goederen worden geproduceerd, opgeslagen of gedistribueerd. Dit attribuut geeft geografische of functionele context aan procesactiviteiten. Procesprestaties per vestiging analyseren is vaak nodig. Je kunt efficiëntie, doorvoer en compliance tussen verschillende locaties vergelijken en zo goede werkwijzen of locaties die verbetering nodig hebben herkennen. Waarom dit belangrijk is Geeft analyses een geografische of organisatorische dimensie, zodat je prestaties tussen verschillende locaties kunt vergelijken. Waar vind je dit? Te vinden in veel regeltabellen van documenten, zoals VBAP (verkoop), EKPO (inkoop) en LIPS (levering). Het veld heet meestal WERKS. Voorbeelden 100021003500 | |||
| Eindtijd EndTime | De timestamp waarop een activiteit is afgerond. Deze wordt gebruikt om de verwerkingstijd te berekenen. | ||
| Beschrijving De eindtijd geeft aan wanneer een specifieke activiteit is afgerond. De starttijd (EventTime) geeft aan wanneer een activiteit begint. De eindtijd is nodig om te bepalen hoelang een activiteit duurde, vooral als die niet direct is afgerond. Met zowel een start- als eindtijd kun je de verwerkingstijd nauwkeurig onderscheiden van de wachttijd. Zo zie je hoeveel tijd aan het werk zelf is besteed en hoeveel tijd er is gewacht op de volgende stap. Dat helpt om efficiëntiekansen te vinden. Waarom dit belangrijk is Maakt het mogelijk de verwerkingstijd van activiteiten nauwkeurig te berekenen en werk dat waarde toevoegt te onderscheiden van wachttijd. Waar vind je dit? Kan worden afgeleid uit statuswijzigingen in SAP. De start kan bijvoorbeeld een statusupdate 'In uitvoering' zijn en het einde een statusupdate 'Afgerond' in tabellen zoals JEST/JCDS. Bij gebeurtenissen zonder duur kan EndTime gelijk zijn aan StartTime. Voorbeelden 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Herstelwerk IsRework | Een aanduiding die aangeeft of een activiteit of reeks activiteiten herstelwerk is. | ||
| Beschrijving Dit booleaanse attribuut markeert activiteiten die eerdere processtappen herhalen en dus wijzen op herstelwerk of correctie. Als bijvoorbeeld na een 'Kwaliteitsinspectie' een stap 'Productieorder aangemaakt' volgt en daarna opnieuw een 'Kwaliteitsinspectie', kan de tweede inspectie als herstelwerk worden gemarkeerd. Herstelwerk herkennen is belangrijk om inefficiëntie en verborgen kosten te begrijpen. Met deze aanduiding kun je herstelwerkloops tellen en de impact ervan meten. Dat ondersteunt de berekening van de KPI voor fouten bij orderverwerking en laat zien waar procesverbetering nodig is. Waarom dit belangrijk is Helpt procesinefficiëntie te meten door activiteiten in een herstelwerkloop expliciet te herkennen en te tellen. Waar vind je dit? Dit wordt meestal berekend in de process mining-tool door herhaalde activiteitenreeksen binnen dezelfde case te herkennen. Voorbeelden truefalse | |||
| Inkoopordernummer PurchaseOrderNumber | De unieke identificatiecode van het inkooporderdocument (PO). | ||
| Beschrijving Het inkoopordernummer is het officiële documentnummer waarmee materialen bij een leverancier worden besteld. Het is een belangrijke identificatiecode in het inkoopdeel van de supply chain. Met dit attribuut kun je inzoomen op het inkoopproces. Je gebruikt het in het dashboard Doorlooptijd van het inkoopproces van begin tot eind en om de KPI voor tijdige levering door leveranciers te berekenen. Het koppelt activiteiten rond aanvragen, bestellen, ontvangen en betalen. Waarom dit belangrijk is Dient als belangrijke identificatiecode om in te zoomen op het inkoopsubproces en gerelateerde inkoopgebeurtenissen te koppelen. Waar vind je dit? Te vinden in de kop van de inkooporder in tabel EKKO en in regeltabel EKPO. Het veld heet EBELN. Voorbeelden 450007819245000781934500078194 | |||
| Levering te laat IsLateDelivery | Een booleaanse waarde die aangeeft of een leverancier na de gewenste leverdatum heeft geleverd. | ||
| Beschrijving Deze berekende waarde geeft eenvoudig aan of een levering op tijd was. De waarde wordt bepaald door de timestamp van de activiteit 'Goederenontvangst voor inkooporder geboekt' te vergelijken met het attribuut 'Gewenste leverdatum'. Dit attribuut maakt het eenvoudiger om dashboards en KPI's voor leveranciersprestaties te maken. Je kunt snel filteren en totalen berekenen voor de KPI voor tijdige levering door leveranciers. Ook zie je welke leveranciers, materialen of regio's de meeste vertragingen hebben. Waarom dit belangrijk is Vereenvoudigt de analyse van leveranciersprestaties met een duidelijke ja-of-nee-uitkomst per levering. Dat is nodig voor de KPI voor tijdige levering. Waar vind je dit? Dit is een berekend veld. De logica is: IF ('Goederenontvangst voor inkooporder geboekt'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Voorbeelden truefalse | |||
| Naam vervoerder CarrierName | De naam van het transportbedrijf of de expediteur die de zending afhandelt. | ||
| Beschrijving De naam van de vervoerder geeft aan welke logistieke dienstverlener verantwoordelijk is voor het transport van goederen tussen locaties, bijvoorbeeld van een magazijn naar een klant. Dit attribuut is nodig voor het dashboard Analyse van transportdoorlooptijden. Je kunt transittijden, kosten en betrouwbaarheid van verschillende vervoerders vergelijken. Dat helpt bij de transportplanning en de keuze van vervoerders. Waarom dit belangrijk is Maakt het mogelijk prestaties per vervoerder te analyseren. Dat helpt om logistieke kosten en levertijden te verbeteren. Waar vind je dit? De vervoerders-ID (expediteur) staat in zendingsdocumenten, zoals tabel VTTK (kop van de zending). De naam wordt opgehaald uit stamgegevenstabellen zoals LFA1. Voorbeelden DHLFedExMaersk Logistics | |||
| Orderhoeveelheid OrderQuantity | De hoeveelheid materiaal op de orderregel. | ||
| Beschrijving Dit attribuut geeft aan hoeveel eenheden van een materiaal zijn aangevraagd op een regel van een verkoop- of inkooporder. Zo wordt het volume van elke transactie zichtbaar. Met een analyse op basis van hoeveelheid kun je grote orders prioriteit geven, omdat die meer impact op het bedrijf kunnen hebben. Je kunt de hoeveelheid ook gebruiken om andere maatstaven te normaliseren, zoals de kosten per eenheid, of om te zien welk effect de ordergrootte heeft op de verwerkingstijd. Waarom dit belangrijk is Geeft inzicht in het volume van transacties, zodat je de impact kunt analyseren en cases op omvang kunt uitsplitsen. Waar vind je dit? Te vinden in regeltabellen, bijvoorbeeld als MENGE in EKPO (inkooporder) of KWMENG in VBAP (verkooporder). Voorbeelden 100500025 | |||
| Verkoopordernummer SalesOrderNumber | De unieke identificatiecode van het verkooporderdocument (SO). | ||
| Beschrijving Het verkoopordernummer is het officiële documentnummer dat een verkoop aan een klant bevestigt. Het is een belangrijke identificatiecode in het order-to-cash-deel van de supply chain. Dit attribuut is belangrijk om de afhandeling van een specifieke klantorder te volgen. Het koppelt de oorspronkelijke klantaanvraag aan alle volgende activiteiten, zoals levering en facturering, en ondersteunt de analyse van de doorlooptijd van orderafhandeling. Waarom dit belangrijk is Dient als belangrijke identificatiecode voor het fulfilmentsubproces en koppelt de klantvraag aan de logistieke en financiële afhandeling. Waar vind je dit? Te vinden in de kop van de verkooporder in tabel VBAK en in regeltabel VBAP. Het veld heet VBELN. Voorbeelden 100023451000234610002347 | |||
Activiteiten voor supplychainmanagement
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Bewijs van levering bevestigd | Dit staat voor de formele bevestiging van de klant of vervoerder dat de goederen volgens afspraak zijn ontvangen. Vaak wordt dit vastgelegd door POD-gegevens aan de uitgaande levering toe te voegen. | ||
| Waarom dit belangrijk is Deze activiteit markeert het definitieve einde van het fulfilmentproces. De informatie is belangrijk voor een correcte facturering, het oplossen van geschillen en het meten van het laatste deel van de leveringscyclus. Waar vind je dit? Dit is een expliciete gebeurtenis. De datum van het bewijs van levering staat in de kop van de leveringstabel (LIKP, veld PODAT) of in gerelateerde POD-tabellen (VLPOD). Vastleggen Gebruik de datum van het bewijs van levering (LIKP-PODAT) uit het leveringsdocument. Gebeurtenistype explicit | |||
| Goederen geproduceerd | Deze activiteit bevestigt dat de productie van de goederen is afgerond. Meestal wordt dit vastgelegd als een goederenontvangst voor de productieorder, waarbij het gereed product aan de voorraad wordt toegevoegd. | ||
| Waarom dit belangrijk is Dit markeert het einde van de productiecyclus. De tijd tussen het aanmaken van de productieorder en deze gebeurtenis is de productiedoorlooptijd, een belangrijke maatstaf voor de productie-efficiëntie. Waar vind je dit? Je kunt dit expliciet vastleggen via een materiaalboeking (goederenontvangst voor de productieorder). Je kunt het ook afleiden uit de laatste bevestiging van de productieorder (tabel AFRU) of een statuswijziging naar 'Geleverd'. Vastleggen Leid dit af uit de boekingsdatum van het laatste materiaaldocument voor goederenontvangst van de productieorder, of uit een statuswijziging. Gebeurtenistype inferred | |||
| Goederenafgifte geboekt | Deze activiteit staat voor het juridische en fysieke vertrek van goederen uit het magazijn. De voorraad neemt hierdoor af en de kostprijs van de verkochte goederen wordt geboekt. Daarmee is de order officieel verzonden. | ||
| Waarom dit belangrijk is Dit is een belangrijk moment: de periode waarin de goederen onderweg zijn, begint. De goederen zijn vanaf dit punt definitief niet meer in het bezit van het bedrijf en worden afgeleverd. Waar vind je dit? Dit is een expliciete gebeurtenis waarbij een materiaaldocument wordt aangemaakt. De timestamp wordt vastgelegd in de kop van het materiaaldocument (MKPF, veld BUDAT) en werkt de goederenbewegingsstatus in het leveringsdocument bij (LIKP, veld WBSTK). Vastleggen Gebruik de boekingsdatum (MKPF-BUDAT) uit het materiaaldocument voor de goederenafgifte dat bij de uitgaande levering hoort. Gebeurtenistype explicit | |||
| Goederenontvangst voor inkooporder geboekt | Dit markeert de fysieke ontvangst van grondstoffen of goederen van een leverancier voor een inkooporder. De gebeurtenis wordt vastgelegd wanneer de goederen bij het magazijn of de fabriek aankomen. | ||
| Waarom dit belangrijk is Met deze activiteit is het leveringsgedeelte van het inkoopproces afgerond. De gegevens zijn belangrijk om te berekenen hoe vaak leveranciers op tijd leveren en om de prestaties van inkomende logistiek te begrijpen. Waar vind je dit? Deze expliciete gebeurtenis wordt vastgelegd via een materiaalboeking. De timestamp staat in de kopteksttabel van het materiaaldocument (MKPF, veld BUDAT). De koppeling met de inkooporder staat in de positietabel (MSEG). Vastleggen Gebruik de boekingsdatum (MKPF-BUDAT) van het materiaaldocument dat bij de inkooporder hoort. Gebeurtenistype explicit | |||
| Inkooporder verstuurd | Dit markeert het formeel aanmaken en versturen van een inkooporder aan een externe leverancier voor de benodigde materialen. Met deze stap wordt een inkoopaanvraag omgezet in een juridisch bindende afspraak met een leverancier. | ||
| Waarom dit belangrijk is Deze belangrijke mijlpaal helpt je de doorlooptijden van leveranciers en de doorlooptijd van inkoop te meten. Ook vormt dit het uitgangspunt om te beoordelen of leveranciers op tijd leveren. Waar vind je dit? Deze expliciete gebeurtenis wordt vastgelegd wanneer de inkooporder wordt aangemaakt. De timestamp voor aanmaak staat in de kopteksttabel van de inkooporder (EKKO, veld AEDAT). Vastleggen Gebruik de aanmaakdatum van het document (EKKO-AEDAT) voor de inkooporder. Gebeurtenistype explicit | |||
| Verkooporder aangemaakt | Deze activiteit markeert het aanmaken van een nieuwe verkooporder, waarin een klant formeel goederen aanvraagt. Het systeem registreert deze gebeurtenis wanneer een gebruiker een nieuw verkooporderdocument opslaat. | ||
| Waarom dit belangrijk is Dit is het belangrijkste startpunt van het order-to-cash-proces. Door de tijd tussen deze gebeurtenis en andere gebeurtenissen te analyseren, zie je de totale doorlooptijd van de orderafhandeling en eventuele vertragingen aan het begin. Waar vind je dit? Deze gebeurtenis wordt expliciet vastgelegd. Je vindt de gegevens in de wijzigingsdocumenten voor verkoopordertabellen (CDHDR/CDPOS) of in de timestamp voor aanmaak in de kopteksttabel van de verkooporder (VBAK, veld ERDAT). Vastleggen Gebruik de aanmaakdatum (VBAK-ERDAT) en -tijd (VBAK-ERZET) van het verkooporderdocument. Gebeurtenistype explicit | |||
| Goederen gelost op bestemming | Deze activiteit geeft aan dat de goederen fysiek zijn gelost op de locatie van de klant. SAP registreert deze gebeurtenis mogelijk niet expliciet. Vaak moet je haar afleiden uit gegevens van de vervoerder of uit latere gebeurtenissen. | ||
| Waarom dit belangrijk is Hiermee eindigt het transporttraject. De tijd tussen de goederenafgifte en dit moment is de transporttijd, een belangrijke maatstaf voor het optimaliseren van de logistiek. Waar vind je dit? In het kern-ERP is dit zelden een expliciete gebeurtenis. Je kunt haar afleiden uit EDI-berichten van de vervoerder, gegevens uit de module Transportation Management (TM) of, als die beschikbaar is, de timestamp op het bewijs van levering. Vastleggen Leid de gebeurtenis af uit statusupdates van de vervoerder (bijvoorbeeld EDI 214) of gebruik de timestamp van het bewijs van levering als benadering. Gebeurtenistype inferred | |||
| Inkoopaanvraag aangemaakt | Deze activiteit markeert het aanmaken van een intern verzoek om benodigde goederen of grondstoffen in te kopen. Dit gebeurt vaak wanneer er onvoldoende voorraad is om een verkooporder af te handelen of wanneer de voorraad onder het bestelpunt komt. | ||
| Waarom dit belangrijk is Dit is de eerste stap in het inkoopproces. Door het aanmaken van de aanvraag te volgen, kun je vertragingen bij de start van de inkoop opsporen en het volledige inkoopproces analyseren. Waar vind je dit? Dit is een expliciete gebeurtenis. De timestamp voor aanmaak staat in de kopteksttabel van de inkoopaanvraag (EBAN, veld BADAT). Vastleggen Gebruik de aanmaakdatum (EBAN-BADAT) van het inkoopaanvraagdocument. Gebeurtenistype explicit | |||
| Klantfactuur aangemaakt | Deze activiteit markeert het aanmaken van het factuurdocument voor de klant op basis van de geleverde goederen of diensten. Hiermee begint de laatste financiële afhandeling van het proces. | ||
| Waarom dit belangrijk is Deze activiteit is belangrijk voor het analyseren van de factureringsdoorlooptijd. Vertraging tussen de leveringsbevestiging en de facturering kan de cashflow verslechteren. Waar vind je dit? Dit is een expliciete gebeurtenis. De aanmaaktimestamp staat in de kop van de factuurdocumenttabel (VBRK, veld ERDAT). Vastleggen Gebruik de aanmaakdatum (VBRK-ERDAT) uit de kop van het factuurdocument. Gebeurtenistype explicit | |||
| Kwaliteitsinspectie uitgevoerd | Dit markeert de afronding van een kwaliteitscontrole op geproduceerde goederen. De uitkomst van de inspectie, goedgekeurd of afgekeurd, wordt vastgelegd in een gebruiksbeslissing. | ||
| Waarom dit belangrijk is Deze activiteit is belangrijk om de productkwaliteit te volgen en productieproblemen op te sporen. Veel afkeuringen of lange inspectietijden kunnen op belangrijke bottlenecks wijzen. Waar vind je dit? Deze expliciete gebeurtenis wordt vastgelegd wanneer een gebruiksbeslissing wordt genomen voor een kwaliteitsinspectiepartij. De beslisdatum staat in de QALS-tabel (veld PASTRTERM) of de QAVE-tabel. Vastleggen Gebruik de timestamp waarop de gebruiksbeslissing voor de inspectiepartij wordt vastgelegd (tabellen QALS/QAVE). Gebeurtenistype explicit | |||
| Orderverzameling afgerond | Deze activiteit markeert de afronding van het fysieke verzamelen van artikelen in het magazijn voor de uitgaande levering. In veel systemen wordt dit bevestigd wanneer de verzamelstatus van het leveringsdocument wordt bijgewerkt. | ||
| Waarom dit belangrijk is Efficiënt orderverzamelen is belangrijk voor de doorvoer in het magazijn. Door deze activiteit te volgen, kun je bottlenecks in de magazijnprocessen opsporen en de prestaties van het orderverzamelen meten. Waar vind je dit? Dit is vaak geen afzonderlijke gebeurtenis, maar kan worden afgeleid uit statuswijzigingen. De gebeurtenis wordt geregistreerd wanneer de pickstatus in de leveringstabel (LIPS, veld KOSTA) op 'C' (volledig verwerkt) wordt gezet. Vastleggen Leid de gebeurtenis af uit wijzigingsdocumenten wanneer de pickstatus (LIPS-KOSTA) wordt bijgewerkt naar volledig gepickt. Gebeurtenistype inferred | |||
| Productieorder aangemaakt | Dit geeft aan dat er een productieorder is aangemaakt om de gereed producten voor de verkooporder te maken. Hiermee begint de interne productie formeel. | ||
| Waarom dit belangrijk is Het aanmaken van een productieorder markeert het begin van de productiedoorlooptijd. Door deze stap te analyseren, kun je vertragingen tussen het vraagsignaal en de start van de productie opsporen. Waar vind je dit? Dit is een expliciete gebeurtenis. De aanmaakdatum staat in de kopteksttabel van de productieorder (AUFK, veld ERDAT). Vastleggen Gebruik de aanmaakdatum (AUFK-ERDAT) uit de kopteksttabel van de order. Gebeurtenistype explicit | |||
| Uitgaande levering aangemaakt | Dit markeert het aanmaken van een leveringsdocument, waarmee het verzamelen en verzenden van goederen naar de klant wordt goedgekeurd. Hiermee gaat het proces over van orderbeheer naar logistieke uitvoering. | ||
| Waarom dit belangrijk is Deze belangrijke stap start de fysieke afhandeling. Vertragingen tussen het aanmaken van de order en de levering kunnen wijzen op problemen met de planning of beschikbaarheid. Waar vind je dit? Dit is een expliciete gebeurtenis. De timestamp voor aanmaak staat in de kopteksttabel van de levering (LIKP, veld ERDAT). Vastleggen Gebruik de aanmaakdatum (LIKP-ERDAT) en -tijd (LIKP-ERZET) uit de koptekst van het leveringsdocument. Gebeurtenistype explicit | |||
| Voorraadbeschikbaarheid gecontroleerd | Dit is de systeemcontrole of handmatige controle om vast te stellen of de gevraagde artikelen op voorraad zijn en de verkooporder kan worden afgehandeld. Vaak gebeurt dit automatisch bij het aanmaken van de verkooporder, maar de controle wordt niet altijd als afzonderlijke gebeurtenis vastgelegd. | ||
| Waarom dit belangrijk is Als je kijkt naar de tijd tussen de order en deze controle, en naar de uitkomst ervan, zie je hoe voorraadniveaus de afhandeling beïnvloeden. Vertragingen leiden hier vaak tot inkoop- of productieactiviteiten. Waar vind je dit? Dit is doorgaans geen expliciete gebeurtenis. Je kunt deze afleiden uit het aanmaken van de eerste bevestigde leveringsregel in de verkooporderpositietabel (VBEP) of uit statuswijzigingen van de orderpositie. Vastleggen Leid dit af uit de statuswijziging van de bevestiging op de leveringsregel van de verkooporder (tabel VBEP). Gebeurtenistype inferred | |||
| Zending aangemaakt | Dit staat voor het aanmaken van een zendingsdocument. Daarin worden een of meer leveringen samengevoegd voor de transportplanning. Het document bevat gegevens over de vervoerder, route en vervoerswijze. | ||
| Waarom dit belangrijk is Met deze activiteit begint de formele transportplanning. De tijd tussen de goederenafgifte en de afronding van de zending laat zien hoe efficiënt het transportproces verloopt. Waar vind je dit? Dit is een expliciete gebeurtenis in de zendingskop (VTTK, veld ERDAT). Deze functie hoort bij de module LE-TRA, die niet door alle organisaties wordt gebruikt. Vastleggen Gebruik de aanmaakdatum (VTTK-ERDAT) uit de kop van het zendingsdocument. Gebeurtenistype explicit | |||
Extractiegidsen
Stappen
- Vereisten: Zorg dat je een gebruiker hebt met voldoende autorisaties voor de benodigde SAP S/4HANA Core Data Services (CDS)-views. Hiervoor is meestal een specifieke rol nodig die je SAP-beveiligingsteam toewijst. Je hebt ook een SQL-client nodig, zoals DBeaver of SAP HANA Studio, die verbinding kan maken met de SAP HANA-database.
- Databaseverbinding instellen: Configureer je SQL-client voor verbinding met de SAP S/4HANA-database. Je hebt de hostnaam van de databaseserver, de poort (bijvoorbeeld 3xx15, waarbij xx het instantienummer is), een databasegebruikersnaam en een wachtwoord nodig.
- De SQL-query voorbereiden: Kopieer de volledige SQL-query uit het querygedeelte van dit document naar de editor van je SQL-client. De query haalt de opgegeven activiteiten op uit verschillende logistieke en verkoopmodules.
- Extractieparameters instellen: Zoek vóór uitvoering van de query de tijdelijke voorwaarden in de
WHERE-clausules van elke subquery. Vervang'YourCompanyCode'door de bedrijfscode die je analyseert en pas de datumwaarden, zoals'YYYY-MM-DD', aan voor de gewenste extractieperiode. - De query uitvoeren: Voer het volledige SQL-script uit. De uitvoeringstijd hangt af van de gekozen periode en de hoeveelheid data in je systeem. Voer de query bij voorkeur buiten piekuren uit om de systeembelasting te beperken.
- Eerste resultaten controleren: Bekijk de uitvoer kort in je SQL-client zodra de query klaar is. Controleer of het aantal rijen aannemelijk is, of kolommen zoals LogisticsOrder, ActivityName en EventTime zijn gevuld en of er verschillende activiteitsnamen voorkomen.
- Data exporteren naar CSV: Exporteer de volledige resultatenset vanuit je SQL-client naar een CSV-bestand. Kies UTF-8-codering om problemen met speciale tekens te voorkomen.
- Bestand voorbereiden voor upload: Controleer of de kolomkoppen in het CSV-bestand exact overeenkomen met de vereiste attribuutnamen, zoals
LogisticsOrder,ActivityNameenEventTime. Als je de SQL-query gebruikt zoals aangeleverd, is verdere datatransformatie niet nodig.
Configuratie
- Vereisten: Je hebt toegang nodig tot de onderliggende SAP HANA-database. De databasegebruiker moet
SELECT-rechten hebben op alle CDS-views waarnaar de query verwijst, waaronder I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment en I_BillingDocumentItem. - Filteren op periode: De query bevat een tijdelijke filter voor een periode, meestal op basis van een aanmaakdatum (
CreationDateofDocumentDate). Voor een eerste analyse raden we een periode van 3 tot 6 maanden aan. Zo krijg je een representatieve dataset zonder het systeem onnodig te belasten. - Belangrijke bedrijfsfilters: Filter de data op specifieke organisatie-eenheden, zodat de resultaten relevant zijn. De query bevat een tijdelijke waarde voor
CompanyCode. Afhankelijk van de reikwijdte van je analyse kun je ook filters toevoegen voorSalesOrganization,DistributionChannelofPlant. - Prestaties: Deze complexe query combineert meerdere grote CDS-views en kan veel systeembronnen gebruiken. Plan extracties buiten kantooruren. Overweeg bij zeer grote datasets de query in kleinere opeenvolgende maandelijkse batches uit te voeren.
a Voorbeeldquery 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; Stappen
- Controleer of je directe leestoegang hebt tot het SAP HANA-schema met de relevante logistieke, verkoop-, inkoop-, voorraad-, productie-, kwaliteits-, leverings-, verzend-, afleveringsbewijs- en factuurdata. Vraag de schemanaam, verbindingsgegevens en autorisaties op bij het SAP Basis- of dataplatformteam. Schrijf niet naar het bronsysteem.
- Controleer het exacte S/4HANA-datamodel in het doelsysteem. EKKO en EKPO worden gebruikt voor inkooporders, LIKP en LIPS voor uitgaande leveringen. Voor verkooporders, inkoopaanvragen, materiaaldocumenten, productieorders, kwaliteitsinspectieresultaten, zendingen, afleveringsbewijzen en facturering moeten aanvullende objecten worden ingesteld. Vervang elke tijdelijke tabel- of kolomverwijzing tussen vierkante haken in de query door een object dat je in het systeemgegevenswoordenboek hebt gecontroleerd.
- Bepaal de correlatieregel voor LogisticsOrder. Gebruik bij voorkeur een gecontroleerde documentstroomrelatie van de verkooporder naar de bijbehorende leveringen, materiaaldocumenten, productie- of inkoopdocumenten en factuurdocumenten. Is er geen rechtstreekse relatie, stel dan een gedocumenteerde correlatietabel of bedrijfsspecifieke koppeling in. Koppel cases niet alleen op basis van materiaalnummer of datum.
- Stel de extractieperiode in met [Start date parameter] en [End date parameter]. Pas de periode consequent toe op event timestamps, maar neem documenten van vóór de periode mee als die nodig zijn om gebeurtenissen binnen de periode te verklaren.
- Stel de bedrijfscode, verkooporganisatie, vestiging, inkooporganisatie, documentsoort en andere bedrijfsfilters in het aangegeven filtergedeelte in. Gebruik filters pas nadat je de waarden in het doelsysteem hebt gecontroleerd.
- Vervang de tijdelijke tabel- en kolomverwijzingen tussen vierkante haken in elke activiteitstak door gecontroleerde namen. Elke tak moet dezelfde kolommen en compatibele gegevenstypen opleveren. De query maakt expliciet één rij aan voor elk van de 15 vereiste activiteiten, omdat ProcessMind ontbrekende gebeurtenissen niet afleidt.
- Voer de query uit in SAP HANA Database Explorer, SAP HANA cockpit SQL Console of de goedgekeurde SQL-client. Test elke activiteitstak afzonderlijk voordat je de volledige UNION ALL-query uitvoert. Controleer de uitvoeringsplannen en beperk de eerste test tot een korte periode.
- Controleer documentrelaties, timestamps, gebruikers-ID's, leveranciers- en klantgegevens, materiaal- en vestigingsgegevens en kwaliteitsresultaten. Onderzoek dubbele rijen door joins op artikelniveau en pas de ingestelde regel voor de gebeurtenisgranulariteit toe, bijvoorbeeld één gebeurtenis per document of per documentregel.
- Exporteer het resultaat als UTF-8 CSV of een ander door ProcessMind ondersteund tabelbestand. Behoud exact deze uitvoerkolomnamen: LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate en QualityInspectionResult. Zorg dat EventTime een timestamp is en LastDataUpdate consequent wordt ingevuld.
- Upload het bestand naar ProcessMind en koppel LogisticsOrder aan de case-ID, ActivityName aan de activiteit en EventTime aan de event timestamp. Controleer of alle 15 activiteitslabels als expliciete gebeurtenissen worden behandeld en plan een gecontroleerde vernieuwing nadat je het gedrag van incrementele extractie hebt gevalideerd.
Configuratie
- Periode: Begin met 3 tot 6 maanden aan data. Gebruik voor de eerste test een kortere periode en verleng die pas nadat je de prestaties en documentrelaties hebt gecontroleerd.
- Bronschema: Stel [SAP HANA schema name] in op het schema met de gecontroleerde S/4HANA-tabellen of -views. Ga er niet van uit dat een klassieke ERP-tabel in elke S/4HANA-implementatie onder dezelfde naam beschikbaar is.
- Documentbereik: Stel [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] en [Document Type filter] in volgens de reikwijdte van het proces.
- Correlatie: Stel [Your document flow or correlation object] zo in dat elke gebeurtenis aan één LogisticsOrder wordt gekoppeld. Meld ontbrekende of onduidelijke koppelingen in plaats van ze stilzwijgend toe te wijzen.
- Gebeurtenisgranulariteit: Kies één gebeurtenis per document, documentregel of relevante statuswijziging. Pas dezelfde regel toe op alle takken en verwijder alleen technisch dubbele rijen.
- Voorrang voor timestamps: Gebruik voor elke activiteit de gecontroleerde boekings-, aanmaak-, bevestigings-, statuswijzigings-, inspectie-, leverings-, los-, POD- of factuurtimestamp. Vervang de tijd van de bedrijfsgebeurtenis niet door de extractietijd.
- Bronlabel: Stel [Source system label] in op een vaste waarde, zoals de goedgekeurde SAP S/4HANA-systeem-ID.
- Vernieuwingstijdstip: Stel [Last data update expression] in op het goedgekeurde extractietijdstip of de tijd van de bronvernieuwing.
- Prestaties: Beperk de periode en organisatie-eenheden vroeg in de query, selecteer alleen de benodigde kolommen, vermijd joins zonder beperking op artikelniveau en controleer het uitvoeringsplan. Overweeg voor terugkerende ladingen een opgeslagen extractieweergave of stagingtabel.
- Autorisaties: Je hebt leestoegang nodig tot de relevante SAP HANA-schemaobjecten en toestemming om SQL uit te voeren. Voor bedrijfsvalidatie is toegang nodig tot de toepasselijke verkoop-, inkoop-, voorraad-, productie-, kwaliteits-, logistieke uitvoerings-, transport- en factuurdata.
- Functionele reikwijdte: Controleer of de geïmplementeerde omgeving de bedrijfsprocessen bevat die bij de gevraagde activiteiten horen. Data over zendingen, lossen, POD, kwaliteit, productie en facturering kan in afzonderlijke applicaties of uitbreidingen staan.
- Beveiliging: Volg de regels van je organisatie voor klant-, leveranciers-, materiaal-, financiële en gebruikersdata. Maskeer gevoelige velden of beperk de toegang ertoe als dat nodig is.
a Voorbeeldquery 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; Stappen
- Vereisten: Zorg dat je een ontwikkelaarsleutel en de benodigde autorisaties hebt om ABAP-programma's aan te maken en uit te voeren in SAP S/4HANA. Je hebt toegang tot transactie SE38 nodig en leesrechten op supplychaintabellen zoals VBAK, LIKP, EKKO en MKPF.
- Programma aanmaken: Open de ABAP Editor met transactiecode
SE38. Geef het nieuwe programma een naam, bijvoorbeeldZ_PM_SCM_EXTRACTION, en klik op 'Create'. Vul een duidelijke titel in en kies als programmatype 'Executable Program'. - Code invoegen: Kopieer de volledige ABAP-code uit het onderstaande gedeelte 'query' en plak deze in de ABAP Editor van je nieuwe programma.
- Tekstelementen instellen: Ga naar Go To > Text Elements > Selection Texts. Activeer alle voorgestelde labels voor het selectiescherm, zodat de gebruikersinterface duidelijk is.
- Programma activeren: Sla het programma op met CTRL+S en activeer het met CTRL+F3, of gebruik het activeringspictogram in de werkbalk. Los eventuele syntaxfouten op die door systeemspecifieke instellingen ontstaan.
- Programma uitvoeren: Druk op F8 of gebruik de knop 'Direct Processing'. Er verschijnt een selectiescherm waarin je de te extraheren data kunt filteren.
- Extractieparameters instellen: Geef op het selectiescherm de periode voor de aanmaakdatum van de verkooporder op. Filter bij voorkeur ook op specifieke bedrijfscodes of verkooporganisaties om de hoeveelheid data te beperken. Vul het volledige pad in naar het uitvoerbestand op de SAP-applicatieserver.
- Op de achtergrond uitvoeren: Voer het programma bij grote datasets van meerdere maanden op de achtergrond uit om time-outs te voorkomen. Kies in het menu Program > Execute in Background en plan de taak in.
- Data ophalen: Gebruik na afloop transactiecode
AL11om naar de opgegeven map op de applicatieserver te gaan. Zoek het gegenereerde bestand en download het naar je computer met transactieCG3Y. - Voorbereiden op upload: Controleer of het gedownloade bestand platte tekst bevat, bijvoorbeeld CSV met komma's of puntkomma's als scheidingsteken, en UTF-8-codering gebruikt. Het bestand is nu klaar om naar de process mining-tool te uploaden.
Configuratie
- Selectieperiode (S_ERDAT): Dit is het belangrijkste filter. Hiermee bepaal je welke verkooporders worden geselecteerd op basis van hun aanmaakdatum (
VBAK-ERDAT). Begin met een afgebakende periode, bijvoorbeeld de afgelopen 3 tot 6 maanden, zodat de hoeveelheid data beheersbaar blijft. - Verkooporganisatie (S_VKORG): Optioneel filter om de extractie te beperken tot specifieke verkooporganisaties. Handig als je de analyse op een bepaalde bedrijfseenheid of regio wilt richten.
- Bedrijfscode (S_BUKRS): Optioneel filter om de data te beperken tot specifieke bedrijfscodes. Dit wordt sterk aangeraden om de hoeveelheid data te beperken en de prestaties te verbeteren.
- Pad naar uitvoerbestand (P_FILE): Het volledige pad op de SAP-applicatieserver waar het uiteindelijke event log wordt opgeslagen. De gebruiker die het programma uitvoert, moet schrijfrechten hebben op deze map. Voorbeeld:
/usr/sap/trans/tmp/scm_event_log.csv. - Uitvoermodus: Voor kleine testextracties kun je het programma op de voorgrond uitvoeren. Bij grotere hoeveelheden data is uitvoering op de achtergrond noodzakelijk om time-outs te voorkomen en de systeembelasting tijdens piekuren te beperken.
- Systeemautorisaties: De gebruiker die het rapport uitvoert, heeft leesrechten nodig op alle onderliggende tabellen, waaronder VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 en LFA1.
a Voorbeeldquery 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. Klaar om te beginnen?
Gebruik deze template om je data voor te bereiden en vandaag nog aan de slag te gaan met het verbeteren van je supplychainprestaties. We helpen je bij elke stap.
Verbeter nu je supplychainmanagement
Krijg end-to-end inzicht en verbeter de prognosenauwkeurigheid binnen enkele dagen tot 90%.
14 dagen gratis proberen, zonder creditcard.