Jouw datatemplate voor Order to Cash - Verkooporderverwerking
Jouw datatemplate voor Order to Cash - Verkooporderverwerking
- Aanbevolen attributen om te verzamelen
- Belangrijke activiteiten om te volgen
- Extractiehandleiding voor SAP ECC
Order to Cash - kenmerken van verkooporderverwerking
| Naam | Beschrijving | ||
|---|---|---|---|
| Sales order SalesOrder | De unieke identificatie van een sales orderdocument. Dit is de primaire case voor het volgen van het volledige Order-to-Cash-proces. | ||
| Beschrijving De sales order is het centrale document in het verkoopproces en vertegenwoordigt het verzoek van een klant om goederen of diensten. Het document bevat alle informatie die nodig is om het verzoek van de klant van begin tot eind af te handelen. In process mining wordt dit attribuut gebruikt als Case ID. Elk uniek sales ordernummer staat voor één end-to-end-procesinstantie. Door processen per sales order te analyseren, kun je de volledige levenscyclus volgen, doorlooptijden meten en variaties per afzonderlijke klantorder opsporen. Waarom dit belangrijk is Dit is de essentiële sleutel om alle gerelateerde activiteiten en gebeurtenissen aan elkaar te koppelen. Zo kun je de volledige end-to-end-reis van elke klantorder analyseren. Waar je het vindt Te vinden in de tabel Sales Document Header Data (VBAK), in het veld VBELN. Voorbeelden 900001234590000123469000012347 | |||
| Activiteit Activity | De naam van een specifieke bedrijfsstap of gebeurtenis binnen het sales orderproces. | ||
| Beschrijving Dit attribuut beschrijft één stap in het Order-to-Cash-proces, zoals 'Sales Order Created', 'Delivery Created' of 'Payment Received'. Deze activiteiten vormen de bouwstenen waarmee de procesflow van elke sales order wordt gereconstrueerd. Het analyseren van de volgorde en timing van deze activiteiten vormt de kern van process mining. Hiermee kun je de procesmap visualiseren, bottlenecks opsporen, procesvarianten ontdekken en compliance controleren ten opzichte van een standaardmodel. Activiteiten worden meestal afgeleid uit een combinatie van documentaanmaak, statuswijzigingen of specifieke transactiecodes die in het systeem zijn vastgelegd. Waarom dit belangrijk is Activiteiten vormen de basis van de procesmap en maken visualisatie en analyse van de procesflow, afwijkingen en bottlenecks mogelijk. Waar je het vindt Dit is een afgeleid attribuut dat meestal tijdens de data-extractie wordt gegenereerd. SAP-transactiecodes (T-Codes), wijzigingen in documentstatussen, bijvoorbeeld in de tabellen VBUK en VBUP, of wijzigingsdocumentlogs, zoals de tabellen CDHDR en CDPOS, worden daarbij gekoppeld aan begrijpelijke activiteitsnamen. Voorbeelden Verkooporder aangemaaktLevering aangemaaktGoederenuitgifteFactuur aangemaaktBetaling ontvangen | |||
| Bronsysteem SourceSystem | Identificeert het bronsysteem waaruit de data is geëxtraheerd. | ||
| Beschrijving Dit attribuut geeft het oorspronkelijke systeem aan, bijvoorbeeld de naam van een specifieke SAP ECC-instantie of het clientnummer. Het geeft context aan de data, vooral in omgevingen met meerdere productiesystemen of data uit legacy-systemen. In analyses gebruik je dit attribuut om data op basis van de herkomst te filteren of te segmenteren. Dat is vooral nuttig om processen tussen verschillende systemen te vergelijken of om tijdens systeemmigraties de integriteit en consistentie van de data te controleren. Waarom dit belangrijk is Geeft belangrijke context, vooral in omgevingen met meerdere systemen. Zo kun je processen vergelijken en blijft de herkomst van de data duidelijk. Waar je het vindt Deze waarde wordt meestal tijdens de data-extractie toegevoegd en is vaak een statische waarde die de SAP System ID (SAPSID) of client (MANDT) vertegenwoordigt. Voorbeelden ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
| Laatste data-update LastDataUpdate | Timestamp die aangeeft wanneer de data voor dit record voor het laatst vanuit het bronsysteem is vernieuwd. | ||
| Beschrijving Dit attribuut registreert de datum en tijd van de meest recente data-extractie of update voor een bepaalde gebeurtenis of case. Het maakt zichtbaar hoe actueel de data is die je analyseert. In dashboards en rapporten helpt deze informatie je om de actualiteit van de inzichten te beoordelen. Je ziet of de analyse de huidige stand van de bedrijfsvoering weergeeft of op oudere data is gebaseerd. Zo weten gebruikers beter hoe recent de data is. Waarom dit belangrijk is Zorgt dat gebruikers weten hoe actueel de data is. Dat is belangrijk om op tijd en goed onderbouwd beslissingen te nemen op basis van de process mining-analyse. Waar je het vindt Dit is een metadata-attribuut dat de data-extractietool of het extractieproces toevoegt wanneer de data wordt ingelezen. Het wordt niet opgeslagen in de SAP-brontabellen. Voorbeelden 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
| Starttijd StartTime | De timestamp die aangeeft wanneer een activiteit of gebeurtenis begon. | ||
| Beschrijving De starttijd, ook wel de event timestamp genoemd, legt de exacte datum en tijd vast waarop een specifieke activiteit plaatsvond. Zo registreert de timestamp wanneer een sales order is aangemaakt, wanneer goederen zijn uitgegeven of wanneer een factuur is geboekt. Deze timestamp vormt de basis voor alle tijdanalyses in process mining. Je gebruikt hem om doorlooptijden tussen activiteiten te berekenen, de totale duur van een case te meten en vertragingen of bottlenecks op te sporen. Nauwkeurige timestamps zijn belangrijk voor performance-analyse in dashboards, bijvoorbeeld voor het volgen van tijdige levering of fulfilmentdoorlooptijden. Waarom dit belangrijk is Dit is een belangrijk attribuut voor het berekenen van alle performancemetrics, zoals doorlooptijden en duur. Die zijn nodig om bottlenecks op te sporen. Waar je het vindt Dit is een samengesteld attribuut dat meestal wordt afgeleid door een datumveld, bijvoorbeeld ERDAT, te combineren met een tijdveld, bijvoorbeeld ERZET, uit verschillende SAP-tabellen zoals VBAK (Sales Order), LIKP (Delivery) en VBRK (Invoice). Voorbeelden 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
| Afwijzingsreden RejectionReason | Een code die aangeeft waarom een orderregel is afgewezen of geannuleerd. | ||
| Beschrijving De afwijzingsreden geeft context bij de reden waarom een sales order of specifieke orderregel niet is afgehandeld. Mogelijke redenen zijn een annulering door de klant, een product dat niet beschikbaar is of andere bedrijfsredenen. Dit attribuut is belangrijk voor het dashboard 'Sales Order Cancellation Trends'. Door de meest voorkomende afwijzingsredenen te analyseren, kan een bedrijf de oorzaken van omzetverlies opsporen. Deze inzichten kunnen leiden tot verbeteringen in voorraadbeheer, prijsstrategie of klantcommunicatie, zodat het aantal geannuleerde orders afneemt. Waarom dit belangrijk is Maakt duidelijk waarom orders worden geannuleerd. Zo kun je de grondoorzaken analyseren, omzetverlies beperken en de nauwkeurigheid van prognoses verbeteren. Waar je het vindt Te vinden in de tabel Sales Document Item Data (VBAP), in het veld ABGRU. Voorbeelden 0215Z5 | |||
| Gebruiker User | De gebruikers-ID van de medewerker die het document heeft aangemaakt of voor het laatst heeft gewijzigd, of de activiteit heeft uitgevoerd. | ||
| Beschrijving Dit attribuut legt de SAP-gebruikers-ID vast die verantwoordelijk is voor een bepaalde gebeurtenis in het proces. Zo identificeert het de verkoopmedewerker die de order heeft aangemaakt of de magazijnmedewerker die de goederenuitgifte heeft geboekt. Door het proces per gebruiker te analyseren, krijg je inzicht in de verdeling van de werklast, opleidingsbehoeften en verschillen in de manier waarop gebruikers dezelfde taak uitvoeren. Het attribuut is belangrijk voor dashboards over resourceprestaties, compliance en handmatige interventies. Waarom dit belangrijk is Geeft inzicht in resourceprestaties en werklast, helpt afwijkingen per gebruiker op te sporen en is belangrijk voor compliance- en automatiseringsanalyses. Waar je het vindt Te vinden in veel SAP-koptabellen als het veld 'Created by' (ERNAM) of 'Changed by' (AENAM), bijvoorbeeld in VBAK, LIKP en VBRK. Voorbeelden CBURKEJSMITHRWILLIAMS | |||
| Klantnummer CustomerNumber | De unieke identificatie van de klant die de sales order heeft geplaatst. | ||
| Beschrijving Dit attribuut vertegenwoordigt de 'Sold-to Party', de primaire klantaccount die aan de sales order is gekoppeld. Het koppelt de transactie aan een specifieke klant in de stamdata. Door op klantnummer te analyseren, kun je het proces segmenteren en klantgedrag en klantprestaties begrijpen. Je kunt bijvoorbeeld zien welke klanten de langste doorlooptijden, de hoogste herstelpercentages of de meeste orderwijzigingen hebben. Dit is belangrijk om klantrelatiebeheer en serviceniveaus te verbeteren. Waarom dit belangrijk is Maakt klantgerichte analyses mogelijk. Zo kun je procesproblemen voor specifieke klanten opsporen en klantgerichte prestaties meten. Waar je het vindt Te vinden in de tabel Sales Document Header Data (VBAK), in het veld KUNNR. Voorbeelden 100234100567200112 | |||
| Leveringsblokkade DeliveryBlock | Een code die aangeeft of een sales order voor levering is geblokkeerd, waardoor geen leveringsdocument kan worden aangemaakt. | ||
| Beschrijving De leveringsblokkade is een status op een sales order, op kop- of regelniveau, waarmee het proces vóór de leveringsstap tijdelijk wordt stilgezet. Een gebruiker kan de blokkade handmatig instellen, maar het systeem kan dit ook automatisch doen, bijvoorbeeld bij een overschrijding van de kredietlimiet of onvolledige data. Dit attribuut is belangrijk voor het dashboard 'Sales Order Blockage and Rework Analysis'. Door de frequentie, duur en redenen van leveringsblokkades te analyseren, kun je belangrijke bottlenecks in het fulfilmentproces opsporen. Minder blokkades helpen om tijdige levering en de totale doorlooptijd te verbeteren. Waarom dit belangrijk is Identificeert bottlenecks in het fulfilmentproces rechtstreeks. Door te analyseren waarom en hoe vaak orders worden geblokkeerd, kun je de procesefficiëntie verbeteren. Waar je het vindt Te vinden in de tabel Sales Document Header Data (VBAK), in het veld LIFSK. Voorbeelden 0102Z1 | |||
| Materiaalnummer MaterialNumber | De unieke identificatie van het product of de dienst die wordt verkocht. | ||
| Beschrijving Het materiaalnummer identificeert het specifieke artikel op een orderregel. Omdat één sales order meerdere materialen kan bevatten, wordt dit attribuut meestal op regelniveau geanalyseerd. Door het proces per materiaalnummer te analyseren, kun je productspecifieke problemen opsporen. Zo zie je of bepaalde producten samenhangen met langere fulfilmentdoorlooptijden, vaker voorkomende leveringsblokkades of meer factuurafwijkingen. Dit is belangrijk voor supplychain- en productmanagement om het proces per productlijn te verbeteren. Waarom dit belangrijk is Maakt productgerichte procesanalyses mogelijk. Zo zie je welke producten samenhangen met procesinefficiënties, zoals vertragingen, blokkades of herstelwerk. Waar je het vindt Te vinden in de tabel Sales Document Item Data (VBAP), in het veld MATNR. Voorbeelden FG-1001-ARAW-205BSERV-INSTALL | |||
| Nettobedrag NetAmount | De totale waarde van de sales order, exclusief belastingen en kortingen op kopniveau. | ||
| Beschrijving Het nettobedrag vertegenwoordigt de geldwaarde van de sales order. Het is een belangrijke financiële metric voor elke procesinstantie. Dit attribuut is belangrijk voor waardegerichte process mining. Je kunt verbeterinitiatieven prioriteren door je te richten op orders met een hoge waarde. Analisten kunnen procesproblemen, zoals vertragingen of herstelwerk, koppelen aan financiële impact. Zo ontstaat een sterkere businesscase voor verandering. Je kunt bijvoorbeeld analyseren of orders met een hoge waarde efficiënter worden verwerkt dan orders met een lage waarde. Waarom dit belangrijk is Maakt waardegerichte analyses mogelijk. Zo kun je verbeteracties prioriteren voor orders met de grootste financiële impact op het bedrijf. Waar je het vindt Te vinden in de tabel Sales Document Header Data (VBAK), in het veld NETWR. Voorbeelden 1500.0012550.75850.50 | |||
| Verkooporganisatie SalesOrganization | De organisatorische eenheid die verantwoordelijk is voor de verkoop van producten of diensten. | ||
| Beschrijving Een verkooporganisatie is een belangrijke organisatorische entiteit in SAP die het bedrijf indeelt op basis van verkoopvereisten. De organisatie is verantwoordelijk voor het onderhandelen over verkoopvoorwaarden en het distribueren van goederen en diensten. In process mining is dit attribuut een belangrijke analys dimensie. Je kunt er procesprestaties, efficiëntie en compliance tussen verschillende verkoopeenheden, regio's of divisies mee vergelijken. Zo ontdek je best practices bij goed presterende organisaties en verbeterpunten bij andere. Waarom dit belangrijk is Maakt benchmarking tussen organisatieonderdelen mogelijk. Zo kun je procesefficiëntie en compliance tussen verschillende bedrijfsonderdelen of regio's vergelijken. Waar je het vindt Te vinden in de tabel Sales Document Header Data (VBAK), in het veld VKORG. Voorbeelden 100025003100 | |||
| Bevestigde leverdatum ConfirmedDeliveryDate | De datum waarop de levering van de goederen of diensten aan de klant is bevestigd. | ||
| Beschrijving Dit is de toegezegde leverdatum voor de klant, gebaseerd op materiaalbeschikbaarheid en planning. De datum vormt de basis voor het meten van leverprestaties. Dit attribuut vormt de basis voor het dashboard 'On-Time Delivery Performance' en de KPI On-Time Delivery Rate. Door de bevestigde leverdatum te vergelijken met de werkelijke datum van de 'Goods Issued'-activiteit, kun je bepalen of een order op tijd, te vroeg of te laat is geleverd. Dit is een belangrijke maatstaf voor de betrouwbaarheid van de supply chain en klanttevredenheid. Waarom dit belangrijk is Dit is de benchmark voor het meten van tijdige levering, een belangrijke KPI voor klanttevredenheid en supplychain-efficiëntie. Waar je het vindt Te vinden in de tabel Sales Document Schedule Line (VBEP), in het veld EDATU. Voorbeelden 2023-05-102023-06-202023-07-01 | |||
| Is herstelwerk IsRework | Een boolean-vlag die aangeeft of een sales order na de eerste aanmaak een belangrijke wijziging of herstelactiviteit heeft ondergaan. | ||
| Beschrijving Dit berekende attribuut identificeert procesinstanties waarin herstelwerk heeft plaatsgevonden, bijvoorbeeld één of meer activiteiten 'Sales Order Changed'. De precieze definitie van herstelwerk, zoals een wijziging van prijs, hoeveelheid of leverdatum, wordt tijdens de projectinrichting bepaald. Dit attribuut is belangrijk voor het dashboard 'Sales Order Rework and Change Frequency' en de KPI Sales Order Rework Rate. Je kunt orders die een 'straight-through'-pad volgden direct filteren en vergelijken met orders waarvoor handmatige wijzigingen nodig waren. Zo wordt de impact van herstelwerk op doorlooptijden en kosten zichtbaar. Waarom dit belangrijk is Maakt de frequentie van herstelwerk direct meetbaar. Zo kun je de oorzaken en de impact op de totale procesefficiëntie en doorlooptijd analyseren. Waar je het vindt Dit is een berekend attribuut dat uit het event log wordt afgeleid. De logica controleert of activiteiten 'Sales Order Changed' of specifieke wijzigingsgebeurtenissen uit de tabellen CDHDR/CDPOS voorkomen. Voorbeelden truefalse | |||
| Is tijdige levering IsOnTimeDelivery | Een boolean-vlag die aangeeft of de goederen op of vóór de bevestigde leverdatum zijn verzonden. | ||
| Beschrijving Dit berekende attribuut vergelijkt de werkelijke datum van de goederenuitgifte met 'ConfirmedDeliveryDate' voor een sales order. Als de datum van de goederenuitgifte op of vóór de bevestigde datum ligt, krijgt het attribuut de waarde true. Anders is de waarde false. Dit attribuut vereenvoudigt het maken van het dashboard 'On-Time Delivery Performance' en het berekenen van de KPI On-Time Delivery Rate. Je kunt prestaties eenvoudig aggregeren en visualiseren zonder in elke analyse of grafiek opnieuw datums te vergelijken. Zo ontstaat een helder overzicht van de leverbetrouwbaarheid. Waarom dit belangrijk is Geeft een duidelijke en eenvoudige maatstaf voor leverprestaties en maakt het makkelijk om de KPI On-Time Delivery Rate te berekenen. Waar je het vindt Dit is een berekend attribuut. De logica vergelijkt de timestamp van de activiteit 'Goods Issued' met de waarde van het attribuut 'ConfirmedDeliveryDate'. Voorbeelden truefalse | |||
| Status kredietcontrole CreditCheckStatus | Geeft de status van de kredietcontrole voor het sales document aan. | ||
| Beschrijving Dit attribuut toont de uitkomst van de automatische of handmatige kredietcontrole van een sales order. Veelvoorkomende statussen zijn 'Approved', 'Rejected' en 'Blocked'. Dit is een belangrijk attribuut voor het dashboard 'Credit Check Processing Time Analysis'. Vertragingen of blokkades bij de kredietcontrole kunnen de totale fulfilmentdoorlooptijd van een order sterk beïnvloeden. Door deze status te analyseren, krijg je inzicht in de efficiëntie van het kredietbeheer en de invloed daarvan op de verkoopsnelheid. Waarom dit belangrijk is Heeft direct invloed op de snelheid van orderverwerking. Door deze status te analyseren, kun je bottlenecks in het kredietbeheer opsporen die de orderafhandeling vertragen. Waar je het vindt Te vinden in de tabel Sales Document Header Status (VBUK) of rechtstreeks in VBAK als het kredietstatusveld, bijvoorbeeld CMGST. Voorbeelden ABD | |||
| Verzendvoorwaarden ShippingConditions | Bepaalt de algemene verzendstrategie voor de levering van goederen aan de klant. | ||
| Beschrijving Verzendvoorwaarden bepalen hoe een order wordt verzonden, bijvoorbeeld 'Standard', 'Express' of 'Pickup'. Dit wordt met de klant afgesproken en heeft invloed op de logistieke planning. Dit attribuut wordt gebruikt in de analyse 'Shipping Method Efficiency & Cost'. Door het proces per verzendvoorwaarde te segmenteren, kunnen bedrijven analyseren of bepaalde methoden vaker tot vertragingen leiden of langere doorlooptijden hebben. Deze data helpt om de logistiek te verbeteren en verwachtingen van klanten over levertijden te beheren. Waarom dit belangrijk is Maakt analyse van logistieke prestaties mogelijk. Zo kun je bepalen of bepaalde verzendmethoden samenhangen met vertragingen of juist een hogere efficiëntie. Waar je het vindt Te vinden in de tabel Sales Document Header Data (VBAK), in het veld VSBED. Voorbeelden 011020 | |||
Order to Cash - activiteiten voor verkooporderverwerking
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Betaling ontvangen | Deze gebeurtenis geeft aan dat de betaling van de klant is ontvangen en aan de factuur is toegewezen, waardoor de openstaande post op debiteuren wordt afgeletterd. Dit is een boekhoudkundige gebeurtenis die wordt afgeleid uit het afletteren van een financieel document. | ||
| Waarom dit belangrijk is Dit is de laatste stap om de verkoopopbrengst als cash te ontvangen. Het is het eindpunt voor het meten van de 'Invoice to Payment Cycle Time' en de totale 'Sales Order Fulfillment Cycle Time'. Waar je het vindt Afgeleid uit de informatie over het afletterdocument in de BSEG-tabel voor de klantregel. Wanneer BSEG-AUGBL (Clearing Document) en BSEG-AUGDT (Clearing Date) zijn gevuld, is de betaling ontvangen. Vastleggen Afgeleid uit het invullen van de afletterdatum (AUGDT) in de BSEG-tabel voor de debiteurenregel. Eventtype inferred | |||
| Factuur aangemaakt | Markeert de aanmaak van de klantfactuur of het billing document. Dit is een expliciete gebeurtenis die een nieuw document in het systeem genereert en het betalingsdeel van het proces start. | ||
| Waarom dit belangrijk is Dit is een belangrijke mijlpaal die de klok start voor de 'Invoice to Payment Cycle Time'. Vertragingen bij het factureren hebben direct invloed op de cashflow. Waar je het vindt Vastgelegd in de VBRK-tabel (Billing Document: Header Data) op basis van de aanmaakdatum (ERDAT). De koppeling met de sales order of levering staat in de VBFA-tabel. Vastleggen Gebeurtenis op basis van de aanmaaktimestamp (ERDAT) in de VBRK-tabel. Eventtype explicit | |||
| Goederenuitgifte | Een belangrijke gebeurtenis waarbij het eigendom van de goederen overgaat en ze het magazijn officieel verlaten. Dit is een expliciete financiële boeking die een material document aanmaakt en de voorraad bijwerkt. | ||
| Waarom dit belangrijk is Dit is de gebeurtenis 'verzonden' en een belangrijke mijlpaal voor het meten van tijdige levering en fulfilmentdoorlooptijden. De gebeurtenis activeert financiële updates en vormt een punt waarop het fysieke fulfilmentproces niet meer kan worden teruggedraaid. Waar je het vindt Aanmaak van een material document (MKPF/MSEG) met een movement type voor goederenuitgifte, bijvoorbeeld 601, gekoppeld aan het leveringsdocument. Vastleggen Aanmaak van een material document (MKPF/MSEG) met een movement type voor goederenuitgifte, gekoppeld aan de levering. Eventtype explicit | |||
| Order bevestigd | Deze activiteit geeft aan dat de verkooporder alle eerste controles heeft doorlopen en is bevestigd voor fulfilment. Dit wordt meestal afgeleid wanneer de order niet langer is geblokkeerd en bevestigde hoeveelheden in de schedule lines heeft. | ||
| Waarom dit belangrijk is Dit is een belangrijk mijlpaal die orderinvoer scheidt van fulfilment. Het is het startpunt voor het meten van fulfilment-doorlooptijden en prestaties op het gebied van tijdige levering. Waar je het vindt Kan worden afgeleid wanneer schedule lines in VBEP een bevestigde hoeveelheid hebben (BMENG > 0) en de order niet is geblokkeerd voor levering (bijvoorbeeld wanneer VBUK-LIFSK leeg is). Vastleggen Afgeleid uit de bevestiging van schedule lines (VBEP-BMENG > 0) en het verwijderen van blokkades op kopniveau. Eventtype inferred | |||
| Orderregel gesloten | Deze activiteit markeert de definitieve afsluiting van een orderregel. De regel is volledig geleverd, gefactureerd en afgerond. Dit wordt afgeleid uit de algemene status van de regel. | ||
| Waarom dit belangrijk is Dient als de succesvolle eindgebeurtenis van het proces. Door te analyseren wanneer regels worden gesloten, krijg je inzicht in de end-to-end-procesduur en ontdek je orders die onnodig open blijven staan. Waar je het vindt Afgeleid uit het algemene statusveld in de VBUP-tabel (Sales Document: Item Status) voor de regel. Wanneer VBUP-GBSTA 'C' (Completely processed) is, is de regel gesloten. Vastleggen Afgeleid uit de wijziging van de regelstatus (VBUP-GBSTA) naar 'C' (Completely processed). Eventtype inferred | |||
| Verkooporder aangemaakt | Markeert het aanmaken van een nieuw verkooporderdocument. Dit is een expliciete gebeurtenis die wordt vastgelegd wanneer een gebruiker een nieuwe order opslaat, meestal via transactie VA01 in SAP. | ||
| Waarom dit belangrijk is Dit is de belangrijkste startgebeurtenis voor het Order-to-Cash-proces. Door het tijdstip te analyseren, kun je de totale doorlooptijd en het aantal binnenkomende orders meten. Waar je het vindt Vastgelegd in de tabel VBAK (Sales Document Header Data) met de aanmaakdatum (ERDAT) en -tijd (ERZET). De transact code staat in VBAK-TCODE. Vastleggen Gebeurtenis op basis van de aanmaaktimestamp (ERDAT, ERZET) in de tabel VBAK. Eventtype explicit | |||
| Factuur geannuleerd | Vertegenwoordigt de terugboeking van een eerder aangemaakt billing document. Dit is een expliciete transactie die een nieuw annuleringsdocument aanmaakt om het oorspronkelijke document te compenseren. | ||
| Waarom dit belangrijk is Door factuurannuleringen te volgen, kun je problemen met prijzen, afwijkingen in verzendingen of datafouten opsporen. Dit ondersteunt de KPI 'Invoice Discrepancy Rate'. Waar je het vindt Een expliciete gebeurtenis die wordt vastgelegd door de aanmaak van een annuleringsdocument voor billing (VBRK-VBTYP = 'N' of 'O'). De oorspronkelijke factuur wordt vermeld in VBRK-SFAKN. Vastleggen Aanmaak van een annuleringsdocument in VBRK, met een verwijzing naar de oorspronkelijke factuur. Eventtype explicit | |||
| Kredietcontrole uitgevoerd | Geeft aan dat de automatische of handmatige kredietcontrole voor de klant op de verkooporder is afgerond. Dit wordt meestal afgeleid uit een wijziging in de algemene kredietstatus van het document. | ||
| Waarom dit belangrijk is De kredietcontrole is vaak een belangrijke bottleneck. Het meten van de benodigde tijd is essentieel voor de 'Credit Check Processing Time Analysis' en voor het versnellen van de orderverwerking. Waar je het vindt Afgeleid uit de kredietstatusvelden in de tabel VBUK (Sales Document: Header Status). Een wijziging in VBUK-CMGST van geblokkeerd naar vrijgegeven markeert deze activiteit. Vastleggen Afgeleid uit wijzigingen in het algemene kredietstatusveld (VBUK-CMGST). Eventtype inferred | |||
| Levering aangemaakt | Deze gebeurtenis markeert het aanmaken van het uitgaande leveringsdocument. Dit document geeft het magazijn opdracht om te beginnen met picken en verzenden. Het is een expliciete gebeurtenis die uit de documentflow wordt vastgelegd. | ||
| Waarom dit belangrijk is Dit is de eerste stap in het fysieke fulfilmentproces. De tijd tussen orderbevestiging en het aanmaken van de levering laat zien hoe snel het logistieke proces wordt gestart. Waar je het vindt Het aanmaken van een record in de tabel LIKP (SD Document: Delivery Header Data). De koppeling met de verkooporder wordt bijgehouden in de documentflowtabel VBFA. Vastleggen Gebeurtenis op basis van de aanmaaktimestamp in de tabel LIKP, gekoppeld via de tabel VBFA. Eventtype explicit | |||
| Leveringsblokkade ingesteld | Geeft een actie weer waarbij een leveringsblokkade op de verkooporder wordt ingesteld, waardoor het aanmaken van een leveringsdocument wordt voorkomen. Dit kan expliciet uit wijzigingslogs worden gehaald of uit statustabellen worden afgeleid. | ||
| Waarom dit belangrijk is Deze activiteit houdt rechtstreeks verband met de KPI 'Sales Order Blockage Rate'. Door vast te stellen waarom en hoe vaak blokkades worden ingesteld, ontdek je de oorzaken van vertragingen in fulfilment. Waar je het vindt Te vinden in wijzigingslogs (CDHDR/CDPOS) voor het veld VBAK-LIFSK. Je kunt dit ook afleiden door te controleren wanneer het veld VBAK-LIFSK is ingevuld. Vastleggen Gebeurtenis uit wijzigingsdocumenten voor het veld VBAK-LIFSK of VBAP-LIFSP. Eventtype explicit | |||
| Order geannuleerd | Geeft aan dat een sales order vóór het fulfilment is geannuleerd. Dit wordt meestal vastgelegd door op alle relevante regels van de order een 'reason for rejection' toe te passen. | ||
| Waarom dit belangrijk is Dit is een eindpunt bij een mislukte verwerking en ondersteunt direct de KPI 'Order Cancellation Rate'. Als je begrijpt wanneer en waarom orders worden geannuleerd, krijg je inzicht in problemen in het verkoopproces. Waar je het vindt Afgeleid uit het invullen van het veld VBAP-ABGRU (Reason for rejection) voor alle actieve regels van een sales order. De wijzigingsdatum staat in CDHDR/CDPOS. Vastleggen Afgeleid uit het invullen van het veld 'Reason for Rejection' (VBAP-ABGRU) op alle regels. Eventtype inferred | |||
| Picken afgerond | Geeft aan dat alle artikelen voor de levering fysiek uit het magazijn zijn verzameld. Als Warehouse Management (WM) wordt gebruikt, kan dit worden afgeleid uit de status van de Transfer Order. | ||
| Waarom dit belangrijk is Door de verzameltijd te analyseren, kun je de magazijnbedrijfsvoering optimaliseren. Vertragingen in deze stap hebben direct invloed op de totale verzendtijd en de fulfilmentcyclus. Waar je het vindt Afgeleid uit de wijziging van de verzamelstatus van het leveringsartikel in tabel LIPS-KOSTA naar 'C' (volledig verzameld). Als WM actief is, kan dit worden afgeleid uit de bevestiging van de Transfer Order (tabellen LTAK/LTAP). Vastleggen Afgeleid uit een wijziging in de verzamelstatus (LIPS-KOSTA) of de bevestiging van de WM Transfer Order. Eventtype inferred | |||
| Proof Of Delivery bevestigd | Deze activiteit bevestigt dat de klant de goederen heeft ontvangen. De activiteit wordt vastgelegd wanneer de Proof Of Delivery in het systeem wordt geregistreerd, waarbij vaak de status van het leveringsdocument wordt bijgewerkt. | ||
| Waarom dit belangrijk is Deze gebeurtenis levert de werkelijke leverdatum op. Die is essentieel om de 'On-Time Delivery Rate' nauwkeurig te meten ten opzichte van de beloofde datum. Waar je het vindt Afgeleid uit de Proof Of Delivery-status (VBUK-PODAT) die op 'C' (Confirmed) is gezet. De bevestigingsdatum staat in VLPOD-PODAT. Dit is niet altijd geïmplementeerd. Vastleggen Afgeleid uit een update van de POD-status op de levering (VBUK-PODAT) of een vermelding in de VLPOD-tabel. Eventtype inferred | |||
| Verkooporder gewijzigd | Geeft een wijziging weer die na het aanmaken in een bestaande verkooporder is aangebracht. Deze wijzigingen worden vastgelegd in speciale wijzigingslogtabellen (CDHDR, CDPOS) wanneer velden zoals hoeveelheid, prijs of datums worden aangepast. | ||
| Waarom dit belangrijk is Door wijzigingen te volgen, kun je herstelwerk, instabiliteit in het proces en problemen met datakwaliteit vinden. Een hoge wijzigingsfrequentie kan wijzen op problemen bij het invoeren van de oorspronkelijke order en daardoor tot vertragingen leiden. Waar je het vindt Opgehaald uit de wijzigingsdocumenttabellen CDHDR (kop) en CDPOS (item) voor OBJECTCLAS = 'VERKBELEG'. De timestamp en het gewijzigde veld kunnen worden vastgesteld. Vastleggen Gebeurtenis uit wijzigingsdocumenttabellen (CDHDR, CDPOS) voor verkoopdocumentobjecten. Eventtype explicit | |||
Extractiegidsen
Stappen
- Programma ontwikkelen: Maak met transactie SE38 of SE80 een nieuw uitvoerbaar ABAP-programma. Dit programma bevat de volledige extractielogica.
- Selectiescherm definiëren: Maak in je programma een selectiescherm om de data te filteren. Neem parameters op voor de aanmaakdatum van het verkoopdocument (VBAK-ERDAT), de verkooporganisatie (VBAK-VKORG) en het verkoopdocumenttype (VBAK-AUART). Zo kun je de extractie hergebruiken en beheersbaar houden.
- Datadeclaraties: Definieer de interne tabellen en structuren voor data uit verschillende SAP-tabellen, zoals VBAK, VBAP, VBFA, CDHDR, CDPOS, VBRK en BSAD. Definieer ook de uiteindelijke outputstructuur voor het event log met de vereiste attributen.
- Basisverkooporders selecteren: Schrijf de eerste SELECT-instructie om verkooporderkoppen (VBAK) en posities (VBAP) op te halen op basis van de invoer op het selectiescherm. Dit vormt de basisdataset van de cases die je analyseert.
- Activiteit 'Aangemaakt' extraheren: Loop door de geselecteerde VBAK-records. Vul voor elk record de eventlogstructuur met de activiteit 'Sales Order Created' en gebruik VBAK-ERDAT en VBAK-ERZET voor StartTime.
- Gebeurtenissen uit het wijzigingslog extraheren: Selecteer records uit CDHDR en CDPOS waarbij OBJECTCLAS 'VERKBELEG' is voor de geselecteerde verkooporders. Loop door de resultaten om specifieke veldwijzigingen te herkennen. Een wijziging in VBAK-LIFSK betekent bijvoorbeeld 'Delivery Block Set'; een wijziging in VBUK-CMGST betekent 'Credit Check Performed'. Andere relevante wijzigingen kun je loggen als 'Sales Order Changed'.
- Documentflowdata extraheren: Vraag voor de geselecteerde verkooporders de documentflowtabel VBFA op. Deze tabel koppelt verkooporders aan vervolgdocumenten zoals leveringen, goederenbewegingen en facturen. Selecteer alle gerelateerde documenten voor verdere verwerking.
- Leverings- en fulfilmentactiviteiten extraheren: Gebruik de leveringsdocumentnummers uit VBFA en vraag LIKP en LIPS op voor activiteiten 'Delivery Created'. Vraag MKPF en MSEG op voor goederenafgifte-documenten met bewegingstype '601' om de activiteit 'Goods Issued' vast te leggen. Als Warehouse Management actief is, gebruik je LTAK en LTAP om het bevestigingstijdstip van het laatste transferorderitem te vinden en 'Picking Completed' te bepalen. Controleer de leveringskopstatus VBUK-PODAT voor 'Proof of Delivery Confirmed'.
- Facturatie- en betalingsactiviteiten extraheren: Gebruik de factuurdocumentnummers uit VBFA en vraag VBRK en VBRP op voor 'Invoice Created' en 'Invoice Cancelled' (waar VBRK-FKSTO = 'X'). Koppel voor 'Payment Received' de factuur uit VBRK aan het boekhouddocument in BKPF en zoek daarna het vereffeningsdocument en de vereffeningsdatum in BSAD.
- Statusgebaseerde activiteiten extraheren: Gebruik de statustabellen VBUP (positiestatus) en VBUK (kopstatus) om bedrijfsactiviteiten af te leiden. Een positie is bijvoorbeeld gesloten wanneer VBUP-GBSTA gelijk is aan 'C'. Een order is geannuleerd wanneer voor alle relevante posities een 'Reason for Rejection' (VBAP-ABGRU) is ingevuld.
- Consolideren en formatteren: Combineer alle vastgelegde activiteiten in één uiteindelijke interne tabel. Controleer of alle attributen, zoals SalesOrder, Activity en User, voor elk eventrecord correct zijn ingevuld. Voeg de timestamps SourceSystem en LastDataUpdate toe.
- Outputbestand genereren: Gebruik de functiemodule GUI_DOWNLOAD of de methode cl_gui_frontend_services=>gui_download om de uiteindelijke interne tabel als CSV-bestand op de lokale computer van de gebruiker te exporteren. Sla het bestand op met UTF-8-codering.
Configuratie
- Vereisten vooraf: ABAP-ontwikkelaarsautorisaties, bijvoorbeeld toegang tot transactie SE38, en leesrechten voor alle vereiste SAP-tabellen, waaronder VBAK, VBAP, CDHDR, CDPOS, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG en BSAD.
- Selectieparameters: Het programma moet een selectiescherm met filterparameters bevatten. Belangrijke parameters zijn:
- Datumbereik: een verplicht datumbereik voor het aanmaken van verkooporders (VBAK-ERDAT). Begin met een recente periode van 3 tot 6 maanden om de dataset beheersbaar te houden.
- Verkooporganisatie: filter op VBAK-VKORG om de analyse op specifieke bedrijfsonderdelen te richten.
- Verkoopdocumenttype: filter op VBAK-AUART om alleen relevante ordertypen op te nemen, zoals standaardorders, en andere uit te sluiten, zoals offertes en retouren.
- Aandacht voor prestaties: Extractie uit wijzigingslogtabellen (CDHDR, CDPOS) en documentflow (VBFA) kan bij grote datavolumes erg traag zijn. Optimaliseer het programma door indexvelden in WHERE-clausules te gebruiken. Plan zeer grote extracties met transactie SM36 als achtergrondtaak buiten piekuren.
- Activering van wijzigingslogs: Deze methode gebruikt de wijzigingsdocumentfunctionaliteit van SAP. Controleer of wijzigingsregistratie is ingeschakeld voor belangrijke gegevenselementen, zoals LIFSK, CMGST en ABGRU. Je kunt dit controleren via transactie SCDO voor object VERKBELEG.
a Voorbeeldquery abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
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~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM. Stappen
- Vereisten vooraf: Zorg dat je directe, alleen-lezen toegang hebt tot de onderliggende SAP ECC-database. Je hebt een databasetool nodig, zoals DBeaver, SQL Server Management Studio of Oracle SQL Developer, om verbinding te maken en queries uit te voeren.
- SQL-script ophalen: Kopieer de volledige SQL-query uit het gedeelte 'query' van dit document.
- Verbinding maken met de database: Open je databasetool en maak verbinding met de SAP ECC-database-instantie. Je hebt het serveradres, de poort, de databasenaam en de juiste inloggegevens nodig.
- Query configureren: Plak het SQL-script in een nieuw queryvenster. Zoek in de configuratiesectie binnen de Common Table Expression (CTE) met de naam SalesOrders de tijdelijke waarden voor de startdatum ('{StartDate}'), einddatum ('{EndDate}'), verkooporganisaties ('{SalesOrgs}') en documenttypen ('{DocTypes}'). Vervang deze door de werkelijke waarden voor je analyse.
- Query uitvoeren: Voer het geconfigureerde SQL-script uit. Afhankelijk van het datumbereik en de omvang van je SAP-database kan dit enkele minuten duren.
- Resultaten controleren: Na afloop verschijnt een resultatenset. Controleer kort of de verwachte kolommen, zoals SalesOrder, Activity en StartTime, aanwezig zijn en of er regels voor verschillende activiteiten worden teruggegeven.
- Data exporteren: Gebruik de exportfunctie van je databasetool om de resultatenset als CSV-bestand op te slaan. Geef het bestand een duidelijke naam, zoals SAP_O2C_Event_Log.csv.
- Formatteren voor ProcessMind: Open het CSV-bestand in een spreadsheetprogramma. Controleer of de kolomkoppen exact overeenkomen met de vereiste attributen, zoals SalesOrder, Activity en StartTime. Zorg dat de datum- en tijdnotatie voor StartTime en LastDataUpdate consistent is en door ProcessMind wordt ondersteund, bijvoorbeeld YYYY-MM-DD HH:MI:SS.
- Uploaden naar ProcessMind: Upload het uiteindelijke, correct opgemaakte CSV-bestand naar je ProcessMind-project voor analyse.
Configuratie
- Datumbereik: De query gebruikt tijdelijke waarden ('{StartDate}' en '{EndDate}') om verkooporders te filteren op hun aanmaakdatum (VBAK.ERDAT). Een analyseperiode van 3 tot 6 maanden is gebruikelijk. Zo krijg je een representatieve steekproef zonder de database onnodig zwaar te belasten.
- Filter voor verkooporganisatie: Gebruik de tijdelijke waarde '{SalesOrgs}' om de extractie te beperken tot specifieke verkooporganisaties, bijvoorbeeld '1000' en '2000'. Dit helpt je de analyse af te bakenen en de query sneller te maken.
- Filter voor documenttype: Gebruik '{DocTypes}' om specifieke verkoopordertypen te selecteren, bijvoorbeeld 'OR' voor Standard Order. Zo sluit je irrelevante documenten, zoals gratis leveringen of retouren, uit de hoofdprocesflow.
- Identificatie van het bronsysteem: De vaste tijdelijke waarde '{SourceSystemName}' markeert elk record met het systeem van herkomst. Stel deze in op een herkenbare naam voor je SAP ECC-instantie, bijvoorbeeld SAP_ECC_PRD.
- Databasecompatibiliteit: De functie voor het combineren van datum- en tijdvelden, [Your DB-specific timestamp function], is een tijdelijke waarde. Vervang deze door de juiste functie voor jouw database, bijvoorbeeld TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS') voor SAP HANA of CAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME) voor SQL Server.
- Vereisten vooraf: Voor deze methode heb je directe, alleen-lezen databasegegevens nodig. De databasegebruiker moet toegang hebben tot alle tabellen in de query, waaronder VBAK, VBAP, VBFA, CDHDR, CDPOS, LIKP, VBRK en BSAD.
a Voorbeeldquery sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''; Klaar om aan de slag te gaan?
Haal meer uit je Order-to-Cash-proces voor verkooporders met deze datatemplate. Zet vandaag de eerste stap naar een efficiënter proces en een snellere cashflow.
Optimaliseer je Order-to-Cash-proces voor verkooporders vandaag
Verwijder knelpunten, verkort de doorlooptijd met 30% en verbeter je cashflow snel.
Je hebt geen creditcard nodig. Je bent in enkele minuten klaar.