Datatemplate voor Record to Report - boekingen
Datatemplate voor Record to Report - boekingen
- Aanbevolen attributen voor een volledige analyse
- Belangrijke boekingsactiviteiten om bij te houden
- Praktische uitleg over data-extractie uit SAP ECC
Attributen voor Record to Report - boekingen
| Naam | Beschrijving | ||
|---|---|---|---|
| Activiteitsnaam ActivityName | De naam van de bedrijfsactiviteit of het event dat op een bepaald moment in het journaalpostproces plaatsvond. | ||
| Beschrijving De activiteitsnaam beschrijft een specifieke stap in de levenscyclus van een journaalpost, zoals ‘Journaalpost aangemaakt’, ‘Journaalpost goedgekeurd’ of ‘Journaalpost geboekt’. Dit attribuut wordt meestal afgeleid uit meerdere SAP-bronnen, waaronder transactiecodes (TCODE), wijzigingsdocumentlogs (tabellen CDHDR en CDPOS) en documentstatusvelden. Activiteiten analyseren is de kern van process mining. Je kunt er proceskaarten mee visualiseren, de tijd tussen stappen berekenen en herstelrondes opsporen, bijvoorbeeld wanneer ‘Journaalpost afgewezen’ wordt gevolgd door ‘Journaalpost gecorrigeerd’. Deze data vormt de basis voor dashboards over doorlooptijden, herstelwerkpercentages en procesvarianten. Waarom dit belangrijk is Dit bepaalt de stappen op de proceskaart, zodat je de workflow voor journaalposten kunt visualiseren, analyseren en optimaliseren. Waar vind je dit? Afgeleid uit verschillende bronnen, waaronder transactiecodes in BKPF (TCODE), documentstatus en workflowlogs in tabellen zoals SWW_WI2OBJ, of wijzigingsdocumenten in CDHDR en CDPOS. Voorbeelden Journaalpost aangemaaktJournaalpost goedgekeurdJournaalpost afgewezenJournaalpost geboekt | |||
| Eventtijd EventTime | De timestamp die aangeeft wanneer een specifieke activiteit of gebeurtenis voor de journaalpost plaatsvond. | ||
| Beschrijving Eventtijd geeft voor elke activiteit in het journaalpostproces de exacte datum en tijd. Deze data is nodig om tijdsgebonden metrieken te berekenen, zoals doorlooptijden, verwerkingstijden en vertragingen tussen stappen. De bron van de timestamp verschilt per activiteit. Het kan gaan om de aanmaakdatum en -tijd van het document (CPUDT/CPUTM) of om wijzigingstimestamps uit logs (CDHDR-UDATE/UTIME). Bij analyses wordt eventtijd gebruikt om events chronologisch te ordenen. Dat vormt de basis van de proceskaart. Eventtijd is nodig om alle tijdgerelateerde KPI’s te berekenen, zoals de gemiddelde doorlooptijd van een journaalpost, de gemiddelde goedkeuringstijd en de tijd tussen goedkeuring en boeking. Waarom dit belangrijk is Deze timestamp vormt de basis voor alle tijdsanalyses en maakt het mogelijk om doorlooptijden, tijdsduur en bottlenecks te berekenen. Waar vind je dit? Afkomstig uit verschillende velden, afhankelijk van de activiteit. Meestal gaat het om de aanmaaktimestamp (CPUDT, CPUTM) uit BKPF of wijzigingsdocumenttimestamps (UDATE, UTIME) uit CDHDR. Voorbeelden 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Journaalpost-ID JournalEntryId | De unieke identificatiecode van een financieel boekhoudkundig document, samengesteld uit de bedrijfscode, het documentnummer en het boekjaar. | ||
| Beschrijving De Journal Entry ID is de primaire case-ID om de levenscyclus van een journaalpost te volgen. Het is een samengestelde sleutel, meestal gevormd door de bedrijfscode (BUKRS), het documentnummer (BELNR) en het boekjaar (GJAHR) samen te voegen. Zo is de ID uniek binnen het hele SAP-systeem. Bij procesanalyse koppelt deze ID alle bijbehorende activiteiten, zoals aanmaken, parkeren, indienen, goedkeuren, afwijzen en boeken. Door de ID te volgen, kunnen we het volledige verloop van elke journaalpost in kaart brengen, doorlooptijden meten en procesafwijkingen of bottlenecks bij specifieke boekingen opsporen. Waarom dit belangrijk is Dit is de essentiële sleutel om een journaalpost vanaf het aanmaken tot en met de definitieve boeking te volgen. Zo kun je het volledige proces analyseren en varianten vergelijken. Waar vind je dit? Dit is een afgeleid attribuut, meestal samengesteld uit velden in de BKPF-tabel: bedrijfscode (BUKRS), documentnummer (BELNR) en boekjaar (GJAHR). Voorbeelden 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Bronsysteem SourceSystem | Het systeem waaruit de procesdata is gehaald. | ||
| Beschrijving Dit attribuut geeft aan waar de data vandaan komt, in dit geval uit een specifieke SAP ECC-instantie. Meestal is het een vaste waarde die tijdens de data-extractie wordt toegevoegd. Dit attribuut is eenvoudig, maar belangrijk in omgevingen met meerdere ERP-systemen of databronnen. Het maakt de herkomst van de data duidelijk en biedt de mogelijkheid om analyses op het bronsysteem te filteren of op te splitsen. Waarom dit belangrijk is Maakt de herkomst van data duidelijk en is belangrijk om de datakwaliteit te volgen, vooral wanneer er meerdere bronsystemen zijn. Waar vind je dit? Meestal een vaste waarde die tijdens de datatransformatie wordt toegevoegd om de specifieke SAP ECC-instantie aan te geven, bijvoorbeeld 'ECC_PROD_100'. Voorbeelden SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Laatste data-update LastDataUpdate | De timestamp die aangeeft wanneer de data voor het laatst uit het bronsysteem is gehaald of vernieuwd. | ||
| Beschrijving Dit attribuut registreert de datum en tijd waarop de data voor het laatst uit SAP ECC is opgehaald. Het is een metadataveld dat aangeeft hoe actueel de geanalyseerde data is. Bij elk process mining-dashboard of elke analyse is het belangrijk om te weten wanneer de data voor het laatst is bijgewerkt. Zo kunnen gebruikers de data beoordelen en weloverwogen beslissingen nemen. Het beantwoordt de vraag: ‘Hoe actueel is deze informatie?’ Waarom dit belangrijk is Laat gebruikers zien hoe actueel de data is, zodat ze weten op welke periode de analyse betrekking heeft en de resultaten goed kunnen beoordelen. Waar vind je dit? Dit metadataveld wordt tijdens het vernieuwen van de data aangemaakt en opgeslagen door de data-extractietool of het ETL-proces. Voorbeelden 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Bedrijfscode CompanyCode | De organisatie-eenheid die een zelfstandige juridische entiteit vertegenwoordigt waarvoor financiële overzichten worden opgesteld. | ||
| Beschrijving De bedrijfscode is een belangrijke organisatie-eenheid in SAP Financials. Deze vertegenwoordigt een juridisch zelfstandige onderneming en is een belangrijk veld in de kop van het journaalpostdocument. Met dit attribuut kun je procesanalyses per juridische entiteit uitsplitsen. Zo kun je procesprestaties, compliancepercentages en KPI-resultaten tussen verschillende onderdelen van het bedrijf vergelijken. Je ziet bijvoorbeeld of goedkeuringsvertragingen of veel terugboekingen alleen bij bepaalde bedrijfscodes voorkomen. Waarom dit belangrijk is Hiermee kun je procesprestaties tussen verschillende juridische entiteiten of bedrijfseenheden binnen de organisatie filteren en vergelijken. Waar vind je dit? Te vinden in veld BUKRS van de documentkopgegevenstabel BKPF. Voorbeelden 10002000US01DE01 | |||
| Boekingsdatum PostingDate | De datum waarop de transactie in het grootboek wordt geboekt en daarmee het financiële tijdvak bepaalt. | ||
| Beschrijving De boekingsdatum bepaalt in welk boekjaar en welke periode de journaalpost wordt verwerkt. Vanuit financieel en compliance-oogpunt is dit een belangrijke datum. De datum moet aansluiten op de planning voor de periodeafsluiting en voldoen aan de regelgeving. Bij process mining wordt deze datum gebruikt om compliance te volgen. Het dashboard voor compliancebewaking en de KPI voor naleving van compliance-eisen gebruiken dit attribuut om te controleren of boekingen in de juiste periode zijn verwerkt. Je kunt het ook gebruiken om trends in het aantal journaalposten door de tijd heen te analyseren. Waarom dit belangrijk is Belangrijk voor financiële rapportages en complianceanalyses, zodat boekingen in de juiste boekhoudperiode worden verwerkt. Waar vind je dit? Te vinden in veld BUDAT van de documentkopgegevenstabel BKPF. Voorbeelden 2023-10-312023-11-302024-01-15 | |||
| Documenttype DocumentType | Een classificatie voor boekhoudkundige documenten die bepaalt hoe ze worden verwerkt en opgeslagen. | ||
| Beschrijving Het documenttype onderscheidt verschillende soorten zakelijke transacties, zoals een grootboekboeking (SA), leveranciersfactuur (KR) of activaboeking (AA). Het wordt ingesteld tijdens de systeemconfiguratie en aan elke journaalpost toegewezen. Dit attribuut is belangrijk voor analyses, omdat je het proces ermee kunt uitsplitsen naar transactiesoort. Het dashboard ‘Doorvoer van journaalposten per type’ en de KPI ‘Gemiddelde doorlooptijd per type journaalpost’ zijn rechtstreeks afhankelijk van dit veld. Zo zie je of bepaalde soorten boekingen vaker vertraging oplopen, herstelwerk vragen of worden teruggedraaid. Waarom dit belangrijk is Hiermee kun je analyses uitsplitsen naar transactiesoort en nagaan of procesproblemen alleen bij bepaalde soorten journaalposten voorkomen. Waar vind je dit? Te vinden in veld BLART van de documentkopgegevenstabel BKPF. Voorbeelden SAKRREAA | |||
| Gebruiker User | De SAP-gebruikers-ID van de persoon die de journaalpost heeft aangemaakt of gewijzigd. | ||
| Beschrijving Dit attribuut legt de SAP-gebruikersnaam vast van degene die verantwoordelijk is voor een activiteit, zoals het aanmaken, parkeren of boeken van een document. De gegevens komen rechtstreeks uit de documentkop of wijzigingslogtabellen. Analyse van het attribuut Gebruiker helpt om de prestaties van teams en individuele medewerkers te begrijpen. Het ondersteunt het dashboard voor gebruikersproductiviteit, dat per gebruiker het aantal activiteiten en de verwerkingstijden bijhoudt. Ook zie je wie betrokken is bij herstelrondes, terugboekingen of complianceafwijkingen. Zo kun je gerichte training of procesverbeteringen inzetten. Waarom dit belangrijk is Geeft aan wie verantwoordelijk is voor elke activiteit. Zo kun je gebruikersprestaties, de verdeling van de werklast en herstelpatronen analyseren. Waar vind je dit? Meestal afkomstig uit de BKPF-tabel (veld USNAM voor de maker) of de CDHDR-tabel (veld USERNAME voor degene die de wijziging heeft aangebracht). Voorbeelden ABROWNCJONESDSMITH | |||
| Teruggedraaid IsReversed | Een booleaanse indicator die aangeeft of de journaalpost is teruggedraaid. | ||
| Beschrijving Deze vlag geeft aan of een boeking later is teruggedraaid met een ander boekhoudkundig document. In SAP is een teruggedraaid document gekoppeld aan het tegenboekingsdocument. Zo ontstaat een duidelijk auditspoor. Dit attribuut is belangrijk voor het dashboard ‘Analyse van tegenboekingen’ en de KPI ‘Percentage tegenboekingen’. Je kunt hiermee teruggedraaide boekingen apart bekijken en de oorzaken onderzoeken, zoals invoerfouten of een onjuiste boekingswijze. Zo kun je het aantal tegenboekingen terugdringen. Waarom dit belangrijk is Ondersteunt de analyse van tegenboekingen door boekingen te markeren die later zijn teruggedraaid. Zo kun je de oorzaken van fouten achterhalen en de datakwaliteit verbeteren. Waar vind je dit? Afgeleid van het veld Reversal Document number (STBLG) in de tabel BKPF. Als STBLG niet leeg is, is de vlag waar. Voorbeelden truefalse | |||
| Transactiecode TransactionCode | De SAP-transactiecode waarmee de journaalpost wordt aangemaakt of verwerkt. | ||
| Beschrijving De transactiecode (T-Code) is een unieke identificatiecode voor een specifieke functie of programma in SAP. Bij journaalposten geeft de code aan hoe de boeking is aangemaakt, bijvoorbeeld handmatig (FB01, F-02), via parkeren (FV50) of met een geautomatiseerde interface. Dit attribuut is waardevol voor het dashboard voor optimalisatie van handmatige activiteiten. Door de T-Code te analyseren, kun je handmatige en geautomatiseerde activiteiten onderscheiden, zien welke handmatige processen de meeste tijd kosten en mogelijkheden voor automatisering opsporen. Zo beperk je handmatig werk en verbeter je de efficiëntie. Waarom dit belangrijk is Helpt handmatige en geautomatiseerde processen te onderscheiden en mogelijkheden voor automatisering en processtandaardisatie op te sporen. Waar vind je dit? Te vinden in veld TCODE van de documentkopgegevenstabel BKPF. Voorbeelden FB01F-02FV50FBD1 | |||
| Goedkeuringstijd ApprovalTime | De tijd tussen het indienen van een boeking ter goedkeuring en het moment waarop deze wordt goedgekeurd of afgewezen. | ||
| Beschrijving Deze metriek meet de duur van het goedkeuringssubproces, dat vaak een groot deel van de totale doorlooptijd uitmaakt. De duur wordt berekend als het tijdsverschil tussen de activiteit ‘Boeking ingediend’ en de bijbehorende activiteit ‘Boeking goedgekeurd’ of ‘Boeking afgewezen’. Goedkeuringstijd is de belangrijkste metriek voor het dashboard ‘Prestaties van boekingsgoedkeuring’ en de KPI ‘Gemiddelde goedkeuringstijd van boekingen’. Door deze duur te analyseren, kun je bottlenecks in de goedkeuringsworkflow opsporen, de prestaties van goedkeurders meten en proceswijzigingen onderbouwen, zoals het aanpassen van goedkeuringsdrempels. Waarom dit belangrijk is Meet de duur van de goedkeuringsfase. Zo kun je vertragingen in de controle- en goedkeuringsworkflow opsporen en aanpakken. Waar vind je dit? Berekend door de timestamp van de gebeurtenis ‘Boeking ingediend’ af te trekken van die van de gebeurtenis ‘Boeking goedgekeurd’ of ‘Boeking afgewezen’. Voorbeelden P1DT2HPT4H15MP3D | |||
| Is geparkeerd IsParked | Een booleaanse vlag die aangeeft of de boeking als geparkeerd document is opgeslagen voordat deze werd geboekt. | ||
| Beschrijving Door een document te parkeren, kan een gebruiker een onvolledige boeking opslaan zonder dat deze invloed heeft op de financiële saldi. Een andere gebruiker kan de boeking daarna aanvullen of controleren voordat deze wordt geboekt. Deze vlag markeert boekingen die een parkeerfase hebben doorlopen. Door dit attribuut te analyseren, krijg je inzicht in het gebruik van de parkeerfunctie. Zo kun je zien of parkeren als informele controle wordt gebruikt en mogelijk vertraging veroorzaakt. Ook kun je de totale doorlooptijd analyseren en onderscheid maken tussen boekingen die meteen worden geboekt en boekingen die eerst worden geparkeerd. Waarom dit belangrijk is Markeert boekingen waarbij de parkeerfunctie is gebruikt. Dit kan vertraging veroorzaken of wijzen op een informele controle. Waar vind je dit? Afgeleid van het documentstatusveld (BSTAT) in tabel BKPF. De waarde ‘V’ geeft aan dat het document geparkeerd is. Voorbeelden truefalse | |||
| Is herstelwerk IsRework | Een booleaanse vlag die aangeeft of een boeking een herstelronde heeft doorlopen, bijvoorbeeld doordat deze is afgewezen en daarna gecorrigeerd. | ||
| Beschrijving Deze vlag markeert cases die afwijken van de ideale route en waarvoor herstel nodig was. De waarde wordt doorgaans waar als bij een boeking een reeks activiteiten voorkomt zoals ‘Boeking afgewezen’, gevolgd door ‘Boeking gecorrigeerd’. Dit attribuut is belangrijk voor het berekenen van de KPI ‘Percentage boekingen met herstelwerk’ en voor analyses in het dashboard ‘Percentage herstelwerk en afwijzingen’. Het helpt de omvang van inefficiëntie in het proces te meten en biedt een basis om de oorzaken van herstelwerk te onderzoeken, zoals onduidelijke vereisten of onvoldoende documentatie. Waarom dit belangrijk is Markeert boekingen die correctie nodig hadden. Zo kun je herstelwerk meten en de oorzaken ervan onderzoeken om het percentage boekingen dat in één keer goed gaat te verhogen. Waar vind je dit? Dit is een berekend attribuut, afgeleid uit de activiteitenreeks van een case. Er is sprake van een herstelronde als een afwijzings- of correctieactiviteit voorkomt. Voorbeelden truefalse | |||
| Kostenplaats CostCenter | Een organisatorische eenheid binnen een controllinggebied die aangeeft waar kosten worden gemaakt. | ||
| Beschrijving De kostenplaats is een belangrijk stamgegeven uit de module Controlling (CO) en wordt vaak toegewezen aan een boekingsregel. Hiermee houd je de kosten bij van een specifieke afdeling, functie of locatie. Met kostenplaatsen kun je het boekingsproces gedetailleerder analyseren. Zo zie je of bepaalde afdelingen meer herstelwerk veroorzaken, langere doorlooptijden hebben of vaker handmatige boekingen verwerken. Daarmee krijg je inzicht in de procesefficiëntie per afdeling. Waarom dit belangrijk is Maakt het mogelijk om procesprestaties per afdeling of functiegebied te analyseren en lokale inefficiënties op te sporen. Waar vind je dit? Staat in veld KOSTL van de documentregelstabel BSEG. Voorbeelden 4100CC_FINANCE_US10010101 | |||
| Reden voor tegenboeking ReversalReason | Een code die aangeeft waarom een boeking is teruggedraaid. | ||
| Beschrijving Wanneer een document wordt teruggedraaid, kan de gebruiker in SAP een redencode opgeven. Deze code geeft gestructureerde informatie over de reden voor de tegenboeking, bijvoorbeeld een onjuiste boekingsdatum of een invoerfout. Dit attribuut is een belangrijke invoer voor het dashboard ‘Analyse van tegenboekingen’. Door de meest voorkomende redenen te analyseren, kunnen organisaties structurele problemen in processen of hiaten in trainingen opsporen. Vervolgens kunnen ze gericht maatregelen nemen om fouten in de toekomst te voorkomen en het aantal tegenboekingen te verlagen. Waarom dit belangrijk is Geeft direct inzicht in de redenen voor tegenboekingen. Zo kun je gericht de oorzaken onderzoeken en toekomstige fouten voorkomen. Waar vind je dit? Staat in veld STGRD van de documentkopteksttabel BKPF. Voorbeelden 010205 | |||
| Totaalbedrag document TotalDocumentAmount | De totale waarde van de journaalpost in de documentvaluta. | ||
| Beschrijving Dit attribuut geeft de totale financiële waarde van de journaalpost weer. Meestal wordt deze berekend door de absolute waarden van alle debet- of creditregelitems van het document bij elkaar op te tellen. Een analyse op basis van financiële waarde kan belangrijke patronen aan het licht brengen. Boekingen met een hoge waarde kunnen bijvoorbeeld een andere, strengere goedkeuringsroute volgen. Je kunt dit attribuut gebruiken om analyses te filteren of uit te splitsen en te zien of doorlooptijden, afwijzingspercentages of goedkeuringsvertragingen samenhangen met het bedrag van de boeking. Waarom dit belangrijk is Maakt analyses van de financiële impact mogelijk, bijvoorbeeld door verwerkingstijden of afwijzingspercentages te vergelijken met de geldwaarde van journaalposten. Waar vind je dit? Dit is een berekend veld, afgeleid door het bedragveld (WRBTR of DMBTR) van alle regelitems in de BSEG-tabel voor een bepaalde journaalpost bij elkaar op te tellen. Voorbeelden 1500.0025000.75125.50 | |||
| Valutasleutel CurrencyKey | De valutacode voor de bedragen in de boeking. | ||
| Beschrijving Dit attribuut geeft aan in welke valuta de boeking is gedaan, bijvoorbeeld USD, EUR of JPY. Het biedt context bij de financiële bedragen in het document. Het is niet altijd een primaire dimensie voor analyse, maar wel belangrijk om geldbedragen goed te interpreteren. Bij internationale organisaties kun je hiermee ook analyses uitsplitsen om te zien of processen verschillen tussen boekingen in buitenlandse en lokale valuta. Waarom dit belangrijk is Biedt de nodige context bij alle geldbedragen, zodat je financiële gegevens correct kunt analyseren en interpreteren. Waar vind je dit? Staat in veld WAERS van de documentkopteksttabel BKPF. Voorbeelden USDEURGBPJPY | |||
Activiteiten voor Record to Report - boekingen
| Activiteit | Beschrijving | ||
|---|---|---|---|
| Journaalpost geboekt | Dit is de centrale activiteit waarbij de journaalpost officieel in het grootboek wordt opgenomen en de financiële overzichten beïnvloedt. SAP registreert dit expliciet wanneer de documentstatus op ‘geboekt’ wordt gezet en een boekingsdatum wordt toegewezen. | ||
| Waarom dit belangrijk is Dit is het belangrijkste meetpunt en geeft aan dat de journaalpost succesvol is verwerkt. De end-to-end-doorlooptijd wordt vaak tot dit moment gemeten. Dit event is ook belangrijk voor de analyse van de financiële afsluiting. Waar vind je dit? Dit wordt vastgesteld wanneer een document in de BKPF-tabel een boekingsdatum heeft (BKPF-BUDAT). Bij geparkeerde documenten komt dit overeen met het moment waarop de status BKPF-BSTAT verandert van 'V' naar leeg. De timestamp van de boeking is de invoerdatum BKPF-CPUDT. Vastleggen Stel vast wanneer BKPF-BSTAT verandert van 'V' naar leeg, of gebruik bij directe boekingen het aanmaak-event. Gebeurtenistype explicit | |||
| Journaalpost geparkeerd | Deze activiteit markeert het aanmaken van een journaalpost in een voorlopige status, voordat deze officieel in het grootboek wordt geboekt. SAP registreert dit expliciet wanneer een gebruiker een document opslaat met een parkeertransactie en de documentstatus op ‘geparkeerd’ zet. | ||
| Waarom dit belangrijk is Dit is een belangrijk startevent voor processen met controle en goedkeuring. Door de tijd tussen parkeren en boeken te analyseren, zie je vertragingen in de fasen vóór de boeking en tijdens de goedkeuring. Waar vind je dit? Dit event wordt vastgesteld aan de hand van de documentkopgegevenstabel BKPF. Een document geldt als geparkeerd wanneer het wordt aangemaakt met status BKPF-BSTAT = 'V'. De timestamp van het event is de aanmaakdatum en -tijd, BKPF-CPUDT en BKPF-CPUTM. Vastleggen Stel vast dat een document is aangemaakt in BKPF, waar BKPF-BSTAT de waarde 'V' heeft. Gebeurtenistype explicit | |||
| Journaalpost goedgekeurd | Deze activiteit markeert de definitieve goedkeuring van een journaalpost in een workflow, waarna deze kan worden geboekt. Het event wordt vastgelegd wanneer de laatste stap voor ‘vrijgeven’ of ‘goedkeuren’ in het workflowlog is afgerond. | ||
| Waarom dit belangrijk is Dit is een belangrijk meetpunt dat het goedkeuringsproces afsluit. De tijd tot deze activiteit is een belangrijke KPI voor de efficiëntie van goedkeuring. De tijd tussen dit event en de boeking meet de vertraging na goedkeuring. Waar vind je dit? Afgeleid van de voltooiingstimestamp van de laatste goedkeuringsstap in het SAP Business Workflow-log. Dit is de laatste goedkeuringshandeling voordat het document wordt geboekt of klaarstaat om te worden geboekt. Vastleggen Stel de voltooiing van de laatste stap voor ‘vrijgeven’ of ‘goedkeuren’ vast in de workflowlogs. Gebeurtenistype inferred | |||
| Journaalpost ingediend | Deze activiteit geeft aan dat de maker een geparkeerde journaalpost heeft afgerond en dat deze klaar is voor controle en goedkeuring. Meestal wordt dit vastgelegd wanneer een SAP Business Workflow-taak voor het geparkeerde document wordt gestart. | ||
| Waarom dit belangrijk is Dit markeert de overdracht van de maker naar de goedkeurder en start de meting van KPI’s voor de goedkeuringsdoorlooptijd. Het is een belangrijk meetpunt voor de efficiëntie van de goedkeuringsworkflow. Waar vind je dit? Afgeleid van de starttijd van de goedkeuringsworkflow die aan het financiële document is gekoppeld. Hiervoor moeten workflowlogtabellen zoals SWW_WI2OBJ worden geanalyseerd om de workflow voor de specifieke bedrijfscode, het documentnummer en het boekjaar te vinden. Vastleggen Stel het startevent vast van de workflow voor het geparkeerde document. Gebeurtenistype inferred | |||
| Journaalpost teruggedraaid | Deze activiteit markeert het terugdraaien van een eerder geboekte journaalpost. Een terugboeking is een nieuw boekhoudkundig document dat de oorspronkelijke boeking ongedaan maakt. | ||
| Waarom dit belangrijk is Dit event is belangrijk om de datakwaliteit en procesnauwkeurigheid te meten. Veel terugboekingen wijzen op structurele problemen bij de oorspronkelijke invoer of goedkeuring. Elke terugboeking betekent bovendien extra herstelwerk. Waar vind je dit? Dit event wordt vastgesteld in de kop van het oorspronkelijke document (BKPF-tabel). Wanneer een document wordt teruggedraaid, vult SAP het nummer van het terugboekingsdocument (BKPF-STBLG) en de reden voor terugboeking (BKPF-STGRD) in. De timestamp van het event is de boekingsdatum van het nieuwe terugboekingsdocument. Vastleggen Stel vast wanneer BKPF-STBLG is ingevuld op het oorspronkelijke document. De timestamp is de boekingsdatum van het terugboekingsdocument. Gebeurtenistype explicit | |||
| Boeking tussen bedrijfscodes vastgesteld | Een berekende activiteit die aangeeft dat een journaalpost meer dan één bedrijfscode raakt. Dit wordt vastgesteld door de regelitems van één financieel document te analyseren. | ||
| Waarom dit belangrijk is Transacties tussen bedrijfscodes kunnen complexere verwerkings- en goedkeuringsvereisten hebben. Door ze te herkennen, kun je hun doorlooptijden en procespaden apart analyseren en specifieke bottlenecks opsporen. Waar vind je dit? Berekend door de regelitemtabel BSEG voor een bepaald documentnummer (BELNR) te controleren. Als de regelitems meer dan één unieke bedrijfscode (BSEG-BUKRS) bevatten, gaat het om een boeking tussen bedrijfscodes. Vastleggen Controleer of er voor één BKPF-BELNR meerdere unieke waarden van BSEG-BUKRS zijn. Gebeurtenistype calculated | |||
| Documentatie toegevoegd | Deze activiteit staat voor het toevoegen van ondersteunende documenten, zoals facturen of spreadsheets, aan de journaalpost. Dit wordt niet als standaard boekhoudevent vastgelegd. Meestal wordt het afgeleid door te controleren of er bijlagen zijn aangemaakt die aan het boekingsdocument zijn gekoppeld. | ||
| Waarom dit belangrijk is Door deze activiteit te volgen, kun je controleren of het beleid voor documentatie wordt nageleefd. Vertraging bij het toevoegen van documenten kan een oorzaak zijn van lange goedkeuringscycli. Waar vind je dit? Dit event is lastig betrouwbaar als timestamp vast te leggen. Je kunt het mogelijk afleiden uit de bijlagetabellen van Generic Object Services (GOS), zoals SOOD, door de aanmaaktimestamp van de bijlage te koppelen aan de objectsleutel van de journaalpost. Vastleggen Leid het event af uit de aanmaaktimestamp van gekoppelde objecten in GOS-tabellen, zoals SOOD. Gebeurtenistype inferred | |||
| Geparkeerde journaalpost verwijderd | Dit staat voor het verwijderen van een geparkeerde journaalpost die nooit is geboekt. Dit kan gebeuren na een afwijzing of wanneer de boeking per ongeluk is aangemaakt. | ||
| Waarom dit belangrijk is Deze activiteit markeert een mislukte afloop van het proces. Door te analyseren waarom geparkeerde documenten worden verwijderd, kun je problemen opsporen, zoals dubbele boekingen of onduidelijkheid over het proces. Waar vind je dit? Dit event wordt vastgelegd wanneer de status van een geparkeerd document in de BKPF-tabel verandert. Het statusveld BKPF-BSTAT wordt bijgewerkt naar 'Z' (geparkeerd document verwijderd). De timestamp van de wijziging staat in de wijzigingsdocumentlogs (CDHDR). Vastleggen Stel vast wanneer BKPF-BSTAT wordt bijgewerkt naar 'Z'. Gebeurtenistype explicit | |||
| Handmatige invoer vastgesteld | Deze activiteit stelt vast of een journaalpost is aangemaakt via een handmatige online transactie of via een geautomatiseerde interface of batchproces. Dit is geen gebruikershandeling, maar een berekend attribuut op basis van systeemdata. | ||
| Waarom dit belangrijk is Het onderscheid tussen handmatige en geautomatiseerde boekingen is belangrijk voor gerichte procesverbetering. Handmatige processen zijn vaak het doel van initiatieven voor standaardisatie en automatisering. Waar vind je dit? Dit wordt berekend door velden in de documentkopgegevenstabel BKPF te analyseren. Transactiecodes (BKPF-TCODE) zoals 'FB01', 'FB50' of 'FV50' wijzen op handmatige invoer. Andere T-codes of specifieke namen voor batchinvoer (BKPF-AWKEY) wijzen mogelijk op automatisering. Vastleggen Leid dit af uit BKPF-TCODE of andere indicatoren van het bronsysteem in de documentkop. Gebeurtenistype calculated | |||
| Journaalpost aangemaakt | Dit staat voor het aanmaken van een journaalpost die direct wordt geboekt, zonder voorafgaande parkeerhandeling. SAP registreert dit wanneer een document wordt aangemaakt met een directe boekingstransactie. | ||
| Waarom dit belangrijk is Deze activiteit is een alternatief startpunt voor eenvoudige journaalpostprocessen waarvoor geen goedkeuringsworkflow nodig is. Zo kun je eenvoudige directe boekingen onderscheiden van complexere geparkeerde boekingen. Waar vind je dit? Dit event komt overeen met het aanmaken van een document in de BKPF-tabel waarbij de documentstatus BKPF-BSTAT leeg is (geboekt). De timestamp van het event is de aanmaakdatum, BKPF-CPUDT. Bij deze documenten vinden de events ‘Aangemaakt’ en ‘Geboekt’ gelijktijdig plaats. Vastleggen Stel vast dat een document is aangemaakt in BKPF, waar BKPF-BSTAT leeg is. Gebeurtenistype explicit | |||
| Journaalpost afgewezen | Deze activiteit geeft aan dat een journaalpost definitief is afgewezen en niet wordt geboekt. Dit is meestal een eindstatus in een goedkeuringsworkflow, waarna het geparkeerde document uiteindelijk wordt verwijderd. | ||
| Waarom dit belangrijk is Afwijzingen volgen is belangrijk voor kwaliteitsbeheer. Door de redenen en frequentie van afwijzingen te analyseren, kun je het percentage journaalposten dat in één keer goed is verbeteren. Waar vind je dit? Dit resultaat wordt vastgelegd in het SAP Business Workflow-log en staat voor een definitieve gebruikersbeslissing om af te wijzen, waarmee het proces eindigt. Het geparkeerde document kan daarna worden verwijderd. Vastleggen Stel de definitieve status ‘afgewezen’ vast in het workflowlog voor het document. Gebeurtenistype inferred | |||
| Journaalpost gecorrigeerd | Deze activiteit geeft aan dat de oorspronkelijke maker een geparkeerde journaalpost heeft aangepast nadat deze voor wijzigingen was teruggestuurd. Je kunt dit afleiden door wijzigingen aan het document vast te stellen na het event ‘Wijzigingen aan journaalpost gevraagd’. | ||
| Waarom dit belangrijk is Door correcties te volgen, zie je hoeveel tijd er aan herstelwerk wordt besteed. De tijd tussen een wijzigingsverzoek en de correctie laat zien hoe lang het duurt om problemen met ingediende boekingen op te lossen. Waar vind je dit? Afgeleid door de wijzigingsdocumentlogs (tabellen CDHDR en CDPOS) voor het geparkeerde document te analyseren. Een wijziging die na een afwijzing in de workflow is vastgelegd, betekent dat er een correctie is uitgevoerd. De timestamp komt uit de CDHDR-tabel. Vastleggen Stel een wijzigingslogregel in CDHDR/CDPOS vast die volgt op een afwijzing. Gebeurtenistype inferred | |||
| Regelitem van journaalpost vereffend | Deze activiteit staat voor de afstemming van een regelitem op een grootboekrekening die openstaande posten beheert, zoals een banktussenrekening. Dit gebeurt wanneer een regelitem met een ander item wordt gematcht en daarmee wordt afgesloten. | ||
| Waarom dit belangrijk is Bij processen zoals bankafstemming is de tijd die nodig is om posten te vereffenen een belangrijke KPI. Deze activiteit helpt de efficiëntie van afstemming en maandafsluiting te analyseren. Waar vind je dit? Dit event wordt vastgelegd in de regelitemtabel BSEG. Wanneer een regelitem is vereffend, zijn de velden voor de vereffeningsdatum (BSEG-AUGDT) en het vereffeningsdocument (BSEG-AUGBL) gevuld. De timestamp van het event is de vereffeningsdatum. Vastleggen Stel vast wanneer de vereffeningsdatum (BSEG-AUGDT) voor een regelitem is ingevuld. Gebeurtenistype explicit | |||
| Wijzigingen aan journaalpost gevraagd | Dit is het moment in de workflow waarop een goedkeurder de journaalpost heeft gecontroleerd en voor correctie heeft teruggestuurd naar de maker. Dit event wordt afgeleid uit workflowlogs met een gebruikersbeslissing als ‘afwijzen’ of ‘terugsturen’. | ||
| Waarom dit belangrijk is Deze activiteit is belangrijk om herstelrondes op te sporen, een belangrijke oorzaak van inefficiëntie en procesafwijkingen. Als dit event vaak voorkomt, kan dat wijzen op problemen met de kwaliteit van boekingen of onduidelijke eisen. Waar vind je dit? Dit event wordt afgeleid van de timestamp van een specifieke gebruikersbeslissing in het SAP Business Workflow-log die overeenkomt met ‘afwijzen’ of ‘terugsturen voor correctie’. Vastleggen Stel de timestamp vast van de beslissing ‘afwijzen’ of ‘herstelwerk’ in de workflowlogs. Gebeurtenistype inferred | |||
Extractiegidsen
Stappen
- Maak het ABAP-programma: Ga in het SAP-systeem naar transactiecode SE38 (ABAP Editor). Voer een naam in voor het nieuwe programma, bijvoorbeeld Z_PM_JE_EXTRACTION, en klik op Create. Geef het programma een passende titel en stel het programmatype in op ‘Executable Program’.
- Definieer het selectiescherm: Definieer het selectiescherm in de broncode van het programma. Hiermee kunnen gebruikers parameters opgeven, zoals een datumbereik voor het aanmaken van documenten, bedrijfsnummers en documenttypen, om de hoeveelheid te extraheren data te beperken.
- Declareer datastructuren: Definieer een interne tabelstructuur voor de uiteindelijke event log-data. Deze structuur moet alle vereiste velden bevatten: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate en aanbevolen attributen zoals User, CompanyCode en PostingDate.
- Implementeer de dataselectie: Schrijf de belangrijkste ABAP SQL-query’s om data voor elk van de 14 vereiste activiteiten te extraheren. Selecteer hiervoor data uit primaire tabellen zoals BKPF (Header) en BSEG (Line Item), wijzigingslogtabellen CDHDR en CDPOS, workflowtabellen zoals SWWLOGHIST en clearingtabellen zoals BSAS en BSAK.
- Extraheer geparkeerde en geboekte documenten: Selecteer voor gebeurtenissen ‘Boeking geparkeerd’ uit BKPF, waar de documentstatus (BSTAT) ‘V’ is. Selecteer voor gebeurtenissen ‘Boeking aangemaakt’ en ‘Boeking geboekt’ uit BKPF, waar de status leeg is. Dit geeft aan dat het om een normaal, geboekt document gaat.
- Extraheer wijzigings- en verwijderingsgebeurtenissen: Doorzoek de wijzigingsdocumenttabellen CDHDR en CDPOS op objectklasse ‘BELEG’. Filter op de documentsleutel om wijzigingen te vinden die horen bij de activiteiten ‘Boeking gecorrigeerd’ of ‘Geparkeerde boeking verwijderd’.
- Extraheer workflowgebeurtenissen: Doorzoek de workflowtabellen om activiteiten zoals ‘Boeking ingediend’, ‘Goedgekeurd’, ‘Afgewezen’ en ‘Wijzigingen aangevraagd’ vast te leggen. Gebruik tabel SWW_WI2OBJ om het boekhoudkundige document aan een workflow-instantie te koppelen. Lees vervolgens SWWLOGHIST uit voor specifieke gebruikersbeslissingen of statuswijzigingen.
- Bepaal berekende gebeurtenissen: Controleer voor ‘Handmatige boeking vastgesteld’ de transactiecode (BKPF-TCODE) aan de hand van een lijst met bekende handmatige transactiecodes. Analyseer voor ‘Boeking tussen bedrijfsnummers vastgesteld’ de boekingsregels in BSEG om te bepalen of er meerdere bedrijfsnummers bij het document betrokken zijn.
- Voeg data samen en zet deze om: Zet de data van elke activiteit om naar de uiteindelijke event log-structuur. Combineer Company Code, Document Number en Fiscal Year om JournalEntryId te maken. Zet SAP-datums en -tijden om naar één EventTime-timestamp. Voeg de resultaten van elke query toe aan de uiteindelijke interne tabel.
- Implementeer bestandsexport: Gebruik ABAP-instructies voor bestandsverwerking, zoals OPEN DATASET, LOOP AT, TRANSFER en CLOSE DATASET, om de samengevoegde interne tabel als CSV- of plat bestand op te slaan in een map op de SAP-applicatieserver. Je kunt het bestand bekijken via transactie AL11.
- Plan een achtergrondtaak: Ga naar transactie SM36 (Define Background Job). Maak een nieuwe taak aan, definieer een stap die je ABAP-programma uitvoert en stel een planning in, bijvoorbeeld elke nacht of wekelijks buiten piekuren. Zo verloopt de extractie automatisch.
- Haal het bestand op en maak het klaar: Gebruik transactie CG3Y of vraag je systeembeheerder om het gegenereerde bestand van de applicatieserver naar je computer te downloaden. Controleer of de codering en bestandsindeling geschikt zijn om het bestand naar je process mining-tool te uploaden.
Configuratie
- Datumbereik: Bepaal een datumbereik om de prestaties te bewaken. Gebruik de aanmaakdatum van het document (BKPF-CPUDT) als primair filter. Voor een eerste analyse wordt een periode van 3 tot 6 maanden aanbevolen. Gebruik voor tests een bereik van enkele dagen waarvan bekend is dat er data beschikbaar is.
- Filter op bedrijfsnummer: Filter altijd op bedrijfsnummer (BKPF-BUKRS). Data voor alle bedrijfsnummers tegelijk extraheren kan veel systeembronnen vergen. Begin met één of een kleine groep relevante bedrijfsnummers.
- Filter op documenttype: Gebruik het documenttypefilter (BKPF-BLART) om de selectie te beperken tot specifieke soorten boekingen, zoals ‘SA’ voor G/L-documenten. Doe dit als je niet alle documenttypen hoeft te analyseren.
- Workflowtaak-ID’s: De extractie van workflowgebeurtenissen is afhankelijk van de specifieke taak-ID’s die in je systeem worden gebruikt voor goedkeuring, afwijzing en indiening. Stel deze ID’s in de broncode van het programma in op basis van de workflowdefinities van je organisatie.
- Prestaties: Het programma koppelt meerdere grote tabellen, vooral CDPOS en de workflowgeschiedenistabellen. Uitvoering tijdens piekuren kan de systeemprestaties beïnvloeden. Plan het programma daarom altijd als achtergrondtaak buiten piekuren. Overweeg secundaire database-indexen aan te maken als de prestaties regelmatig een probleem vormen.
- Vereisten: Voor deze methode heb je een gebruiker nodig met ABAP-ontwikkelrechten (voor SE38) en rechten om achtergrondtaken aan te maken en te beheren (voor SM36). De gebruiker of taak moet ook leestoegang hebben tot alle relevante financiële, workflow- en systeemtabellen (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST enzovoort).
Voorbeeldquery abap
REPORT Z_PM_JE_EXTRACTION.
*&---------------------------------------------------------------------*
*& Data Structures for Final Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
journalentryid TYPE string,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
username TYPE uname,
companycode TYPE bukrs,
documenttype TYPE blart,
postingdate TYPE budat,
transactioncode TYPE tcode,
isreversed TYPE abap_bool,
END OF ty_event_log.
DATA: lt_final_log TYPE STANDARD TABLE OF ty_event_log.
DATA: ls_event TYPE ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen Parameters
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_blart FOR bkpf-blart,
s_cpudt FOR bkpf-cpudt OBLIGATORY.
PARAMETERS: p_sysid TYPE sy-sysid DEFAULT sy-sysid.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA(lv_last_update) = cl_abap_context_info=>get_system_timestamp( ).
" 1. Journal Entry Parked
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
'Journal Entry Parked' AS activityname,
a~cpudt, a~cputm,
a~usnam AS username,
a~bukrs AS companycode,
a~blart AS documenttype,
a~bldat AS postingdate,
a~tcode AS transactioncode
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~bstat = 'V' " Parked Document
INTO TABLE @DATA(lt_parked).
IF sy-subrc = 0.
LOOP AT lt_parked ASSIGNING FIELD-SYMBOL(<fs_parked>).
ls_event-journalentryid = <fs_parked>-journalentryid.
ls_event-activityname = <fs_parked>-activityname.
CONVERT DATE <fs_parked>-cpudt TIME <fs_parked>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_parked>-username.
ls_event-companycode = <fs_parked>-companycode.
ls_event-documenttype = <fs_parked>-documenttype.
ls_event-postingdate = <fs_parked>-postingdate.
ls_event-transactioncode = <fs_parked>-transactioncode.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 2. Journal Entry Created (directly posted, not parked first)
" 9. Journal Entry Posted
" These two events happen at the same time for a direct posting.
SELECT CONCAT( bukrs, belnr, gjahr ) AS journalentryid,
cpudt, cputm, usnam, bukrs, blart, budat, tcode, stblg
FROM bkpf
WHERE bukrs IN s_bukrs
AND blart IN s_blart
AND cpudt IN s_cpudt
AND bstat = '' " Normal, posted document
INTO TABLE @DATA(lt_posted).
IF sy-subrc = 0.
LOOP AT lt_posted ASSIGNING FIELD-SYMBOL(<fs_posted>).
" Activity: Journal Entry Created
ls_event-journalentryid = <fs_posted>-journalentryid.
ls_event-activityname = 'Journal Entry Created'.
CONVERT DATE <fs_posted>-cpudt TIME <fs_posted>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-sourcesystem = p_sysid.
ls_event-lastdataupdate = lv_last_update.
ls_event-username = <fs_posted>-usnam.
ls_event-companycode = <fs_posted>-bukrs.
ls_event-documenttype = <fs_posted>-blart.
ls_event-postingdate = <fs_posted>-budat.
ls_event-transactioncode = <fs_posted>-tcode.
ls_event-isreversed = COND #( WHEN <fs_posted>-stblg IS NOT INITIAL THEN abap_true ELSE abap_false ).
APPEND ls_event TO lt_final_log.
" Activity: Journal Entry Posted
ls_event-activityname = 'Journal Entry Posted'.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 3. Documentation Attached (via GOS)
SELECT a~instid_a, c~cr_timestamp
FROM srgbtbrel AS a
INNER JOIN sood AS b ON a~instid_b = b~objid
INNER JOIN socf AS c ON b~filid = c~filid
WHERE a~typeid_a = 'BKPF'
AND a~bukrs IN s_bukrs
INTO TABLE @DATA(lt_attachments).
IF sy-subrc = 0.
LOOP AT lt_attachments ASSIGNING FIELD-SYMBOL(<fs_attach>).
ls_event-journalentryid = |{ <fs_attach>-instid_a(4) }{ <fs_attach>-instid_a+4(10) }{ <fs_attach>-instid_a+14(4) }|.
ls_event-activityname = 'Documentation Attached'.
ls_event-eventtime = <fs_attach>-cr_timestamp.
" Other attributes may need to be looked up from BKPF if needed.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 4, 5, 6, 7, 8: Workflow events (Submitted, Changes Requested, Corrected, Approved, Rejected)
" This is a simplified example. Real logic depends on specific workflow templates.
SELECT a~instid, b~wi_cd, b~wi_ct, b~wi_aagent, b~wi_text
FROM sww_wi2obj AS a
INNER JOIN swwloghist AS b ON a~wi_id = b~wi_id
WHERE a~typeid = 'BKPF'
AND a~catid = 'BO'
AND a~bukrs IN s_bukrs
AND b~wi_cd BETWEEN s_cpudt-low AND s_cpudt-high
INTO TABLE @DATA(lt_workflow).
IF sy-subrc = 0.
LOOP AT lt_workflow ASSIGNING FIELD-SYMBOL(<fs_wf>).
ls_event-journalentryid = |{ <fs_wf>-instid(4) }{ <fs_wf>-instid+4(10) }{ <fs_wf>-instid+14(4) }|.
ls_event-activityname = CASE <fs_wf>-wi_text. " Simplified logic based on work item text
WHEN '[Placeholder for Submit Text]' THEN 'Journal Entry Submitted'
WHEN '[Placeholder for Approve Text]' THEN 'Journal Entry Approved'
WHEN '[Placeholder for Reject Text]' THEN 'Journal Entry Rejected'
WHEN '[Placeholder for Rework Text]' THEN 'Journal Entry Changes Requested'
ELSE ''
ENDCASE.
IF ls_event-activityname IS NOT INITIAL.
CONVERT DATE <fs_wf>-wi_cd TIME <fs_wf>-wi_ct INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_wf>-wi_aagent.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
ENDIF.
" 10. Manual Entry Identified & 11. Cross-Company Posting Identified
SELECT bukrs, belnr, gjahr, tcode FROM bkpf
WHERE bukrs IN s_bukrs AND blart IN s_blart AND cpudt IN s_cpudt
INTO TABLE @DATA(lt_calc_base).
LOOP AT lt_calc_base ASSIGNING FIELD-SYMBOL(<fs_calc>).
ls_event-journalentryid = |{ <fs_calc>-bukrs }{ <fs_calc>-belnr }{ <fs_calc>-gjahr }|.
" Check for manual entry T-Codes
IF <fs_calc>-tcode = 'FB01' OR <fs_calc>-tcode = 'F-02' OR <fs_calc>-tcode = 'FB50'.
ls_event-activityname = 'Manual Entry Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
" Check for cross-company posting
SELECT SINGLE bukrs FROM bseg WHERE belnr = <fs_calc>-belnr AND gjahr = <fs_calc>-gjahr AND bukrs <> <fs_calc>-bukrs INTO @DATA(lv_cross_bukrs).
IF sy-subrc = 0.
ls_event-activityname = 'Cross-Company Posting Identified'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 12. Journal Entry Line Item Cleared
SELECT a~bukrs, a~belnr, a~gjahr, a~augdt, a~augbl
FROM bsas AS a " G/L Cleared Items
WHERE a~bukrs IN s_bukrs
AND a~budat IN s_cpudt
INTO TABLE @DATA(lt_cleared_gl).
IF sy-subrc = 0.
LOOP AT lt_cleared_gl ASSIGNING FIELD-SYMBOL(<fs_clr>).
ls_event-journalentryid = |{ <fs_clr>-bukrs }{ <fs_clr>-belnr }{ <fs_clr>-gjahr }|.
ls_event-activityname = 'Journal Entry Line Item Cleared'.
CONVERT DATE <fs_clr>-augdt INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
" User is often not directly available for clearing events
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" 13. Parked Journal Entry Deleted & 6. Journal Entry Corrected
SELECT objectid, changenr, username, udate, utime FROM cdhdr
WHERE objectclas = 'BELEG'
AND udate IN s_cpudt
INTO TABLE @DATA(lt_cdhdr).
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
SELECT SINGLE tcode FROM cdpos WHERE changenr = <fs_cdhdr>-changenr AND fname = 'BSTAT' AND value_new = 'Z' INTO @DATA(lv_deleted_tcode).
ls_event-journalentryid = |{ <fs_cdhdr>-objectid(4) }{ <fs_cdhdr>-objectid+4(10) }{ <fs_cdhdr>-objectid+14(4) }|.
CONVERT DATE <fs_cdhdr>-udate TIME <fs_cdhdr>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_cdhdr>-username.
IF sy-subrc = 0.
ls_event-activityname = 'Parked Journal Entry Deleted'.
APPEND ls_event TO lt_final_log.
ELSE.
ls_event-activityname = 'Journal Entry Corrected'.
APPEND ls_event TO lt_final_log.
ENDIF.
ENDLOOP.
" 14. Journal Entry Reversal Processed
SELECT CONCAT( a~bukrs, a~belnr, a~gjahr ) AS journalentryid,
a~cpudt, a~cputm, a~usnam
FROM bkpf AS a
WHERE a~bukrs IN s_bukrs
AND a~blart IN s_blart
AND a~cpudt IN s_cpudt
AND a~stblg IS NOT NULL " Document is a reversal
INTO TABLE @DATA(lt_reversals).
IF sy-subrc = 0.
LOOP AT lt_reversals ASSIGNING FIELD-SYMBOL(<fs_rev>).
ls_event-journalentryid = <fs_rev>-journalentryid.
ls_event-activityname = 'Journal Entry Reversal Processed'.
CONVERT DATE <fs_rev>-cpudt TIME <fs_rev>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
ls_event-username = <fs_rev>-usnam.
APPEND ls_event TO lt_final_log.
ENDLOOP.
ENDIF.
" Final step: Output to file
DATA(lv_filename) = |/tmp/je_extraction_{ sy-datum }_{ sy-uzeit }.csv|.
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'JournalEntryId,ActivityName,EventTime,SourceSystem,LastDataUpdate,User,CompanyCode,DocumentType,PostingDate,TransactionCode,IsReversed'.
TRANSFER lv_header TO lv_filename.
LOOP AT lt_final_log INTO ls_event.
DATA(lv_line) = |"{ ls_event-journalentryid }","|
|{ ls_event-activityname }","|
|{ ls_event-eventtime }","|
|{ ls_event-sourcesystem }","|
|{ ls_event-lastdataupdate }","|
|{ ls_event-username }","|
|{ ls_event-companycode }","|
|{ ls_event-documenttype }","|
|{ ls_event-postingdate }","|
|{ ls_event-transactioncode }","|
|{ ls_event-isreversed }"|.
TRANSFER lv_line TO lv_filename.
ENDLOOP.
CLOSE DATASET lv_filename.
ENDIF. Stappen
- Maak verbinding met de database: Vraag inloggegevens met alleen-lezenrechten aan voor de SAP ECC-database. Gebruik een standaard SQL-client, zoals DBeaver, SAP HANA Studio of SQL Server Management Studio, om verbinding te maken.
- Bereid de SQL-query voor: Kopieer de volledige SQL-query uit het gedeelte ‘query’ van dit document naar je SQL-client.
- Stel de extractieparameters in: Stel de tijdelijke waarden in de query in voordat je deze uitvoert. Vervang ‘[START_DATE]’ en ‘[END_DATE]’ door het gewenste datumbereik in de notatie ‘YYYYMMDD’. Vervang ‘[COMPANY_CODE_1]’, ‘[COMPANY_CODE_2]’ door de SAP-bedrijfsnummers die je wilt analyseren.
- Geef het bronsysteem op: Vervang in de hoofd-
SELECT-instructie de tijdelijke waarde ‘[Your SAP System ID]’ door de werkelijke SAP System ID (SID), zodat de databron correct wordt geïdentificeerd. - Voer de query uit: Voer de ingestelde SQL-query uit op de SAP-database. De uitvoeringstijd hangt af van het datumbereik en de omvang van de databasetabellen.
- Controleer de eerste resultaten: Bekijk na afloop kort de rijen in de resultaten om te controleren of de data naar verwachting is ingevuld. Controleer of er verschillende activiteiten voorkomen en of belangrijke velden zoals
JournalEntryIdenEventTimeniet leeg zijn. - Verwerk timestamps: De query voegt datum- en tijdvelden samen tot een tekenreeks in de notatie
YYYYMMDDHHMMSS. Controleer of je nabewerking of doelsysteem deze notatie kan verwerken. Zo niet, pas dan de SQL-functieCONCATaan naar een ISO 8601-notatie zoalsYYYY-MM-DDTHH:MI:SS, als je database dit ondersteunt. - Exporteer de data: Exporteer de volledige resultatenset vanuit je SQL-client naar een CSV-bestand. Gebruik UTF-8-codering om problemen met speciale tekens te voorkomen.
- Maak de data klaar om te uploaden: Controleer voordat je de data naar een process mining-tool uploadt of de kolomkoppen overeenkomen met het vereiste dataschema.
JournalEntryId,ActivityNameenEventTimezijn essentieel. Voeg de kolomLastDataUpdatetoe en vul deze met de timestamp van de extractie. - Voer de eindcontrole uit: Volg de stappen in het gedeelte ‘validationSteps’ om te controleren of de geëxtraheerde data volledig en correct is voordat je met de analyse begint.
Configuratie
- Databaserechten: De databasegebruiker moet leestoegang hebben tot de volgende SAP-tabellen: BKPF, BSEG, CDHDR, CDPOS, T001 en V_USERNAME. Voor workflowactiviteiten is ook toegang tot SWW_WI2OBJ en SWWLOGHIST nodig. Dit toegangsniveau wordt doorgaans alleen toegekend aan gespecialiseerde technische teams.
- Filter op datumbereik: Filter de data op een specifiek datumbereik om de query goed te laten presteren. De query gebruikt tijdelijke waarden voor een begin- en einddatum, die worden toegepast op de aanmaakdatum van het document (
BKPF.CPUDT). Voor een eerste analyse wordt een periode van 3 tot 6 maanden aanbevolen. - Filter op entiteit: Filter altijd op bedrijfsnummer (
BKPF.BUKRS) om de hoeveelheid data te beperken en de analyse gericht te houden. Je kunt ook filteren op documenttype (BKPF.BLART) om alleen relevante boekingstypen op te nemen, bijvoorbeeld ‘SA’ voor G/L-documenten. Zo kun je operationele documenten zoals facturen of betalingen uitsluiten als die buiten de scope vallen. - Prestaties: Rechtstreekse queries op kerntabellen zoals BSEG en CDPOS kunnen veel systeembronnen vergen. Voer deze extractie bij voorkeur buiten piekuren uit, zodat de systeemprestaties voor eindgebruikers niet worden beïnvloed. Extraheer niet meer dan één jaar aan data in één keer.
- Workflowtaak-ID’s: De query bevat tijdelijke waarden zoals ‘[WF_TASK_ID_SUBMIT]’ en ‘[WF_TASK_ID_APPROVE]’. Vervang deze door de werkelijke taak-ID’s uit de workflowconfiguratie voor boekingen in je systeem. Je kunt deze achterhalen met hulp van een SAP Workflow-specialist of door de technische workflowdefinitie in transactie PFTC te analyseren.
Voorbeeldquery sql
WITH DOC_HEADERS AS (
SELECT
BUKRS,
BELNR,
GJAHR,
BLART,
BLDAT,
BUDAT,
CPUDT,
CPUTM,
USNAM,
TCODE,
BSTAT,
STBLG,
XRECH
FROM BKPF
WHERE CPUDT BETWEEN '[START_DATE]' AND '[END_DATE]'
AND BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]')
)
-- Event 1: Journal Entry Created (Directly Posted)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = '' OR H.BSTAT = 'U'
UNION ALL
-- Event 2: Journal Entry Parked
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Parked' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.BSTAT = 'V'
UNION ALL
-- Event 3: Journal Entry Posted (from Parked state)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT <> 'V'
AND P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW <> 'V'
UNION ALL
-- Event 4: Parked Journal Entry Deleted
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Parked Journal Entry Deleted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND C.TCODE = 'FBV0'
JOIN CDPOS P ON C.CHANGENR = P.CHANGENR AND P.OBJECTCLAS = 'BELEG' AND P.OBJECTID = C.OBJECTID
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE P.TABNAME = 'BKPF'
AND P.FNAME = 'BSTAT'
AND P.VALUE_OLD = 'V'
AND P.VALUE_NEW = 'Z'
UNION ALL
-- Event 5: Journal Entry Reversal Processed
SELECT
CONCAT(H.BUKRS, H.STBLG, H.GJAHR) AS "JournalEntryId", -- Linking to the original document
'Journal Entry Reversal Processed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
TRUE AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.STBLG IS NOT NULL AND H.STBLG <> ''
UNION ALL
-- Event 6: Journal Entry Line Item Cleared
SELECT
CONCAT(B.BUKRS, B.BELNR, B.GJAHR) AS "JournalEntryId",
'Journal Entry Line Item Cleared' AS "ActivityName",
TO_TIMESTAMP(B.AUGDT, 'YYYYMMDD') AS "EventTime", -- Clearing date used as event time
U.NAME_TEXT AS "User",
B.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode", -- Clearing transaction is in the clearing document header, complex to retrieve here
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM BSEG B
JOIN DOC_HEADERS H ON B.BUKRS = H.BUKRS AND B.BELNR = H.BELNR AND B.GJAHR = H.GJAHR
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE B.AUGBL IS NOT NULL AND B.AUGBL <> '' AND B.AUGDT <> '00000000'
UNION ALL
-- Event 7: Journal Entry Corrected (changes to a parked document)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Journal Entry Corrected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
C.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN CDHDR C ON C.OBJECTCLAS = 'BELEG' AND C.OBJECTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR)
LEFT JOIN V_USERNAME U ON C.USERNAME = U.BNAME
WHERE H.BSTAT = 'V' AND C.TCODE IN ('FBV2', 'FBV4') -- FBV2 is change parked doc, FBV4 is change parked doc header
UNION ALL
-- Event 8: Documentation Attached (inferred from GOS attachment creation, requires configuration)
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Documentation Attached' AS "ActivityName",
TO_TIMESTAMP(CONCAT(REL.RECDATE, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SRGBTBREL REL ON REL.INSTID_A = CONCAT('BUS2081', H.BUKRS, H.BELNR, H.GJAHR) -- BUS2081 is object type for BKPF
LEFT JOIN V_USERNAME U ON REL.RECUNAM = U.BNAME
WHERE REL.TYPEID_A = 'BUS2081' AND REL.RELTYPE = 'ATTA'
UNION ALL
-- Events 9-13 from Workflow (Submitted, Changes Requested, Approved, Rejected) requires specific workflow config
-- This is a generic template. The WI_RH_TASK must be adapted to your system.
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
CASE
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_SUBMIT]' THEN 'Journal Entry Submitted'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_APPROVE]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Approved'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_REJECT]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Rejected'
WHEN LOG.WI_RH_TASK = '[WF_TASK_ID_CHANGES_REQ]' AND LOG.METHOD = 'DECISION' AND LOG.EVT_ID = 'COMPLETED' THEN 'Journal Entry Changes Requested'
ELSE NULL
END AS "ActivityName",
TO_TIMESTAMP(CONCAT(LOG.EVT_DATE, LOG.EVT_TIME), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
NULL AS "TransactionCode",
FALSE AS "IsReversed"
FROM DOC_HEADERS H
JOIN SWW_WI2OBJ WIOBJ ON WIOBJ.INSTID = CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AND WIOBJ.TYPEID = 'BKPF'
JOIN SWWLOGHIST LOG ON WIOBJ.WI_ID = LOG.WI_ID
LEFT JOIN V_USERNAME U ON LOG.EXEC_USER = U.BNAME
WHERE LOG.WI_RH_TASK IN ('[WF_TASK_ID_SUBMIT]', '[WF_TASK_ID_APPROVE]', '[WF_TASK_ID_REJECT]', '[WF_TASK_ID_CHANGES_REQ]')
UNION ALL
-- Event 14: Manual Entry Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Manual Entry Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.TCODE IN ('FB01', 'F-02', 'FB50', 'F-04', 'F-22', 'F-43', 'FB60', 'FB70', 'FV50', 'FV60', 'FV70')
UNION ALL
-- Event 15: Cross-Company Posting Identified
SELECT
CONCAT(H.BUKRS, H.BELNR, H.GJAHR) AS "JournalEntryId",
'Cross-Company Posting Identified' AS "ActivityName",
TO_TIMESTAMP(CONCAT(H.CPUDT, H.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
U.NAME_TEXT AS "User",
H.BUKRS AS "CompanyCode",
H.BLART AS "DocumentType",
H.BUDAT AS "PostingDate",
H.TCODE AS "TransactionCode",
CASE WHEN H.STBLG IS NOT NULL AND H.STBLG <> '' THEN TRUE ELSE FALSE END AS "IsReversed"
FROM DOC_HEADERS H
LEFT JOIN V_USERNAME U ON H.USNAM = U.BNAME
WHERE H.XRECH = 'X' Stappen
- SAP-verbinding instellen: Configureer in je ETL-tool van een derde partij een nieuwe bronverbinding met je SAP ECC-systeem. Hiervoor heb je meestal de gegevens van de applicatieserver, de client, het systeemnummer en een aparte SAP-gebruiker met de benodigde RFC-autorisaties nodig.
- Databronnen definiëren: Voeg in je extractieproject de benodigde SAP-tabellen toe als databronnen. De belangrijkste tabellen zijn BKPF (kopgegevens van boekingsdocumenten), BSEG (regels van boekingsdocumenten), VBSEGK (kopgegevens van geparkeerde documenten), CDHDR (kopgegevens van wijzigingen), CDPOS (wijzigingsregels), SWW_WI2OBJ (koppelingen tussen workflows en objecten), SWWLOGHIST (workflowlog) en SRGBTBREL (relaties voor GOS-bijlagen).
- Basisgebeurtenissen extraheren (aangemaakt en geparkeerd): Maak de eerste dataflow om de begingebeurtenissen te extraheren. Gebruik voor ‘Journaalpost geparkeerd’ VBSEGK als bron. Gebruik voor ‘Journaalpost aangemaakt’ BKPF en filter op documenten die geen tegenboekingen zijn en niet eerst zijn geparkeerd. Dat kan met een anti-join op VBSEGK.
- Workflowgebeurtenissen extraheren: Maak een dataflow die BKPF koppelt aan SWW_WI2OBJ op basis van de objectsleutel (bedrijfsnummer + documentnummer + boekjaar), zodat je de workflowinstantie-ID vindt. Koppel dit resultaat aan SWWLOGHIST om gebeurtenissen zoals ‘Ingediend’, ‘Goedgekeurd’, ‘Afgewezen’ en ‘Wijzigingen aangevraagd’ te extraheren. Baseer deze op de uitkomsten van workflowtaken en de gebruikersbeslissingen in het log.
- Wijzigings- en verwijderingsgebeurtenissen extraheren: Gebruik de tabellen CDHDR en CDPOS om wijzigingen te vinden. Filter voor ‘Journaalpost gecorrigeerd’ op wijzigingen aan geparkeerde documenten (Object Class ‘FIPP’). Zoek voor ‘Geparkeerde journaalpost verwijderd’ naar verwijderingsmarkeringen in de wijzigingslogs van geparkeerde documenten.
- Bijlagegebeurtenissen extraheren: Koppel BKPF aan SRGBTBREL om ‘Documentatie toegevoegd’ vast te leggen. Gebruik daarbij objecttype ‘BKPF’ en de relatie ‘[Your attachment relationship type]’. De aanmaakdatum van de koppeling geldt als tijdstip van de gebeurtenis.
- Afletterings- en tegenboekingsgebeurtenissen extraheren: Zoek voor ‘Regel van journaalpost afgeletterd’ in BSEG naar regels met een ingevuld afletteringsdocumentveld (AUGBL). Het tijdstip van de gebeurtenis is de boekingsdatum van het afletteringsdocument (AUGDT). Zoek voor ‘Tegenboeking journaalpost verwerkt’ in BKPF naar documenten met een waarde in het veld voor het tegengeboekte document (STBLG).
- Berekende gebeurtenissen afleiden: Maak aparte logica voor berekende gebeurtenissen. Filter voor ‘Handmatige invoer vastgesteld’ in BKPF op een lijst met handmatige transactiecodes (bijvoorbeeld FB01, FB50, F-02). Groepeer voor ‘Boeking tussen bedrijven vastgesteld’ de BSEG-tabel op document-ID en zoek documenten met meer dan één uniek bedrijfsnummer.
- Alle gebeurtenisstromen combineren: Gebruik een UNION-transformatie in je ETL-tool om de uitvoer van alle afzonderlijke gebeurtenisstromen (aangemaakt, geparkeerd, goedgekeurd enzovoort) samen te voegen in één event log-tabel. Zorg dat de kolomnamen en gegevenstypen in alle stromen overeenkomen.
- Toewijzen aan het uiteindelijke schema: Koppel de gecombineerde data aan de vereiste structuur van het event log. Maak daarbij de velden
JournalEntryId,ActivityName,EventTime,Gebruikeren andere verplichte en aanbevolen attributen aan. Voeg vaste kolommen toe, zoalsSourceSystem, en gebruik het uitvoeringstijdstip van de ETL-taak voorLastDataUpdate. - Incrementeel laden instellen: Stel voor doorlopende extracties een strategie voor incrementeel laden in. Gebruik de laatste aanmaak- of wijzigingsdatum (bijvoorbeeld BKPF.CPUDT, CDHDR.UDATE) als watermark, zodat je alleen nieuwe of bijgewerkte records sinds de vorige uitvoering ophaalt.
- Exporteren naar ProcessMind: Plan de extractietaak en stel de laatste uitvoerstap zo in dat het event log wordt opgeslagen als CSV- of Parquet-bestand op een locatie die ProcessMind kan bereiken voor upload.
Configuratie
- Vereisten: Een licentie voor een ETL-tool van een derde partij (bijvoorbeeld Theobald Xtract Universal, Informatica of Talend) met een speciale SAP-connector. Een SAP-gebruikersaccount met RFC-toegang en autorisaties om financiële tabellen te lezen (bijvoorbeeld S_TABU_DIS voor tabelgroepen F_00 en F_WF), evenals workflowgegevens en wijzigingslogs.
- Verbindingsparameters: Je hebt het IP-adres of de hostnaam van de SAP Application Server, het systeemnummer en de client-ID nodig. Gebruik veilig beheer voor de SAP-gebruikersnaam en het wachtwoord.
- Belangrijke filters: Pas bij de bron altijd filters toe op bedrijfsnummer (BKPF.BUKRS) en boekjaar (BKPF.GJAHR) om de hoeveelheid data te beperken. Filter bij voorkeur ook op de aanmaakdatum van het document (BKPF.CPUDT) om een specifieke extractieperiode vast te leggen, bijvoorbeeld de afgelopen 6 maanden.
- Datumbereik kiezen: Kies voor de eerste keer een representatieve periode, bijvoorbeeld 3 tot 6 maanden. Gebruik voor volgende deltabelastingen een watermark op een timestampveld zoals
CPUDT, zodat alleen nieuwe records worden opgehaald. - Aandachtspunten voor prestaties: Koppelingen met BSEG, CDPOS en workflowtabellen kunnen erg traag zijn. Stel je ETL-tool zo in dat filters waar mogelijk naar de SAP-bron worden doorgestuurd. Extraheer data in kleinere delen of pakketten als de tool dat ondersteunt, vooral bij grote historische gegevensbestanden.
- Workflow aanpassen: De logica voor het herkennen van workflowactiviteiten zoals ‘Goedgekeurd’ of ‘Afgewezen’ hangt sterk af van je workflowtemplates. Je moet in je systeem de juiste workflowtaak-ID’s en gebruikersbeslissingssleutels vinden om in de filters te gebruiken.
Voorbeeldquery sql
/*
This is a logical representation of the extraction configuration in a third-party ETL tool.
It is not executable SQL but defines the sources, joins, and transformations for each activity.
Placeholders like [Your SAP Source], [Date Filter], and [Company Code Filter] must be configured in the tool.
*/
-- Extraction block for 'Journal Entry Parked'
SELECT
CONCAT(v.BUKRS, v.VBELN, v.GJAHR) AS JournalEntryId,
'Journal Entry Parked' AS ActivityName,
CAST(CONCAT(v.CPUDT, v.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
v.USNAM AS User,
v.BUKRS AS CompanyCode,
v.BLART AS DocumentType,
v.BUDAT AS PostingDate,
v.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].VBSEGK v
WHERE [Date Filter on v.CPUDT] AND [Company Code Filter on v.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Created'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Created' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
LEFT JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE h.BSTAT = '' AND v.VBELN IS NULL AND h.STBLG IS NULL
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Posted' (from parked)
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Posted' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Or a more precise posting time from change logs if available
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
JOIN [Your SAP Source].VBSEGK v ON h.AWKEY = CONCAT(v.BUKRS, v.VBELN, v.GJAHR)
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Submitted', 'Approved', 'Rejected', 'Changes Requested'
SELECT
CONCAT(SUBSTRING(o.INSTID, 3, 4), SUBSTRING(o.INSTID, 7, 10), SUBSTRING(o.INSTID, 17, 4)) AS JournalEntryId,
CASE
WHEN wl.WI_TEXT LIKE '%Submit%' THEN 'Journal Entry Submitted'
WHEN wl.WI_TEXT LIKE '%Approve%' THEN 'Journal Entry Approved'
WHEN wl.WI_TEXT LIKE '%Reject%' THEN 'Journal Entry Rejected'
WHEN wl.WI_TEXT LIKE '%Request Changes%' THEN 'Journal Entry Changes Requested'
END AS ActivityName,
CAST(CONCAT(wl.WI_CD, wl.WI_CT) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
wl.EXEC_USER AS User,
SUBSTRING(o.INSTID, 3, 4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SWW_WI2OBJ o
JOIN [Your SAP Source].SWWLOGHIST wl ON o.WI_ID = wl.WI_ID
WHERE o.TYPEID = 'BKPF' AND o.CATID = 'BO'
AND wl.WI_TEXT IN ('[Your Submit Task Name]', '[Your Approve Task Name]', '[Your Reject Task Name]', '[Your Changes Request Task Name]')
AND [Date Filter on wl.WI_CD]
UNION ALL
-- Extraction block for 'Journal Entry Corrected'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Journal Entry Corrected' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'U'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Parked Journal Entry Deleted'
SELECT
CONCAT(cd.OBJECTID_LONG_CHAR(3,4), cd.OBJECTID_LONG_CHAR(7,10), cd.OBJECTID_LONG_CHAR(17,4)) AS JournalEntryId,
'Parked Journal Entry Deleted' AS ActivityName,
CAST(CONCAT(cd.UDATE, cd.UTIME) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
cd.USERNAME AS User,
cd.OBJECTID_LONG_CHAR(3,4) AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
cd.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].CDHDR cd
WHERE cd.OBJECTCLAS = 'FIPP' AND cd.CHANGE_IND = 'D'
AND [Date Filter on cd.UDATE]
UNION ALL
-- Extraction block for 'Documentation Attached'
SELECT
CONCAT(SUBSTRING(r.INSTID_A, 3, 4), SUBSTRING(r.INSTID_A, 7, 10), SUBSTRING(r.INSTID_A, 17, 4)) AS JournalEntryId,
'Documentation Attached' AS ActivityName,
-- Note: A precise timestamp is often unavailable. Using document creation time as a proxy.
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].SRGBTBREL r
JOIN [Your SAP Source].BKPF h ON h.BUKRS = SUBSTRING(r.INSTID_A, 3, 4) AND h.BELNR = SUBSTRING(r.INSTID_A, 7, 10) AND h.GJAHR = SUBSTRING(r.INSTID_A, 17, 4)
WHERE r.TYPEID_A = 'BKPF' AND r.RELTYPE = '[Configure based on your system]'
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Reversal Processed'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Journal Entry Reversal Processed' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.STBLG IS NOT NULL AND h.STBLG <> ''
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Is Reversed' flag on original document
SELECT
CONCAT(h_orig.BUKRS, h_orig.BELNR, h_orig.GJAHR) AS JournalEntryId,
'Is Reversed' AS ActivityName, -- This is an attribute update, modeled as an event
CAST(CONCAT(h_rev.CPUDT, h_rev.CPUTM) AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h_rev.USNAM AS User,
h_orig.BUKRS AS CompanyCode,
h_orig.BLART AS DocumentType,
h_orig.BUDAT AS PostingDate,
h_orig.TCODE AS TransactionCode,
TRUE AS IsReversed
FROM [Your SAP Source].BKPF h_rev
JOIN [Your SAP Source].BKPF h_orig ON h_rev.STBLG = h_orig.BELNR AND h_rev.BUKRS = h_orig.BUKRS AND h_rev.GJAHR_S = h_orig.GJAHR
WHERE h_rev.STBLG IS NOT NULL AND h_rev.STBLG <> ''
AND [Date Filter on h_rev.CPUDT] AND [Company Code Filter on h_rev.BUKRS]
UNION ALL
-- Extraction block for 'Journal Entry Line Item Cleared'
SELECT
CONCAT(i.BUKRS, i.BELNR, i.GJAHR) AS JournalEntryId,
'Journal Entry Line Item Cleared' AS ActivityName,
CAST(i.AUGDT AS TIMESTAMP) AS EventTime,
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
NULL AS User, -- User who performed clearing is on the clearing document header
i.BUKRS AS CompanyCode,
NULL AS DocumentType,
NULL AS PostingDate,
NULL AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BSEG i
WHERE i.AUGBL IS NOT NULL AND i.AUGBL <> ''
AND [Date Filter on i.AUGDT] AND [Company Code Filter on i.BUKRS]
UNION ALL
-- Extraction block for 'Manual Entry Identified'
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
'Manual Entry Identified' AS ActivityName,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed
FROM [Your SAP Source].BKPF h
WHERE h.TCODE IN ('FB01', 'F-02', 'FB50', 'FV50', '[Add other manual T-Codes]')
AND [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
UNION ALL
-- Extraction block for 'Cross-Company Posting Identified'
SELECT
JournalEntryId,
'Cross-Company Posting Identified' AS ActivityName,
EventTime, -- Same time as creation
'SAP ECC' AS SourceSystem,
NOW() AS LastDataUpdate,
User,
CompanyCode,
DocumentType,
PostingDate,
TransactionCode,
IsReversed
FROM (
SELECT
CONCAT(h.BUKRS, h.BELNR, h.GJAHR) AS JournalEntryId,
CAST(CONCAT(h.CPUDT, h.CPUTM) AS TIMESTAMP) AS EventTime,
h.USNAM AS User,
h.BUKRS AS CompanyCode,
h.BLART AS DocumentType,
h.BUDAT AS PostingDate,
h.TCODE AS TransactionCode,
FALSE AS IsReversed,
(SELECT COUNT(DISTINCT i.BUKRS) FROM [Your SAP Source].BSEG i WHERE i.BELNR = h.BELNR AND i.BUKRS = h.BUKRS AND i.GJAHR = h.GJAHR) as CompanyCodeCount
FROM [Your SAP Source].BKPF h
WHERE [Date Filter on h.CPUDT] AND [Company Code Filter on h.BUKRS]
) AS CrossCompanyCheck
WHERE CompanyCodeCount > 1 Klaar om aan de slag te gaan?
Gebruik deze datatemplate als startpunt voor process mining van Record to Report - boekingen. Krijg helder inzicht en verbeter de efficiëntie van je financiële processen.
Optimaliseer nu Record to Report - boekingen
Verkort de doorlooptijd van boekingen met 30% en zorg voor nauwkeurige rapportages.
Je hebt geen creditcard nodig. Begin vandaag met verbeteren.