Il Suo Template dei dati Record to Report - Registrazione contabile
Il Suo Template dei dati Record to Report - Registrazione contabile
- Attributi consigliati per un’analisi completa
- Attività chiave delle registrazioni contabili da monitorare
- Indicazioni pratiche per l’estrazione dei dati da SAP ECC
Record to Report - Attributi delle registrazioni contabili
| Nome | Descrizione | ||
|---|---|---|---|
| ID della scrittura contabile JournalEntryId | L'identificativo univoco di un documento di contabilità finanziaria, che combina codice società, numero documento ed esercizio. | ||
| Descrizione L'ID della scrittura contabile è l'identificativo principale del caso per monitorare il ciclo di vita di una scrittura contabile. È una chiave composta, generalmente formata dalla concatenazione di Codice società (BUKRS), Numero documento (BELNR) ed Esercizio (GJAHR), così da garantire l'univocità nell'intero sistema SAP. Nell'analisi dei processi, questo ID collega tutte le attività correlate, come creazione, parcheggio, invio, approvazione, rifiuto e registrazione. Tracciando questo identificativo è possibile ricostruire il percorso end-to-end di ogni scrittura contabile, misurare i tempi di ciclo e individuare deviazioni dal processo o colli di bottiglia per registrazioni specifiche. Perché è importante È la chiave essenziale per monitorare una scrittura contabile dalla creazione alla registrazione finale, consentendo l'analisi end-to-end del processo e il confronto tra varianti. Dove reperirlo È un Attributo derivato, generalmente ottenuto concatenando i campi della tabella BKPF: Codice società (BUKRS), Numero documento (BELNR) ed Esercizio (GJAHR). Esempi 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Nome dell'attività ActivityName | Il nome dell'attività aziendale o dell'evento che si è verificato in un determinato momento del processo della scrittura contabile. | ||
| Descrizione Il Nome dell'attività descrive un passaggio specifico del ciclo di vita della scrittura contabile, come «Scrittura contabile creata», «Scrittura contabile approvata» o «Scrittura contabile registrata». Questo Attributo viene generalmente derivato da più fonti SAP, tra cui codici transazione (TCODE), log dei documenti di modifica, nelle tabelle CDHDR e CDPOS, e campi di stato del documento. L'analisi delle attività è il fulcro del Process Mining. Consente di visualizzare le mappe dei processi, calcolare i tempi di transizione tra i passaggi e individuare i cicli di rielaborazione, ad esempio «Scrittura contabile rifiutata» seguita da «Scrittura contabile corretta». Questi dati sono fondamentali per le Dashboard relative ai tempi di ciclo, ai tassi di rielaborazione e alle varianti di processo. Perché è importante Definisce i passaggi nella mappa del processo, rendendo possibile visualizzare, analizzare e ottimizzare il Workflow della scrittura contabile. Dove reperirlo Derivato da diverse fonti, tra cui i codici transazione in BKPF (TCODE), lo stato del documento e i log del Workflow nelle tabelle come SWW_WI2OBJ, oppure i documenti di modifica nelle tabelle CDHDR e CDPOS. Esempi Scrittura contabile creataScrittura contabile approvataScrittura contabile rifiutataScrittura contabile registrata | |||
| Ora dell'evento EventTime | Il timestamp che indica quando si è verificata una specifica attività o un determinato evento per la scrittura contabile. | ||
| Descrizione L'Ora dell'evento fornisce la data e l'ora esatte di ogni attività nel processo della scrittura contabile. Questi dati sono fondamentali per calcolare tutte le metriche basate sul tempo, come tempi di ciclo, durate di elaborazione e ritardi tra i passaggi. La fonte del timestamp varia in base all'attività: può essere la data e l'ora di creazione del documento (CPUDT/CPUTM) oppure i timestamp delle modifiche nei log (CDHDR-UDATE/UTIME). Nell'analisi, l'Ora dell'evento viene utilizzata per ordinare cronologicamente gli eventi e costituisce la base della mappa del processo. È essenziale per calcolare tutti i KPI relativi al tempo, come il tempo medio di ciclo della scrittura contabile, il tempo medio di approvazione e il tempo dall'approvazione alla registrazione. Perché è importante Questo timestamp costituisce la base di tutte le analisi relative al tempo e consente di calcolare tempi di ciclo, durate e colli di bottiglia. Dove reperirlo Ottenuto da diversi campi in base all'attività, principalmente dal timestamp di creazione (CPUDT, CPUTM) di BKPF o dai timestamp dei documenti di modifica (UDATE, UTIME) di CDHDR. Esempi 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Sistema di origine SourceSystem | Il sistema dal quale sono stati estratti i dati del processo. | ||
| Descrizione Questo Attributo identifica l'origine dei dati, che in questo caso è la specifica istanza SAP ECC. Si tratta generalmente di un valore statico aggiunto durante il processo di estrazione dei dati. Sebbene sia semplice, questo Attributo è importante negli ambienti con più ERP o fonti di dati. Garantisce la tracciabilità dei dati e consente di filtrare o segmentare l'analisi in base al sistema di origine. Perché è importante Fornisce una tracciabilità chiara dei dati ed è essenziale per monitorarne la qualità, soprattutto negli ambienti con più sistemi di origine. Dove reperirlo Si tratta generalmente di un valore statico aggiunto durante il processo di trasformazione dei dati, che identifica la specifica istanza SAP ECC, ad esempio «ECC_PROD_100». Esempi SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Il timestamp che indica quando i dati sono stati estratti o aggiornati l'ultima volta dal sistema di origine. | ||
| Descrizione Questo Attributo registra la data e l'ora dell'estrazione più recente dei dati da SAP ECC. È un campo di metadati fondamentale per comprendere l'aggiornamento e l'attualità dei dati analizzati. In qualsiasi Dashboard o analisi di Process Mining, conoscere l'ora dell'ultimo aggiornamento è essenziale affinché gli utenti possano fidarsi dei dati e prendere decisioni informate. Aiuta a rispondere alla domanda: «Quanto sono aggiornate queste informazioni?». Perché è importante Informa gli utenti sull'aggiornamento dei dati, assicurando che comprendano l'intervallo temporale dell'analisi e possano fidarsi dei risultati. Dove reperirlo È un campo di metadati generato e memorizzato dallo strumento di estrazione dei dati o dal processo ETL al momento dell'aggiornamento dei dati. Esempi 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Codice società CompanyCode | L'unità organizzativa che rappresenta un'entità giuridica indipendente per la quale vengono redatti i bilanci. | ||
| Descrizione Il Codice società è un'unità organizzativa fondamentale in SAP Financials. Rappresenta una società giuridicamente indipendente ed è un campo chiave nella testata del documento della scrittura contabile. Questo Attributo è essenziale per segmentare l'analisi del processo per entità giuridica. Consente di confrontare le prestazioni del processo, i tassi di conformità e i risultati dei KPI tra diverse aree dell'azienda. Ad esempio, può aiutare a determinare se i ritardi di approvazione o gli elevati tassi di storno sono specifici di determinati codici società. Perché è importante Consente di filtrare e confrontare le prestazioni del processo tra diverse entità giuridiche o unità aziendali dell'organizzazione. Dove reperirlo Si trova nella tabella di testata del documento BKPF, campo BUKRS. Esempi 10002000US01DE01 | |||
| Codice transazione TransactionCode | Il codice transazione SAP utilizzato per creare o elaborare la scrittura contabile. | ||
| Descrizione Il Codice transazione (T-Code) è un identificativo univoco di una specifica funzione o programma in SAP. Per le scritture contabili indica come è stata creata la registrazione, ad esempio manualmente (FB01, F-02), tramite parcheggio (FV50) o attraverso un'interfaccia automatizzata. Questo Attributo è prezioso per la Dashboard «Ottimizzazione delle attività manuali». Analizzando il T-Code è possibile distinguere tra attività manuali e automatizzate, individuare i processi manuali che richiedono più tempo e identificare le opportunità di automazione per ridurre l'impegno manuale e migliorare l'efficienza. Perché è importante Aiuta a distinguere tra processi manuali e automatizzati, individuando opportunità di automazione e standardizzazione dei processi. Dove reperirlo Si trova nella tabella di testata del documento BKPF, campo TCODE. Esempi FB01F-02FV50FBD1 | |||
| Data di registrazione PostingDate | La data in cui la transazione viene registrata nel libro mastro, con effetto sul periodo finanziario. | ||
| Descrizione La Data di registrazione determina il periodo fiscale nel quale la scrittura contabile viene contabilizzata. È un campo data critico dal punto di vista finanziario e della conformità, poiché deve essere coerente con i calendari di chiusura dei periodi contabili e con le normative. Nel Process Mining, questa data viene utilizzata per monitorare la conformità. La Dashboard «Monitoraggio del rispetto della conformità» e il KPI «Tasso di conformità» utilizzano questo Attributo per verificare che le registrazioni siano effettuate nel periodo corretto. Può inoltre essere utilizzata per analizzare nel tempo le tendenze relative ai volumi delle scritture contabili. Perché è importante È fondamentale per il reporting finanziario e l'analisi della conformità, poiché assicura che le registrazioni vengano effettuate nel periodo contabile corretto. Dove reperirlo Si trova nella tabella di testata del documento BKPF, campo BUDAT. Esempi 2023-10-312023-11-302024-01-15 | |||
| È stornato IsReversed | Un flag booleano che indica se la scrittura contabile è stata stornata. | ||
| Descrizione Questo flag identifica le scritture contabili che sono state successivamente stornate da un altro documento contabile. In SAP, un documento stornato è collegato al documento di storno, fornendo una traccia di audit chiara. Questo Attributo è fondamentale per la Dashboard «Analisi degli storni delle scritture contabili» e per il KPI «Tasso di storno delle scritture contabili». Consente di isolare le registrazioni stornate e analizzarne le cause principali, come errori di inserimento dati o trattamenti contabili errati, con l'obiettivo di ridurre la frequenza degli storni. Perché è importante Supporta direttamente l'analisi degli storni segnalando le registrazioni successivamente annullate, aiutando a individuare le cause principali degli errori e a migliorare l'integrità dei dati. Dove reperirlo Derivato dal campo del numero del documento di storno (STBLG) nella tabella BKPF. Se STBLG non è vuoto, il flag è impostato su true. Esempi truefalse | |||
| Tipo di documento DocumentType | Una classificazione dei documenti contabili che ne controlla l'elaborazione e la memorizzazione. | ||
| Descrizione Il Tipo di documento distingue diversi tipi di transazioni aziendali, come una registrazione nella contabilità generale (SA), una fattura fornitore (KR) o una registrazione cespiti (AA). Viene definito durante la configurazione del sistema e assegnato a ogni scrittura contabile. È un Attributo critico per l'analisi, poiché consente di segmentare il processo in base alla natura della transazione. La Dashboard «Volumi delle scritture contabili per tipo» e il KPI «Tempo medio di ciclo per tipo di scrittura contabile» dipendono direttamente da questo campo. Aiuta a individuare se determinati tipi di registrazione sono più soggetti a ritardi, rielaborazioni o storni. Perché è importante Consente di segmentare l'analisi per tipo di transazione e aiuta a determinare se i problemi di processo riguardano tipi specifici di scritture contabili. Dove reperirlo Si trova nella tabella di testata del documento BKPF, campo BLART. Esempi SAKRREAA | |||
| Utente User | L'ID utente SAP della persona che ha creato o modificato la scrittura contabile. | ||
| Descrizione Questo Attributo acquisisce il nome utente SAP responsabile di una determinata attività, come la creazione, il parcheggio o la registrazione di un documento. Viene ricavato direttamente dalla testata del documento o dalle tabelle dei log delle modifiche. Analizzare l'Attributo Utente è fondamentale per comprendere le prestazioni dei team e dei singoli utenti. Supporta la Dashboard sulla produttività degli utenti monitorando i volumi di attività e i tempi di elaborazione per utente. Aiuta inoltre a individuare chi è coinvolto nei cicli di rielaborazione, negli storni o nelle deviazioni di conformità, consentendo formazione mirata o miglioramenti del processo. Perché è importante Identifica l'utente responsabile di ogni attività e consente di analizzare le prestazioni degli utenti, la distribuzione del carico di lavoro e i modelli di rielaborazione. Dove reperirlo Generalmente dalla tabella BKPF, campo USNAM per il creatore, oppure dalla tabella CDHDR, campo USERNAME per chi apporta la modifica. Esempi ABROWNCJONESDSMITH | |||
| Centro di costo CostCenter | Unità organizzativa all’interno di un’area di controlling che rappresenta una sede in cui vengono sostenuti i costi. | ||
| Descrizione Il centro di costo è un elemento fondamentale dei dati anagrafici del modulo Controlling (CO), spesso assegnato a livello di posizione della registrazione contabile. Viene utilizzato per monitorare i costi di uno specifico reparto, funzione o sede. L’inclusione del centro di costo consente un’analisi più granulare del processo di registrazione contabile. Può aiutare a determinare se alcuni reparti generano più rilavorazioni, presentano tempi di ciclo più lunghi o sono responsabili di un volume maggiore di registrazioni manuali. In questo modo è possibile analizzare l’efficienza del processo a livello di reparto. Perché è importante Consente di analizzare le prestazioni del processo per reparto o area funzionale, aiutando a individuare le inefficienze locali. Dove reperirlo Si trova nella tabella delle posizioni del documento BSEG, campo KOSTL. Esempi 4100CC_FINANCE_US10010101 | |||
| Chiave valuta CurrencyKey | Il codice valuta degli importi registrati nella scrittura contabile. | ||
| Descrizione Questo Attributo specifica la valuta della scrittura contabile, come USD, EUR o JPY. Fornisce il contesto per tutti gli importi finanziari associati al documento. Sebbene non sia sempre una dimensione di analisi primaria, è fondamentale per interpretare correttamente i valori monetari. Può inoltre essere utilizzato per segmentare l'analisi nelle organizzazioni globali e verificare se i processi differiscono per le registrazioni in valuta estera rispetto a quelle in valuta locale. Perché è importante Fornisce il contesto necessario per tutti i valori monetari, assicurando un'analisi e un'interpretazione finanziaria accurate. Dove reperirlo Si trova nella tabella di testata del documento BKPF, campo WAERS. Esempi USDEURGBPJPY | |||
| È parcheggiato IsParked | Indicatore booleano che segnala se la registrazione contabile è stata salvata come documento parcheggiato prima della registrazione definitiva. | ||
| Descrizione Il parcheggio di un documento consente all’utente di salvare una registrazione contabile incompleta senza incidere sui saldi finanziari. Il documento può quindi essere completato o verificato da un altro utente prima della registrazione definitiva. Questo indicatore identifica le registrazioni che hanno attraversato una fase di parcheggio. L’analisi di questo attributo aiuta a comprendere l’utilizzo della funzione di parcheggio. Può evidenziare se il parcheggio viene utilizzato come fase informale di revisione, causando potenzialmente dei ritardi. Supporta inoltre l’analisi del tempo di ciclo end-to-end, distinguendo le registrazioni registrate direttamente da quelle parcheggiate in precedenza. Perché è importante Identifica le registrazioni che utilizzano la funzione di parcheggio, che può essere una fonte di ritardi o un indicatore di un processo informale di revisione. Dove reperirlo Derivato dal campo dello stato del documento (BSTAT) nella tabella BKPF. Il valore «V» indica un documento parcheggiato. Esempi truefalse | |||
| È una rilavorazione IsRework | Indicatore booleano che segnala se una registrazione contabile ha attraversato un ciclo di rilavorazione, ad esempio dopo essere stata rifiutata e successivamente corretta. | ||
| Descrizione Questo indicatore identifica i casi che si sono discostati dal «percorso standard» e hanno richiesto un intervento correttivo. In genere viene impostato su true quando, per una determinata registrazione contabile, viene osservata una sequenza di attività come «Registrazione contabile rifiutata» seguita da «Registrazione contabile corretta». Questo attributo è essenziale per calcolare il KPI «Tasso di rilavorazione delle registrazioni contabili» e per l’analisi nella Dashboard «Tasso di rilavorazione e rifiuto». Aiuta a quantificare l’entità dell’inefficienza nel processo e fornisce una base per analizzare le cause principali delle rilavorazioni, come requisiti poco chiari o documentazione insufficiente. Perché è importante Segnala le registrazioni che hanno richiesto una correzione, consentendo di quantificare le rilavorazioni e analizzarne le cause principali per migliorare il tasso di esecuzione corretta al primo tentativo. Dove reperirlo Si tratta di un attributo calcolato, derivato dall’analisi della sequenza di attività di un caso. Un ciclo di rilavorazione viene identificato quando si verifica un’attività di rifiuto o di correzione. Esempi truefalse | |||
| Importo totale del documento TotalDocumentAmount | Il valore totale della scrittura contabile nella valuta del documento. | ||
| Descrizione Questo Attributo rappresenta il valore finanziario totale della scrittura contabile. Generalmente viene calcolato sommando i valori assoluti di tutte le posizioni in dare o in avere associate al documento. Analizzare il processo in base al valore finanziario può rivelare modelli importanti. Ad esempio, le registrazioni di importo elevato potrebbero seguire un percorso di approvazione diverso e più rigoroso. Questo Attributo può essere utilizzato per filtrare o segmentare l'analisi e verificare se i tempi di ciclo, i tassi di rifiuto o i ritardi di approvazione sono correlati all'importo della registrazione. Perché è importante Consente di analizzare l'impatto finanziario, ad esempio correlando i tempi di elaborazione o i tassi di rifiuto al valore monetario delle scritture contabili. Dove reperirlo È un campo calcolato, derivato dall'aggregazione del campo importo (WRBTR o DMBTR) di tutte le posizioni nella tabella BSEG per una determinata scrittura contabile. Esempi 1500.0025000.75125.50 | |||
| Motivo dello storno ReversalReason | Un codice che indica il motivo per cui una scrittura contabile è stata stornata. | ||
| Descrizione Quando un documento viene stornato, SAP consente all’utente di specificare un codice causale. Questo codice fornisce informazioni strutturate sul motivo per cui si è reso necessario lo storno, ad esempio una data di registrazione errata o un errore di immissione dei dati. Questo attributo è un input fondamentale per la Dashboard «Analisi degli storni delle registrazioni contabili». Analizzando i motivi di storno più frequenti, le organizzazioni possono individuare problemi sistemici nei processi o lacune nella formazione, quindi adottare interventi mirati per prevenire errori futuri e ridurre il tasso di storno. Perché è importante Fornisce una visione diretta dei motivi per cui si verificano gli storni, consentendo un’analisi mirata delle cause principali per ridurre gli errori futuri. Dove reperirlo Si trova nella tabella dell’intestazione del documento BKPF, campo STGRD. Esempi 010205 | |||
| Tempo di approvazione ApprovalTime | Tempo trascorso dal momento in cui una registrazione contabile viene inviata per l’approvazione fino alla sua approvazione o al suo rifiuto. | ||
| Descrizione Questa metrica misura la durata del sottoprocesso di approvazione, che spesso contribuisce in modo significativo al tempo di ciclo complessivo. Viene calcolata come differenza temporale tra l’attività «Registrazione contabile inviata» e la corrispondente attività «Registrazione contabile approvata» o «Registrazione contabile rifiutata». Il tempo di approvazione è la metrica principale della Dashboard «Prestazioni di approvazione delle registrazioni contabili» e del KPI «Tempo medio di approvazione delle registrazioni contabili». L’analisi di questa durata aiuta a individuare i colli di bottiglia nel Workflow di approvazione, misurare le prestazioni degli approvatori e motivare modifiche al processo, come l’adeguamento delle soglie di approvazione. Perché è importante Quantifica la durata della fase di approvazione, aiutando a individuare e risolvere i ritardi nel Workflow di revisione e approvazione. Dove reperirlo Calcolato sottraendo il timestamp dell’evento «Registrazione contabile inviata» a quello dell’evento «Registrazione contabile approvata» o «Registrazione contabile rifiutata». Esempi P1DT2HPT4H15MP3D | |||
Record to Report - Attività delle registrazioni contabili
| Attività | Descrizione | ||
|---|---|---|---|
| Processo di storno della scrittura contabile completato | Questa attività indica lo storno di una scrittura contabile precedentemente registrata. Uno storno è un nuovo documento contabile che annulla la registrazione originale. | ||
| Perché è importante È un evento critico per misurare la qualità dei dati e l'accuratezza del processo. Un'elevata percentuale di storni indica problemi sistemici nelle fasi iniziali di inserimento o approvazione dei dati, e ogni storno rappresenta una rielaborazione. Dove reperirlo Questo evento viene identificato nella testata del documento originale, nella tabella BKPF. Quando un documento viene stornato, SAP valorizza il numero del documento di storno (BKPF-STBLG) e il motivo dello storno (BKPF-STGRD). Il timestamp dell'evento corrisponde alla data di registrazione del nuovo documento di storno. Acquisizione Individuare il momento in cui BKPF-STBLG viene valorizzato nel documento originale; il timestamp corrisponde alla data di registrazione del documento di storno. Tipo di evento explicit | |||
| Scrittura contabile approvata | Questa attività indica l'approvazione finale di una scrittura contabile all'interno di un Workflow, rendendola idonea alla registrazione. L'evento viene acquisito dal log del Workflow quando viene completato l'ultimo passaggio di «rilascio» o «approvazione». | ||
| Perché è importante È una tappa fondamentale che conclude il processo di approvazione. La durata fino a questa attività è un KPI critico per l'efficienza dell'approvazione, mentre il tempo tra questo evento e la registrazione misura il ritardo successivo all'approvazione. Dove reperirlo Deducibile dal timestamp di completamento dell'ultimo passaggio di approvazione nel log SAP Business Workflow. Si tratta dell'ultima azione di approvazione prima che il documento venga registrato o reso pronto per la registrazione. Acquisizione Individuare il completamento dell'ultimo passaggio di «rilascio» o «approvazione» nei log del Workflow. Tipo di evento inferred | |||
| Scrittura contabile inviata | Questa attività indica che una scrittura contabile parcheggiata è stata finalizzata dal suo creatore ed è ora pronta per la revisione e l'approvazione. Viene generalmente rilevata dall'avvio di un'attività SAP Business Workflow associata al documento parcheggiato. | ||
| Perché è importante Indica il passaggio di consegne dal creatore all'approvatore e avvia il conteggio del tempo del ciclo di approvazione per i KPI. È una tappa fondamentale per misurare l'efficienza del Workflow di approvazione. Dove reperirlo Deducibile dall'ora di avvio dell'istanza del Workflow di approvazione collegata all'oggetto del documento finanziario. È necessario analizzare tabelle dei log del Workflow come SWW_WI2OBJ per individuare il Workflow avviato per lo specifico codice società, numero documento ed esercizio. Acquisizione Individuare l'evento di avvio del Workflow per l'oggetto del documento parcheggiato. Tipo di evento inferred | |||
| Scrittura contabile parcheggiata | Questa attività indica la creazione iniziale di una scrittura contabile in uno stato preliminare, prima della registrazione ufficiale nel libro mastro. In SAP viene rilevata esplicitamente quando un utente salva un documento utilizzando una transazione di parcheggio, impostando lo stato del documento su «parcheggiato». | ||
| Perché è importante Si tratta di un evento iniziale critico per i processi che prevedono revisione e approvazione. Analizzare il tempo tra il parcheggio e la registrazione aiuta a individuare i ritardi nelle fasi precedenti alla registrazione e in quelle di approvazione. Dove reperirlo Questo evento viene identificato nella tabella di testata del documento BKPF. Un documento è considerato parcheggiato quando viene creato con BKPF-BSTAT = «V». Il timestamp dell'evento corrisponde alla data e all'ora di creazione, BKPF-CPUDT e BKPF-CPUTM. Acquisizione Individuare la creazione del documento in BKPF quando BKPF-BSTAT è «V». Tipo di evento explicit | |||
| Scrittura contabile registrata | Questa è l'attività centrale in cui la scrittura contabile viene registrata ufficialmente nel libro mastro, con impatto sui bilanci. L'evento viene acquisito esplicitamente quando lo stato del documento viene impostato su «registrato» e viene assegnata una data di registrazione. | ||
| Perché è importante È la tappa più importante, poiché indica l'elaborazione corretta di una scrittura contabile. Il tempo di ciclo end-to-end viene spesso misurato fino a questo punto, che rappresenta un evento chiave per l'analisi della chiusura finanziaria. Dove reperirlo Viene identificato quando un documento nella tabella BKPF presenta una data di registrazione, BKPF-BUDAT. Per i documenti parcheggiati, corrisponde al momento in cui lo stato BKPF-BSTAT cambia da «V» a vuoto. Il timestamp della registrazione è la data di inserimento BKPF-CPUDT. Acquisizione Individuare il momento in cui BKPF-BSTAT cambia da «V» a vuoto oppure, per le registrazioni dirette, l'evento di creazione. Tipo di evento explicit | |||
| Documentazione allegata | Questa attività rappresenta l'azione con cui un utente allega documenti di supporto, come fatture o fogli di calcolo, alla scrittura contabile. L'evento non viene registrato esplicitamente come evento contabile standard e viene generalmente dedotto verificando la creazione di allegati collegati all'oggetto documento contabile. | ||
| Perché è importante Il monitoraggio di questa attività aiuta a verificare la conformità alle policy che richiedono la documentazione. I ritardi nell'allegare i documenti possono essere una causa principale del prolungamento dei cicli di approvazione. Dove reperirlo È difficile acquisire questo evento in modo affidabile come evento con timestamp. Potrebbe essere dedotto analizzando le tabelle degli allegati di Generic Object Services (GOS), come SOOD, e collegando il timestamp di creazione dell'allegato alla chiave oggetto della scrittura contabile. Acquisizione Dedurre l'evento dal timestamp di creazione degli oggetti collegati nelle tabelle GOS, ad esempio SOOD. Tipo di evento inferred | |||
| Inserimento manuale identificato | Questa attività identifica se una scrittura contabile è stata creata tramite una transazione online manuale anziché tramite un'interfaccia automatizzata o un processo batch. Non si tratta di un'azione dell'utente, ma di un Attributo calcolato della registrazione, derivato dai dati di sistema. | ||
| Perché è importante Distinguere tra registrazioni manuali e automatizzate è fondamentale per un miglioramento mirato del processo. I processi manuali sono spesso il principale oggetto delle iniziative di standardizzazione e automazione. Dove reperirlo Viene calcolato analizzando i campi della tabella di testata del documento BKPF. I codici transazione (BKPF-TCODE) come «FB01», «FB50» o «FV50» indicano un inserimento manuale, mentre altri codici T o specifici nomi di batch input (BKPF-AWKEY) suggeriscono l'automazione. Acquisizione Derivare da BKPF-TCODE o da altri indicatori del sistema di origine nella testata del documento. Tipo di evento calculated | |||
| Modifiche richieste sulla scrittura contabile | Rappresenta un punto del Workflow in cui un approvatore ha esaminato la scrittura contabile e l'ha restituita al creatore per la correzione. Questo evento viene acquisito dai log del Workflow che indicano una decisione dell'utente di «rifiuto» o «restituzione». | ||
| Perché è importante Questa attività è essenziale per individuare i cicli di rielaborazione, che costituiscono una delle principali fonti di inefficienza e deviazione dal processo. Un'elevata frequenza di questo evento indica problemi nella qualità delle registrazioni o requisiti poco chiari. Dove reperirlo Questo evento viene dedotto dal timestamp di uno specifico passaggio decisionale dell'utente nel log SAP Business Workflow, corrispondente a un'azione di «rifiuto» o «invio per correzione». Acquisizione Individuare il timestamp della decisione di «rifiuto» o «rielaborazione» nei log del Workflow. Tipo di evento inferred | |||
| Posizione della scrittura contabile compensata | Questa attività rappresenta la riconciliazione di una posizione di un conto di contabilità generale gestito a partite aperte, come un conto transitorio bancario. Si verifica quando una posizione viene abbinata a un'altra e chiusa. | ||
| Perché è importante Per processi come la riconciliazione bancaria, il tempo necessario per compensare le posizioni è un KPI fondamentale. Questa attività aiuta ad analizzare l'efficienza delle procedure di riconciliazione e di chiusura di fine mese. Dove reperirlo Questo evento viene acquisito dalla tabella delle posizioni BSEG. Quando una posizione viene compensata, i campi della data di compensazione (BSEG-AUGDT) e del documento di compensazione (BSEG-AUGBL) vengono valorizzati. Il timestamp dell'evento corrisponde alla data di compensazione. Acquisizione Individuare il momento in cui la data di compensazione (BSEG-AUGDT) viene valorizzata per una posizione. Tipo di evento explicit | |||
| Registrazione intercompany identificata | Un'attività calcolata che segnala una scrittura contabile con impatto su più di un codice società. Viene determinata analizzando le posizioni di un singolo documento finanziario. | ||
| Perché è importante Le transazioni intercompany possono avere requisiti di elaborazione e approvazione più complessi. Identificarle consente di analizzarne separatamente i tempi di ciclo e i percorsi di processo, individuando colli di bottiglia specifici. Dove reperirlo Calcolata esaminando la tabella delle posizioni BSEG per un determinato numero documento (BELNR). Se le posizioni contengono più di un codice società distinto (BSEG-BUKRS), la registrazione è intercompany. Acquisizione Verificare se per un singolo BKPF-BELNR esistono più valori univoci di BSEG-BUKRS. Tipo di evento calculated | |||
| Scrittura contabile corretta | Questa attività indica che il creatore originale ha modificato una scrittura contabile parcheggiata dopo che gli era stata restituita per apportare modifiche. Viene dedotta rilevando modifiche al documento successive a un evento «Modifiche richieste». | ||
| Perché è importante Il monitoraggio delle correzioni aiuta a quantificare l'impegno dedicato alla rielaborazione. Il tempo tra la richiesta di modifica e la correzione evidenzia i ritardi nella risoluzione dei problemi relativi alle registrazioni inviate. Dove reperirlo Deducibile analizzando i log dei documenti di modifica, nelle tabelle CDHDR e CDPOS, relativi al documento parcheggiato. Una modifica registrata dopo un evento di rifiuto nel Workflow indica che è stata apportata una correzione. Il timestamp proviene dalla tabella CDHDR. Acquisizione Individuare la voce del log delle modifiche in CDHDR/CDPOS successiva a un evento di rifiuto. Tipo di evento inferred | |||
| Scrittura contabile creata | Rappresenta la creazione di una scrittura contabile registrata direttamente, senza un precedente passaggio di parcheggio. Viene rilevata quando un documento viene creato in SAP utilizzando una transazione di registrazione diretta. | ||
| Perché è importante Questa attività costituisce un punto di avvio alternativo per i processi più semplici delle scritture contabili che non richiedono un Workflow di approvazione. Aiuta a distinguere le registrazioni semplici e dirette dalle scritture parcheggiate più complesse. Dove reperirlo Questo evento corrisponde alla creazione del documento nella tabella BKPF, dove lo stato del documento BKPF-BSTAT è vuoto, cioè registrato. Il timestamp dell'evento è la data di creazione, BKPF-CPUDT. Per questi documenti, gli eventi «Creato» e «Registrato» si verificano simultaneamente. Acquisizione Individuare la creazione del documento in BKPF quando BKPF-BSTAT è vuoto. Tipo di evento explicit | |||
| Scrittura contabile parcheggiata eliminata | Rappresenta l'eliminazione di una scrittura contabile parcheggiata che non è mai stata registrata. Può verificarsi dopo un rifiuto oppure se la registrazione è stata creata per errore. | ||
| Perché è importante Questa attività segna una conclusione non riuscita del processo. Analizzare le ragioni per cui i documenti parcheggiati vengono eliminati può evidenziare problemi come registrazioni duplicate o incomprensioni del processo. Dove reperirlo Questo evento viene acquisito quando lo stato di un documento parcheggiato nella tabella BKPF cambia. Il campo di stato BKPF-BSTAT viene aggiornato a «Z» (documento parcheggiato eliminato). Il timestamp della modifica è disponibile nei log delle modifiche del documento (CDHDR). Acquisizione Individuare il momento in cui BKPF-BSTAT viene aggiornato a «Z». Tipo di evento explicit | |||
| Scrittura contabile rifiutata | Questa attività indica il rifiuto definitivo di una scrittura contabile, che di conseguenza non verrà registrata. Si tratta generalmente di uno stato terminale in un Workflow di approvazione, che porta infine all'eliminazione del documento parcheggiato. | ||
| Perché è importante Il monitoraggio dei rifiuti è fondamentale per la gestione della qualità. Analizzare le motivazioni e la frequenza dei rifiuti aiuta a migliorare il tasso di scritture contabili corrette al primo tentativo. Dove reperirlo Si tratta di un risultato acquisito dal log SAP Business Workflow, che rappresenta una decisione finale dell'utente di «rifiuto» e termina il processo. Il documento parcheggiato potrebbe essere eliminato successivamente. Acquisizione Individuare lo stato terminale di «rifiuto» nel log del Workflow relativo al documento. Tipo di evento inferred | |||
Guide all’estrazione
Passaggi
- Crei il programma ABAP: nel sistema SAP, acceda al codice transazione SE38 (ABAP Editor). Inserisca un nome per il nuovo programma, ad esempio Z_PM_JE_EXTRACTION, e faccia clic su Crea. Indichi un titolo appropriato e imposti il tipo di programma su «Executable Program».
- Definisca la schermata di selezione: nel codice sorgente del programma, definisca la schermata di selezione. Questa consente agli utenti di specificare parametri come l’intervallo di date di creazione dei documenti, i codici società e i tipi di documento, così da limitare il volume dei dati estratti.
- Dichiari le strutture dati: definisca una struttura di tabella interna che conterrà i dati finali dell’Event Log. La struttura deve includere tutti i campi obbligatori: JournalEntryId, ActivityName, EventTime, SourceSystem, LastDataUpdate e gli attributi consigliati, come User, CompanyCode e PostingDate.
- Implementi la logica di selezione dei dati: scriva le query SQL ABAP principali per estrarre i dati relativi a ciascuna delle 14 attività obbligatorie. Ciò comporta la selezione dei dati da tabelle primarie come BKPF (Header) e BSEG (Line Item), dalle tabelle dei log delle modifiche CDHDR e CDPOS, dalle tabelle del Workflow come SWWLOGHIST e dalle tabelle di compensazione come BSAS e BSAK.
- Estragga i documenti parcheggiati e registrati: per gli eventi «Journal Entry Parked», selezioni da BKPF i record in cui lo stato del documento (BSTAT) è «V». Per gli eventi «Journal Entry Created» e «Journal Entry Posted», selezioni da BKPF i record in cui lo stato è vuoto, a indicare un documento normale e registrato.
- Estragga gli eventi di modifica e cancellazione: interroghi le tabelle dei documenti di modifica CDHDR e CDPOS per la classe oggetto «BELEG». Applichi un filtro sulla chiave del documento per individuare le modifiche corrispondenti alle attività «Journal Entry Corrected» o «Parked Journal Entry Deleted».
- Estragga gli eventi del Workflow: per acquisire attività come «Journal Entry Submitted», «Approved», «Rejected» e «Changes Requested», interroghi le tabelle del Workflow. Utilizzi la tabella SWW_WI2OBJ per collegare il documento contabile a un’istanza del Workflow, quindi legga SWWLOGHIST per individuare decisioni specifiche degli utenti o cambiamenti di stato.
- Identifichi gli eventi calcolati: per «Manual Entry Identified», verifichi il codice transazione (BKPF-TCODE) rispetto a un elenco di codici transazione manuali noti. Per «Cross-Company Posting Identified», analizzi le posizioni BSEG di un determinato documento per verificare se sono coinvolti più codici società.
- Consolidi e trasformi i dati: man mano che seleziona i dati di ciascuna attività, li trasformi nella struttura finale dell’Event Log. Concateni Company Code, Document Number e Fiscal Year per creare JournalEntryId. Converti date e orari SAP in un unico timestamp EventTime. Aggiunga i risultati di ogni query alla tabella interna finale.
- Implementi l’esportazione dei file: utilizzi istruzioni ABAP per la gestione dei file, come OPEN DATASET, LOOP AT, TRANSFER e CLOSE DATASET, per scrivere la tabella interna consolidata in un file CSV o flat file nella directory del server applicativo SAP, visualizzabile tramite la transazione AL11.
- Pianifichi l’esecuzione come job in background: acceda alla transazione SM36 (Define Background Job). Crei un nuovo job, definisca uno step che esegua il programma ABAP e imposti una pianificazione, ad esempio notturna o settimanale nelle ore di minore attività, per automatizzare l’estrazione.
- Recuperi e formatti il file: utilizzi la transazione CG3Y oppure collabori con l’amministratore di sistema per scaricare il file generato dal server applicativo al computer locale. Verifichi che la codifica e il formato del file siano adatti al caricamento nella piattaforma di Process Mining.
Configurazione
- Intervallo di date: è fondamentale definire un intervallo di date per gestire le prestazioni. Utilizzi la data di creazione del documento (BKPF-CPUDT) come filtro principale. Per un’analisi iniziale, si consiglia un periodo compreso tra 3 e 6 mesi. Per i test, utilizzi un intervallo di pochi giorni in cui sa che sono presenti dati.
- Filtro per codice società: applichi sempre un filtro per codice società (BKPF-BUKRS). Estrarre contemporaneamente i dati di tutti i codici società può richiedere un impiego estremamente elevato di risorse. Inizi con un solo codice società o con un piccolo gruppo di codici rilevanti.
- Filtro per tipo di documento: utilizzi il filtro per tipo di documento (BKPF-BLART) per limitare l’ambito a specifici tipi di registrazioni contabili, ad esempio «SA» per i documenti G/L, se non è necessario analizzare tutti i tipi di documento.
- ID dei Task del Workflow: la logica di estrazione degli eventi del Workflow dipende dagli ID dei Task specifici utilizzati nel Suo sistema per approvazione, rifiuto e invio. Questi ID devono essere configurati nel codice sorgente del programma in base alle definizioni del Workflow aziendale.
- Considerazioni sulle prestazioni: il programma esegue join tra diverse tabelle di grandi dimensioni, in particolare CDPOS e le tabelle della cronologia del Workflow. Eseguirlo durante il normale orario lavorativo può incidere sulle prestazioni del sistema. Lo pianifichi sempre come job in background nelle ore di minore attività. Valuti la creazione di indici secondari sul database se il problema delle prestazioni si ripresenta.
- Prerequisiti: questo metodo richiede un utente con autorizzazioni per lo sviluppo ABAP (per SE38) e autorizzazioni per creare e gestire job in background (per SM36). L’utente o il job deve inoltre disporre dell’accesso in lettura a tutte le tabelle finanziarie, del Workflow e di sistema pertinenti (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST e così via).
a Query di esempio 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. Passaggi
- Stabilisca la connessione al database: ottenga credenziali di sola lettura per il database SAP ECC. Utilizzi un client SQL standard, come DBeaver, SAP HANA Studio o SQL Server Management Studio, per connettersi al database.
- Prepari la query SQL: copi nel client SQL la query completa fornita nella sezione «query» di questo documento.
- Imposti i parametri di estrazione: prima dell’esecuzione, configuri i segnaposto presenti nella query. Sostituisca «[START_DATE]» e «[END_DATE]» con l’intervallo di date desiderato nel formato «YYYYMMDD». Sostituisca «[COMPANY_CODE_1]» e «[COMPANY_CODE_2]» con i codici società SAP specifici che desidera analizzare.
- Definisca il sistema di origine: nell’istruzione principale
SELECT, sostituisca il segnaposto «[Your SAP System ID]» con il SID effettivo del sistema SAP, così da identificare correttamente l’origine dei dati. - Esegua la query: esegua la query SQL configurata sul database SAP. Il tempo di esecuzione varia in base all’intervallo di date e alle dimensioni delle tabelle del database.
- Esamini i risultati iniziali: al termine della query, esegua una rapida scansione delle righe restituite per verificare che i dati siano stati popolati come previsto. Controlli la presenza di attività diverse e che campi chiave come
JournalEntryIdedEventTimenon siano vuoti. - Gestisca i timestamp: la query concatena i campi di data e ora in una stringa «YYYYMMDDHHMMSS». Verifichi che il post-processing o il sistema di destinazione siano in grado di interpretare questo formato oppure modifichi la funzione SQL
CONCATin un formato ISO 8601 come «YYYY-MM-DDTHH:MI:SS», se supportato dal database. - Esporti i dati: esporti l’intero set di risultati dal client SQL in un file CSV. Si assicuri di utilizzare la codifica UTF-8 per evitare problemi con i caratteri speciali.
- Prepari il caricamento: prima di caricare i dati in uno strumento di Process Mining, verifichi che le intestazioni delle colonne corrispondano allo schema dati richiesto.
JournalEntryId,ActivityNameedEventTimesono fondamentali. Aggiunga la colonnaLastDataUpdate, valorizzandola con il timestamp del momento in cui è stata eseguita l’estrazione. - Esegua la convalida finale: completi i passaggi indicati nella sezione «validationSteps» per assicurarsi che i dati estratti siano completi e accurati prima di iniziare l’analisi.
Configurazione
- Autorizzazioni del database: l’utente del database deve disporre dell’accesso in lettura alle seguenti tabelle SAP: BKPF, BSEG, CDHDR, CDPOS, T001 e V_USERNAME. Per le attività relative al Workflow, sono necessari anche gli accessi a SWW_WI2OBJ e SWWLOGHIST. Questo livello di accesso viene in genere concesso solo a team tecnici specializzati.
- Filtro per intervallo di date: è fondamentale filtrare i dati in base a un intervallo di date specifico per garantire prestazioni adeguate della query. La query fornita utilizza segnaposto per una data di inizio e una di fine, applicati alla data di creazione del documento (
BKPF.CPUDT). Per un’analisi iniziale si consiglia un intervallo compreso tra 3 e 6 mesi. - Filtro per entità: per gestire il volume dei dati e concentrare l’analisi, applichi sempre un filtro per codice società (
BKPF.BUKRS). Può inoltre valutare di filtrare per tipo di documento (BKPF.BLART) per includere solo i tipi di registrazione contabile pertinenti, ad esempio «SA» per i documenti G/L, ed escludere documenti operativi come fatture o pagamenti se non rientrano nell’ambito dell’analisi. - Considerazioni sulle prestazioni: le query dirette su tabelle principali come BSEG e CDPOS possono richiedere molte risorse. Si consiglia vivamente di eseguire l’estrazione nelle ore di minore attività, per evitare di incidere sulle prestazioni del sistema per gli utenti finali. Eviti di estrarre dati relativi a più di un anno in una singola esecuzione.
- ID dei Task del Workflow: la query contiene segnaposto come «[WF_TASK_ID_SUBMIT]» e «[WF_TASK_ID_APPROVE]». Questi devono essere sostituiti con gli ID dei Task effettivi della configurazione specifica del Workflow delle registrazioni contabili nel Suo sistema. Può individuarli collaborando con uno specialista SAP Workflow o analizzando la definizione tecnica del Workflow nella transazione PFTC.
a Query di esempio 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' Passaggi
- Stabilisca la connessione SAP: nel Suo strumento ETL di terze parti, configuri una nuova connessione di origine al sistema SAP ECC. In genere sono necessari i dettagli del server applicativo, il client, il numero di sistema e un utente SAP dedicato con le autorizzazioni RFC necessarie.
- Definisca le origini dei dati: nel progetto di estrazione, aggiunga come origini dei dati le tabelle SAP richieste. Le tabelle principali includono BKPF (testata del documento contabile), BSEG (segmento del documento contabile), VBSEGK (testata del documento parcheggiato), CDHDR (testata del documento di modifica), CDPOS (posizioni del documento di modifica), SWW_WI2OBJ (collegamenti tra flusso di lavoro e oggetti), SWWLOGHIST (registro del flusso di lavoro) e SRGBTBREL (relazioni per gli allegati GOS).
- Estragga gli eventi di base (creato e parcheggiato): crei il primo flusso di dati per estrarre gli eventi iniziali. Per "Registrazione contabile parcheggiata", utilizzi VBSEGK come origine. Per "Registrazione contabile creata", utilizzi BKPF, assicurandosi di filtrare i documenti che non sono storni e che non sono stati inizialmente parcheggiati. È possibile farlo con un anti-join a VBSEGK.
- Estragga gli eventi del flusso di lavoro: crei un flusso di dati che colleghi BKPF a SWW_WI2OBJ utilizzando la chiave oggetto (codice società + numero documento + esercizio fiscale) per individuare l’ID dell’istanza del flusso di lavoro. Colleghi quindi questo risultato a SWWLOGHIST per estrarre eventi come "Inviato", "Approvato", "Rifiutato" e "Modifiche richieste", sulla base degli esiti delle task del flusso di lavoro e delle decisioni dell’utente registrate nel log.
- Estragga gli eventi di modifica e cancellazione: utilizzi le tabelle CDHDR e CDPOS per identificare le modifiche. Per "Registrazione contabile corretta", filtri le modifiche apportate ai documenti parcheggiati (classe oggetto "FIPP"). Per "Registrazione contabile parcheggiata eliminata", cerchi gli indicatori di eliminazione nei log delle modifiche dei documenti parcheggiati.
- Estragga gli eventi relativi agli allegati: per acquisire "Documentazione allegata", colleghi BKPF a SRGBTBREL quando il tipo di oggetto è "BKPF" e la relazione è "[Your attachment relationship type]". La data di creazione del collegamento costituisce l’ora dell’evento.
- Estragga gli eventi di compensazione e storno: per "Posizione della registrazione contabile compensata", interroghi la tabella BSEG verificando che il campo del documento di compensazione (AUGBL) sia valorizzato. L’ora dell’evento è la data di registrazione del documento di compensazione (AUGDT). Per "Processo di storno della registrazione contabile elaborato", interroghi BKPF per individuare i documenti di storno, riconoscibili dalla presenza di un valore nel campo del documento stornato (STBLG).
- Derivi gli eventi calcolati: crei blocchi di logica separati per gli eventi calcolati. Per "Registrazione manuale identificata", filtri BKPF sulla base di un elenco di codici transazione manuali, ad esempio FB01, FB50 e F-02. Per "Registrazione intersocietaria identificata", raggruppi la tabella BSEG per ID documento e individui i documenti con più di un codice società distinto.
- Combini tutti i flussi degli eventi: utilizzi una trasformazione UNION nel Suo strumento ETL per unire gli output di tutti i singoli flussi degli eventi, tra cui creato, parcheggiato e approvato, in un’unica tabella Event Log. Verifichi che i nomi e i tipi di dati delle colonne siano coerenti in tutti i flussi.
- Esegua la mappatura sullo schema finale: mappi i dati combinati nella struttura Event Log richiesta, creando
JournalEntryId,ActivityName,EventTime,Utentee gli altri attributi richiesti e consigliati. Aggiunga colonne statiche comeSourceSysteme utilizzi l’ora di esecuzione del job ETL perLastDataUpdate. - Configuri il caricamento incrementale: per le estrazioni ricorrenti, configuri una strategia di caricamento incrementale. Utilizzi l’ultima data di creazione o modifica, ad esempio BKPF.CPUDT o CDHDR.UDATE, come watermark per recuperare solo i record nuovi o aggiornati dall’ultima esecuzione.
- Esporti per ProcessMind: pianifichi il job di estrazione e configuri il passaggio finale affinché salvi l’Event Log come file CSV o Parquet in una posizione accessibile a ProcessMind per il caricamento.
Configurazione
- Prerequisiti: uno strumento ETL di terze parti con licenza, ad esempio Theobald Xtract Universal, Informatica o Talend, dotato di un connettore SAP dedicato. Un account utente SAP con accesso RFC e autorizzazioni per leggere le tabelle finanziarie, ad esempio S_TABU_DIS per i gruppi di tabelle F_00 e F_WF, i dati del Workflow e i log delle modifiche.
- Parametri di connessione: saranno necessari l'indirizzo IP o il nome host dell'Application Server SAP, il numero di sistema e l'ID client. Per il nome utente e la password SAP è opportuno utilizzare una gestione sicura delle credenziali.
- Filtri principali: applichi sempre i filtri su codice società (BKPF.BUKRS) ed esercizio (BKPF.GJAHR) direttamente alla sorgente, per limitare il volume dei dati. È fortemente consigliato filtrare anche per data di creazione del documento (BKPF.CPUDT), così da definire un periodo di estrazione specifico, ad esempio gli ultimi 6 mesi.
- Selezione dell'intervallo di date: per il caricamento iniziale, selezioni un periodo rappresentativo, ad esempio da 3 a 6 mesi. Per i successivi caricamenti delta, utilizzi un watermark su un campo timestamp come
CPUDT, in modo da acquisire solo i record nuovi. - Considerazioni sulle prestazioni: le join su BSEG, CDPOS e sulle tabelle del Workflow possono risultare molto lente. Verifichi che lo strumento ETL trasferisca i filtri alla sorgente SAP, ove possibile. Se lo strumento lo consente, estragga i dati in blocchi o pacchetti più piccoli, soprattutto per i caricamenti storici di grandi dimensioni.
- Personalizzazione del Workflow: la logica per identificare attività del Workflow come «Approvato» o «Rifiutato» dipende in larga misura dai Template del Workflow specifici del Suo sistema. Dovrà individuare gli ID corretti delle attività del Workflow e le chiavi delle decisioni degli utenti da utilizzare nei filtri.
a Query di esempio 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 Pronto per iniziare?
Utilizzi questo Template dei dati per avviare il Suo percorso di Process Mining per Record to Report - Registrazione contabile. Ottenga una visione più approfondita e migliori l’efficienza delle operazioni finanziarie.
Ottimizzi ora il processo Record to Report - Registrazione contabile
Riduca del 30% il tempo di ciclo delle registrazioni contabili e garantisca una rendicontazione impeccabile.
Non è necessaria alcuna carta di credito: inizi oggi stesso a migliorare i Suoi processi.