Uw Record to Report - Journaalpost Data Template
Uw Record to Report - Journaalpost Data Template
- Aanbevolen attributen voor uitgebreide analyse
- Belangrijke journaalpostactiviteiten om te volgen
- Praktische richtlijnen voor data-extractie voor SAP ECC
Record to Report - Journaalpost Attributes
| Naam | Omschrijving | ||
|---|---|---|---|
| Activiteitsnaam ActivityName | De naam van de bedrijfsactiviteit of event die op een specifiek punt in het journaalpostproces plaatsvond. | ||
| Omschrijving De Activity Name beschrijft een specifieke stap in de journal entry lifecycle, zoals 'Journaalpost Aangemaakt', 'Journaalpost Goedgekeurd' of 'Journaalpost Geboekt'. Dit attribute is typisch afgeleid van meerdere bronnen in SAP, waaronder transactiecodes (TCODE), wijzigingsdocument logs (tabellen CDHDR en CDPOS) en documentstatusvelden. Activiteiten analyseren is de kern van Process Mining. Het maakt de visualisatie van process maps, berekening van overgangstijden tussen stappen en identificatie van herwerkingslussen (bijv. 'Journaalpost Afgewezen' gevolgd door 'Journaalpost Gecorrigeerd') mogelijk. Deze data is fundamenteel voor dashboards gerelateerd aan cyclusduren, herwerkingspercentages en procesvarianten. Het belang Het definieert de stappen in de processmap, waardoor het mogelijk is om de journal entry workflow te visualiseren, analyseren en optimaliseren. Vindplaats Afgeleid uit verschillende bronnen, waaronder transactiecodes in BKPF (TCODE), documentstatus en Voorbeelden Journaalpost aangemaaktJournaalpost GoedgekeurdJournaalpost AfgewezenJournaalpost Geboekt | |||
| Journaalpost ID JournalEntryId | De unieke identifier voor een financieel boekhoudkundig document, een combinatie van bedrijfscode, documentnummer en fiscaal jaar. | ||
| Omschrijving De Journal Entry ID is de primaire case identifier voor het volgen van de lifecycle van een journaalpost. Het is een samengestelde sleutel, typisch gevormd door het concateneren van de Company Code (BUKRS), Document Number (BELNR) en Fiscal Year (GJAHR) om uniciteit over het gehele SAP-systeem te waarborgen. Bij procesanalyse koppelt deze ID alle gerelateerde activiteiten, zoals aanmaak, parkeren, indiening, goedkeuring, afwijzing en boeking. Door deze identifier te traceren, kunnen we de end-to-end reis van elke journaalpost construeren, cyclusduren meten en procesafwijkingen of knelpunten voor specifieke posten identificeren. Het belang Dit is de essentiële sleutel voor het volgen van een journaalpost van aanmaak tot definitieve boeking, waardoor end-to-end procesanalyse en variantvergelijking mogelijk is. Vindplaats Dit is een afgeleid attribute, typisch een concatenatie van velden uit de BKPF-tabel: Company Code (BUKRS), Document Number (BELNR) en Fiscal Year (GJAHR). Voorbeelden 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Tijdstip Gebeurtenis EventTime | De timestamp die aangeeft wanneer een specifieke activiteit of event plaatsvond voor de journaalpost. | ||
| Omschrijving
In analyse wordt Het belang Deze timestamp vormt de basis voor alle tijdgerelateerde analyses, waardoor de berekening van doorlooptijden, duren en knelpunten mogelijk wordt. Vindplaats Afkomstig uit diverse velden afhankelijk van de activiteit, voornamelijk creatie timestamp (CPUDT, CPUTM) uit BKPF of wijzigingsdocument timestamps (UDATE, UTIME) uit CDHDR. Voorbeelden 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Bronsysteem SourceSystem | Het systeem waaruit de procesdata is geëxtraheerd. | ||
| Omschrijving Dit attribute identificeert de herkomst van de data, wat in dit geval de specifieke SAP ECC instance is. Het is typisch een statische waarde die wordt toegevoegd tijdens het data-extractieproces. Hoewel eenvoudig, is dit attribute belangrijk in omgevingen met meerdere ERP's of databronnen. Het zorgt ervoor dat data lineage duidelijk is en maakt filteren of segmenteren van analyse per bronsysteem mogelijk. Het belang Biedt duidelijke data lineage en is essentieel voor het bijhouden van datakwaliteit, vooral in omgevingen met meerdere bronsystemen. Vindplaats Dit is typisch een statische waarde die wordt toegevoegd tijdens het data transformatieproces, en identificeert de specifieke SAP ECC instance (bijv. '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 is geëxtraheerd of vernieuwd uit het bronsysteem. | ||
| Omschrijving Dit attribute registreert de datum en tijd van de meest recente data pull uit SAP ECC. Het is een metadata veld dat cruciaal is voor het begrijpen van de actualiteit en currency van de geanalyseerde data. In elk Process Mining dashboard of analyse is het kennen van de laatste update tijd essentieel voor gebruikers om de data te vertrouwen en geïnformeerde beslissingen te nemen. Het helpt de vraag te beantwoorden: 'Hoe up-to-date is deze informatie?'. Het belang Informeert gebruikers over de actualiteit van de data, zodat zij het tijdsbestek van de analyse begrijpen en de resultaten kunnen vertrouwen. Vindplaats Dit is een metadata veld gegenereerd en opgeslagen door de data-extractietool of ETL-proces op het moment van data refresh. Voorbeelden 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Bedrijfscode CompanyCode | De organisatorische eenheid die een onafhankelijke juridische entiteit vertegenwoordigt waarvoor financiële overzichten worden opgesteld. | ||
| Omschrijving De Company Code is een fundamentele organisatorische eenheid in SAP Financials. Het vertegenwoordigt een juridisch onafhankelijke onderneming en is een sleutelveld in de journal entry documentheader. Dit attribute is essentieel voor het segmenteren van procesanalyse per juridische entiteit. Het maakt het mogelijk om procesprestaties, compliance-percentages en KPI-resultaten te vergelijken tussen verschillende delen van het bedrijf. Het kan bijvoorbeeld helpen identificeren of goedkeuringsvertragingen of hoge herroepingspercentages specifiek zijn voor bepaalde company codes. Het belang Maakt het mogelijk om procesprestaties te filteren en te vergelijken tussen verschillende juridische entiteiten of Vindplaats Gevonden in de documentheader-tabel BKPF, veld BUKRS. Voorbeelden 10002000US01DE01 | |||
| Boekingsdatum PostingDate | De datum waarop de transactie in het grootboek wordt vastgelegd, wat de financiële periode beïnvloedt. | ||
| Omschrijving De Boekingsdatum bepaalt de fiscale periode waarin de journaalpost wordt verwerkt. Het is een cruciaal datumveld vanuit financieel en compliance-perspectief, aangezien het moet aansluiten bij de afsluitingsschema's en regelgeving van de boekhoudperiode. In Process Mining wordt deze datum gebruikt om compliance te monitoren. Het 'Compliance Adherence Monitoring' dashboard en de 'Compliance Conformance Rate' KPI gebruiken dit attribute om te controleren of posten binnen de juiste periode worden geboekt. Het kan ook worden gebruikt om trends in het volume van journaalposten over tijd te analyseren. Het belang Cruciaal voor financiële rapportage en Vindplaats Gevonden in de documentheader-tabel BKPF, veld BUDAT. Voorbeelden 2023-10-312023-11-302024-01-15 | |||
| Documenttype DocumentType | Een classificatie voor boekhoudkundige documenten die bepaalt hoe ze worden verwerkt en opgeslagen. | ||
| Omschrijving De Document Type onderscheidt verschillende soorten zakelijke transacties, zoals een grootboekpost (SA), leveranciersfactuur (KR) of activa-boeking (AA). Het wordt gedefinieerd tijdens de systeemconfiguratie en toegewezen aan elke journaalpost. Dit is een cruciaal attribute voor analyse, omdat het de segmentatie van het proces per aard van de transactie mogelijk maakt. Het 'Journal Entry Throughput by Type' dashboard en de 'Average Cycle Time by Journal Entry Type' KPI zijn direct afhankelijk van dit veld. Het helpt te ontdekken of bepaalde typen posten gevoeliger zijn voor vertragingen, herwerk of herroepingen. Het belang Maakt segmentatie van analyse op transactietype mogelijk, wat helpt bij het identificeren of procesproblemen specifiek zijn voor bepaalde typen Vindplaats Gevonden in de documentheader-tabel BKPF, veld BLART. Voorbeelden SAKRREAA | |||
| Gebruiker User | De SAP user ID van de persoon die de journaalpost heeft aangemaakt of gewijzigd. | ||
| Omschrijving Dit attribute legt de SAP username vast die verantwoordelijk is voor een bepaalde activiteit, zoals het aanmaken, parkeren of boeken van een document. Het is direct afkomstig uit de documentheader of wijzigingslogtabellen. Het analyseren van het User attribute is cruciaal voor het begrijpen van team- en individuele prestaties. Het ondersteunt het User Productivity dashboard door activiteitsvolumes en verwerkingstijden per gebruiker te volgen. Het helpt ook te identificeren wie betrokken is bij herwerkingslussen, herroepingen of compliance-afwijkingen, waardoor gerichte training of procesverbeteringen mogelijk zijn. Het belang Identificeert de gebruiker die verantwoordelijk is voor elke activiteit, wat analyse van gebruikersprestaties, werkdrukverdeling en herwerkpatronen mogelijk maakt. Vindplaats Doorgaans uit de BKPF-tabel (veld USNAM voor aanmaker) of de CDHDR-tabel (veld USERNAME voor wijziger). Voorbeelden ABROWNCJONESDSMITH | |||
| Is gestorneerd IsReversed | Een booleanse vlag die aangeeft of de Journal Entry is teruggedraaid. | ||
| Omschrijving Deze flag identificeert journaalposten die vervolgens zijn herroepen door een ander boekhoudkundig document. In SAP is een herroepen document gekoppeld aan het herroepingsdocument, wat een duidelijk audit trail biedt. Dit attribute is fundamenteel voor het 'Journal Entry Reversal Analysis' dashboard en de 'Journal Entry Reversal Rate' KPI. Het maakt het mogelijk om herroepen posten te isoleren om de grondoorzaken te onderzoeken, zoals data-invoerfouten of onjuiste boekhoudkundige verwerkingen, met als doel de frequentie van herroepingen te verminderen. Het belang Ondersteunt direct Vindplaats Afgeleid van het Voorbeelden truefalse | |||
| Transactiecode TransactionCode | De SAP-transactiecode gebruikt om de journaalpost aan te maken of te verwerken. | ||
| Omschrijving De Transactiecode (T-Code) is een unieke identifier voor een specifieke functie of programma in SAP. Voor journaalposten geeft het aan hoe de post is aangemaakt, bijvoorbeeld handmatig (FB01, F-02), via parkeren (FV50), of via een geautomatiseerde interface. Dit attribute is van onschatbare waarde voor het 'Manual Activity Optimization' dashboard. Door de T-Code te analyseren, kunnen we onderscheid maken tussen handmatige en geautomatiseerde activiteiten, identificeren welke handmatige processen het meest tijdrovend zijn, en kansen voor automatisering opsporen om handmatige inspanning te verminderen en efficiëntie te verbeteren. Het belang Helpt onderscheid te maken tussen handmatige en geautomatiseerde processen en identificeert kansen voor automatisering en processtandaardisatie. Vindplaats Gevonden in de documentheader-tabel BKPF, veld TCODE. Voorbeelden FB01F-02FV50FBD1 | |||
| Annuleringsreden ReversalReason | Een code die de reden aangeeft waarom een Journal Entry werd teruggedraaid. | ||
| Omschrijving Wanneer een document wordt geannuleerd, stelt SAP de gebruiker in staat een redencode op te geven. Deze code biedt gestructureerde informatie over waarom de annulering noodzakelijk was, bijvoorbeeld een onjuiste boekingsdatum of een data-invoerfout. Dit attribute is een belangrijke input voor het 'Journaalpost Annuleringsanalyse' dashboard. Door de meest voorkomende annuleringsredenen te analyseren, kunnen organisaties systemische problemen in hun processen of trainingslacunes identificeren, en gerichte acties ondernemen om toekomstige fouten te voorkomen en de annuleringsfrequentie te verlagen. Het belang Biedt direct inzicht in waarom herroepingen plaatsvinden, en maakt gerichte grondoorzaakanalyse mogelijk om toekomstige fouten te verminderen. Vindplaats Gevonden in de documentheader-tabel BKPF, veld STGRD. Voorbeelden 010205 | |||
| Doorlooptijd CycleTime | De totale verstreken tijd vanaf de aanmaak van de eerste journaalpostactiviteit tot de uiteindelijke boekingsactiviteit. | ||
| Omschrijving
Deze berekende Het belang Meet de algehele end-to-end efficiëntie van het proces, en biedt een belangrijke metric voor het identificeren van knelpunten en het volgen van verbeteringen. Vindplaats Berekend door de Voorbeelden P2DT3H15MPT8H30MP5D | |||
| Goedkeuringstijd ApprovalTime | De verstreken tijd vanaf het moment dat een journaalpost ter goedkeuring wordt ingediend totdat deze wordt goedgekeurd of afgewezen. | ||
| Omschrijving Deze metriek meet de duur van het goedkeuringssubproces, dat vaak aanzienlijk bijdraagt aan de totale doorlooptijd. Het wordt berekend als het tijdsverschil tussen de activiteit 'Journaalpost Ingediend' en de corresponderende activiteit 'Journaalpost Goedgekeurd' of 'Journaalpost Afgewezen'. De goedkeuringstijd is de kernmetriek voor het 'Prestatie Journaalpost Goedkeuring' dashboard en de KPI 'Gemiddelde Goedkeuringstijd Journaalpost'. Het analyseren van deze duur helpt knelpunten in de goedkeuringsworkflow te identificeren, de prestaties van goedkeurders te meten en proceswijzigingen te onderbouwen, zoals het aanpassen van goedkeuringsdrempels. Het belang Kwantificeert de duur van de goedkeuringsfase, en helpt vertragingen in de beoordelings- en goedkeuringsworkflow op te sporen en aan te pakken. Vindplaats Berekend door de Voorbeelden P1DT2HPT4H15MP3D | |||
| Is Geparkeerd IsParked | Een booleanse vlag die aangeeft of de Journal Entry als een geparkeerd document is opgeslagen voordat deze werd geboekt. | ||
| Omschrijving Het parkeren van een document stelt een gebruiker in staat een onvolledige journaalpost op te slaan zonder dat dit financiële saldi beïnvloedt. Het kan dan worden voltooid of beoordeeld door een andere gebruiker voordat het wordt geboekt. Deze flag identificeert posten die een parkeerstap hebben doorlopen. Het analyseren van dit attribute helpt het gebruik van de parkeerfunctie te begrijpen. Het kan onthullen of parkeren wordt gebruikt als een informele beoordelingsstap, wat mogelijk vertragingen veroorzaakt. Het ondersteunt de analyse van de end-to-end cyclusduur, waarbij onderscheid wordt gemaakt tussen posten die direct worden geboekt en posten die eerst worden geparkeerd. Het belang Identificeert invoer die gebruikmaakt van de parkeerfunctie, wat een bron van vertraging kan zijn of een indicator van een informeel beoordelingsproces. Vindplaats Afgeleid van het documentstatusveld (BSTAT) in tabel BKPF. Een 'V' geeft een geparkeerd document aan. Voorbeelden truefalse | |||
| Is herstelwerk IsRework | Een booleanse vlag die aangeeft of een Journal Entry een rework-loop heeft ondergaan, zoals afgekeurd en vervolgens gecorrigeerd worden. | ||
| Omschrijving Deze flag identificeert cases die zijn afgeweken van het 'happy path' en corrigerende actie vereisten. Het is typisch ingesteld op 'true' als een reeks activiteiten zoals 'Journaalpost Afgewezen' gevolgd door 'Journaalpost Gecorrigeerd' wordt waargenomen voor een bepaalde journaalpost. Dit attribute is essentieel voor het berekenen van de 'Journal Entry Rework Rate' KPI en voor analyse op het 'Rework and Rejection Rate' dashboard. Het helpt de mate van inefficiëntie in het proces te kwantificeren en biedt een basis voor het onderzoeken van de grondoorzaken van herwerk, zoals onduidelijke vereisten of onvoldoende documentatie. Het belang Markeert Vindplaats Dit is een berekend attribute, afgeleid door de sequentie van activiteiten voor een case te analyseren. Een herwerkingslus wordt geïdentificeerd als een afwijzings- of correctieactiviteit optreedt. Voorbeelden truefalse | |||
| Kostenplaats CostCenter | Een organisatorische eenheid binnen een `controlling area` die een locatie vertegenwoordigt waar kosten worden gemaakt. | ||
| Omschrijving Het Cost Center is een belangrijk master data element uit de Controlling (CO) module, vaak toegewezen op het journal entry regelitemniveau. Het wordt gebruikt om kosten te volgen voor een specifieke afdeling, functie of locatie. Het opnemen van Cost Center maakt een meer gedetailleerde analyse van het journal entry-proces mogelijk. Het kan helpen bepalen of bepaalde afdelingen meer herwerk genereren, langere cyclusduren hebben of verantwoordelijk zijn voor een hoger volume aan handmatige posten. Dit maakt een afdelingsgericht beeld van de procesefficiëntie mogelijk. Het belang Maakt analyse van Vindplaats Gevonden in de documentregelitem-tabel BSEG, veld KOSTL. Voorbeelden 4100CC_FINANCE_US10010101 | |||
| Totaal Documentbedrag TotalDocumentAmount | De totale waarde van de journaalpost in de documentvaluta. | ||
| Omschrijving Dit attribute vertegenwoordigt de totale financiële waarde van de journaalpost. Het wordt typisch berekend door de absolute waarden van alle debet- of creditregelitems die bij het document horen, op te tellen. Het analyseren van het proces per financiële waarde kan belangrijke patronen onthullen. Hoge-waarde posten kunnen bijvoorbeeld een ander, strenger goedkeuringspad volgen. Dit attribute kan worden gebruikt om de analyse te filteren of te segmenteren om te zien of cyclusduren, afwijzingspercentages of goedkeuringsvertragingen correleren met het bedrag van de post. Het belang Maakt financiële impactanalyse mogelijk, zoals het correleren van verwerkingstijden of afwijzingspercentages met de monetaire waarde van Vindplaats Dit is een berekend veld, afgeleid door het bedragveld (WRBTR of DMBTR) van alle regelitems in de BSEG-tabel te aggregeren voor een bepaalde journaalpost. Voorbeelden 1500.0025000.75125.50 | |||
| Valutacode CurrencyKey | De valutacode voor de bedragen die in de journaalpost zijn vastgelegd. | ||
| Omschrijving Dit attribute specificeert de valuta van de journaalpost, zoals USD, EUR of JPY. Het biedt context voor alle financiële bedragen die bij het document horen. Hoewel niet altijd een primaire analysedimensie, is het cruciaal voor het correct interpreteren van monetaire waarden. Het kan ook worden gebruikt om analyse te segmenteren in wereldwijde organisaties om te zien of processen verschillen voor posten in buitenlandse versus lokale valuta. Het belang Biedt de nodige context voor alle monetaire waarden, en zorgt voor accurate financiële analyse en interpretatie. Vindplaats Gevonden in de documentheader-tabel BKPF, veld WAERS. Voorbeelden USDEURGBPJPY | |||
Record to Report - Journaalpostactiviteiten
| Activiteit | Omschrijving | ||
|---|---|---|---|
| Journaalpost Geboekt | Dit is de centrale activiteit waar de journaalpost officieel wordt vastgelegd in het grootboek, wat financiële overzichten beïnvloedt. Dit event wordt expliciet vastgelegd wanneer de documentstatus op 'geboekt' wordt gezet en een boekingsdatum wordt toegewezen. | ||
| Het belang Dit is de belangrijkste mijlpaal, wat de succesvolle verwerking van een journaalpost betekent. De end-to-end cyclusduur wordt vaak tot dit punt gemeten, en het is een belangrijk event voor financiële afsluitingsanalyse. Vindplaats Geïdentificeerd wanneer een document in de BKPF-tabel een boekingsdatum (BKPF-BUDAT) heeft. Voor geparkeerde documenten komt dit overeen met het moment dat de status BKPF-BSTAT verandert van 'V' naar leeg. De timestamp van de boeking is de invoerdatum BKPF-CPUDT. Vastleggen Identificeer wanneer BKPF-BSTAT verandert van 'V' naar leeg, of voor directe boekingen, de creatiegebeurtenis. Gebeurtenistype explicit | |||
| Journaalpost Geparkeerd | Deze activiteit markeert de initiële aanmaak van een journaalpost in een voorlopige staat, voordat deze officieel in het grootboek wordt geboekt. Dit wordt expliciet vastgelegd in SAP wanneer een gebruiker een document opslaat met behulp van een parkeertransactie, waarbij de documentstatus op 'geparkeerd' wordt gezet. | ||
| Het belang Dit is een kritisch start event voor processen die beoordeling en goedkeuring omvatten. Het analyseren van de tijd tussen parkeren en boeken helpt vertragingen in de pre-boekings- en goedkeuringsfasen te identificeren. Vindplaats Dit event wordt geïdentificeerd vanuit de documentheader-tabel BKPF. Een document wordt als geparkeerd beschouwd wanneer het wordt aangemaakt met een status BKPF-BSTAT = 'V'. De event timestamp is de aanmaakdatum en -tijd, BKPF-CPUDT en BKPF-CPUTM. Vastleggen Identificeer documentcreatie in BKPF waar BKPF-BSTAT 'V' is. Gebeurtenistype explicit | |||
| Journaalpost Goedgekeurd | Deze activiteit markeert de definitieve goedkeuring van een journaalpost binnen een workflow, waardoor deze in aanmerking komt voor boeking. Dit event wordt vastgelegd vanuit de workflow log wanneer de definitieve 'vrijgave'- of 'goedkeurings'-stap is voltooid. | ||
| Het belang Dit is een belangrijke mijlpaal die het goedkeuringsproces afsluit. De duur tot aan deze activiteit is een kritische KPI voor goedkeuringsefficiëntie, en de tijd van dit event tot boeking meet de post-goedkeuringsvertraging. Vindplaats Afgeleid uit de voltooiing timestamp van de definitieve goedkeuringsstap in het SAP Business Workflow log. Dit is de laatste goedkeuringsactie voordat het document wordt geboekt of klaargemaakt voor boeking. Vastleggen Identificeer voltooiing van de definitieve 'vrijgave'- of 'goedkeurings'-stap in workflow logs. Gebeurtenistype inferred | |||
| Journaalpost Herroeping Verwerkt | Deze activiteit markeert de herroeping van een eerder geboekte journaalpost. Een herroeping is een nieuw boekhoudkundig document dat de oorspronkelijke post ongedaan maakt. | ||
| Het belang Dit is een kritisch event voor het meten van datakwaliteit en procesnauwkeurigheid. Een hoog percentage herroepingen wijst op systemische problemen in de initiële data-invoer- of goedkeuringsfasen, en elke herroeping vertegenwoordigt herwerk. Vindplaats Dit event wordt geïdentificeerd in de header van het originele document (BKPF-tabel). Wanneer een document wordt herroepen, vult SAP het herroepingsdocumentnummer (BKPF-STBLG) en de herroepingsreden (BKPF-STGRD) in. De event timestamp is de boekingsdatum van het nieuwe herroepingsdocument. Vastleggen Identificeer wanneer BKPF-STBLG wordt ingevuld op het originele document; de timestamp is de boekingsdatum van het herroepingsdocument. Gebeurtenistype explicit | |||
| Journaalpost Ingediend | Deze activiteit betekent dat een geparkeerde journaalpost is afgerond door de aanmaker en nu klaar is voor beoordeling en goedkeuring. Het wordt typisch vastgelegd door de initiatie van een SAP Business Workflow-taak geassocieerd met het geparkeerde document. | ||
| Het belang Dit markeert de overdracht van de aanmaker naar de goedkeurder, waarmee de klok start voor goedkeuringscyclusduur KPI's. Het is een belangrijke mijlpaal voor het meten van de efficiëntie van de goedkeuringsworkflow. Vindplaats Afgeleid uit de starttijd van de goedkeurings-workflow instance die gekoppeld is aan het financiële documentobject. Dit vereist het analyseren van workflow logtabellen zoals SWW_WI2OBJ om de workflow te vinden die is gestart voor de specifieke bedrijfscode, documentnummer en fiscaal jaar. Vastleggen Identificeer workflow startevenement voor het geparkeerde documentobject. Gebeurtenistype inferred | |||
| Cross-Company Boeking Geïdentificeerd | Een berekende activiteit die een Journal Entry markeert die meer dan één `Company Code` beïnvloedt. Dit wordt bepaald door de regelitems van een enkel financieel document te analyseren. | ||
| Het belang Cross-company transacties kunnen complexere verwerkings- en goedkeuringsvereisten hebben. Het identificeren ervan maakt een afzonderlijke analyse van hun Vindplaats Berekend door de Vastleggen Controleer of er meerdere unieke waarden van BSEG-BUKRS bestaan voor een enkele BKPF-BELNR. Gebeurtenistype calculated | |||
| Documentatie Bijgevoegd | Deze activiteit vertegenwoordigt het bijvoegen van ondersteunende documenten, zoals facturen of spreadsheets, door een gebruiker aan de journaalpost. Dit event wordt niet expliciet gelogd als een standaard boekhoudkundig event en wordt typisch afgeleid door te controleren op de aanmaak van attachments gekoppeld aan het boekhoudkundige documentobject. | ||
| Het belang Het volgen van deze activiteit helpt de compliance te verifiëren met beleid dat documentatie vereist. Vertragingen bij het bijvoegen van documenten kunnen een hoofdoorzaak zijn voor langdurige goedkeuringscycli. Vindplaats Dit is moeilijk betrouwbaar vast te leggen als een timestamped event. Het kan potentieel worden afgeleid door de Generic Object Services (GOS) attachment tabellen, zoals SOOD, te analyseren en de aanmaak timestamp van de attachment te koppelen aan de journal entry object key. Vastleggen Afleiden uit creatie timestamp van gekoppelde objecten in GOS-tabellen (bijv. SOOD). Gebeurtenistype inferred | |||
| Geparkeerde Journaalpost Verwijderd | Vertegenwoordigt het verwijderen van een geparkeerde journaalpost die nooit is geboekt. Dit kan gebeuren na een afwijzing of als de post per ongeluk is aangemaakt. | ||
| Het belang Deze activiteit markeert een onsuccesvol einde van het proces. Analyseren waarom geparkeerde documenten worden verwijderd, kan problemen aan het licht brengen zoals dubbele posten of procesmisverstanden. Vindplaats Dit event wordt vastgelegd wanneer de status van een geparkeerd document in de BKPF-tabel wordt gewijzigd. Het statusveld BKPF-BSTAT wordt bijgewerkt naar 'Z' (Geparkeerd document verwijderd). De wijziging timestamp kan worden gevonden in de documentwijzigingslogs (CDHDR). Vastleggen Identificeer wanneer BKPF-BSTAT wordt bijgewerkt naar 'Z'. Gebeurtenistype explicit | |||
| Handmatige Invoer Geïdentificeerd | Deze activiteit identificeert of een journaalpost is aangemaakt via een handmatige online transactie versus een geautomatiseerde interface of batchproces. Dit is geen gebruikersactie, maar een berekend attribute van de post, afgeleid uit systeemdata. | ||
| Het belang Het onderscheid maken tussen handmatige en geautomatiseerde Vindplaats Dit wordt berekend door velden in de documentheader-tabel BKPF te analyseren. Transactiecodes (BKPF-TCODE) zoals 'FB01', 'FB50' of 'FV50' duiden op handmatige invoer, terwijl andere T-codes of specifieke batch input namen (BKPF-AWKEY) automatisering suggereren. Vastleggen Afleiden uit BKPF-TCODE of andere Gebeurtenistype calculated | |||
| Journaalpost aangemaakt | Vertegenwoordigt de aanmaak van een journaalpost die direct wordt geboekt, zonder een voorafgaande parkeerstap. Dit wordt vastgelegd wanneer een document in SAP wordt aangemaakt met behulp van een directe boekingstransactie. | ||
| Het belang Deze activiteit dient als een alternatief startpunt voor eenvoudigere journaalpostprocessen die geen goedkeuringsworkflow vereisen. Het helpt onderscheid te maken tussen eenvoudige, directe boekingen en complexere, geparkeerde posten. Vindplaats Dit event komt overeen met documentaanmaak in de BKPF-tabel waar de documentstatus BKPF-BSTAT leeg is (geboekt). De event timestamp is de aanmaakdatum, BKPF-CPUDT. Voor deze documenten vinden 'Aangemaakt' en 'Geboekt' events gelijktijdig plaats. Vastleggen Identificeer documentcreatie in BKPF waar BKPF-BSTAT leeg is. Gebeurtenistype explicit | |||
| Journaalpost Afgewezen | Deze activiteit betekent de definitieve afwijzing van een journaalpost, waarna deze niet meer zal worden geboekt. Dit is typisch een terminale status in een goedkeuringsworkflow, wat leidt tot de uiteindelijke verwijdering van het geparkeerde document. | ||
| Het belang Het bijhouden van afwijzingen is cruciaal voor kwaliteitsmanagement. Het analyseren van de redenen en frequentie van afwijzingen helpt de 'first-time-right' ratio van journaalposten te verbeteren. Vindplaats Dit is een uitkomst vastgelegd vanuit het SAP Business Workflow log, en vertegenwoordigt een definitieve 'afwijzings'-gebruikersbeslissing die het proces beëindigt. Het geparkeerde document kan vervolgens worden verwijderd. Vastleggen Identificeer de definitieve 'afwijzings'-status in het workflow log voor het document. Gebeurtenistype inferred | |||
| Journaalpost Gecorrigeerd | Deze activiteit geeft aan dat de oorspronkelijke aanmaker een geparkeerde journaalpost heeft gewijzigd nadat deze teruggestuurd was voor wijzigingen. Het wordt afgeleid door wijzigingen aan het document te detecteren na een 'Wijzigingen Aangevraagd'-event. | ||
| Het belang Het bijhouden van correcties helpt de inspanningen voor herbewerking te kwantificeren. De tijd tussen een wijzigingsverzoek en de correctie benadrukt vertragingen bij het oplossen van problemen met ingediende boekingsaanvragen. Vindplaats Afgeleid door analysedocumentlogboeken (tabellen CDHDR en CDPOS) voor het geparkeerde document. Een wijziging die is vastgelegd na een afwijzingsgebeurtenis in de workflow, duidt erop dat een correctie is uitgevoerd. De timestamp komt uit de CDHDR-tabel. Vastleggen Identificeer logboekverandering in CDHDR/CDPOS na een afwijzingsgebeurtenis. Gebeurtenistype inferred | |||
| Journaalpost Regelitem Afgeboekt | Deze activiteit vertegenwoordigt de afstemming van een open-posten beheerd G/L-rekeningregelitem, zoals een bankafstemmingsrekening. Het vindt plaats wanneer een regelitem wordt gematcht met een ander, waardoor het wordt afgesloten. | ||
| Het belang Voor processen zoals bankafstemming is de tijd om items af te boeken een cruciale KPI. Deze activiteit helpt de efficiëntie van afstemming en maandafsluitingsprocedures te analyseren. Vindplaats Dit event wordt vastgelegd vanuit de regelitemtabel BSEG. Wanneer een regelitem wordt afgeboekt, worden de afboekingsdatum (BSEG-AUGDT) en het afboekingsdocument (BSEG-AUGBL) velden ingevuld. De timestamp van het event is de afboekingsdatum. Vastleggen Identificeer wanneer de afboekingsdatum (BSEG-AUGDT) wordt ingevuld voor een regelitem. Gebeurtenistype explicit | |||
| Wijzigingen Journaalpost Aangevraagd | Vertegenwoordigt een punt in de workflow waar een goedkeurder de journaalpost heeft beoordeeld en teruggestuurd naar de aanmaker voor correctie. Dit event wordt vastgelegd vanuit workflow logs die een 'afwijzings'- of 'terugstuur'-gebruikersbeslissing aangeven. | ||
| Het belang Deze activiteit is essentieel voor het identificeren van herwerkingslussen, die een primaire bron zijn van inefficiëntie en procesafwijking. Hoge frequentie van dit event wijst op problemen met de invoerkwaliteit of onduidelijke vereisten. Vindplaats Dit event wordt afgeleid uit de timestamp van een specifieke gebruikersbeslissingsstap in het SAP Business Workflow log die overeenkomt met een 'afwijzings'- of 'terugstuur voor correctie'-actie. Vastleggen Identificeer 'afwijzings'- of 'herwerkings'-beslissing timestamp in workflow logs. Gebeurtenistype inferred | |||
Extractie Guides
Stappen
- Het ABAP-programma creëren: 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 Aanmaken. Geef een geschikte titel op en stel het programmatype in op 'Executable Program'.
- Selectiescherm definiëren: Definieer in de broncode van het programma het selectiescherm. Dit stelt gebruikers in staat parameters zoals een datumbereik voor documentaanmaak,
company codesendocument typesop te geven om het datavolume voor de extractie te beperken. - Datastructuren declareren: Definieer een interne tabelstructuur die de uiteindelijke
event log datazal bevatten. Deze structuur moet alle vereiste velden bevatten:JournalEntryId,ActivityName,EventTime,SourceSystem,LastDataUpdate, en alle aanbevolenattributeszoalsUser,CompanyCodeenPostingDate. - Datalogica implementeren: Schrijf de kern ABAP SQL-queries om data te extraheren voor elk van de 14 vereiste activiteiten. Dit omvat het selecteren van data uit primaire tabellen zoals BKPF (Header) en BSEG (Line Item),
change logtabellen CDHDR en CDPOS, workflowtabellen zoals SWWLOGHIST, en clearing tabellen zoals BSAS en BSAK. - Geparkeerde en geboekte documenten extraheren: Voor 'Journal Entry Parked'
events, selecteer uit BKPF waar de documentstatus (BSTAT) 'V' is. Voor 'Journal Entry Created' en 'Journal Entry Posted'events, selecteer uit BKPF waar de status leeg is, wat een normaal, geboekt document aangeeft. - Wijzigings- en verwijderings
eventsextraheren: Query dechange documenttabellen, CDHDR en CDPOS, voor objectklasse 'BELEG'. Filter op de documentsleutel om wijzigingen te vinden die overeenkomen met 'Journal Entry Corrected' of 'Parked Journal Entry Deleted' activiteiten. - Workflow
eventsextraheren: Om activiteiten zoals 'Journal Entry Submitted', 'Approved', 'Rejected' en 'Changes Requested' vast te leggen, query de workflowtabellen. Gebruik tabel SWW_WI2OBJ om het boekhoudkundige document te koppelen aan een workflowinstance, en lees vervolgens SWWLOGHIST voor specifieke gebruikersbeslissingen of statuswijzigingen. - Berekende
eventsidentificeren: Voor 'Manual Entry Identified', controleer de transactiecode (BKPF-TCODE) tegen een lijst van bekende handmatigeentryt-codes. Voor 'Cross-Company Posting Identified', analyseer de BSEGline itemsvoor een gegeven document om te zien of meerderecompany codesbetrokken zijn. - Data consolideren en transformeren: Naarmate de
datavan elke activiteit wordt geselecteerd, transformeert u deze in de uiteindelijkeevent logstructuur. ConcateneerCompany Code,Document NumberenFiscal Yearom deJournalEntryIdte creëren. Converteer SAP-datums en -tijden naar een enkeleEventTime timestamp. Voeg de resultaten van elke query toe aan de uiteindelijke interne tabel. - Bestandsexport implementeren: Gebruik ABAP-bestandshandling-statements, zoals OPEN DATASET, LOOP AT, TRANSFER en CLOSE DATASET, om de geconsolideerde interne tabel naar een CSV- of flat file te schrijven op de SAP
application serverdirectory (zichtbaar via transactie AL11). - Plannen als
Background Job: Ga naar transactie SM36 (Define Background Job). Creëer een nieuwejob, definieer een stap die uw ABAP-programma uitvoert, en stel een schema in, bijvoorbeeld 's nachts of wekelijks tijdens daluren, om het extractieproces te automatiseren. - Bestand ophalen en formatteren: Gebruik transactie CG3Y of werk samen met uw systeembeheerder om het gegenereerde bestand van de
application servernaar uw lokale machine te downloaden. Zorg ervoor dat de bestandscodering en het formaat geschikt zijn voor upload naar uwprocess mining tool.
Configuratie
- Datumbereik: Het is cruciaal om een datumbereik te definiëren voor het beheer van de prestaties. Gebruik de aanmaakdatum van het document (BKPF-CPUDT) als primair filter. Voor een initiële analyse wordt een periode van 3 tot 6 maanden aanbevolen. Voor tests gebruikt u een bereik van enkele dagen waarvan bekend is dat deze data bevat.
Company CodeFilter: Filter altijd opCompany Code(BKPF-BUKRS). Het extraheren van data voor alleCompany Codestegelijk kan extreem resource-intensief zijn. Begin met één of een kleine groep relevanteCompany Codes.Document TypeFilter: Gebruik hetDocument Typefilter (BKPF-BLART) om de scope te beperken tot specifieke typenJournal Entries, zoals 'SA' voor grootboekdocumenten, als u niet alle documenttypen hoeft te analyseren.Workflow Task IDs: De logica voor het extraheren van workfloweventshangt af van specifieke taak-ID's die in uw systeem worden gebruikt voor goedkeuring, afwijzing en indiening. Deze ID's moeten in de broncode van het programma worden geconfigureerd op basis van de workflowdefinities van uw bedrijf.- Prestatieoverwegingen: Het programma join(t) verschillende grote tabellen, met name CDPOS en de workflow historie-tabellen. Uitvoering tijdens piekuren kan de systeemprestaties beïnvloeden. Plan het altijd als een
background jobom buiten piekuren te draaien. Overweeg het creëren van secundaire database-indexes als prestaties een terugkerend probleem zijn. - Vereisten: Deze methode vereist een gebruiker met ABAP-ontwikkelautorisaties (voor SE38) en rechten om
background jobs(voor SM36) aan te maken en te beheren. De gebruiker ofjobheeft ook leesrechten nodig voor alle relevante financiële, workflow- en systeemtabellen (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST, etc.).
a 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
- Databaseverbinding tot stand brengen: Verkrijg
read-onlyinloggegevens voor de SAP ECC-database. Gebruik een standaard SQL-client, zoals DBeaver, SAP HANA Studio of SQL Server Management Studio, om verbinding te maken met de database. - De SQL-query voorbereiden: Kopieer de volledige SQL-query uit de 'query'-sectie van dit document naar uw SQL-client.
- Extractieparameters instellen: Voordat u de query uitvoert, moet u de
placeholdersbinnen de query configureren. Vervang'[START_DATE]'en'[END_DATE]'door het gewenste datumbereik in 'YYYYMMDD'-formaat. Vervang'[COMPANY_CODE_1]', '[COMPANY_CODE_2]'door de specifieke SAPcompany codesdie u wilt analyseren. Source Systemdefiniëren: Vervang in de hoofdSELECTstatement deplaceholder'[Your SAP System ID]'door de feitelijke SAPSystem ID(SID) om dedata sourcecorrect te identificeren.- De query uitvoeren: Voer de geconfigureerde SQL-query uit op de SAP-database. De uitvoeringstijd zal variëren afhankelijk van het datumbereik en de grootte van uw databasetabellen.
- Initiële resultaten beoordelen: Zodra de query is voltooid, scant u kort de geretourneerde rijen om ervoor te zorgen dat de data naar verwachting wordt gevuld. Controleer op een verscheidenheid aan activiteiten en of belangrijke velden zoals
JournalEntryIdenEventTimeniet leeg zijn. Timestampsverwerken: De query concateneert datum- en tijdvelden tot eenYYYYMMDDHHMMSSstring. Zorg ervoor dat uw post-processing oftarget systemdit formaat kan parsen, of pas de SQLCONCAT-functie aan naar een ISO 8601-formaat zoalsYYYY-MM-DDTHH:MI:SSals uw database dit ondersteunt.- De data exporteren: Exporteer de volledige resultaatset van uw SQL-client naar een CSV-bestand. Zorg ervoor dat u UTF-8-codering gebruikt om problemen met speciale tekens te voorkomen.
- Voorbereiden op upload: Voordat u uploadt naar een
process mining tool, controleert u of de kolomheaders overeenkomen met het vereistedata schema.JournalEntryId,ActivityNameenEventTimezijn cruciaal. Voeg deLastDataUpdatekolom toe, en vul deze met detimestampvan wanneer de extractie werd uitgevoerd. - Definitieve validatie: Voer de stappen uit die worden beschreven in de 'validationSteps'-sectie om ervoor te zorgen dat de geëxtraheerde data compleet en accuraat is voordat u met uw analyse begint.
Configuratie
- Database Authorizations: De databasegebruiker heeft leesrechten nodig voor de volgende SAP-tabellen: BKPF, BSEG, CDHDR, CDPOS, T001 en V_USERNAME. Voor workflowgerelateerde activiteiten is toegang tot SWW_WI2OBJ en SWWLOGHIST ook vereist. Dit toegangsniveau wordt doorgaans alleen toegekend aan gespecialiseerde technische teams.
- Date Range Filtering: Het is essentieel om de data te filteren op een specifiek datumbereik om de queryprestaties te waarborgen. De meegeleverde query gebruikt placeholders voor een start- en einddatum, die worden toegepast op de aanmaakdatum van het document (
BKPF.CPUDT). Een bereik van 3 tot 6 maanden wordt aanbevolen voor een initiële analyse. - Entity Filtering: Om het datavolume te beheren en de analyse te focussen, filtert u altijd op
Company Code(BKPF.BUKRS). U kunt er ook voor kiezen om te filteren opDocument Type(BKPF.BLART) om alleen relevanteJournal Entrytypes op te nemen, bijvoorbeeld 'SA' voor grootboekdocumenten, en operationele documenten zoals facturen of betalingen uit te sluiten als deze buiten de scope vallen. - Performance Considerations: Directe queries op kerntabellen zoals BSEG en CDPOS kunnen veel resources vergen. Het wordt sterk aanbevolen om deze extractie buiten piekuren uit te voeren om de systeemprestaties voor eindgebruikers niet te beïnvloeden. Vermijd het extraheren van data voor meer dan een jaar in één uitvoering.
- Workflow Task IDs: De query bevat placeholders zoals
'[WF_TASK_ID_SUBMIT]'en'[WF_TASK_ID_APPROVE]'. Deze moeten worden vervangen door de werkelijke taak-ID's uit de specifiekeJournal Entryworkflowconfiguratie van uw systeem. Deze kunnen worden geïdentificeerd door samen te werken met een SAP Workflow specialist of door de technische workflowdefinitie in transactie PFTC te analyseren.
a 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 tot stand brengen: Configureer in uw externe ETL-tool een nieuwe bronverbinding met uw SAP ECC-systeem. Dit vereist doorgaans de details van de
application server, client, systeemnummer en een toegewijde SAP-gebruiker met de nodige RFC-autorisaties. Data Sourcesdefiniëren: Voeg binnen uw extractieproject de vereiste SAP-tabellen toe alsdata sources. De primaire tabellen omvatten BKPF (Accounting Document Header), BSEG (Accounting Document Segment), VBSEGK (Parked Document Header), CDHDR (Change Document Header), CDPOS (Change Document Items), SWW_WI2OBJ (Workflow to Object Links), SWWLOGHIST (Workflow Log), en SRGBTBREL (Relationships for GOS Attachments).- Basis
Eventsextraheren (Created & Parked): Creëer de eerste data flow om initiëleeventste extraheren. Voor 'Journal Entry Parked', gebruik VBSEGK als de bron. Voor 'Journal Entry Created', gebruik BKPF, waarbij u ervoor zorgt dat u filtert op documenten die geenreversalszijn en niet aanvankelijk geparkeerd waren. Dit kan worden gedaan door middel van een anti-join met VBSEGK. - Workflow
Eventsextraheren: Creëer een data flow die BKPF joined met SWW_WI2OBJ met behulp van de object key (company code+document number+fiscal year) om de workflowinstance IDte vinden. Join dit resultaat met SWWLOGHIST omeventszoals 'Submitted', 'Approved', 'Rejected' en 'Changes Requested' te extraheren op basis van de workflow taakresultaten en gebruikersbeslissingen die in het log zijn vastgelegd. - Wijzigings- en verwijderings
eventsextraheren: Gebruik tabellen CDHDR en CDPOS om wijzigingen te identificeren. Voor 'Journal Entry Corrected', filter op wijzigingen die zijn aangebracht in geparkeerde documenten (Object Class 'FIPP'). Voor 'Parked Journal Entry Deleted', zoek naar verwijderingsmarkers in dechange logsvoor geparkeerde documenten. Attachment Eventsextraheren: Om 'Documentation Attached' vast te leggen, join BKPF met SRGBTBREL waarbij het objecttype 'BKPF' is en de relatie is '[Uwattachment relationship type]'. De aanmaakdatum van de link dient als deevent time.ClearingenReversal Eventsextraheren: Voor 'Journal Entry Line Item Cleared', query de BSEG-tabel waar hetclearing documentveld (AUGBL) is gevuld. Deevent timeis deposting datevan hetclearing document(AUGDT). Voor 'Journal Entry Reversal Processed', query BKPF voor documenten diereversalszijn, geïdentificeerd door een waarde in hetreversed documentveld (STBLG).- Berekende
Eventsafleiden: Creëer afzonderlijke logische blokken voor berekendeevents. Voor 'Manual Entry Identified', filter BKPF op basis van een lijst van handmatige transactiecodes (bijv. FB01, FB50, F-02). Voor 'Cross-Company Posting Identified', groepeer de BSEG-tabel op document-ID en identificeer documenten met meer dan één afzonderlijkecompany code. - Alle
Event Flowscombineren: Gebruik een UNION-transformatie in uw ETL-tool om de outputs van alle individueleevent flows(Created, Parked, Approved, etc.) samen te voegen tot éénevent logtabel. Zorg ervoor dat de kolomnamen endata typesconsistent zijn voor alle flows. - Naar finaal
Schemamappen: Map de gecombineerdedatanaar de vereisteevent logstructuur, waarbij deJournalEntryId,ActivityName,EventTime,User, en andere vereiste en aanbevolenattributesworden gecreëerd. Voeg statische kolommen toe zoalsSourceSystemen gebruik de uitvoeringstijd van de ETLjobvoorLastDataUpdate. Incremental Loadingconfigureren: Voor doorlopende extracties, configureer eenincremental loadingstrategie. Gebruik de laatste aanmaak- of wijzigingsdatum (bijv. BKPF.CPUDT, CDHDR.UDATE) als eenwatermarkom alleen nieuwe of bijgewerkte records op te halen sinds de laatste run.- Exporteren voor ProcessMind: Plan de extractie
joben configureer de laatste uitvoerstap om deevent logop te slaan als een CSV- of Parquet-bestand op een locatie die toegankelijk is voor ProcessMind voor upload.
Configuratie
- Vereisten: Een gelicentieerde externe ETL-tool (bijv. Theobald Xtract Universal, Informatica, Talend) met een speciale SAP-connector. Een SAP-gebruikersaccount met RFC-toegang en autorisaties om financiële tabellen (bijv. S_TABU_DIS voor tabelgroepen F_00, F_WF), workflowdata en wijzigingslogs te lezen.
- Verbindingsparameters: U heeft het IP-adres of de hostnaam van de SAP Application Server, het systeemnummer en de client-ID nodig. Voor de SAP-gebruikersnaam en het wachtwoord moet een veilig beheersysteem voor inloggegevens worden gebruikt.
- Belangrijke filters: Pas altijd filters toe op
Company Code(BKPF.BUKRS) enFiscal Year(BKPF.GJAHR) bij de bron om het datavolume te beperken. Het wordt sterk aanbevolen om te filteren opDocument Creation Date(BKPF.CPUDT) om een specifieke extractieperiode te definiëren, bijvoorbeeld de laatste 6 maanden. - Datumbereik selectie: Voor de initiële load selecteert u een representatieve periode van bijvoorbeeld 3 tot 6 maanden. Voor volgende delta loads gebruikt u een watermark op een timestamp-veld zoals
CPUDTom alleen nieuwe records op te halen. - Prestatieoverwegingen: Joins op BSEG, CDPOS en workflowtabellen kunnen erg traag zijn. Zorg ervoor dat uw ETL-tool filters zoveel mogelijk naar de SAP-bron pusht. Extraheer data in kleinere batches of pakketten als de tool dit toestaat, vooral voor grote historische loads.
- Workflow Customization: De logica voor het identificeren van workflowactiviteiten zoals 'Goedgekeurd' of 'Afgekeurd' is sterk afhankelijk van uw specifieke workflowtemplates. U moet de juiste workflow taak-ID's en gebruikersbeslissingssleutels uit uw systeem identificeren om in de filters te gebruiken.
a Voorbeeldquery config
/*
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