Uw Inkoop tot Betaling - Inkooporder Data Template
Uw Inkoop tot Betaling - Inkooporder Data Template
- Aanbevolen attributen voor diepgaande analyse
- Cruciale activiteiten om te volgen binnen het proces
- Stapsgewijze begeleiding bij data-extractie
Van Inkoop tot Betaling - Inkooporder Attributes
| Naam | Omschrijving | ||
|---|---|---|---|
| Activiteit ActivityName | De naam van de bedrijfsgebeurtenis of stap die heeft plaatsgevonden in het inkooporderproces. | ||
| Omschrijving Dit attribuut beschrijft een specifieke actie of statuswijziging binnen de levenscyclus van de inkooporder, zoals 'Inkooporder aangemaakt', 'Inkooporder goedgekeurd' of 'Goederenontvangst geboekt'. De sequentie van deze activiteiten vormt de processtroom. Het analyseren van de sequentie en frequentie van activiteiten is de kern van process mining. Het helpt het daadwerkelijke proces te ontdekken, te vergelijken met het ontworpen model, knelpunten te identificeren (bijv. lange wachttijden na 'Factuur ontvangen') en herwerk te kwantificeren (bijv. herhaalde 'Inkooporder gewijzigd' activiteiten). Het belang Het definieert de processtappen, wat visualisatie en analyse van de end-to-end stroom, variantanalyse en knelpuntidentificatie mogelijk maakt. Vindplaats Doorgaans afgeleid uit een combinatie van tabellen en velden, zoals statusvelden in EKKO/EKPO of wijzigingsdocumentlogs in CDHDR/CDPOS, om belangrijke bedrijfsmijlpalen weer te geven. Voorbeelden Inkooporder AangemaaktInkooporder GoedgekeurdGoederenontvangst geboektFactuur ontvangen | |||
| Inkooporder PurchaseOrderNumber | De unieke identificatie voor de inkooporder (PO), die dient als de primaire case ID voor het volgen van de inkooplevenscyclus. | ||
| Omschrijving Het Inkoopordernummer is de centrale identificatie die alle gerelateerde activiteiten verbindt, van de initiële aanmaak tot de definitieve goederenontvangst en voltooiing. Het fungeert als de case-identifier voor process mining-analyse. Bij analyse maakt het groeperen van gebeurtenissen op dit nummer de reconstructie van het traject van elke individuele inkooporder mogelijk. Dit is essentieel voor het berekenen van doorlooptijden, het analyseren van procesvarianten en het identificeren van knelpunten of afwijkingen die specifiek zijn voor één order. Het belang Het is de essentiële sleutel om alle inkoopgebeurtenissen te verbinden tot één end-to-end proces, waardoor een gedetailleerde analyse van de levenscyclus van elke inkooporder mogelijk wordt. Vindplaats Dit attribuut is te vinden in de SAP S/4HANA tabel EKKO, veld EBELN. Voorbeelden 450001712345000171244500017125 | |||
| Tijdstip Gebeurtenis EventTime | De timestamp waarop de activiteit heeft plaatsgevonden. | ||
| Omschrijving Dit attribuut legt de exacte datum en tijd vast van elke activiteit in het proces. Het is fundamenteel voor alle tijdsgebonden analyses in process mining. Event Time wordt gebruikt om de activiteiten chronologisch te ordenen en zo de processtroom op te bouwen. Bovendien vormt het de basis voor het berekenen van alle op duur gebaseerde metrics, zoals doorlooptijden tussen activiteiten, wachttijden en verwerkingstijden, die cruciaal zijn voor prestatieanalyse en knelpuntidentificatie. Het belang Deze timestamp is cruciaal voor het correct ordenen van gebeurtenissen en het berekenen van alle prestatiemetrics, inclusief doorlooptijden, levertijden en wachttijden. Vindplaats Timestamp velden geassocieerd met specifieke activiteiten, zoals Aanmaakdatum (EKKO-AEDAT voor wijzigingen) of Boekingsdatum (MKPF-BUDAT voor goederenontvangsten). Vereist vaak het combineren van data uit meerdere tabellen. Voorbeelden 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Bronsysteem SourceSystem | Identificeert het bronsysteem waaruit de data is geëxtraheerd. | ||
| Omschrijving Dit attribuut specificeert het oorspronkelijke systeem voor de event data, bijvoorbeeld 'SAP S/4HANA Production' of 'SAP ECC'. In omgevingen met meerdere systemen is dit veld cruciaal voor data lineage, probleemoplossing en het garanderen dat data uit verschillende bronnen correct wordt geïnterpreteerd. Het helpt bij het begrijpen van de context van de data en kan worden gebruikt om analyse te filteren voor specifieke systeemomgevingen. Het belang Biedt essentiële context over de herkomst van de data, wat cruciaal is voor datagovernance, validatie en analyse in multisysteemlandschappen. Vindplaats Dit is doorgaans een statische waarde die tijdens het data-extractie-, transformatie- en laad (ETL)-proces wordt toegevoegd om de dataset te labelen met zijn oorsprong. Voorbeelden S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Laatste data-update LastDataUpdate | De timestamp waarop de data voor het laatst is ververst of geëxtraheerd uit het bronsysteem. | ||
| Omschrijving Dit attribuut geeft de recentheid aan van de geanalyseerde data. Het toont de datum en tijd van de meest recente data-extractie uit SAP S/4HANA. Het kennen van de laatste data-updatetijd is van vitaal belang voor gebruikers om de tijdigheid van hun analyse te begrijpen. Het helpt hen de bevindingen correct te interpreteren, wetende of zij naar real-time informatie kijken of naar een momentopname van een specifiek tijdstip, wat de relevantie beïnvloedt van eventuele acties die op basis van de analyse worden ondernomen. Het belang Informeert gebruikers over de actualiteit van de data, en zorgt ervoor dat zij de context en relevantie van hun analytische bevindingen begrijpen. Vindplaats Dit is een metadata timestamp toegevoegd tijdens het data-extractie-, transformatie- en laad (ETL)-proces. Voorbeelden 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Gebruiker UserName | De identificatie van de gebruiker die een specifieke activiteit heeft uitgevoerd. | ||
| Omschrijving Dit attribuut legt de SAP gebruikers-ID vast die verantwoordelijk is voor het aanmaken, wijzigen of goedkeuren van een document. Het biedt traceerbaarheid voor acties die binnen het systeem zijn ondernomen. Analyse per gebruiker helpt bij het identificeren van trainingsbehoeften, werkdrukverdeling en individuele prestaties. Het kan bijvoorbeeld worden gebruikt om te zien of specifieke gebruikers consequent worden geassocieerd met lange goedkeuringstijden of frequente wijzigingen na goedkeuring, wat kan leiden tot initiatieven voor resourcebeheer en procesverbetering. Het belang Biedt verantwoording en maakt prestatieanalyse op individueel of teamniveau mogelijk, wat helpt bij het identificeren van trainingsmogelijkheden of capaciteitsbeperkingen. Vindplaats Deze informatie is te vinden in velden zoals ERNAM (Aangemaakt door) in EKKO of vanuit het gebruikersveld in wijzigingsdocumenttabellen (CDHDR-USERNAME). Voorbeelden CB9980000012JSMITHRROE | |||
| Gewenste leverdatum RequestedDeliveryDate | De `datum` waarop het `bedrijf` de `leverancier` verzocht de `goederen` of `diensten` te leveren. | ||
| Omschrijving Dit attribuut specificeert de overeengekomen streefleverdatum in de inkooporder. Het dient als de basis voor het meten van de leveringsprestaties van leveranciers. In process mining wordt deze datum vergeleken met de werkelijke goederenontvangstdatum ('Goederenontvangst geboekt' timestamp) om de 'Tijdige Levering Leverancier' KPI te berekenen. Het analyseren van afwijkingen van deze datum helpt bij het beoordelen van de betrouwbaarheid van leveranciers en het beheren van supply chain risico's. Het belang Dient als de basis voor het meten van de on-time leveringsprestaties van leveranciers, een cruciale KPI voor supply chain management en operationele planning. Vindplaats Dit is te vinden in de planningsregeltabel EKET, veld EINDT. Voorbeelden 2023-06-012023-06-152023-07-01 | |||
| Inkoopaanvraag PurchaseRequisitionNumber | De identificatie van de inkoopaanvraag (PR) die de inkooporder heeft geïnitieerd. | ||
| Omschrijving Dit attribuut koppelt de inkooporder terug aan de oorspronkelijke inkoopaanvraag. Niet alle inkooporders zullen een PR hebben als ze direct zijn aangemaakt. Deze koppeling is essentieel voor het analyseren van het volledige end-to-end inkoopproces, startend vanaf de initiële aanvraag. Het ondersteunt KPI's zoals 'Goedkeuringstijd Inkoopaanvraag' en is fundamenteel voor het identificeren van 'Ongeoorloofde Uitgaven', waarbij inkooporders worden aangemaakt zonder een voorafgaande, goedgekeurde aanvraag. Het belang Koppelt de PO aan de initiële aanvraag, wat end-to-end procesanalyse en de identificatie van niet-compliant maverick spend mogelijk maakt. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKPO (Inkooporder postniveau), veld BANFN. Voorbeelden 1001005110010052 | |||
| Inkooporderdocumenttype DocumentType | Een classificatie die verschillende typen inkooporders onderscheidt, zoals standaard PO's, service PO's of voorraadtransportorders. | ||
| Omschrijving Het Documenttype is een belangrijk configuratie-element in SAP dat de processtroom, nummerreeks en velden voor een inkooporder regelt. Het stelt bedrijven in staat het inkoopproces aan te passen voor verschillende scenario's. Het analyseren van het proces per documenttype is cruciaal voor het begrijpen van procesvariaties. Zo kan het proces voor een standaard goederen-inkooporder aanzienlijk verschillen van een service-inkooporder of een voorraadoverdracht. Dit attribuut maakt het filteren en vergelijken van deze afzonderlijke processtromen mogelijk om specifieke verbetermogelijkheden te vinden. Het belang Het categoriseert inkooporders, maakt de vergelijking van verschillende inkoopprocessen mogelijk en helpt variaties in processtromen en doorlooptijden te verklaren. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKKO, veld BSART. Voorbeelden NBFOUB | |||
| Totaal nettobedrag TotalNetAmount | De totale waarde van de inkooporder, exclusief belastingen en vrachtkosten. | ||
| Omschrijving Dit attribuut vertegenwoordigt de netto monetaire waarde van de inkooporder. Het is een belangrijk financieel cijfer dat de omvang van de inkooptransactie aangeeft. Dit bedrag is cruciaal voor financiële analyse, zoals het categoriseren van inkooporders op waarde (hoogwaardig versus laagwaardig) om te zien of hun procespaden verschillen. Het kan ook worden gebruikt om analyse te prioriteren, gericht op hoogwaardige orders die meer financieel risico met zich mee kunnen brengen of een grotere impact hebben op het bedrijf. Het belang Maakt financiële analyse mogelijk, door inkooporders op waarde te segmenteren en procesverbeteringsinspanningen te prioriteren op gebieden met hoge uitgaven. Vindplaats Dit attribuut is te vinden in de SAP S/4HANA tabel EKKO, veld NETWR. Voorbeelden 1500.0025000.50125.75 | |||
| Vendor ID VendorId | De unieke identificatie voor de leverancier of verkoper die de goederen of diensten levert. | ||
| Omschrijving De Leveranciers-ID is een cruciaal stuk master data dat een inkooporder koppelt aan een specifieke leverancier. Het wordt gedurende het gehele inkoopproces gebruikt voor communicatie, levering en betaling. In process mining maakt dit attribuut prestatieanalyse mogelijk die per leverancier kan worden gesegmenteerd. Het is essentieel voor dashboards zoals 'Prestaties Levertijd Leverancier' en 'Retourpercentage per Leverancier', wat helpt bij het identificeren van de meest betrouwbare leveranciers en degenen die vertragingen of kwaliteitsproblemen kunnen veroorzaken. Het belang Maakt leveranciersgerichte analyse mogelijk, wat helpt bij het evalueren van prestaties, het identificeren van goed- en slechtpresterende leveranciers en het optimaliseren van de supply chain. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKKO, veld LIFNR. Voorbeelden 100023100045100088 | |||
| `PO`-goedkeurings `cycle time` PoApprovalCycleTime | De berekende duur vanaf het moment dat een inkooporder werd aangemaakt tot het moment dat deze definitieve goedkeuring ontving. | ||
| Omschrijving Deze metric meet de verstreken tijd tussen de activiteit 'Inkooporder aangemaakt' en de activiteit 'Inkooporder goedgekeurd'. Het wordt berekend voor elke inkooporder case. Dit attribuut biedt een directe maatstaf voor interne goedkeuringsefficiëntie. Het is de primaire metric voor het 'Doorlooptijd goedkeuring inkooporder'-dashboard en KPI, wat helpt te identificeren waar vertragingen in het goedkeuringsproces optreden en mogelijkheden voor versnelling aan te wijzen. Het belang Meet direct de efficiëntie van het interne goedkeuringsproces, en helpt bij het identificeren en aanpakken van knelpunten die de inkoop vertragen. Vindplaats Berekend door het tijdsverschil te vinden tussen de 'Inkooporder goedgekeurd' event en de 'Inkooporder aangemaakt' event voor elke inkooporder. Voorbeelden P2D4H30MP0D2H15MP5D | |||
| Artikelcategorie ItemCategory | Classificeert een inkooporderregelitem, zoals standaard, consignatie, onderaanneming of service. | ||
| Omschrijving De Postcategorie bepaalt hoe de inkoop van een specifiek materiaal of een dienst wordt gecontroleerd en verwerkt. Het beïnvloedt daaropvolgende stappen zoals goederenontvangst en factuurverificatie. Dit attribuut is belangrijk voor het analyseren van procesvarianten op basis van wat wordt ingekocht. Zo verschilt het proces voor een service-item (waarvoor een service entry sheet nodig is) aanzienlijk van dat voor een standaard voorraadartikel. Analyse per postcategorie helpt deze verschillen te verklaren en maakt gerichte procesverbeteringen mogelijk. Het belang Verklaart procesvariaties door te onderscheiden tussen verschillende typen inkoop, zoals goederen, diensten of onderaanneming. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKPO, veld PSTYP. Voorbeelden 093 | |||
| Bedrijfscode CompanyCode | De identificatie van de juridische entiteit of het bedrijf waarvoor de inkooporder wordt aangemaakt. | ||
| Omschrijving De Bedrijfscode vertegenwoordigt een onafhankelijke boekhoudkundige eenheid binnen een organisatie. Alle financiële transacties gerelateerd aan een inkooporder worden geboekt op een specifieke bedrijfscode. Dit is een fundamenteel organisatorisch attribuut dat het filteren en vergelijken van inkoopprocessen tussen verschillende juridische entiteiten mogelijk maakt. Analyse per bedrijfscode kan inconsistenties in procesuitvoering, uiteenlopende efficiëntieniveaus of variërende compliancerates binnen de organisatie aan het licht brengen. Het belang Maakt procesanalyse mogelijk die gesegmenteerd kan worden per juridische entiteit, wat vergelijkingen van prestaties en compliance vergemakkelijkt over verschillende onderdelen van het bedrijf. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKKO, veld BUKRS. Voorbeelden 101017102000 | |||
| Inkoopgroep PurchasingGroup | De specifieke groep inkopers die verantwoordelijk is voor bepaalde inkoopactiviteiten. | ||
| Omschrijving Een Purchasing Group is een inkoper of een groep inkopers die verantwoordelijk zijn voor specifieke inkoopactiviteiten, materialen of leveranciers. Zij zijn het primaire contactpunt voor leveranciers. Dit attribuut maakt een meer granulaire analyse van werkdruk en prestaties mogelijk dan de inkooporganisatie. Het kan worden gebruikt om overbelaste teams te identificeren, de efficiëntie van verschillende inkoopgroepen te meten en te begrijpen welke groepen vatbaarder zijn voor procesafwijkingen zoals maverick spend. Het belang Biedt een gedetailleerd overzicht van de prestaties van de inkoopgroep, wat analyse van werkdruk, efficiëntie en procesnaleving op teamniveau mogelijk maakt. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKKO, veld EKGRP. Voorbeelden 001002N00 | |||
| Inkooporganisatie PurchasingOrganization | De organisatorische eenheid die verantwoordelijk is voor het inkopen van materialen en diensten en het onderhandelen met leveranciers. | ||
| Omschrijving De Inkooporganisatie is een belangrijke organisatorische eenheid in inkoop. Het kan gestructureerd zijn op concern-, bedrijfs- of fabrieksniveau en is verantwoordelijk voor alle inkoopactiviteiten. Het analyseren van het proces per inkooporganisatie helpt bij het evalueren van de efficiëntie en prestaties van verschillende inkoopteams of regio's. Het kan verschillen in leveranciersonderhandelingen, procesnaleving of goedkeuringsvertragingen tussen organisatorische eenheden aan het licht brengen. Het belang Maakt prestatievergelijking mogelijk tussen verschillende inkoopafdelingen of regio's, wat helpt bij het identificeren van best practices en gebieden voor verbetering. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKKO, veld EKORG. Voorbeelden 10101710US01 | |||
| Is herstelwerk IsRework | Een berekende vlag die aangeeft of de inkooporder rework heeft ondergaan, zoals een wijziging na goedkeuring of een goederenretour. | ||
| Omschrijving Dit Booleaanse attribuut wordt berekend door de sequentie van activiteiten voor elke inkooporder te analyseren. Het wordt gemarkeerd als 'true' als een 'Inkooporder gewijzigd'-gebeurtenis optreedt na een 'Inkooporder goedgekeurd'-gebeurtenis, of als een 'Goederen geretourneerd'-gebeurtenis aanwezig is. Deze vlag vereenvoudigt de berekening van de 'Straight-Through Processing Rate' KPI. Het maakt eenvoudig filteren en visualiseren mogelijk van alle inkooporders die handmatige interventie of correctie vereisten, wat helpt om de kosten en frequentie van herwerk te kwantificeren. Het belang Helpt de procesinefficiëntie te kwantificeren door gevallen met rework te markeren, wat cruciaal is voor het berekenen van straight-through processing-percentages en het identificeren van grondoorzaken van afwijking. Vindplaats Berekend veld gebaseerd op de sequentie van activiteiten. Logica controleert of een 'Inkooporder gewijzigd' event volgt op een goedkeuring of dat een 'Goederen geretourneerd' event bestaat. Voorbeelden truefalse | |||
| Is ongeoorloofde uitgave IsMaverickSpend | Een berekende vlag die aangeeft of een inkooporder is aangemaakt zonder een voorafgaande, goedgekeurde inkoopaanvraag. | ||
| Omschrijving Deze Booleaanse vlag wordt afgeleid tijdens de dataverwerking. Deze wordt ingesteld op 'true' als een inkooporder geen bijbehorende inkoopaanvraag heeft of als de aanmaak van de inkooporder de standaard goedkeuringsworkflow omzeilt. Dit attribuut ondersteunt direct het 'Ongeoorloofde Uitgaven Identificatie'-dashboard en gerelateerde KPI's. Het helpt de omvang van niet-conform inkoopgedrag te kwantificeren, waardoor bedrijven specifieke afdelingen of gebruikersgroepen kunnen targeten om het inkoopbeleid en de controles te versterken. Het belang Identificeert direct niet-compliant inkoop, en helpt bij het kwantificeren van procesafwijkingen en het afdwingen van financiële controles en inkoopbeleid. Vindplaats Berekend veld gebaseerd op de afwezigheid van een waarde in 'PurchaseRequisitionNumber' voor specifieke documenttypen, of door de event-sequentie te analyseren. Voorbeelden truefalse | |||
| Materiaalnummer MaterialNumber | De identificatie voor het specifieke materiaal of goed dat wordt ingekocht. | ||
| Omschrijving Het Materiaalnummer is een unieke code die is toegewezen aan elke materiaalstamrecord in SAP. Het wordt gebruikt voor alle transacties met betrekking tot dat materiaal, inclusief inkoop, voorraadbeheer en verkoop. Analyse per materiaalnummer of materiaalgroep maakt grondstofgebaseerde analyse mogelijk. Het kan helpen identificeren of inkoopprocessen voor bepaalde typen materialen minder efficiënt zijn, langere levertijden hebben of gevoeliger zijn voor retouren, wat inzichten oplevert voor categoriebeheer. Het belang Maakt commodity-gebaseerde analyse mogelijk, wat helpt bij het identificeren van procesproblemen of leveranciersprestatieproblemen gerelateerd aan specifieke producten of materialen. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKPO, veld MATNR. Voorbeelden RM100-100FG210SERV-CONSULT | |||
| Tijdige levering door leverancier SupplierOnTimeDelivery | Een berekende vlag die aangeeft of de goederenontvangst is geboekt op of vóór de aangevraagde leverdatum. | ||
| Omschrijving Dit Booleaanse attribuut wordt afgeleid door de timestamp van de activiteit 'Goederenontvangst geboekt' te vergelijken met de 'Aangevraagde leveringsdatum'. Als de goederenontvangst op of vóór de aangevraagde datum is, wordt deze gemarkeerd als 'true'. Dit attribuut ondersteunt direct de 'Tijdige Levering Leverancier' KPI. Het vereenvoudigt de analyse door gebruikers in staat te stellen eenvoudig te filteren op tijdige of late leveringen, wat essentieel is voor leveranciersprestatiedashboards en leveranciersscorecarding. Het belang Meet direct de leveranciersbetrouwbaarheid, vormt de basis voor de on-time delivery KPI en maakt effectief leveranciersprestatiemanagement mogelijk. Vindplaats Berekend door de timestamp van de activiteit 'Goederenontvangst geboekt' te vergelijken met het 'RequestedDeliveryDate' attribuut. Voorbeelden truefalse | |||
| Vestiging Plant | De operationele faciliteit of locatie waarnaar de goederen worden geleverd of diensten worden verricht. | ||
| Omschrijving In SAP is een Plant een fysieke locatie waar goederen worden geproduceerd, opgeslagen of diensten worden uitgevoerd. Het is een sleutelelement voor logistiek en planning. Het segmenteren van procesanalyse per plant kan regionale of locatiespecifieke variaties in het inkoopproces onthullen. Het kan bijvoorbeeld aantonen of bepaalde plants langere levertijden ervaren of hogere percentages goederenretouren hebben, wat duidt op gelokaliseerde logistieke of kwaliteitscontroleproblemen. Het belang Maakt locatiegebaseerde analyse mogelijk, waarbij prestatieverschillen tussen verschillende operationele locaties, plants of magazijnen worden benadrukt. Vindplaats Dit attribuut bevindt zich in de SAP S/4HANA tabel EKPO, veld WERKS. Voorbeelden 10101710DE01 | |||
Van Inkoop tot Betaling - Inkooporder Activiteiten
| Activiteit | Omschrijving | ||
|---|---|---|---|
| Factuur ontvangen | Vertegenwoordigt de invoer van een leveranciersfactuur in het SAP-systeem, deze koppelend aan de corresponderende inkooporder. Dit is een expliciete financiële boeking die een boekhoudkundig document creëert. | ||
| Het belang Dit is een cruciale mijlpaal die het inkoopproces verbindt met het crediteurenproces. Het maakt analyse mogelijk van de tijd tussen goederenontvangst en factuurverwerking. Vindplaats Een accounting document wordt aangemaakt in tabel BKPF (header) en de regelitems bevinden zich in BSEG of het universal journal ACDOCA. Het document is gekoppeld aan de PO in tabel RSEG. Vastleggen Documentboekingsdatum (CPUDT) uit de accounting document header tabel BKPF. Gebeurtenistype explicit | |||
| Goederenontvangst geboekt | Vertegenwoordigt de fysieke ontvangst van goederen van de leverancier en de corresponderende invoer in het systeem. Dit is een expliciete transactie die de inkooporderhistorie bijwerkt. | ||
| Het belang Dit is een belangrijke mijlpaal die de levertijd van de leverancier beëindigt en het interne proces van factuurverificatie start. Het is essentieel voor het volgen van percentages van tijdige levering. Vindplaats Vastgelegd als een materiaaldocument in tabellen MKPF (kop) en MSEG (item), en gekoppeld in de inkooporderhistorietabel EKBE met een specifiek bewegingstype (bijv. 101). Vastleggen Boekingsdatum (BUDAT) uit de kop van het materiaaldocument (MKPF) gekoppeld via EKBE. Gebeurtenistype explicit | |||
| Inkoopaanvraag Aangemaakt | Deze activiteit markeert de formele aanvraag voor goederen of diensten, waarmee het inkoopproces wordt geïnitieerd. De gebeurtenis wordt expliciet vastgelegd wanneer een gebruiker een nieuw inkoopaanvraagdocument opslaat (bijv. met transactie ME51N). | ||
| Het belang Dit is het primaire startpunt voor veel inkooporderlevenscycli. Het analyseren van de tijd van deze gebeurtenis tot de aanmaak van de inkooporder helpt bij het identificeren van vertragingen in sourcing en interne verwerking. Vindplaats Vastgelegd in tabel EBAN (Inkoopaanvraag). De timestamp van de aanmaakgebeurtenis is te vinden in de wijzigingshistorietabellen CDHDR en CDPOS voor het EBAN-object. Vastleggen Event vastgelegd bij aanmaak van een document in de EBAN-tabel. Gebeurtenistype explicit | |||
| Inkoopaanvraag Goedgekeurd | Vertegenwoordigt de formele goedkeuring van een inkoopaanvraag door een manager of aangewezen goedkeurder. Dit wordt doorgaans afgeleid uit een statuswijziging in het aanvraagdocument, wat aangeeft dat het klaar is voor conversie naar een inkooporder. | ||
| Het belang Dit is een cruciale mijlpaal voor het volgen van goedkeuringscycli en het identificeren van knelpunten. Vertragingen hier hebben direct impact op hoe snel een inkooporder kan worden aangemaakt en naar een leverancier kan worden gestuurd. Vindplaats Afgeleid van de release statusvelden in de EBAN-tabel (bijv. FRGZU - Release indicator). De timestamp is afgeleid van de wijzigingsdocumenten (CDHDR/CDPOS) die vastleggen wanneer de definitieve release status werd ingesteld. Vastleggen Afgeleid van wijzigingslogs (CDHDR/CDPOS) voor release statusvelden in de EBAN-tabel. Gebeurtenistype inferred | |||
| Inkooporder Aangemaakt | Markeert de aanmaak van het officiële inkooporderdocument, dat met of zonder verwijzing naar een inkoopaanvraag kan worden aangemaakt. Dit is een expliciete gebeurtenis die wordt vastgelegd wanneer het inkooporderdocument voor het eerst in het systeem wordt opgeslagen. | ||
| Het belang Deze activiteit kan dienen als een alternatief startpunt voor het proces, met name voor analyse van ongeoorloofde inkoop. Het is een fundamentele gebeurtenis voor het volgen van de totale verwerkingstijd van inkooporders. Vindplaats Vastgelegd in de inkooporderkoptabel EKKO. De aanmaakdatum (AEDAT) en -tijd worden direct in deze tabel voor het document opgeslagen. Vastleggen Aanmaak-timestamp (AEDAT) in de EKKO-tabel voor het inkooporderdocument. Gebeurtenistype explicit | |||
| Inkooporder Goedgekeurd | Geeft aan dat de inkooporder alle benodigde interne goedkeuringen heeft ontvangen en is geautoriseerd voor vrijgave aan de leverancier. De gebeurtenis wordt afgeleid uit een statuswijziging in de vrijgavestrategie van de inkooporder. | ||
| Het belang Dit is een belangrijke mijlpaal voor het meten van goedkeuringsefficiëntie en herwerk na goedkeuring. Het analyseren van de tijd tussen de aanmaak en goedkeuring van de inkooporder benadrukt interne procesvertragingen. Vindplaats Afgeleid van de release indicator (FRGKE) in de EKKO-tabel. De timestamp wordt bepaald door te kijken naar de wijzigingshistorie (CDHDR/CDPOS) voor wanneer dit veld werd bijgewerkt naar de 'released' status. Vastleggen Afgeleid van wijzigingslogs voor het release indicator veld (FRGKE) in de EKKO-tabel. Gebeurtenistype inferred | |||
| Purchase Order voltooid | Deze activiteit betekent dat een inkooporderitem vanuit logistiek oogpunt als afgesloten wordt beschouwd. Het wordt afgeleid wanneer zowel de indicatoren 'Levering voltooid' als 'Definitieve factuur' zijn ingesteld. | ||
| Het belang Dit dient als het eindpunt voor de inkooporderlevenscyclusanalyse. Het meten van de tijd tot deze gebeurtenis biedt de end-to-end doorlooptijd voor inkoopoperaties. Vindplaats Afgeleid van statusvlaggen op de inkooporderitemtabel, EKPO. De event treedt op wanneer zowel de 'Levering voltooid' indicator (ELIKZ) als de 'Definitieve factuur' indicator (EREKZ) op 'true' zijn ingesteld. Vastleggen Afgeleid van wijzigingslogs wanneer EKPO-velden ELIKZ en EREKZ beide zijn gemarkeerd als voltooid. Gebeurtenistype inferred | |||
| `Inkooporder Verwijderd` | Vertegenwoordigt de annulering of logische verwijdering van een inkooporderpost of het gehele document. Dit wordt vastgelegd doordat een gebruiker een verwijderingsvlag op het document instelt. | ||
| Het belang Deze activiteit is een alternatief eindpunt voor het proces, wat duidt op een storing of annulering. Het analyseren waarom inkooporders worden verwijderd, kan problemen in vraagplanning of vereistenbepaling aan het licht brengen. Vindplaats Vastgelegd van de deletion indicator flag (LOEKZ) in de inkooporderheader (EKKO) of item (EKPO) tabellen. De timestamp is afgeleid van de wijzigingsdocumenten (CDHDR/CDPOS). Vastleggen Timestamp uit wijzigingsdocumenten (CDHDR/CDPOS) wanneer de verwijderingsvlag (LOEKZ) is ingesteld. Gebeurtenistype explicit | |||
| Dienstenbevestiging Ingevuld | Deze activiteit markeert de bevestiging dat een dienst gespecificeerd op een inkooporder is geleverd. Het wordt expliciet vastgelegd door de aanmaak van een service entry sheet. | ||
| Het belang Voor servicegebaseerde inkoop is dit het equivalent van een goederenontvangst. Het is cruciaal voor het bijhouden van serviceleveringstijdlijnen en het mogelijk maken van tijdige leveranciersbetalingen. Vindplaats Vastgelegd via de aanmaak van een service entry sheet, met data opgeslagen in tabellen ESSR (kop) en ESLL (regels). De aanmaakdatum dient als de timestamp. Vastleggen Aanmaakdatum van het Service Entry Sheet document in tabel ESSR. Gebeurtenistype explicit | |||
| Factuur betaald | Markeert de definitieve afwikkeling van de leveranciersfactuur via een betaalrun of handmatige betaling. Dit is een expliciete financiële transactie die een afstemmingsdocument creëert. | ||
| Het belang Hoewel technisch onderdeel van het betalingsproces, biedt het opnemen van deze activiteit een compleet beeld van de procure-to-pay cyclus. Het is cruciaal voor het analyseren van betalingstermijnen en prestaties. Vindplaats De betaling wordt vastgelegd als een afstemmingsdocument in BKPF/ACDOCA. De afstemmingsdatum (AUGDT) op de factuurregel in tabel BSEG of ACDOCA geeft de betaalgebeurtenis aan. Vastleggen Vrijgavdatum (AUGDT) van het factuurdocument, te vinden in BSEG of ACDOCA. Gebeurtenistype explicit | |||
| Goederen Geretourneerd | Geeft aan dat eerder ontvangen goederen zijn teruggestuurd naar de leverancier, doorgaans vanwege kwaliteitsproblemen, schade of onjuiste zendingen. Dit wordt vastgelegd als een expliciete omboeking van de goederenbeweging. | ||
| Het belang Deze activiteit benadrukt herwerk en potentiële problemen met leverancierskwaliteit of ordernauwkeurigheid. Een hoge frequentie van retouren voor een specifieke leverancier of materiaal signaleert een probleem. Vindplaats Vastgelegd als een materiaaldocument met een specifiek retourbewegingstype (bijv. 122). De gebeurtenis wordt gelogd in MKPF/MSEG en gekoppeld aan de inkooporder in de EKBE-historietabel. Vastleggen Boekingsdatum uit het materiaaldocument met een retourbewegingstype in EKBE. Gebeurtenistype explicit | |||
| Inkooporder Gewijzigd | Deze activiteit geeft aan dat een wijziging is aangebracht in de inkooporder na de initiële aanmaak, zoals een wijziging in hoeveelheid, prijs of leveringsdatum. Het wordt expliciet vastgelegd in systeemwijzigingslogboeken. | ||
| Het belang Het volgen van wijzigingen, vooral na goedkeuring, is cruciaal voor het identificeren van procesinefficiënties, herwerk en potentiële complianceproblemen. Frequente wijzigingen kunnen wijzen op slechte initiële specificaties. Vindplaats Vastgelegd in de wijzigingsdocumenttabellen CDHDR (kop) en CDPOS (item) voor inkooporderobjecten (EINKBELEG). Elke wijziging creëert een gedetailleerde logvermelding. Vastleggen Event gelogd voor wijzigingen in sleutelvelden in de EKKO- of EKPO-tabellen, vastgelegd in CDHDR/CDPOS. Gebeurtenistype explicit | |||
| Inkooporder naar Leverancier Verzonden | Vertegenwoordigt het moment waarop de inkooporder aan de leverancier wordt gecommuniceerd, bijvoorbeeld via EDI, e-mail of print. Deze gebeurtenis wordt vaak vastgelegd via de output management logs van het systeem. | ||
| Het belang Deze activiteit is de ware start van de levertijd van de leverancier. Het is cruciaal voor het nauwkeurig meten van de leveranciersprestaties vanaf het moment dat zij de order ontvangen. Vindplaats Vastgelegd uit de output control tabel NAST, die berichten logt die zijn verzonden voor een inkoopdocument. De datum en tijd van het relevante output type (bijv. EDI, e-mail) kunnen worden gebruikt. Vastleggen Timestamp van het eerste succesvolle outputbericht voor de inkooporder in de NAST tabel. Gebeurtenistype inferred | |||
Extractie Guides
Stappen
- Vereisten en toegang: Zorg ervoor dat u een gebruiker heeft met de juiste autorisaties om Core Data Services (CDS) views in het SAP S/4HANA-systeem te bevragen. Toegang kan via SAP HANA Studio, ABAP Development Tools (ADT) voor Eclipse, of een externe data-extractietool die SQL-verbindingen met de SAP HANA-database ondersteunt.
- Systeemverbindingsdetails identificeren: Verkrijg de benodigde verbindingsparameters voor uw SAP S/4HANA-systeem, inclusief de host, het instancenummer en uw authenticatiegegevens.
- Verbinden met de database: Maak met uw voorkeurs-SQL-client een verbinding met de SAP S/4HANA-database waar de CDS views zich bevinden.
- De SQL-query voorbereiden: Kopieer de complete SQL-query uit de query-sectie van dit document naar uw SQL-editor. Deze query is ontworpen om alle vereiste activiteiten en attributen te extraheren.
- Filterparameters instellen: Zoek de placeholder-waarden binnen de query. Vervang _start_date en _end_date door het gewenste datumbereik voor uw analyse (bijv. '20230101' en '20231231'). Wijzig het poh.CompanyCode-filter om de specifieke bedrijfscodes op te nemen die u wilt analyseren.
- De query uitvoeren: Voer de gewijzigde SQL-query uit op de S/4HANA-database. Afhankelijk van het datavolume en het opgegeven datumbereik kan deze uitvoering enige tijd in beslag nemen.
- Voorlopige resultaten bekijken: Zodra de query is voltooid, voert u een snelle controle uit van de output in uw SQL-client. Controleer op de aanwezigheid van verschillende activiteiten, zorg ervoor dat timestamps correct zijn ingevuld en controleer of de case ID (PurchaseOrderNumber) consistent is.
- De data exporteren: Exporteer de complete resultatenset vanuit uw SQL-tool naar een CSV (Comma Separated Values) bestand. Zorg ervoor dat het bestand UTF-8-codering gebruikt om tekenproblemen te voorkomen.
- Voorbereiden op upload: Voordat u uploadt naar ProcessMind, opent u het CSV-bestand en controleert u of de kolomkoppen exact overeenkomen met de attributen die zijn gedefinieerd in de datavereisten (PurchaseOrderNumber, ActivityName, EventTime, etc.). Pas kolomnamen aan als uw exporttool deze heeft gewijzigd.
- Uploaden naar ProcessMind: Upload het definitieve CSV-bestand naar uw ProcessMind-project. Wijs de kolommen in uw bestand toe aan de overeenkomstige case ID-, activiteits- en timestamp-velden tijdens het importproces.
Configuratie
- Gebruikte belangrijke CDS Views: De extractielogica vertrouwt op een set standaard, semantisch rijke CDS views. De primaire views omvatten:
- I_PurchaseOrderItemAPI01: Voor kerngegevens van inkooporderartikelen.
- I_PurchaseRequisitionItemAPI01: Voor details van inkoopaanvragen.
- I_MaterialDocumentItem: Voor goederenbewegingen zoals ontvangsten en retouren.
- I_ServiceEntrySheetAPI01: Voor servicebevestigings-events.
- I_SupplierInvoiceAPI01: Voor informatie over leveranciersfacturen.
- I_OperationalAcctgDocItem: Voor het koppelen van facturen aan financiële documenten voor betalingsopvolging.
- I_ChangeDocument: Voor het vastleggen van wijzigingen in de inkooporder.
- Filtering op datumbereik: Het is cruciaal om een datumbereikfilter toe te passen om de prestaties en het datavolume te beheren. De query gebruikt placeholders _start_date en _end_date voor de aanmaakdatum van de inkooporder (PurchaseOrderDate). Een aanbevolen startbereik is 3 tot 6 maanden data.
- Organisatorische filtering: De query moet altijd worden gefilterd op CompanyCode om de reikwijdte van de extractie te beperken tot relevante bedrijfseenheden. Aanvullende filters op PurchaseOrderType of PurchasingOrganization kunnen worden toegevoegd aan de hoofd PO_base common table expression voor verdere verfijning.
- Vereisten: De gebruiker die de query uitvoert, vereist SELECT-autorisatie voor alle bovengenoemde CDS views. Toegang tot deze views wordt doorgaans verleend via specifieke bedrijfs- of analyserollen in S/4HANA. Zonder de juiste machtigingen zal de query mislukken.
a Voorbeeldquery sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Stappen
- Vereisten en toegang: Zorg ervoor dat u een gebruiker heeft met de juiste autorisaties om Core Data Services (CDS) views in het SAP S/4HANA-systeem te bevragen. Toegang kan via SAP HANA Studio, ABAP Development Tools (ADT) voor Eclipse, of een externe data-extractietool die SQL-verbindingen met de SAP HANA-database ondersteunt.
- Systeemverbindingsdetails identificeren: Verkrijg de benodigde verbindingsparameters voor uw SAP S/4HANA-systeem, inclusief de host, het instancenummer en uw authenticatiegegevens.
- Verbinden met de database: Maak met uw voorkeurs-SQL-client een verbinding met de SAP S/4HANA-database waar de CDS views zich bevinden.
- De SQL-query voorbereiden: Kopieer de complete SQL-query uit de query-sectie van dit document naar uw SQL-editor. Deze query is ontworpen om alle vereiste activiteiten en attributen te extraheren.
- Filterparameters instellen: Zoek de placeholder-waarden binnen de query. Vervang _start_date en _end_date door het gewenste datumbereik voor uw analyse (bijv. '20230101' en '20231231'). Wijzig het poh.CompanyCode-filter om de specifieke bedrijfscodes op te nemen die u wilt analyseren.
- De query uitvoeren: Voer de gewijzigde SQL-query uit op de S/4HANA-database. Afhankelijk van het datavolume en het opgegeven datumbereik kan deze uitvoering enige tijd in beslag nemen.
- Voorlopige resultaten bekijken: Zodra de query is voltooid, voert u een snelle controle uit van de output in uw SQL-client. Controleer op de aanwezigheid van verschillende activiteiten, zorg ervoor dat timestamps correct zijn ingevuld en controleer of de case ID (PurchaseOrderNumber) consistent is.
- De data exporteren: Exporteer de complete resultatenset vanuit uw SQL-tool naar een CSV (Comma Separated Values) bestand. Zorg ervoor dat het bestand UTF-8-codering gebruikt om tekenproblemen te voorkomen.
- Voorbereiden op upload: Voordat u uploadt naar ProcessMind, opent u het CSV-bestand en controleert u of de kolomkoppen exact overeenkomen met de attributen die zijn gedefinieerd in de datavereisten (PurchaseOrderNumber, ActivityName, EventTime, etc.). Pas kolomnamen aan als uw exporttool deze heeft gewijzigd.
- Uploaden naar ProcessMind: Upload het definitieve CSV-bestand naar uw ProcessMind-project. Wijs de kolommen in uw bestand toe aan de overeenkomstige case ID-, activiteits- en timestamp-velden tijdens het importproces.
Configuratie
- Gebruikte belangrijke CDS Views: De extractielogica vertrouwt op een set standaard, semantisch rijke CDS views. De primaire views omvatten:
- I_PurchaseOrderItemAPI01: Voor kerngegevens van inkooporderartikelen.
- I_PurchaseRequisitionItemAPI01: Voor details van inkoopaanvragen.
- I_MaterialDocumentItem: Voor goederenbewegingen zoals ontvangsten en retouren.
- I_ServiceEntrySheetAPI01: Voor servicebevestigings-events.
- I_SupplierInvoiceAPI01: Voor informatie over leveranciersfacturen.
- I_OperationalAcctgDocItem: Voor het koppelen van facturen aan financiële documenten voor betalingsopvolging.
- I_ChangeDocument: Voor het vastleggen van wijzigingen in de inkooporder.
- Filtering op datumbereik: Het is cruciaal om een datumbereikfilter toe te passen om de prestaties en het datavolume te beheren. De query gebruikt placeholders _start_date en _end_date voor de aanmaakdatum van de inkooporder (PurchaseOrderDate). Een aanbevolen startbereik is 3 tot 6 maanden data.
- Organisatorische filtering: De query moet altijd worden gefilterd op CompanyCode om de reikwijdte van de extractie te beperken tot relevante bedrijfseenheden. Aanvullende filters op PurchaseOrderType of PurchasingOrganization kunnen worden toegevoegd aan de hoofd PO_base common table expression voor verdere verfijning.
- Vereisten: De gebruiker die de query uitvoert, vereist SELECT-autorisatie voor alle bovengenoemde CDS views. Toegang tot deze views wordt doorgaans verleend via specifieke bedrijfs- of analyserollen in S/4HANA. Zonder de juiste machtigingen zal de query mislukken.
a Voorbeeldquery sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Stappen
- Specificatie en ontwerp: Definieer de uiteindelijke datastructuur voor het event log bestand, inclusief alle vereiste en aanbevolen attributen. Documenteer de specifieke SAP-tabellen (bijv. EKKO, EKPO, EKBE, CDHDR, CDPOS, BKPF) die zullen worden gebruikt om data te sourcen voor elk van de 13 vereiste activiteiten.
- Programmacreatie: Navigeer in de SAP GUI naar de ABAP Editor met transactiecode SE38 of SE80. Creëer een nieuw uitvoerbaar programma, bijvoorbeeld Z_PM_PO_EXTRACT.
- Selectiescherm definiëren: Codeer het selectiescherm voor het rapport. Dit stelt gebruikers in staat de data te filteren die ze willen extraheren. Neem parameters op voor het aanmaakdatumbereik van de inkooporder (P_AEDAT), Bedrijfscode (P_BUKRS) en Inkoopdocumenttype (P_BSART).
- Datadeclaraties: Definieer de interne tabellen en datastructuren die nodig zijn voor het programma. Dit omvat een interne tabel voor de uiteindelijke event log die overeenkomt met de structuur die in de specificatiestap is gedefinieerd.
- Dataselectielogica implementeren: Schrijf de kern-ABAP-logica om data te selecteren voor elk van de 13 activiteiten. Dit omvat een reeks SELECT-statements op de relevante SAP-tabellen, waar nodig gekoppeld. Voor op wijzigingen gebaseerde events, lees uit de wijzigingslogtabellen CDHDR en CDPOS.
- Data transformeren en mappen: Voor elke opgehaalde record, wijs de SAP-tabelvelden toe aan de overeenkomstige kolommen in uw uiteindelijke event log interne tabel. Stel de ActivityName in op basis van de verwerkte event (bijv. 'Inkooporder aangemaakt'). Converteer datum- en tijdvelden naar een consistent timestamp-formaat voor EventTime.
- Event Data consolideren: Na het verwerken van alle 13 activiteitstypes, zorg ervoor dat alle data wordt verzameld in één enkele, uniforme interne tabel. Deze tabel vertegenwoordigt nu de complete event log voor de geselecteerde inkooporders.
- Bestandsoutput implementeren: Voeg functionaliteit toe om de uiteindelijke interne tabel naar een bestand te schrijven. De aanbevolen aanpak is om de
cl_gui_frontend_services=>gui_download-methode te gebruiken om gebruikers in staat te stellen het bestand als een CSV op hun lokale machine op te slaan, of gebruik OPEN DATASET om het op te slaan op de SAP-applicatieserver voor achtergrondverwerking. - Transactiecode aanmaken (optioneel): Om het programma gemakkelijk toegankelijk te maken voor zakelijke gebruikers, gebruikt u transactiecode SE93 om een custom transactiecode (bijv. ZPM_PO_EXTRACT) aan te maken die uw ABAP-programma uitvoert.
- Achtergrondtaak plannen: Voor grote datavolumes of geautomatiseerde extracties, gebruikt u transactiecode SM36 om het programma te plannen als een achtergrondtaak. Het uitvoerbestand zal worden geschreven naar het applicatieserverpad dat in de programmalogica is gespecificeerd.
Configuratie
- Selectiecriteria: Het programma moet selectieparameters bevatten om de data effectief te filteren. Belangrijke filters zijn:
- Datumbereik: Een verplicht datumbereik voor de aanmaakdatum van de inkooporder (EKKO-AEDAT). Het wordt aanbevolen om te beginnen met een periode van 3-6 maanden om het datavolume en de rapportprestaties te beheren.
- Bedrijfscode (BUKRS): Essentieel voor organisaties met meerdere juridische entiteiten om de extractieomvang te beperken.
- Inkoopdocumenttype (BSART): Maakt het filteren van specifieke PO-types mogelijk, zoals Standaard-inkooporder, Raamwerkovereenkomst of Voorraadtransportorder, om de analyse te richten.
- Lezen van wijzigingslogs: De extractie van activiteiten zoals 'Inkooporder goedgekeurd' of 'Inkooporder gewijzigd' berust op het lezen van de SAP-wijzigingslogtabellen (CDHDR, CDPOS). Dit kan resource-intensief zijn. De ABAP-logica moet worden geoptimaliseerd om alleen de benodigde objectklassen (EINKBELEG, BANF) en tabel-/veldcombinaties te selecteren.
- Autorisaties: De gebruiker of technische account die dit rapport uitvoert, vereist uitgebreide leesautorisaties voor tabellen in meerdere SAP-modules, waaronder Materials Management (MM), Financial Accounting (FI) en systeembrede tabellen. Dit omvat tabellen zoals EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR en CDPOS.
- Achtergronduitvoering: Voor extracties die meer dan een paar maanden data omvatten of die worden uitgevoerd in een systeem met een hoog transactievolume, moet het programma altijd op de achtergrond worden uitgevoerd om time-outs van dialoogprocessen te voorkomen.
a Voorbeeldquery abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log.