Datatemplate voor de verwerking van retouren en terugbetalingen
Datatemplate voor de verwerking van retouren en terugbetalingen
- Aanbevolen attributen om te verzamelen
- Belangrijke activiteiten om te volgen
- Instructies voor data-extractie
Attributen voor de verwerking van retouren en terugbetalingen
| Naam | Beschrijving | ||
|---|---|---|---|
| Activiteitsnaam ActivityName | De naam van een specifieke bedrijfsgebeurtenis of stap in het retourproces. | ||
| Beschrijving Dit attribuut beschrijft één afzonderlijke actie of statuswijziging in het retourproces, zoals 'Retourorder aangemaakt', 'Goederenontvangst geboekt' of 'Creditnota aangemaakt'. Deze activiteiten vormen de bouwstenen van de proceskaart. Door de volgorde en frequentie van activiteiten te analyseren, kun je de meest voorkomende procesroutes, afwijkingen en herstelwerk herkennen. Dit is belangrijk om te begrijpen wat er binnen een case gebeurt en in welke volgorde. Die informatie vormt de basis voor alle process mining-analyses. Waarom dit belangrijk is Activiteiten beschrijven de stappen in het proces. Door de volgorde, duur en frequentie ervan te analyseren, zie je hoe het werk daadwerkelijk wordt uitgevoerd. Dat is de kern van process mining. Waar vind je dit? Afgeleid van statuswijzigingen in tabellen zoals VBUK/VBUP, aanmaak-events van documenten (bijvoorbeeld in VBAK, LIKP en VBRK) of wijzigingslogboeken in de tabellen CDHDR/CDPOS. Voorbeelden Retourorder aangemaaktGoederenontvangst geboektCreditnota aangemaaktRetourorderregel verwerkt | |||
| Eventtijd EventTime | De exacte datum en tijd waarop de activiteit plaatsvond. | ||
| Beschrijving Deze timestamp geeft precies aan wanneer een bedrijfsgebeurtenis plaatsvond. Voor elke activiteit in het proces wordt een timestamp vastgelegd, zodat je de volgorde van events binnen een case kunt bepalen. Eventtijd is nodig voor alle tijdsanalyses. Je berekent er doorlooptijden tussen activiteiten mee, ziet waar wachttijd bottlenecks veroorzaakt en meet de totale duur van een case. Ook kun je prestaties analyseren en controleren of service level agreements (SLA’s) worden nageleefd. Waarom dit belangrijk is Deze timestamp is nodig om doorlooptijden te berekenen, procesprestaties te analyseren, bottlenecks op te sporen en het verloop van elke retourcase te begrijpen. Waar vind je dit? Afkomstig uit verschillende datum- en tijdvelden in SAP-tabellen. Voor aanmaak-events zijn dat vaak de velden ERDAT en ERZET (bijvoorbeeld in VBAK). Voor wijzigings-events zijn dat UDATE en UTIME in de tabel CDHDR. Voorbeelden 2023-04-15T10:22:05Z2023-04-16T14:01:30Z2023-04-18T09:15:00Z | |||
| Retourcase-ID ReturnCaseId | De unieke identificatiecode van het retourverzoek van een klant. Deze koppelt alle bijbehorende activiteiten en documenten aan elkaar. | ||
| Beschrijving De retourcase-ID is de primaire sleutel waarmee je het hele retourproces volgt, van de start tot de afsluiting. Elke ID hoort bij één specifieke retourzending van een klant en omvat alle bijbehorende events, zoals het aanmaken van de order, de levering, de inspectie en de verwerking van de creditnota. Bij procesanalyse gebruik je dit attribuut om de proceskaart op te bouwen. Het systeem groepeert er afzonderlijke events mee tot volledige caseverlopen. Zo kun je procesvarianten, doorlooptijden en bottlenecks per retourcase analyseren. Waarom dit belangrijk is Dit is de unieke case-ID die alle stappen van een retour met elkaar verbindt. Zo kun je het volledige procesverloop en de prestaties analyseren. Waar vind je dit? Dit is meestal het nummer van de retourorder uit de module Verkoop en distributie (SD). Je vindt het in tabel VBAK (kopgegevens verkoopdocument), veld VBELN. De documentcategorie (VBAK-VBTYP) is 'H' voor retouren. Voorbeelden 600001236000045660000789 | |||
| Bronsysteem SourceSystem | Het systeem waaruit de data is geëxtraheerd. | ||
| Beschrijving Dit attribuut geeft aan waar de data vandaan komt. Dat is belangrijk in omgevingen met meerdere systemen. Het biedt context en helpt de herkomst en integriteit van de data te bewaken. Bij analyses kun je dit attribuut gebruiken om data te segmenteren of te filteren wanneer je processen uit verschillende bronsystemen combineert. Zo controleer je of de events uit de verwachte applicatie komen, in dit geval SAP ECC. Waarom dit belangrijk is Geeft de herkomst van de data aan. Dat is belangrijk voor datagovernance en analyses die meerdere bedrijfssystemen omvatten. Waar vind je dit? Dit is een vaste waarde die tijdens de data-extractie wordt ingesteld om de specifieke SAP ECC-instantie aan te geven (bijvoorbeeld 'ECC_PROD_100'). Voorbeelden SAP_ECC_PRODSAPECC_FINANCE_200 | |||
| Laatste data-update LastDataUpdate | De timestamp die aangeeft wanneer de data voor dit proces voor het laatst is bijgewerkt. | ||
| Beschrijving Dit attribuut registreert de datum en tijd van de meest recente data-extractie of update. Zo zie je hoe actueel de data is die je analyseert. Dit is belangrijk om te bepalen hoe actueel de inzichten zijn. Je kunt zien hoe recent de data is, wat invloed heeft op de bruikbaarheid van de bevindingen, vooral bij het monitoren van de lopende bedrijfsvoering. Waarom dit belangrijk is Geeft aan hoe actueel de data is, zodat je weet hoe recent de procesanalyse is en wanneer de volgende update wordt verwacht. Waar vind je dit? Dit is een metadataveld dat wordt gevuld met de uitvoeringstimestamp van de data-extractietaak. Voorbeelden 2023-05-20T02:00:00Z2023-05-21T02:00:00Z | |||
| Aangevraagd terugbetalingsbedrag RequestedRefundAmount | Het verwachte bedrag van de terugbetaling, meestal gebaseerd op de nettowaarde van de geretourneerde artikelen. | ||
| Beschrijving Dit attribuut geeft het oorspronkelijke geldbedrag van de retour weer, zoals vastgelegd in de retourorder. Het vormt de basis voor financiële analyses en aansluitingen. Je vergelijkt dit bedrag met het 'Werkelijke terugbetalingsbedrag' om verschillen bij te houden. Dit is een belangrijke metriek voor het dashboard 'Verschillen in terugbetalingsbedragen bijhouden'. Met analyses van dit bedrag kun je de financiële impact van retouren volgen en mogelijke problemen met prijzen of creditberekeningen opsporen. Waarom dit belangrijk is Legt de oorspronkelijke financiële waarde van de retour vast. Zo kun je financiële verschillen volgen en de totale waarde van geretourneerde goederen bepalen. Waar vind je dit? Dit is meestal de nettowaarde op regelniveau van de retourorder. Te vinden in tabel VBAP, veld NETWR. Voorbeelden 150.0049.991250.75 | |||
| Artikelnummer MaterialNumber | De unieke identificatiecode van het product dat wordt geretourneerd. | ||
| Beschrijving Het artikelnummer, of SKU, geeft precies aan om welk artikel het gaat. Zo kun je retouren op productniveau analyseren. Door retouren per artikelnummer te analyseren, kunnen bedrijven producten met veel retouren opsporen. Dat kan wijzen op kwaliteitsproblemen, onjuiste beschrijvingen of productiefouten. Dit attribuut is belangrijk voor dashboards zoals 'Impact van retouren op de voorraad' en laat zien hoe verschillende producten het retourproces doorlopen. Waarom dit belangrijk is Geeft aan welke producten worden geretourneerd en kan wijzen op problemen met kwaliteitscontrole of onjuiste productbeschrijvingen. Waar vind je dit? Te vinden in de tabel VBAP met verkoopdocumentregels, in veld MATNR. Voorbeelden RM-1025FG-2050-BACC-5591 | |||
| Retourkanaal ReturnChannel | Het kanaal waarlangs de retour is gestart, bijvoorbeeld online, in de winkel of via het callcenter. | ||
| Beschrijving Dit attribuut geeft aan waar het retourverzoek vandaan komt of hoe het is ingediend. Je kunt er retouren mee onderscheiden die via een webportaal, een fysieke winkel of een medewerker van de klantenservice zijn gestart. Door het proces op retourkanaal te segmenteren, zie je verschillen in de bedrijfsvoering en de inzet van medewerkers. Winkelretouren kunnen bijvoorbeeld sneller worden geïnspecteerd, maar andere documentatiestappen hebben dan online retouren. Dit is een belangrijke dimensie voor het dashboard 'Trends in de doorvoer van het retourproces'. Waarom dit belangrijk is Laat zien hoe retouren worden gestart. Dat heeft vaak invloed op het procesverloop, de benodigde middelen en de doorlooptijden per kanaal. Waar vind je dit? Dit is vaak geen standaardveld in SAP ECC. Mogelijk moet je de waarde ophalen uit een aangepast veld (bijvoorbeeld in VBAK) of afleiden uit andere data, zoals de verkooporganisatie (VKORG) of het distributiekanaal (VTWEG). Raadpleeg de SAP ECC-documentatie voor de specifieke implementatie. Voorbeelden OnlineportaalIn de winkelCallcenter | |||
| Retourreden ReturnReason | De reden die de klant opgeeft voor het retourneren van het artikel. | ||
| Beschrijving Dit attribuut geeft met vooraf ingestelde redenencodes in SAP aan waarom een product is geretourneerd. Voorbeelden zijn 'Beschadigd tijdens transport', 'Verkeerd artikel geleverd' en 'Past niet'. Dit is een belangrijke dimensie voor oorzaakanalyse. Door de proceskaart of KPI’s op retourreden te filteren, kunnen analisten zien of bepaalde redenen samenhangen met langere verwerkingstijden, meer afgekeurde inspecties of specifieke procesafwijkingen. Met die informatie kun je de productkwaliteit, logistiek of verkoopprocessen verbeteren. Waarom dit belangrijk is Geeft aan waarom producten worden geretourneerd. Met oorzaakanalyse kun je het aantal retouren terugdringen door problemen met productkwaliteit, verzending of productbeschrijvingen aan te pakken. Waar vind je dit? Te vinden in de tabel VBAP met verkoopdocumentregels, in veld ABGRU (afwijzingsreden voor verkoopdocumenten). Voorbeelden 001 - Product beschadigd002 - Verkeerd product005 - Te laat aangekomen | |||
| Verwerkingsmedewerker ProcessingAgent | De gebruikers-ID van de medewerker die de activiteit heeft uitgevoerd. | ||
| Beschrijving Dit attribuut bevat de gebruikersnaam van de persoon die verantwoordelijk is voor een specifieke processtap, zoals het aanmaken van de retourorder of het boeken van de goederenontvangst. Deze gebruiker wordt vaak aangeduid als 'Gewijzigd door' of 'Gemaakt door'. Analyse op basis van de verwerkingsmedewerker is belangrijk voor prestatiebeheer en bronanalyse. Je ziet wie goed presteert, wie mogelijk extra training nodig heeft en hoe het werk binnen een team is verdeeld. Het attribuut wordt gebruikt in dashboards zoals 'Prestaties van medewerkers bij retourverwerking', waarmee je doorlooptijden en doorvoer kunt vergelijken. Waarom dit belangrijk is Houdt bij wie bij het werk betrokken is. Zo kun je teamprestaties en de werkverdeling analyseren en zien waar training nodig is of welke werkwijzen goed werken. Waar vind je dit? Meestal te vinden in velden zoals ERNAM (aangemaakt door) of AENAM (gewijzigd door) in kopgegevenstabellen zoals VBAK, LIKP en VBRK. Voor wijzigings-events staat de gebruikersnaam in CDHDR. Voorbeelden CBURNSDSCRANTONJHALPERT | |||
| Werkelijk terugbetalingsbedrag ActualRefundAmount | Het uiteindelijke bedrag dat aan de klant is gecrediteerd, zoals geboekt in de financiële documenten. | ||
| Beschrijving Dit attribuut bevat het definitieve terugbetalingsbedrag dat is verwerkt en geboekt in het boekhoudsysteem. Het bedrag kan afwijken van het aangevraagde bedrag door herbevoorradingskosten, aanpassingen op basis van de staat van het artikel of andere beleidsregels. Dit attribuut is belangrijk voor het dashboard 'Verschillen in terugbetalingsbedragen bijhouden'. Door het te vergelijken met het aangevraagde bedrag, kun je structurele problemen in de berekening en goedkeuring van terugbetalingen opsporen en de financiële juistheid bewaken. Waarom dit belangrijk is Geeft de uiteindelijke financiële uitkomst van de retour weer. Door dit bedrag te vergelijken met het aangevraagde bedrag, kun je de juistheid controleren en financiële verliezen opsporen. Waar vind je dit? Afkomstig uit het financiële document dat bij de creditnota hoort. Meestal te vinden in de tabel BSEG (segment boekhoudkundig document), veld WRBTR (bedrag in documentvaluta), voor de betreffende boeking op de grootboekrekening. Voorbeelden 150.0045.001200.75 | |||
| Bedrijfscode CompanyCode | De juridische entiteit of het bedrijf dat verantwoordelijk is voor de transactie. | ||
| Beschrijving De bedrijfscode is in SAP een zelfstandige boekhoudkundige eenheid. Alle financiële transacties, waaronder retouren en terugbetalingen, worden aan een specifieke bedrijfscode geboekt. Dit attribuut is belangrijk voor financiële rapportages en om processen te segmenteren binnen internationale organisaties of organisaties met meerdere entiteiten. Door op bedrijfscode te analyseren, kun je de prestaties van retourprocessen bij verschillende juridische entiteiten binnen het bedrijf vergelijken. Waarom dit belangrijk is Hiermee kun je retourprocessen bij verschillende juridische entiteiten binnen een organisatie filteren en vergelijken. Dat is belangrijk voor financiële analyses. Waar vind je dit? Te vinden in de tabel VBAK met kopgegevens van verkoopdocumenten, in veld BUKRS_VF (bedrijfscode voor facturering). Voorbeelden 10002000US01 | |||
| Creditnotanummer CreditMemoNumber | De unieke identificatiecode van het creditnotadocument dat voor de terugbetaling is uitgegeven. | ||
| Beschrijving De creditnota is het officiële factuurdocument in SAP waarin de terugbetaling aan de klant wordt vastgelegd. Dit nummer identificeert het financiële document uniek. Dit attribuut is belangrijk voor financiële aansluitingen en om het proces te volgen van de operationele retour tot de financiële afhandeling. Het is een belangrijke mijlpaal in het proces en helpt bij het vinden van bijbehorende boekhoudkundige documenten voor attributen zoals 'Werkelijk terugbetalingsbedrag'. Waarom dit belangrijk is Verwijst rechtstreeks naar het financiële document waarmee de terugbetaling aan de klant wordt goedgekeurd. Dit is belangrijk voor financiële controles en aansluitingen. Waar vind je dit? De creditnota is een factuurdocument. Het nummer staat in tabel VBRK (factuurdocument: kopgegevens), veld VBELN. De koppeling is te vinden via de documentstroom van de retourorder. Voorbeelden 900011229000334490005566 | |||
| Klant-ID CustomerId | De unieke identificatiecode van de klant die de retour start. | ||
| Beschrijving Dit attribuut identificeert de specifieke klant die het product retourneert, in SAP-termen de 'Sold-to Party'. Het koppelt de retourtransactie aan de stamgegevens van de klant. Met analyses op klant-ID kun je klanten met veel retouren opsporen. Dat kan wijzen op ontevredenheid of mogelijk misbruik van het retourbeleid. In combinatie met klantsegmentatie kun je ook nagaan of bepaalde klantgroepen ander retourgedrag vertonen of het proces anders ervaren. Waarom dit belangrijk is Koppelt retouren aan specifieke klanten. Zo kun je klantgedrag analyseren, klanten met herhaalde retouren opsporen en de gevolgen voor klantrelaties onderzoeken. Waar vind je dit? Te vinden in de tabel VBAK met kopgegevens van verkoopdocumenten, in veld KUNNR (Sold-to Party). Voorbeelden CUST-100432CUST-203991CUST-831102 | |||
| Naleving van het retourbeleid ReturnPolicyAdherence | Een indicator die aangeeft of de retour voldoet aan alle vastgestelde bedrijfsregels en beleidsregels. | ||
| Beschrijving Dit berekende booleaanse attribuut geeft aan of een retourcase volgens het standaardbeleid van het bedrijf is afgehandeld. De logica kan meerdere voorwaarden controleren, bijvoorbeeld of de retour binnen de toegestane termijn is gestart, of de redenencode geldig is voor het product en of een manager een uitzondering heeft goedgekeurd. Dit attribuut vormt de basis voor het dashboard 'Naleving van het goedkeuringsbeleid voor retouren'. Je kunt er het nalevingspercentage mee meten en zien welke beleidsregels het vaakst worden omzeild. Zo kun je procesverbeteringen of trainingen gericht inzetten. Waarom dit belangrijk is Meet of bedrijfsregels worden nageleefd. Zo kun je beleid consequent toepassen en cases opsporen die extra beoordeling of goedkeuring nodig hebben. Waar vind je dit? Dit is een afgeleid attribuut op basis van een reeks bedrijfsregels. Bijvoorbeeld: (Return Initiation Date - Original Purchase Date) <= 30 days AND ReturnReason IS NOT NULL. Voorbeelden truefalse | |||
| Oorspronkelijk verkoopdocument OriginalSalesDocument | Het nummer van de oorspronkelijke verkooporder waarop de retour betrekking heeft. | ||
| Beschrijving Dit attribuut verwijst rechtstreeks naar de oorspronkelijke aankoop van de klant. Het is een referentiedocument dat de retour koppelt aan de gegevens van de oorspronkelijke transactie. Deze koppeling is waardevol voor verdere analyses. Je kunt onderzoeken waarom aankopen uit bepaalde orders worden geretourneerd, de oorspronkelijke prijzen en voorwaarden controleren en het volledige traject van bestelling tot retour bekijken. Ook kun je nagaan of producten uit specifieke campagnes of kanalen vaker worden geretourneerd. Waarom dit belangrijk is Koppelt de retour aan de oorspronkelijke verkoop. Zo krijg je een volledig beeld van de klanttransactie en kun je de oorzaken verder onderzoeken. Waar vind je dit? Deze verwijzing staat op regelniveau van de retourorder. Je vindt deze in tabel VBAP, veld VGBEL (documentnummer van het referentiedocument). Voorbeelden 100034561000987110012345 | |||
| SLA nageleefd IsSLACompliant | Een indicator die aangeeft of de terugbetaling binnen de afgesproken service level agreement (SLA) is verwerkt. | ||
| Beschrijving Dit is een berekend booleaans attribuut dat de werkelijke datum van de activiteit 'Terugbetaling verwerkt' vergelijkt met de 'Uiterste datum voor terugbetaling volgens SLA'. De waarde is true als de terugbetaling op tijd is afgerond en false als dat niet zo is. Dit attribuut maakt analyses en rapportages eenvoudiger doordat het per case een duidelijke uitkomst voor de SLA-prestaties geeft. Je gebruikt het om het totale nalevingspercentage voor het dashboard 'Naleving van de SLA voor terugbetalingen' te berekenen en om cases die niet aan de SLA voldoen eenvoudig te filteren en analyseren. Waarom dit belangrijk is Geeft per case een duidelijke ja-of-nee-indicatie van de SLA-prestaties. Zo wordt het eenvoudiger om de naleving te volgen en erover te rapporteren. Waar vind je dit? Dit is een berekend attribuut. De logica is: 'Terugbetaling verwerkt' EventTime <= RefundSLATargetDate. Voorbeelden truefalse | |||
| Status retourorder ReturnOrderStatus | De algemene verwerkingsstatus van de retourcase. | ||
| Beschrijving Dit attribuut geeft de huidige status van de retourcase weer, bijvoorbeeld 'Open', 'In behandeling' of 'Afgerond'. De waarde wordt afgeleid uit de gecombineerde statussen op kop- of regelniveau van het verkoopdocument. Bij analyses kun je dit attribuut gebruiken om cases te filteren en je te richten op lopende of afgeronde retouren. Het helpt de totale werkvoorraad en voortgang van open cases te volgen en geeft per retour een overzicht van de uitkomst. Waarom dit belangrijk is Geeft op hoofdlijnen aan waar een case zich in het proces bevindt. Zo kun je open, lopende of afgesloten retouren filteren en analyseren. Waar vind je dit? Afgeleid van de statusvelden in de tabellen VBUK (kopstatus) en VBUP (regelstatus). VBUK-GBSTK geeft bijvoorbeeld de algemene verwerkingsstatus van het document aan. Voorbeelden OpenIn behandelingAfgerond | |||
| Uiterste datum voor terugbetaling volgens SLA RefundSLATargetDate | De datum waarop de terugbetaling volgens de service level agreements moet zijn verwerkt. | ||
| Beschrijving Dit attribuut bepaalt de uiterste datum waarop de terugbetaling voor een retourcase moet zijn afgerond. De datum wordt meestal berekend op basis van bedrijfsregels, zoals '5 werkdagen na ontvangst van de goederen'. Deze datum is de norm waarmee je de werkelijke prestaties vergelijkt. Het is een belangrijk onderdeel van het dashboard 'Naleving van de SLA voor terugbetalingen'. Zo kan het bedrijf controleren of klantafspraken worden nagekomen en cases opsporen waarbij de SLA mogelijk niet wordt gehaald. Waarom dit belangrijk is Stelt het prestatiedoel voor de verwerking van terugbetalingen vast. Zo kan het bedrijf de SLA-naleving meten en rapporteren en achterstallige cases prioriteit geven. Waar vind je dit? Dit is meestal geen standaard SAP-veld en moet worden afgeleid op basis van bedrijfsregels. Je kunt de datum bijvoorbeeld berekenen door een belangrijke datum (zoals de goederenontvangstdatum uit MKPF) te combineren met een ingestelde termijn. Raadpleeg de SAP ECC-documentatie of de bedrijfsvereisten. Voorbeelden 2023-04-25T23:59:59Z2023-04-28T23:59:59Z2023-05-02T23:59:59Z | |||
| Verschil in terugbetalingsbedrag RefundAmountDiscrepancy | Het berekende verschil tussen het werkelijke en het aangevraagde terugbetalingsbedrag. | ||
| Beschrijving Deze berekende metriek geeft het geldelijke verschil aan tussen het bedrag dat oorspronkelijk in de retourorder is aangevraagd en het bedrag dat uiteindelijk op de creditnota is uitgegeven. Een positieve waarde kan wijzen op een gedeeltelijke terugbetaling. Een negatieve waarde is ongebruikelijk, maar kan duiden op een te hoge betaling. Dit attribuut is de belangrijkste maatstaf voor het dashboard 'Verschillen in terugbetalingsbedragen bijhouden'. Je kunt er snel cases met financiële afwijkingen mee opsporen en analyseren. Die afwijkingen kunnen bijvoorbeeld ontstaan door de beoordeling van de staat van het artikel, herbevoorradingskosten of fouten. Door dit te volgen, houd je grip op de financiën en de naleving van het beleid. Waarom dit belangrijk is Meet financiële afwijkingen in het terugbetalingsproces. Zo kun je niet-naleving van beleid, verwerkingsfouten of financiële verliezen opsporen. Waar vind je dit? Berekend veld: ActualRefundAmount - RequestedRefundAmount. Voorbeelden 0.00-4.99-50.00 | |||
| Vestiging Plant | De fysieke locatie of faciliteit waar het geretourneerde artikel wordt ontvangen en verwerkt. | ||
| Beschrijving De vestiging in SAP is een fysieke locatie, zoals een magazijn of distributiecentrum, waar goederen worden verwerkt. Bij retouren is dit meestal de locatie waar het artikel wordt ontvangen en geïnspecteerd. Door het proces per vestiging te analyseren, kun je prestatieverschillen tussen locaties opsporen. Zo zie je welke magazijnen artikelen efficiënter inspecteren of een hogere doorvoer hebben. Dit ondersteunt het dashboard 'Doorvoer en efficiëntie van artikelinspecties'. Waarom dit belangrijk is Geeft aan op welke fysieke locatie de retour wordt verwerkt. Zo kun je de prestaties van verschillende magazijnen of distributiecentra vergelijken. Waar vind je dit? Te vinden op regelniveau van de retourorder, in tabel VBAP, veld WERKS. Voorbeelden PL01WH02DC05 | |||
Activiteiten voor de verwerking van retouren en terugbetalingen
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Creditnota aangemaakt | Er wordt een factuurdocument (creditnota) aangemaakt om de financiële terugbetaling aan de klant goed te keuren. Dit is het officiële financiële document waarin het terug te betalen bedrag wordt vastgelegd. | ||
| Waarom dit belangrijk is Dit is een belangrijke financiële mijlpaal in het proces. Door te analyseren hoe lang het duurt om de creditnota aan te maken, kun je vertragingen opsporen bij de verwerking van financiële documenten na ontvangst en inspectie van de goederen. Waar vind je dit? Dit is een expliciet event in de tabel VBRK (kopgegevens factuurdocument). De aanmaakdatum staat in VBRK-ERDAT. De creditnota is via de documentstroom gekoppeld aan de retourorder of het verzoek om een creditnota. Vastleggen Gebruik de aanmaaktimestamp (ERDAT) uit de tabel VBRK voor het betreffende factuurdocument. Gebeurtenistype explicit | |||
| Creditnota geboekt in FI | De creditnota wordt vrijgegeven voor de financiële administratie en wordt daarmee een officiële boeking op debiteuren. Deze stap start de daadwerkelijke terugbetaling aan de klant. | ||
| Waarom dit belangrijk is Deze activiteit markeert het moment waarop het bedrijf de terugbetaling financieel verwerkt. Vertraging tussen het aanmaken en boeken van de creditnota kan ervoor zorgen dat de klant langer op de terugbetaling moet wachten. Waar vind je dit? Dit is een afgeleid event. Het wordt vastgesteld wanneer de boekingsstatus in de kop van het factuurdocument (VBRK-RFBSK) wordt bijgewerkt naar 'C' (boekingsdocument aangemaakt). De aanmaakdatum van het daadwerkelijke boekhoudkundige document staat in de tabel BKPF. Vastleggen Bepaal de timestamp waarop VBRK-RFBSK op 'C' wordt gezet, of gebruik de aanmaakdatum (CPUDT) van het gekoppelde boekhoudkundige document in BKPF. Gebeurtenistype inferred | |||
| Gebruiksbeslissing genomen | Na de inspectie neemt een kwaliteitsmedewerker of inspecteur een formeel besluit over de staat van het retourartikel. Dit bepaalt de volgende stap, zoals terugplaatsing in de voorraad, afvoer of reparatie. | ||
| Waarom dit belangrijk is Deze activiteit is belangrijk om de efficiëntie en resultaten van inspecties te begrijpen. De beslissing heeft direct invloed op het terugbetalingsbedrag en het voorraadbeheer. Waar vind je dit? Als SAP QM wordt gebruikt, is dit een expliciete gebeurtenis in tabel QAVE (gebruiksbeslissing bij inspectieverwerking). Het tijdstip van de beslissing staat in QAVE-VDATUM. De koppeling met de levering staat in tabel QALS. Vastleggen Gebruik de datum van de gebruiksbeslissing (VDATUM) uit tabel QAVE, gekoppeld via de inspectiepartij (QALS-PRUEFLOS). Gebeurtenistype explicit | |||
| Goederenontvangst geboekt | Deze activiteit vindt plaats wanneer het fysieke retourartikel in het magazijn of verwerkingscentrum aankomt. De activiteit wordt vastgelegd wanneer een goederenbewegingsdocument voor de retourlevering wordt geboekt. | ||
| Waarom dit belangrijk is Dit is een belangrijke mijlpaal: het bedrijf heeft het retourartikel nu in bezit. Vanaf dit moment kan de fysieke inspectie beginnen. De gebeurtenis beïnvloedt ook de voorraadnauwkeurigheid. Waar vind je dit? Deze gebeurtenis kan worden afgeleid uit de status van de goederenbeweging voor de retourleveringsregel in tabel VBUP (bijvoorbeeld WBSTA = 'C'). De exacte timestamp staat in de kopgegevens van het materiaaldocument (MKPF-BUDAT) voor de bijbehorende goederenontvangst. Vastleggen Haal de boekingsdatum (BUDAT) uit tabel MKPF voor het materiaaldocument dat aan de retourlevering is gekoppeld. Gebeurtenistype inferred | |||
| Retourorder aangemaakt | Deze activiteit markeert de start van het retourproces, wanneer een klant een product wil retourneren. De activiteit wordt vastgelegd zodra in SAP ECC een nieuw verkoopdocument van het type ‘Retour’ (bijvoorbeeld RE) wordt aangemaakt. | ||
| Waarom dit belangrijk is Dit is de belangrijkste startgebeurtenis van het retourproces. Door de tijd vanaf deze activiteit tot andere activiteiten te analyseren, meet je de totale doorlooptijd en herken je vertragingen aan het begin van de verwerking. Waar vind je dit? Dit is een expliciete gebeurtenis in tabel VBAK (kopgegevens verkoopdocument). De aanmaaktimestamp staat in VBAK-ERDAT en VBAK-ERZET voor het bijbehorende verkoopdocumentnummer (VBAK-VBELN) met ordertype VBAK-AUART = 'RE'. Vastleggen Gebruik de aanmaaktimestamp (ERDAT, ERZET) uit tabel VBAK voor verkoopdocumenttype 'RE'. Gebeurtenistype explicit | |||
| Retourorder verwerkt | Deze activiteit markeert het einde van het retourproces vanuit het perspectief van verkoop en distributie. Dit gebeurt wanneer alle regels van de retourorder volledig zijn verwerkt en afgesloten. | ||
| Waarom dit belangrijk is Dit is het belangrijkste eind-event van het proces. De tijd tussen 'Retourorder aangemaakt' en deze activiteit is de totale doorlooptijd van de retourcase. Waar vind je dit? Dit is een afgeleid event uit de statustabellen. Het wordt vastgelegd wanneer de algemene status van de verkoopdocumentkop (VBUK-GBSTK) wordt bijgewerkt naar 'C' (volledig verwerkt). Vastleggen Bepaal de timestamp in de wijzigingsdocumenten (CDHDR/CDPOS) waarop het statusveld VBUK-GBSTK verandert in 'C'. Gebeurtenistype inferred | |||
| Blokkering retourorder opgeheven | Dit staat voor de goedkeuring van het retourverzoek, waarna het naar de volgende fase kan. Meestal wordt dit vastgelegd als een wijziging in de documentstatus of als het opheffen van een leverings- of factureringsblokkering. | ||
| Waarom dit belangrijk is Dit is een belangrijke mijlpaal in de goedkeuring. Door te meten hoe lang het duurt om deze stap te bereiken, herken je bottlenecks in de autorisatie en goedkeuring van retouren. Waar vind je dit? Dit is een afgeleide gebeurtenis op basis van wijzigingslogboeken voor het verkoopdocument. Controleer in tabellen CDHDR en CDPOS wijzigingen aan blokkeringsvelden in VBAK of VBAP, of aan statusvelden in VBUK/VBUP. Vastleggen Haal de timestamp waarop een relevante blokkeringsstatus is opgeheven uit de wijzigingsdocumenttabellen (CDHDR/CDPOS). Gebeurtenistype inferred | |||
| Creditnota vereffend | De openstaande creditpost op debiteuren wordt vereffend, meestal via een uitgaande betaling aan de klant. Dit event markeert de definitieve financiële afhandeling van de terugbetaling. | ||
| Waarom dit belangrijk is Deze activiteit bevestigt dat het bedrag is uitbetaald en rondt de financiële kant van het proces af. Vanuit het perspectief van de klant is dit het daadwerkelijke einde van de terugbetaling. Waar vind je dit? Dit is een expliciet event uit de FI-module. De vereffeningsdatum van het boekhoudkundige document staat in de tabel BSEG (BSEG-AUGDT) bij de betreffende klantregel. Vastleggen Gebruik de vereffeningsdatum (AUGDT) uit de tabel BSEG of BSAD voor het boekhoudkundige document dat aan de creditnota is gekoppeld. Gebeurtenistype explicit | |||
| Creditnotaverzoek aangemaakt | Er wordt een creditnotaverzoek aangemaakt om de noodzaak van een terugbetaling formeel vast te leggen. In veel configuraties dient de retourorder zelf als creditnotaverzoek. | ||
| Waarom dit belangrijk is Dit is de formele start van de financiële afhandeling van het retourproces. De gebeurtenis vormt de aanleiding voor de daaropvolgende financiële goedkeuringen en documentaanmaak. Waar vind je dit? Dit kan een expliciete gebeurtenis in VBAK zijn voor een verkoopdocument van het type ‘Creditnotaverzoek’ (bijvoorbeeld CR). Het kan ook dezelfde gebeurtenis zijn als ‘Retourorder aangemaakt’ als het ordertype is ingesteld op facturering op basis van de order. Vastleggen Gebruik de aanmaaktimestamp (ERDAT) uit VBAK voor documenttype 'CR', of gebruik de gebeurtenis voor het aanmaken van de retourorder opnieuw. Gebeurtenistype explicit | |||
| Retourlevering aangemaakt | Er wordt een leveringsdocument aangemaakt om de fysieke ontvangst van de retourgoederen te regelen. Deze gebeurtenis geeft aan dat de logistieke afhandeling van de retour is gestart. | ||
| Waarom dit belangrijk is Deze activiteit markeert de overgang van administratieve verwerking naar fysieke logistiek. Vertragingen kunnen de magazijnplanning en de totale doorlooptijd van de retour beïnvloeden. Waar vind je dit? Dit is een expliciete gebeurtenis in tabel LIKP (kopgegevens levering). De aanmaaktimestamp staat in LIKP-ERDAT. De koppeling met de oorspronkelijke retourorder staat in tabel LIPS (LIPS-VGBEL). Vastleggen Gebruik de aanmaaktimestamp (ERDAT) uit tabel LIKP voor de levering die bij de retourorder hoort. Gebeurtenistype explicit | |||
| Retourorderregel afgewezen | Een specifieke regel van de retourorder wordt afgewezen, tijdens de eerste beoordeling of na inspectie. Dit betekent dat de regel niet verder wordt verwerkt en er bijvoorbeeld geen terugbetaling volgt. | ||
| Waarom dit belangrijk is Door afwijzingen te analyseren, kun je ongeldige retourverzoeken opsporen en de communicatie over het retourbeleid verbeteren. Dit is een belangrijke procesroute die niet tot een terugbetaling leidt. Waar vind je dit? Dit is een afgeleid event. Meestal wordt het vastgesteld wanneer voor de regel een unieke code voor de afwijzingsreden wordt ingevuld in de tabel VBAP (VBAP-ABGRU). De timestamp moet uit wijzigingslogboeken komen. Vastleggen Bepaal de timestamp in de wijzigingsdocumenten (CDHDR/CDPOS) waarop het veld VBAP-ABGRU wordt ingevuld voor een retourregel. Gebeurtenistype inferred | |||
| Retourorderregel verwerkt | Een afzonderlijke regel in de retourorder wordt gemarkeerd als volledig verwerkt. Dit gebeurt meestal nadat alle logistieke en financiële vervolgdocumenten voor die regel zijn afgehandeld. | ||
| Waarom dit belangrijk is Door op regelniveau te volgen, zie je welke producten of retourredenen de meeste vertraging veroorzaken. Zo krijg je een gedetailleerder beeld van de voortgang van het proces. Waar vind je dit? Dit is een afgeleid event uit de statustabellen. Het wordt vastgelegd wanneer de algemene status van de verkoopdocumentregel (VBUP-GBSTK) wordt bijgewerkt naar 'C' (volledig verwerkt). Vastleggen Bepaal de timestamp in de wijzigingsdocumenten (CDHDR/CDPOS) waarop het statusveld VBUP-GBSTK verandert in 'C'. Gebeurtenistype inferred | |||
Extractiegidsen
Stappen
- ABAP-programma maken: Gebruik transactiecode
SE38om een nieuw uitvoerbaar ABAP-programma te maken, bijvoorbeeldZ_PM_RETURN_EXTRACTION. Geef het programma een duidelijke titel en sla het op als lokaal object of in een ontwikkelpakket. - Selectiescherm definiëren: Definieer in het programma een selectiescherm waarmee gebruikers de data kunnen filteren. Belangrijke filters zijn de aanmaakdatum van retourorders (
S_ERDAT), het verkoopdocumenttype voor retouren (S_AUART, bijvoorbeeld 'RE') en de bedrijfs code (P_BUKRS). - Datastructuren definiëren: Maak een lokaal structuurtype dat overeenkomt met de vereiste indeling van het event log. Neem hierin velden op voor
ReturnCaseId,ActivityName,EventTime,SourceSystem,LastDataUpdate,ProcessingAgent,ReturnReasonen andere vereiste attributen. - Logica voor dataselectie implementeren: Schrijf de ABAP-logica om data voor elk van de 12 vereiste activiteiten te selecteren. Hiervoor raadpleeg je verschillende SAP-tabellen, zoals VBAK, VBAP, LIKP, VBRK, BKPF, CDHDR en CDPOS. Gebruik de documentstroomtabel (VBFA) om gerelateerde documenten, zoals leveringen en creditnota's, aan de oorspronkelijke retourorder te koppelen.
- 'Retourorder aangemaakt' extraheren: Selecteer records uit de tabellen
VBAKenVBAPop basis van de criteria op het selectiescherm. Het verkoopdocumentnummer (VBAK-VBELN) dient alsReturnCaseId. - Statuswijzigingen en belangrijke gebeurtenissen extraheren: Raadpleeg voor activiteiten zoals 'Blokkering retourorder opgeheven' of 'Retourorderregel afgewezen' de wijzigingsdocumenttabellen (
CDHDR,CDPOS) of statusvelden in tabellen zoalsVBAP(ABGRU). Selecteer voor logistieke en financiële vervolgactiviteiten data uit tabellen zoalsLIKP,MKPF,VBRKenBKPF. GebruikVBFAom te controleren of ze aan de oorspronkelijke retourorders zijn gekoppeld. - De event log-tabel vullen: Maak voor elke opgehaalde activiteit een record in een interne tabel met de structuur van het event log. Koppel de data uit de SAP-brontabellen aan de bijbehorende velden. Koppel bijvoorbeeld
VBAK-ERNAMaanProcessingAgentenVBAK-ERDATenVBAK-ERZETaanEventTime. - Activiteitsdata combineren: Zorg dat elke SELECT-instructie voor een activiteit de resultaten toevoegt aan dezelfde interne hoofdtabel. Zo ontstaat een plat bestand waarin elke rij één gebeurtenis voorstelt.
- Timestamps en systeemgegevens verwerken: Gebruik de systeemvelden
SY-DATUMenSY-UZEITom voor elke rij de timestampLastDataUpdatein te vullen. GebruikSY-SYSIDvoorSourceSystem. - Uitvoer toevoegen: Voeg de mogelijkheid toe om de resultaten voor online analyse in een ALV-grid (SAP List Viewer) weer te geven, bijvoorbeeld met functiemodules zoals
REUSE_ALV_GRID_DISPLAY. Voeg ook een optie toe om de interne tabel als CSV- of tekstbestand naar de lokale computer te downloaden. - Uitvoeren en exporteren: Voer het programma uit via
SE38. Vul de gewenste selectiecriteria in en start het programma. Sla het event log-bestand op met de exportfunctie zodra de data is weergegeven of verwerkt. Gebruik een indeling die geschikt is voor ProcessMind, meestal CSV met een kopregel.
Configuratie
- Datumbereik: Geef op het selectiescherm een datumbereik op voor de aanmaakdatum van de retourorder. Voor een eerste analyse is 3 tot 6 maanden aan data aan te raden, zodat de hoeveelheid data beheersbaar blijft en je het proces goed kunt analyseren.
- Retourdocumenttype: Filter op het verkoopdocumenttype dat in je systeem voor retouren wordt gebruikt, bijvoorbeeld 'RE' voor retouren of 'CR' voor een verzoek om een creditnota. Met deze filter selecteer je de juiste processen. Vul de waarden in bij de selectieoptie
S_AUART. - Bedrijfscode: Geef de relevante bedrijfscode (
P_BUKRS) op om de data tot één rechtspersoon te beperken. Dit is belangrijk als je met meerdere bedrijven werkt. - Vereisten: De gebruiker die het programma uitvoert, heeft autorisaties nodig voor
SE38(programma uitvoeren) en toegang tot de onderliggende SD-, MM- en FI-tabellen, zoals VBAK, LIKP, VBRK, BKPF en CDHDR. Voor de ontwikkeling is een ABAP-ontwikkelaarsrol nodig. - Prestaties: Bij zeer grote datasets over meerdere jaren kan het programma lang draaien. Overweeg het als achtergrondtaak uit te voeren (
SM36) en de uitvoer naar het bestandssysteem van de applicatieserver te schrijven in plaats van de data online weer te geven.
a Voorbeeldquery abap
REPORT Z_PM_RETURN_EXTRACTION.
" =======================================================================
" DATA DECLARATIONS
" =======================================================================
TYPES: BEGIN OF ty_event_log,
returncaseid TYPE vbeln_va,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE sysysid,
lastdataupdate TYPE timestamp,
processingagent TYPE ernam,
returnreason TYPE augru,
materialnumber TYPE matnr,
returnchannel TYPE string, " Placeholder, needs custom logic
requestedrefundamount TYPE netwr,
actualrefundamount TYPE netwr,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lv_timestamp TYPE timestamp,
lv_last_update TYPE timestamp.
" =======================================================================
" SELECTION SCREEN
" =======================================================================
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_auart FOR vbak-auart.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY.
" =======================================================================
" MAIN LOGIC
" =======================================================================
START-OF-SELECTION.
" Set static values for the extraction run
GET TIME STAMP FIELD lv_last_update.
" 1. Return Order Created & 6. Credit Memo Request Created
" Note: In many SAP standard processes, the Return Order itself acts as the Credit Memo Request.
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~augru, i~matnr, i~netwr
INTO TABLE @DATA(lt_return_orders)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~auart IN @s_auart
AND h~bukrs_vf = @p_bukrs.
LOOP AT lt_return_orders INTO DATA(ls_return_order).
" Activity: Return Order Created
ls_event_log-returncaseid = ls_return_order-vbeln.
ls_event_log-activityname = 'Return Order Created'.
CONVERT DATE ls_return_order-erdat TIME ls_return_order-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_return_order-ernam.
ls_event_log-returnreason = ls_return_order-augru.
ls_event_log-materialnumber = ls_return_order-matnr.
ls_event_log-requestedrefundamount = ls_return_order-netwr.
APPEND ls_event_log TO lt_event_log.
" Activity: Credit Memo Request Created
ls_event_log-activityname = 'Credit Memo Request Created'.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
IF lt_return_orders IS NOT INITIAL.
" 2. Return Order Block Removed (Example for Delivery Block)
SELECT objectid, udate, utime, username
FROM cdhdr
INTO TABLE @DATA(lt_block_changes)
FOR ALL ENTRIES IN @lt_return_orders
WHERE objectclas = 'VERKBELEG'
AND objectid = @lt_return_orders-vbeln
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT objectid, fname, value_new
INTO TABLE @DATA(lt_cdpos_block)
FROM cdpos
FOR ALL ENTRIES IN @lt_block_changes
WHERE objectclas = @lt_block_changes-objectclas
AND objectid = @lt_block_changes-objectid
AND changenr = @lt_block_changes-changenr
AND tabname = 'VBAK'
AND fname = 'LIFSK' " Delivery Block field
AND value_new = ''.
LOOP AT lt_cdpos_block INTO DATA(ls_cdpos_block).
READ TABLE lt_block_changes INTO DATA(ls_block_change) WITH KEY objectid = ls_cdpos_block-objectid.
IF sy-subrc = 0.
ls_event_log-returncaseid = ls_cdpos_block-objectid.
ls_event_log-activityname = 'Return Order Block Removed'.
CONVERT DATE ls_block_change-udate TIME ls_block_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_block_change-username.
CLEAR: ls_event_log-returnreason, ls_event_log-materialnumber, ls_event_log-requestedrefundamount, ls_event_log-actualrefundamount.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDIF.
" Get subsequent documents from flow
SELECT vbelv, vbtyp_n, vbeln, rfbsk
INTO TABLE @DATA(lt_doc_flow)
FROM vbfa
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbelv = @lt_return_orders-vbeln
AND vbtyp_n IN ('J', 'R', 'M'). " J=Delivery, R=Goods Mvmt, M=Invoice
" 3. Return Delivery Created
SELECT vbeln, erdat, erzet, ernam FROM likp
INTO TABLE @DATA(lt_deliveries)
FOR ALL ENTRIES IN @lt_doc_flow
WHERE vbeln = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'J'.
LOOP AT lt_deliveries INTO DATA(ls_delivery).
READ TABLE lt_doc_flow INTO DATA(ls_doc_flow_del) WITH KEY vbeln = ls_delivery-vbeln.
ls_event_log-returncaseid = ls_doc_flow_del-vbelv.
ls_event_log-activityname = 'Return Delivery Created'.
CONVERT DATE ls_delivery-erdat TIME ls_delivery-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_delivery-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 4. Goods Receipt Posted
SELECT mblnr, mjahr, budat, cputm, usnam FROM mkpf
INTO TABLE @DATA(lt_goods_receipt)
FOR ALL ENTRIES IN @lt_doc_flow
WHERE xblnr = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'R'.
LOOP AT lt_goods_receipt INTO DATA(ls_goods_receipt).
READ TABLE lt_doc_flow INTO DATA(ls_doc_flow_gr) WITH KEY vbeln = ls_goods_receipt-mblnr.
ls_event_log-returncaseid = ls_doc_flow_gr-vbelv.
ls_event_log-activityname = 'Goods Receipt Posted'.
CONVERT DATE ls_goods_receipt-budat TIME ls_goods_receipt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_goods_receipt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 5. Usage Decision Made (Requires QM Module implementation)
SELECT q~prueflos, q~vdatu, q~vzeit, q~vname
FROM qals AS q
INNER JOIN qave AS v ON q~prueflos = v~prueflos
INTO TABLE @DATA(lt_usage_decisions)
FOR ALL ENTRIES IN @lt_deliveries
WHERE q~kdauf = @lt_deliveries-vbeln.
LOOP AT lt_usage_decisions INTO DATA(ls_ud).
SELECT SINGLE vbelv FROM vbfa INTO @DATA(lv_vbelv_ud) WHERE vbeln = @ls_ud-prueflos.
ls_event_log-returncaseid = lv_vbelv_ud.
ls_event_log-activityname = 'Usage Decision Made'.
CONVERT DATE ls_ud-vdatu TIME ls_ud-vzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_ud-vname.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 7. Credit Memo Created
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, i~netwr, i~vgbel
INTO TABLE @DATA(lt_cred_memos)
FROM vbrk AS h
INNER JOIN vbrp AS i ON h~vbeln = i~vbeln
FOR ALL ENTRIES IN @lt_doc_flow
WHERE h~vbeln = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'M'.
LOOP AT lt_cred_memos INTO DATA(ls_cred_memo).
ls_event_log-returncaseid = ls_cred_memo-vgbel.
ls_event_log-activityname = 'Credit Memo Created'.
CONVERT DATE ls_cred_memo-erdat TIME ls_cred_memo-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_cred_memo-ernam.
ls_event_log-actualrefundamount = ls_cred_memo-netwr.
APPEND ls_event_log TO lt_event_log.
" 8. Credit Memo Posted To FI
SELECT SINGLE budat, cputime, usnam FROM bkpf
INTO @DATA(ls_bkpf_post)
WHERE awkey = @ls_cred_memo-vbeln AND awtyp = 'VBRK'.
IF sy-subrc = 0.
ls_event_log-activityname = 'Credit Memo Posted To FI'.
CONVERT DATE ls_bkpf_post-budat TIME ls_bkpf_post-cputime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-processingagent = ls_bkpf_post-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 12. Credit Memo Cleared
SELECT SINGLE augdt FROM bseg
INTO @DATA(lv_augdt)
WHERE bukrs = @p_bukrs
AND belnr = @ls_cred_memo-vbeln
AND augdt IS NOT NULL.
IF sy-subrc = 0 AND lv_augdt IS NOT INITIAL.
ls_event_log-activityname = 'Credit Memo Cleared'.
CONVERT DATE lv_augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
CLEAR: ls_event_log-processingagent.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 9. Return Order Item Completed
SELECT vbeln, erdat, erzet, ernam, abgru FROM vbap
INTO TABLE @DATA(lt_items_completed)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND gbsta = 'C'.
LOOP AT lt_items_completed INTO DATA(ls_item_completed).
ls_event_log-returncaseid = ls_item_completed-vbeln.
ls_event_log-activityname = 'Return Order Item Completed'.
CONVERT DATE ls_item_completed-erdat TIME ls_item_completed-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_item_completed-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 10. Return Order Completed
SELECT vbeln, erdat, erzet, ernam FROM vbak
INTO TABLE @DATA(lt_orders_completed)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND gbsta = 'C'.
LOOP AT lt_orders_completed INTO DATA(ls_order_completed).
ls_event_log-returncaseid = ls_order_completed-vbeln.
ls_event_log-activityname = 'Return Order Completed'.
CONVERT DATE ls_order_completed-erdat TIME ls_order_completed-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_order_completed-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 11. Return Order Item Rejected
SELECT vbeln, erdat, erzet, ernam FROM vbap
INTO TABLE @DATA(lt_items_rejected)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND abgru IS NOT NULL AND abgru <> ''.
LOOP AT lt_items_rejected INTO DATA(ls_item_rejected).
ls_event_log-returncaseid = ls_item_rejected-vbeln.
ls_event_log-activityname = 'Return Order Item Rejected'.
CONVERT DATE ls_item_rejected-erdat TIME ls_item_rejected-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_item_rejected-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
ENDIF.
" =======================================================================
" OUTPUT
" =======================================================================
cl_salv_table=>factory(
IMPORTING
r_salv_table = DATA(lo_alv)
CHANGING
t_table = lt_event_log ).
lo_alv->display( ). Stappen
- Vereisten: Zorg dat je een databasegebruiker hebt met leestoegang tot de benodigde SAP ECC-tabellen. Dit zijn onder meer tabellen uit de modules Sales and Distribution (SD), Materials Management (MM) en Financial Accounting (FI). Je hebt een geschikte SQL-client nodig, zoals DBeaver, SAP HANA Studio of Oracle SQL Developer, om verbinding te maken met de database.
- Systeemspecifieke gegevens bepalen: Bepaal voordat je de query uitvoert welke documenttypen in je organisatie voor retouren worden gebruikt. In de query staat de tijdelijke aanduiding
[YOUR_RETURN_ORDER_TYPES]. Vervang deze door de juiste waarden, bijvoorbeeld 'RE' voor standaardretouren. - Query voorbereiden: Kopieer de volledige SQL-query uit het onderdeel 'query' naar je SQL-client.
- Parameters instellen: Zoek aan het begin van de query de Common Table Expression (CTE) met de naam
BaseReturnOrders. Pas deWHERE-clausule aan om het gewenste datumbereik op te geven door[START_DATE]en[END_DATE]te vervangen. Werk de lijst met retourordertypen bij en filter zo nodig op een specifieke bedrijfscode (BUKRS_VF). - Query uitvoeren: Voer de aangepaste query uit op de SAP ECC-database. De uitvoeringstijd hangt af van het gekozen datumbereik en de omvang van de database.
- Ruwe data controleren: Controleer de uitvoer zodra de query klaar is. Kijk of de kolommen
ReturnCaseId,ActivityNameenEventTimezijn gevuld en of er data voor meerdere activiteiten is. - Exporteren naar CSV: Exporteer de volledige resultatenset vanuit je SQL-client naar een CSV-bestand. Gebruik UTF-8-codering, zodat alle tekens correct worden opgeslagen.
- Klaarmaken voor upload: Open het CSV-bestand en controleer of de kolomkoppen exact overeenkomen met de vereiste attributen:
ReturnCaseId,ActivityName,EventTime,SourceSystemenzovoort. Pas de koppen aan als je SQL-client ze tijdens het exporteren heeft gewijzigd. - Uploaden: Upload het opgeschoonde CSV-bestand naar ProcessMind om de data te analyseren.
Configuratie
- Retourdocumenttypen: Stel de query in met de specifieke verkoopdocumenttypen die in je SAP-systeem voor retourorders worden gebruikt. Vervang hiervoor de tijdelijke aanduiding
[YOUR_RETURN_ORDER_TYPES]. Veelgebruikte voorbeelden zijn 'RE' en aangepaste 'Z'-typen. - Datumbereik: Stel een geschikt datumbereik in voor de extractie. Voor een eerste analyse wordt meestal 3 tot 6 maanden aan data aangeraden. Gebruik hiervoor de tijdelijke aanduidingen
[START_DATE]en[END_DATE]in de notatie 'YYYYMMDD'. - Bedrijfscode: Als je organisatie meerdere bedrijfscodes gebruikt, filter dan de data voor een gerichte analyse. Voeg in de eerste CTE bijvoorbeeld de filter
VBAK.BUKRS_VF = '[YOUR_COMPANY_CODE]'toe om de selectie te beperken. - SQL-dialect: De query gebruikt gangbare SQL-functies. Voor datum- en tijdconversies, zoals
TO_TIMESTAMP, en het samenvoegen van strings (CONCAT) kunnen kleine aanpassingen nodig zijn, afhankelijk van de database, bijvoorbeeld Oracle, HANA of DB2. - Vereiste autorisaties: De databasegebruiker heeft leestoegang nodig tot de volgende belangrijke tabellen: VBAK, VBAP, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG, BKPF, BSAD, QALS, QAVE, CDHDR en CDPOS.
a Voorbeeldquery sql
WITH BaseReturnOrders AS (
SELECT
VBAK.VBELN AS ReturnOrderNumber,
VBAP.POSNR AS ReturnOrderItemNumber
FROM VBAK
JOIN VBAP ON VBAK.VBELN = VBAP.VBELN
WHERE VBAK.AUART IN ('[YOUR_RETURN_ORDER_TYPES]') -- e.g., 'RE'
AND VBAK.ERDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- e.g., '20230101' and '20231231'
)
-- 1. Return Order Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(VBAK.ERDAT, VBAK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
VBAK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
UNION ALL
-- 2. Return Order Block Removed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Block Removed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON B.ReturnOrderNumber = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBAK'
AND CDPOS.FNAME IN ('LIFSK', 'FAKSK')
AND CDPOS.VALUE_NEW = ''
AND CDPOS.VALUE_OLD <> ''
UNION ALL
-- 3. Return Delivery Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Delivery Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(LIKP.ERDAT, LIKP.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
LIKP.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN LIKP ON VBFA.VBELN = LIKP.VBELN
UNION ALL
-- 4. Goods Receipt Posted
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Goods Receipt Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(MKPF.CPUDT, MKPF.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
MKPF.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN LIPS ON VBFA.VBELN = LIPS.VBELN AND VBFA.POSNN = LIPS.POSNR
JOIN MSEG ON LIPS.VBELN = MSEG.LFBNR AND LIPS.POSNR = MSEG.LFPOS
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART IN ('651', '653', '655') -- Standard returns movement types
UNION ALL
-- 5. Usage Decision Made
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Usage Decision Made' AS "ActivityName",
TO_TIMESTAMP(CONCAT(QAVE.ADAT, QAVE.ATIM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
QAVE.AENAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN QALS ON VBFA.VBELN = QALS.VBELN AND VBFA.POSNN = QALS.POSNR -- Linking inspection lot to delivery item
JOIN QAVE ON QALS.PRUEFLOS = QAVE.PRUEFLOS
UNION ALL
-- 6. Credit Memo Request Created (assumes a separate doc, or can be the return order itself)
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Request Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CMR_VBAK.ERDAT, CMR_VBAK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CMR_VBAK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'K' -- 'K' is Credit Memo Request
JOIN VBAK AS CMR_VBAK ON VBFA.VBELN = CMR_VBAK.VBELN
UNION ALL
-- 7. Credit Memo Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(VBRK.ERDAT, VBRK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
VBRK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
WHERE VBRK.FKART IN ('[YOUR_CREDIT_MEMO_TYPES]') -- e.g., 'G2'
UNION ALL
-- 8. Credit Memo Posted To FI
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Posted To FI' AS "ActivityName",
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
BKPF.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
JOIN BKPF ON VBRK.VBELN = BKPF.AWKEY AND BKPF.AWTYP = 'VBRK'
UNION ALL
-- 9. Return Order Item Completed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Item Completed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON CONCAT(B.ReturnOrderNumber, LPAD(B.ReturnOrderItemNumber, 6, '0')) = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBUP'
AND CDPOS.FNAME = 'GBSTA'
AND CDPOS.VALUE_NEW = 'C'
UNION ALL
-- 10. Return Order Completed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Completed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON B.ReturnOrderNumber = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBUK'
AND CDPOS.FNAME = 'GBSTK'
AND CDPOS.VALUE_NEW = 'C'
UNION ALL
-- 11. Return Order Item Rejected
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Item Rejected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
CDPOS.VALUE_NEW AS "ReturnReason", -- Using rejection reason for this specific event
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON CONCAT(B.ReturnOrderNumber, LPAD(B.ReturnOrderItemNumber, 6, '0')) = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBAP'
AND CDPOS.FNAME = 'ABGRU'
AND CDPOS.VALUE_NEW <> ''
UNION ALL
-- 12. Credit Memo Cleared
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Cleared' AS "ActivityName",
TO_TIMESTAMP(BSAD.AUGDT, 'YYYYMMDD') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CLEAR_DOC.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
JOIN BSAD ON VBRK.VBELN = BSAD.VBELN
JOIN BKPF AS CLEAR_DOC ON BSAD.AUGBL = CLEAR_DOC.BELNR AND BSAD.BUKRS = CLEAR_DOC.BUKRS AND BSAD.GJAHR_AUGL = CLEAR_DOC.GJAHR; Klaar om aan de slag te gaan?
Gebruik deze template vandaag nog om data eenvoudiger te verzamelen en waardevolle inzichten in het retour- en terugbetalingsproces te krijgen.
Verbeter nu de verwerking van retouren en terugbetalingen
Maak de verwerking van retouren in SAP ECC efficiënter en verkort de doorlooptijd met 30%. Ga vandaag aan de slag.
Geen creditcard nodig. Binnen enkele minuten ingesteld.