Il Suo template di dati per Record to Report - Registrazione contabile
Il Suo template di dati per Record to Report - Registrazione contabile
- Attributi consigliati per un’analisi completa
- Attività principali delle registrazioni contabili da monitorare
- Indicazioni pratiche per estrarre i dati da SAP ECC
Attributi di Record to Report - Registrazione contabile
| Nome | Descrizione | ||
|---|---|---|---|
| ID della registrazione contabile JournalEntryId | Identificativo univoco di un documento contabile, composto dal codice società, dal numero del documento e dall’anno fiscale. | ||
| Descrizione L’ID della registrazione contabile è l’identificativo principale del caso per monitorare il ciclo di vita di una registrazione. È una chiave composta, generalmente formata dalla concatenazione del codice società (BUKRS), del numero del documento (BELNR) e dell’anno fiscale (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. Tracciandolo è possibile ricostruire l’intero percorso di ogni registrazione contabile, misurare i tempi di ciclo e individuare deviazioni dal processo o colli di bottiglia per singole registrazioni. Perché è importante È la chiave essenziale per seguire una registrazione contabile dalla creazione alla registrazione finale e consente di analizzare il processo end-to-end e confrontarne le varianti. Dove reperirli È un attributo derivato, generalmente ottenuto concatenando i campi della tabella BKPF: codice società (BUKRS), numero del documento (BELNR) e anno fiscale (GJAHR). Esempi 1000-1000000123-20232000-1900000456-20231000-1800000789-2024 | |||
| Nome dell’attività ActivityName | Nome dell’attività aziendale o dell’evento che si è verificato in un determinato momento del processo di registrazione contabile. | ||
| Descrizione Il nome dell’attività descrive un passaggio specifico del ciclo di vita della registrazione contabile, come 'Registrazione contabile creata', 'Registrazione contabile approvata' o 'Registrazione contabile registrata'. Questo attributo viene in genere ricavato da più fonti SAP, tra cui i codici transazione (TCODE), i log delle modifiche ai documenti (tabelle CDHDR e CDPOS) e i campi di stato del documento. L’analisi delle attività è alla base del Process Mining. Consente di visualizzare le mappe dei processi, calcolare i tempi di transizione tra i passaggi e individuare i cicli di revisione (ad es. 'Registrazione contabile rifiutata' seguita da 'Registrazione contabile corretta'). Questi dati sono fondamentali per le Dashboard sui tempi di ciclo, i tassi di revisione e le varianti del processo. Perché è importante Definisce i passaggi nella mappa del processo e consente di visualizzare, analizzare e ottimizzare il flusso di lavoro delle registrazioni contabili. Dove reperirli Ricavato da diverse fonti, tra cui i codici transazione in BKPF (TCODE), lo stato del documento, i log del flusso di lavoro nelle tabelle come SWW_WI2OBJ e i documenti delle modifiche in CDHDR e CDPOS. Esempi Registrazione contabile creataRegistrazione contabile approvataRegistrazione contabile rifiutataRegistrazione contabile registrata | |||
| Ora dell’evento EventTime | La marca temporale che indica quando si è verificata una specifica attività o un evento relativo alla registrazione contabile. | ||
| Descrizione L’ora dell’evento fornisce la data e l’ora esatte di ogni attività nel processo di registrazione contabile. Questi dati sono fondamentali per calcolare tutte le metriche temporali, come i tempi di ciclo, le durate di elaborazione e i ritardi tra i passaggi. La fonte della marca temporale varia in base all’attività: può trattarsi della data e dell’ora di creazione del documento (CPUDT/CPUTM) oppure delle marche temporali delle modifiche nei log (CDHDR-UDATE/UTIME). Nell’analisi, l’ora dell’evento serve a ordinare gli eventi cronologicamente e costituisce la base della mappa del processo. È indispensabile per calcolare tutti gli indicatori temporali, come il tempo medio di ciclo della registrazione contabile, il tempo medio di approvazione e il tempo tra approvazione e registrazione. Perché è importante Questa marca temporale è alla base di tutte le analisi temporali e consente di calcolare tempi di ciclo, durate e colli di bottiglia. Dove reperirli Ricavata da diversi campi a seconda dell’attività, principalmente dalla marca temporale di creazione (CPUDT, CPUTM) in BKPF o dalle marche temporali delle modifiche (UDATE, UTIME) in CDHDR. Esempi 2023-10-26T09:00:00Z2023-10-26T14:30:15Z2023-10-27T11:05:00Z | |||
| Sistema di origine SourceSystem | Il sistema da cui sono stati estratti i dati del processo. | ||
| Descrizione Questo attributo identifica l’origine dei dati, in questo caso la specifica istanza di SAP ECC. In genere è un valore statico aggiunto durante l’estrazione dei dati. Anche se semplice, questo attributo è importante negli ambienti con più sistemi ERP o origini dati. Garantisce la tracciabilità dei dati e consente di filtrare o segmentare l’analisi in base al sistema di origine. Perché è importante Garantisce la tracciabilità dei dati ed è essenziale per monitorarne la qualità, soprattutto negli ambienti con più sistemi di origine. Dove reperirli In genere è un valore statico aggiunto durante la trasformazione dei dati, che identifica la specifica istanza di SAP ECC (ad es. 'ECC_PROD_100'). Esempi SAP ECC EHP8ECC_FIN_PRODSAP_ERP_60 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | La marca temporale che indica quando i dati sono stati estratti o aggiornati per 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 capire quanto siano aggiornati i dati analizzati. In qualsiasi Dashboard o analisi di Process Mining, conoscere l’ora dell’ultimo aggiornamento è essenziale perché gli utenti possano fidarsi dei dati e prendere decisioni informate. Aiuta a rispondere alla domanda: 'Quanto sono aggiornate queste informazioni?'. Perché è importante Indica agli utenti quanto sono aggiornati i dati, chiarendo il periodo a cui si riferisce l’analisi e aiutandoli a fidarsi dei risultati. Dove reperirli È un campo di metadati generato e memorizzato dallo strumento di estrazione dei dati o dal processo ETL al momento dell’aggiornamento. Esempi 2024-05-20T04:00:00Z2024-05-21T04:00:00Z2024-05-22T04:00:00Z | |||
| Codice società CompanyCode | Unità organizzativa che rappresenta una persona giuridica indipendente per la quale vengono redatti i rendiconti finanziari. | ||
| Descrizione Il codice società è un’unità organizzativa fondamentale in SAP Financials. Rappresenta una società giuridicamente indipendente ed è un campo chiave nella testata del documento di registrazione contabile. Questo attributo è essenziale per segmentare l’analisi del processo per persona giuridica. Consente di confrontare le prestazioni del processo, i tassi di conformità e i risultati degli indicatori tra le diverse aree dell’azienda. Ad esempio, può aiutare a capire se i ritardi nelle approvazioni o l’elevato numero di storni riguardano codici società specifici. Perché è importante Consente di filtrare e confrontare le prestazioni del processo tra le diverse persone giuridiche o unità aziendali dell’organizzazione. Dove reperirli Si trova nella tabella di testata dei documenti BKPF, campo BUKRS. Esempi 10002000US01DE01 | |||
| Codice transazione TransactionCode | Il codice della transazione SAP utilizzata per creare o elaborare la registrazione contabile. | ||
| Descrizione Il codice transazione (T-Code) è un identificativo univoco di una funzione o di un programma specifico in SAP. Per le registrazioni 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 le attività manuali da quelle automatizzate, individuare i processi manuali che richiedono più tempo e riconoscere le opportunità di automazione per ridurre il lavoro manuale e migliorare l’efficienza. Perché è importante Aiuta a distinguere i processi manuali da quelli automatizzati e a individuare opportunità di automazione e standardizzazione dei processi. Dove reperirli Si trova nella tabella di testata dei documenti BKPF, campo TCODE. Esempi FB01F-02FV50FBD1 | |||
| Data di registrazione PostingDate | La data in cui la transazione viene registrata in contabilità generale e determina il periodo finanziario di riferimento. | ||
| Descrizione La data di registrazione determina il periodo fiscale in cui viene contabilizzata la registrazione contabile. È un campo data fondamentale dal punto di vista finanziario e della conformità, poiché deve rispettare le scadenze di chiusura dei periodi contabili e le normative. Nel Process Mining, questa data serve a monitorare la conformità. La Dashboard 'Monitoraggio del rispetto delle norme' e l’indicatore 'Tasso di conformità' utilizzano questo attributo per verificare che le registrazioni siano effettuate nel periodo corretto. Può inoltre essere usata per analizzare l’andamento dei volumi delle registrazioni contabili nel tempo. Perché è importante È fondamentale per la rendicontazione finanziaria e l’analisi della conformità, perché consente di verificare che le registrazioni siano effettuate nel periodo contabile corretto. Dove reperirli Si trova nella tabella di testata dei documenti BKPF, campo BUDAT. Esempi 2023-10-312023-11-302024-01-15 | |||
| Stornata IsReversed | Indicatore booleano che segnala se la registrazione contabile è stata stornata. | ||
| Descrizione Questo flag identifica le registrazioni contabili stornate successivamente tramite un altro documento contabile. In SAP, il documento stornato è collegato al documento di storno, garantendo una chiara tracciabilità ai fini dell’audit. Questo attributo è fondamentale per la Dashboard «Analisi degli storni delle registrazioni contabili» e per il KPI «Tasso di storno delle registrazioni contabili». Consente di isolare le registrazioni stornate e indagarne le cause profonde, 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 annullate in un secondo momento, così da individuare le cause profonde degli errori e migliorare l’integrità dei dati. Dove reperirli 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 | Classificazione dei documenti contabili che ne determina le modalità di elaborazione e archiviazione. | ||
| Descrizione Il tipo di documento distingue le diverse transazioni aziendali, come una registrazione in contabilità generale (SA), una fattura fornitore (KR) o una registrazione di cespite (AA). Viene definito durante la configurazione del sistema e assegnato a ogni registrazione contabile. È un attributo fondamentale per l’analisi, perché consente di segmentare il processo in base alla natura della transazione. La Dashboard 'Volume delle registrazioni contabili per tipo' e l’indicatore 'Tempo medio di ciclo per tipo di registrazione contabile' dipendono direttamente da questo campo. Aiuta a individuare se alcuni tipi di registrazione sono più soggetti a ritardi, revisioni o storni. Perché è importante Consente di segmentare l’analisi per tipo di transazione e di individuare eventuali problemi specifici di determinati tipi di registrazione contabile. Dove reperirli Si trova nella tabella di testata dei documenti BKPF, campo BLART. Esempi SAKRREAA | |||
| Utente User | L’ID utente SAP della persona che ha creato o modificato la registrazione contabile. | ||
| Descrizione Questo attributo registra il nome utente SAP responsabile di una determinata attività, come la creazione, il parcheggio o la registrazione di un documento. Il dato proviene 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. La Dashboard sulla produttività degli utenti consente di monitorare i volumi di attività e i tempi di elaborazione per utente. Aiuta inoltre a individuare chi è coinvolto nei cicli di revisione, negli storni o nelle deviazioni di conformità, così da orientare la formazione e gli interventi di miglioramento del processo. Perché è importante Identifica l’utente responsabile di ogni attività e consente di analizzare le prestazioni, la distribuzione del carico di lavoro e le modalità di revisione. Dove reperirli In genere proviene dalla tabella BKPF (campo USNAM per chi ha creato il documento) o dalla tabella CDHDR (campo USERNAME per chi lo ha modificato). Esempi ABROWNCJONESDSMITH | |||
| Centro di costo CostCenter | Unità organizzativa all’interno di un’area di controlling che rappresenta una sede in cui vengono sostenuti dei costi. | ||
| Descrizione Il centro di costo è un dato anagrafico fondamentale del modulo Controlling (CO), spesso assegnato a livello di singola riga della registrazione contabile. Viene utilizzato per monitorare i costi di uno specifico reparto, funzione o sede. Includere il centro di costo consente di analizzare il processo delle registrazioni contabili con maggiore dettaglio. Aiuta a determinare se alcuni reparti generano più rilavorazioni, hanno tempi di ciclo più lunghi o sono responsabili di un volume maggiore di registrazioni manuali, offrendo così una visione dell’efficienza del processo a livello di reparto. Perché è importante Consente di analizzare le prestazioni del processo per reparto o area funzionale e di individuare le inefficienze locali. Dove reperirli Si trova nella tabella delle righe dei documenti BSEG, campo KOSTL. Esempi 4100CC_FINANCE_US10010101 | |||
| Chiave valuta CurrencyKey | Il codice della valuta degli importi registrati nella registrazione contabile. | ||
| Descrizione Questo attributo specifica la valuta della registrazione contabile, ad esempio USD, EUR o JPY, e fornisce il contesto necessario per interpretare gli importi finanziari associati al documento. Anche se non è sempre una dimensione di analisi primaria, è indispensabile per interpretare correttamente i valori monetari. Nelle organizzazioni globali, può inoltre essere usato per segmentare l’analisi e verificare se i processi differiscono tra le registrazioni in valuta estera e quelle in valuta locale. Perché è importante Fornisce il contesto necessario per tutti i valori monetari, consentendo analisi e interpretazioni finanziarie accurate. Dove reperirli Si trova nella tabella di intestazione dei documenti BKPF, campo WAERS. Esempi USDEURGBPJPY | |||
| È parcheggiata IsParked | Flag booleano che indica 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. In seguito, un altro utente può completarla o rivederla prima della registrazione definitiva. Questo flag identifica le registrazioni che hanno attraversato una fase di parcheggio. L’analisi di questo attributo aiuta a comprendere come viene utilizzata la funzione di parcheggio. Può rivelare che viene impiegata come fase informale di revisione, con possibili ritardi. Consente inoltre di analizzare il tempo di attraversamento complessivo, distinguendo le registrazioni definitive da quelle parcheggiate in precedenza. Perché è importante Identifica le registrazioni che utilizzano la funzione di parcheggio, possibile causa di ritardi o indicatore di un processo di revisione informale. Dove reperirli Derivato dal campo dello stato del documento (BSTAT) nella tabella BKPF. Il valore «V» indica un documento parcheggiato. Esempi truefalse | |||
| È una rilavorazione IsRework | Flag booleano che indica se una registrazione contabile ha attraversato un ciclo di rilavorazione, ad esempio dopo essere stata rifiutata e poi corretta. | ||
| Descrizione Questo flag identifica i casi che si sono discostati dal percorso ottimale e hanno richiesto un intervento correttivo. In genere viene impostato su true quando, per una registrazione contabile, si osserva 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 le inefficienze del processo e fornisce una base per indagare le cause profonde 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 profonde per aumentare la percentuale di operazioni corrette al primo tentativo. Dove reperirli Attributo calcolato, derivato dall’analisi della sequenza di attività di un caso. Il ciclo di rilavorazione viene identificato quando si verifica un’attività di rifiuto o correzione. Esempi truefalse | |||
| Importo totale del documento TotalDocumentAmount | Valore totale della registrazione contabile nella valuta del documento. | ||
| Descrizione Questo attributo rappresenta il valore finanziario totale della registrazione contabile. In genere viene calcolato sommando i valori assoluti di tutte le singole voci in dare o in avere associate al documento. L’analisi del processo in base al valore finanziario può rivelare schemi importanti. Ad esempio, le registrazioni di importo elevato potrebbero seguire un iter di approvazione diverso e più rigoroso. Questo attributo può essere usato per filtrare o segmentare l’analisi e verificare se i tempi di ciclo, i tassi di rifiuto o i ritardi nelle approvazioni sono correlati all’importo della registrazione. Perché è importante Consente di analizzare l’impatto finanziario, ad esempio mettendo in relazione i tempi di elaborazione o i tassi di rifiuto con il valore monetario delle registrazioni contabili. Dove reperirli È un campo calcolato, ottenuto aggregando il campo dell’importo (WRBTR o DMBTR) di tutte le singole voci nella tabella BSEG per una determinata registrazione contabile. Esempi 1500.0025000.75125.50 | |||
| Motivo dello storno ReversalReason | Codice che indica il motivo per cui una registrazione contabile è stata stornata. | ||
| Descrizione Quando un documento viene stornato, SAP consente all’utente di specificare un codice motivo. Questo codice fornisce informazioni strutturate sulla necessità dello storno, ad esempio una data di registrazione errata o un errore di inserimento dati. Questo attributo è un dato 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 e intervenire in modo mirato per prevenire errori futuri e ridurre il tasso di storno. Perché è importante Fornisce indicazioni dirette sui motivi degli storni e consente di analizzarne le cause profonde in modo mirato, riducendo gli errori futuri. Dove reperirli Si trova nella tabella di intestazione dei documenti BKPF, campo STGRD. Esempi 010205 | |||
| Tempo di approvazione ApprovalTime | Tempo trascorso dall’invio di una registrazione contabile per l’approvazione fino alla sua approvazione o al suo rifiuto. | ||
| Descrizione Questa metrica misura la durata del sottoprocesso di approvazione, che spesso incide in modo significativo sul tempo di ciclo complessivo. Si calcola come differenza 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». Analizzare questa durata aiuta a individuare i colli di bottiglia nel flusso di lavoro di approvazione, misurare le prestazioni degli approvatori e motivare modifiche al processo, come la revisione delle soglie di approvazione. Perché è importante Misura la durata della fase di approvazione e aiuta a individuare e affrontare i ritardi nel flusso di lavoro di revisione e approvazione. Dove reperirli Calcolato sottraendo il timestamp dell’evento «Registrazione contabile inviata» da quello dell’evento «Registrazione contabile approvata» o «Registrazione contabile rifiutata». Esempi P1DT2HPT4H15MP3D | |||
Attività di Record to Report - Registrazione contabile
| Attività | Descrizione | ||
|---|---|---|---|
| Registrazione contabile approvata | Questa attività segna l’approvazione finale di una registrazione contabile nel flusso di lavoro, rendendola idonea alla registrazione. L’evento viene rilevato nel log del flusso di lavoro al completamento del passaggio finale di 'rilascio' o 'approvazione'. | ||
| Perché è importante È una tappa fondamentale che conclude il processo di approvazione. La durata fino a questo momento è un indicatore chiave dell’efficienza delle approvazioni, mentre il tempo tra questo evento e la registrazione misura il ritardo successivo all’approvazione. Dove reperirli L’evento viene dedotto dalla marca temporale di completamento del passaggio finale di approvazione nel log di SAP Business Workflow. Si tratta dell’ultima azione di approvazione prima che il documento venga registrato o reso pronto per la registrazione. Acquisizione Individuare nei log del flusso di lavoro il completamento del passaggio finale di 'rilascio' o 'approvazione'. Tipo di evento inferred | |||
| Registrazione contabile inviata | Questa attività indica che chi ha creato la registrazione contabile parcheggiata l’ha finalizzata e che ora è pronta per la revisione e l’approvazione. In genere viene rilevata all’avvio di un’attività SAP Business Workflow associata al documento parcheggiato. | ||
| Perché è importante Segna il passaggio della registrazione da chi l’ha creata a chi deve approvarla e avvia il conteggio del tempo per gli indicatori del ciclo di approvazione. È una tappa fondamentale per misurare l’efficienza del flusso di lavoro di approvazione. Dove reperirli L’evento viene dedotto dall’ora di avvio dell’istanza del flusso di lavoro di approvazione collegata all’oggetto del documento finanziario. Per individuarlo occorre analizzare le tabelle dei log del flusso di lavoro, come SWW_WI2OBJ, e trovare il flusso avviato per la specifica società, il numero di documento e l’anno fiscale. Acquisizione Individuare l’evento di avvio del flusso di lavoro per l’oggetto del documento parcheggiato. Tipo di evento inferred | |||
| Registrazione contabile parcheggiata | Questa attività indica la creazione iniziale di una registrazione contabile in stato provvisorio, prima della registrazione ufficiale in contabilità generale. In SAP viene rilevata esplicitamente quando un utente salva un documento tramite una transazione di parcheggio, impostandone lo stato su 'parcheggiato'. | ||
| Perché è importante È un evento di inizio fondamentale per i processi che prevedono revisione e approvazione. Analizzare il tempo tra il parcheggio e la registrazione consente di individuare i ritardi nelle fasi precedenti alla registrazione e in quelle di approvazione. Dove reperirli L’evento viene identificato nella tabella di testata dei documenti BKPF. Un documento è considerato parcheggiato quando viene creato con BKPF-BSTAT = 'V'. La data e l’ora dell’evento corrispondono a BKPF-CPUDT e BKPF-CPUTM. Acquisizione Individuare la creazione del documento in BKPF quando BKPF-BSTAT è 'V'. Tipo di evento explicit | |||
| Registrazione contabile registrata | Questa è l’attività centrale in cui la registrazione contabile viene inserita ufficialmente in contabilità generale, con effetti sui rendiconti finanziari. L’evento viene rilevato esplicitamente quando lo stato del documento viene impostato su 'registrato' e viene assegnata una data di registrazione. | ||
| Perché è importante È la tappa più importante, perché indica che la registrazione contabile è stata elaborata correttamente. Spesso il tempo di attraversamento complessivo viene misurato fino a questo momento, che è anche un riferimento fondamentale per l’analisi della chiusura finanziaria. Dove reperirli L’evento 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 passa da 'V' a vuoto. La marca temporale della registrazione è la data di inserimento BKPF-CPUDT. Acquisizione Individuare il momento in cui BKPF-BSTAT passa da 'V' a vuoto oppure, per le registrazioni dirette, l’evento di creazione. Tipo di evento explicit | |||
| Storno della registrazione contabile elaborato | Questa attività segna lo storno di una registrazione contabile precedentemente registrata. Lo storno è un nuovo documento contabile che annulla la registrazione originale. | ||
| Perché è importante È un evento fondamentale per misurare la qualità dei dati e l’accuratezza del processo. Un’elevata frequenza di storni segnala problemi sistemici nelle fasi iniziali di inserimento o approvazione dei dati; inoltre, ogni storno comporta attività di revisione. Dove reperirli L’evento viene identificato nella testata del documento originale (tabella BKPF). Quando un documento viene stornato, SAP compila il numero del documento di storno (BKPF-STBLG) e il motivo dello storno (BKPF-STGRD). La marca temporale dell’evento corrisponde alla data di registrazione del nuovo documento di storno. Acquisizione Individuare il momento in cui BKPF-STBLG viene compilato nel documento originale; la marca temporale corrisponde alla data di registrazione del documento di storno. Tipo di evento explicit | |||
| Documentazione allegata | Questa attività rappresenta l’allegato, da parte di un utente, di documenti di supporto, come fatture o fogli di calcolo, alla registrazione contabile. Non viene registrata esplicitamente come evento contabile standard e in genere viene dedotta verificando la creazione di allegati collegati all’oggetto del documento contabile. | ||
| Perché è importante Monitorare questa attività aiuta a verificare il rispetto delle procedure che richiedono la documentazione. I ritardi nell’allegare i documenti possono essere una causa profonda del prolungamento dei cicli di approvazione. Dove reperirli È difficile rilevare questo evento in modo affidabile con una marca temporale. In alcuni casi è possibile dedurlo analizzando le tabelle degli allegati di Generic Object Services (GOS), come SOOD, e collegando la data e l’ora di creazione dell’allegato alla chiave dell’oggetto della registrazione contabile. Acquisizione Dedurre l’evento dalla data e ora di creazione degli oggetti collegati nelle tabelle GOS (ad es. SOOD). Tipo di evento inferred | |||
| Documento contabile parcheggiato eliminato | Indica l’eliminazione di una registrazione contabile parcheggiata che non è mai stata registrata. Può verificarsi dopo un rifiuto o quando la registrazione è stata creata per errore. | ||
| Perché è importante Questa attività segna la conclusione non riuscita del processo. Analizzare i motivi per cui vengono eliminati i documenti parcheggiati può far emergere problemi come registrazioni duplicate o incomprensioni sul processo. Dove reperirli L’evento viene rilevato quando cambia lo stato di un documento parcheggiato nella tabella BKPF. Il campo di stato BKPF-BSTAT viene aggiornato a 'Z' (documento parcheggiato eliminato). La marca temporale della modifica è disponibile nei log delle modifiche al documento (CDHDR). Acquisizione Individuare il momento in cui BKPF-BSTAT viene aggiornato a 'Z'. Tipo di evento explicit | |||
| Modifiche richieste alla registrazione contabile | Indica il momento in cui chi approva ha esaminato la registrazione contabile e l’ha restituita a chi l’ha creata, chiedendo una correzione. L’evento viene rilevato nei log del flusso di lavoro, che riportano una decisione dell’utente di 'rifiuto' o di restituzione. | ||
| Perché è importante Questa attività è essenziale per individuare i cicli di revisione, una delle principali fonti di inefficienza e deviazioni dal processo. Una frequenza elevata dell’evento può indicare problemi nella qualità delle registrazioni o requisiti poco chiari. Dove reperirli L’evento viene dedotto dalla marca temporale di uno specifico passaggio decisionale dell’utente nel log di SAP Business Workflow, corrispondente a un’azione di 'rifiuto' o 'richiesta di correzione'. Acquisizione Individuare nei log del flusso di lavoro la marca temporale della decisione di 'rifiuto' o 'revisione'. Tipo di evento inferred | |||
| Registrazione contabile corretta | Questa attività indica che chi ha creato la registrazione contabile ha modificato il documento parcheggiato dopo averlo ricevuto indietro per apportare delle modifiche. L’evento viene dedotto rilevando modifiche al documento successive all’evento 'Modifiche richieste'. | ||
| Perché è importante Monitorare le correzioni consente di quantificare il tempo dedicato alle revisioni. Il tempo tra la richiesta di modifica e la correzione evidenzia i ritardi nella risoluzione dei problemi delle registrazioni inviate. Dove reperirli L’evento viene dedotto analizzando i log delle modifiche al documento, nelle tabelle CDHDR e CDPOS, per il documento parcheggiato. Una modifica registrata dopo un evento di rifiuto nel flusso di lavoro indica che è stata apportata una correzione. La marca temporale proviene dalla tabella CDHDR. Acquisizione Individuare una voce nel log delle modifiche CDHDR/CDPOS successiva a un evento di rifiuto. Tipo di evento inferred | |||
| Registrazione contabile creata | Indica la creazione di una registrazione contabile registrata direttamente, senza un precedente passaggio di parcheggio. L’evento viene rilevato quando il documento viene creato in SAP tramite una transazione di registrazione diretta. | ||
| Perché è importante Questa attività costituisce un punto di inizio alternativo per i processi di registrazione contabile più semplici, che non richiedono un flusso di lavoro di approvazione. Consente di distinguere le registrazioni dirette più semplici da quelle parcheggiate, che seguono un iter più articolato. Dove reperirli L’evento corrisponde alla creazione di un documento nella tabella BKPF con il campo di stato BKPF-BSTAT vuoto (registrato). La data dell’evento è BKPF-CPUDT. Per questi documenti, gli eventi 'Creato' e 'Registrato' si verificano contemporaneamente. Acquisizione Individuare la creazione del documento in BKPF quando BKPF-BSTAT è vuoto. Tipo di evento explicit | |||
| Registrazione contabile rifiutata | Questa attività indica il rifiuto definitivo di una registrazione contabile, che quindi non verrà registrata. In genere rappresenta uno stato terminale nel flusso di lavoro di approvazione e porta infine all’eliminazione del documento parcheggiato. | ||
| Perché è importante Monitorare i rifiuti è fondamentale per la gestione della qualità. Analizzarne le cause e la frequenza aiuta a migliorare la percentuale di registrazioni contabili corrette al primo tentativo. Dove reperirli L’esito viene rilevato nel log di SAP Business Workflow e rappresenta una decisione finale dell’utente di 'rifiuto', che termina il processo. Il documento parcheggiato può essere eliminato successivamente. Acquisizione Individuare nel log del flusso di lavoro lo stato terminale di 'rifiuto' del documento. Tipo di evento inferred | |||
| Registrazione manuale identificata | Questa attività identifica se una registrazione contabile è stata creata tramite una transazione online manuale oppure mediante un’interfaccia automatizzata o un processo batch. Non corrisponde a un’azione dell’utente, ma è un attributo calcolato della registrazione, ricavato dai dati di sistema. | ||
| Perché è importante Distinguere le registrazioni manuali da quelle automatizzate è fondamentale per orientare gli interventi di miglioramento. I processi manuali sono spesso al centro delle iniziative di standardizzazione e automazione. Dove reperirli Il dato viene calcolato analizzando i campi della tabella di testata dei documenti BKPF. I codici transazione (BKPF-TCODE) come 'FB01', 'FB50' o 'FV50' indicano un inserimento manuale, mentre altri codici T o nomi specifici di input batch (BKPF-AWKEY) suggeriscono un’elaborazione automatizzata. Acquisizione Ricavare il dato da BKPF-TCODE o da altri indicatori del sistema di origine presenti nella testata del documento. Tipo di evento calculated | |||
| Registrazione tra società identificata | Attività calcolata che segnala una registrazione contabile con effetti su più di una società. Si determina analizzando le singole voci di un documento finanziario. | ||
| Perché è importante Le transazioni tra società possono richiedere procedure di elaborazione e approvazione più articolate. Individuarle consente di analizzarne separatamente i tempi di attraversamento e i percorsi del processo, così da rilevare eventuali colli di bottiglia specifici. Dove reperirli Il dato viene calcolato esaminando la tabella delle singole voci BSEG per un determinato numero di documento (BELNR). Se le voci contengono più di un codice società distinto (BSEG-BUKRS), si tratta di una registrazione tra società. Acquisizione Verificare se per un singolo BKPF-BELNR sono presenti più valori univoci di BSEG-BUKRS. Tipo di evento calculated | |||
| Voce della registrazione contabile compensata | Questa attività rappresenta la riconciliazione di una voce aperta di un conto di contabilità generale gestito per partite aperte, come un conto transitorio bancario. Si verifica quando una voce viene abbinata a un’altra e chiusa. | ||
| Perché è importante In processi come la riconciliazione bancaria, il tempo necessario per compensare le partite è un indicatore fondamentale. Questa attività consente di analizzare l’efficienza delle procedure di riconciliazione e di chiusura mensile. Dove reperirli L’evento viene rilevato nella tabella delle singole voci BSEG. Quando una voce viene compensata, vengono compilati i campi della data di compensazione (BSEG-AUGDT) e del documento di compensazione (BSEG-AUGBL). La data dell’evento corrisponde alla data di compensazione. Acquisizione Individuare il momento in cui viene compilata la data di compensazione (BSEG-AUGDT) di una voce. Tipo di evento explicit | |||
Guide all’estrazione
Passaggi
- Creare il programma ABAP: Nel sistema SAP, apra il codice transazione SE38 (ABAP Editor). Inserisca un nome per il nuovo programma, ad esempio Z_PM_JE_EXTRACTION, e selezioni Crea. Assegni un titolo appropriato e imposti il tipo di programma su «Executable Program».
- Definire 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 di dati da estrarre.
- Dichiarare 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 eventuali attributi consigliati, come User, CompanyCode e PostingDate.
- Implementare la logica di selezione dei dati: Scriva le query SQL ABAP principali per estrarre i dati relativi a ciascuna delle 14 attività obbligatorie. A tal fine, selezioni i dati dalle tabelle principali, come BKPF (intestazione) e BSEG (riga), dalle tabelle del registro delle modifiche CDHDR e CDPOS, dalle tabelle del flusso di lavoro come SWWLOGHIST e dalle tabelle di compensazione come BSAS e BSAK.
- Estrarre i documenti parcheggiati e registrati: Per gli eventi «Registrazione contabile parcheggiata», selezioni da BKPF i documenti con stato (BSTAT) «V». Per gli eventi «Registrazione contabile creata» e «Registrazione contabile registrata», selezioni da BKPF i documenti con stato vuoto, che indica un documento normale e registrato.
- Estrarre gli eventi di modifica ed eliminazione: Interroghi le tabelle dei documenti di modifica CDHDR e CDPOS per la classe oggetto «BELEG». Applichi un filtro alla chiave del documento per individuare le modifiche corrispondenti alle attività «Registrazione contabile corretta» o «Registrazione contabile parcheggiata eliminata».
- Estrarre gli eventi del flusso di lavoro: Per acquisire attività come «Registrazione contabile inviata», «Approvata», «Rifiutata» e «Modifiche richieste», interroghi le tabelle del flusso di lavoro. Utilizzi la tabella SWW_WI2OBJ per collegare il documento contabile a un’istanza del flusso di lavoro, quindi legga SWWLOGHIST per recuperare le decisioni specifiche degli utenti o le modifiche di stato.
- Individuare gli eventi calcolati: Per «Registrazione manuale identificata», verifichi il codice transazione (BKPF-TCODE) confrontandolo con un elenco di codici transazione manuali noti. Per «Registrazione intersocietaria identificata», analizzi le righe BSEG di un documento per verificare se sono coinvolti più codici società.
- Consolidare e trasformare i dati: Man mano che seleziona i dati di ciascuna attività, li trasformi nella struttura finale dell’Event Log. Concateni Codice società, Numero documento ed Esercizio per creare JournalEntryId. Converta le date e gli orari SAP in un unico timestamp EventTime. Aggiunga i risultati di ogni query alla tabella interna finale.
- Implementare l’esportazione del file: Utilizzi le 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 di testo semplice nella directory del server applicativo SAP, consultabile tramite la transazione AL11.
- Pianificare l’esecuzione in background: Apra la transazione SM36 (Define Background Job). Crei un nuovo job, definisca un passaggio che esegua il programma ABAP e imposti una pianificazione, ad esempio ogni notte o ogni settimana nelle ore di minore attività, per automatizzare l’estrazione.
- Recuperare e formattare il file: Utilizzi la transazione CG3Y oppure chieda all’amministratore di sistema di scaricare il file generato dal server applicativo sul computer locale. Verifichi che la codifica e il formato del file siano adatti al caricamento nello strumento 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 da 3 a 6 mesi. Per i test, utilizzi un intervallo di pochi giorni di cui è noto che contenga 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 molte risorse. Inizi con un solo codice società o con un piccolo gruppo di codici pertinenti.
- Filtro per tipo di documento: Utilizzi il filtro per tipo di documento (BKPF-BLART) per limitare l’ambito a tipi specifici di registrazioni contabili, ad esempio «SA» per i documenti di contabilità generale, se non è necessario analizzare tutti i tipi di documento.
- ID delle attività del flusso di lavoro: La logica di estrazione degli eventi del flusso di lavoro dipende dagli ID delle attività specifici utilizzati nel sistema per approvazioni, rifiuti e invii. Questi ID devono essere configurati nel codice sorgente del programma in base alle definizioni del flusso di lavoro aziendale.
- Considerazioni sulle prestazioni: Il programma unisce diverse tabelle di grandi dimensioni, in particolare CDPOS e le tabelle della cronologia del flusso di lavoro. Eseguirlo nelle ore di punta può incidere sulle prestazioni del sistema. Lo pianifichi sempre come job in background nelle ore di minore attività. Se i problemi di prestazioni si ripetono, valuti la creazione di indici secondari nel database.
- Prerequisiti: Questo metodo richiede un utente con autorizzazioni di sviluppo ABAP (per SE38) e i permessi necessari 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 flusso di lavoro e di sistema pertinenti (BKPF, BSEG, CDHDR, CDPOS, SWWLOGHIST e così via).
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
- Stabilire la connessione al database: Richieda 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.
- Preparare la query SQL: Copi nel client SQL la query completa fornita nella sezione «query» di questo documento.
- Impostare i parametri di estrazione: Prima di eseguire la query, configuri i segnaposto al suo interno. 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 da analizzare.
- Definire il sistema di origine: Nell’istruzione
SELECTprincipale, sostituisca il segnaposto «[Your SAP System ID]» con l’ID effettivo del sistema SAP (SID), così da identificare correttamente l’origine dei dati. - Eseguire 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.
- Rivedere i risultati iniziali: Al termine della query, controlli rapidamente le righe restituite per verificare che i dati siano stati popolati come previsto. Verifichi la presenza di attività diverse e che i campi chiave, come
JournalEntryIdedEventTime, non siano vuoti. - Gestire i timestamp: La query concatena i campi di data e ora in una stringa
YYYYMMDDHHMMSS. Verifichi che il sistema di destinazione o la fase di post-elaborazione siano in grado di interpretare questo formato oppure modifichi la funzione SQLCONCATper usare un formato ISO 8601, ad esempioYYYY-MM-DDTHH:MI:SS, se supportato dal database. - Esportare i dati: Esporti l’intero insieme di risultati dal client SQL in un file CSV. Utilizzi la codifica UTF-8 per evitare problemi con i caratteri speciali.
- Preparare il caricamento: Prima di caricare i dati in uno strumento di Process Mining, verifichi che le intestazioni delle colonne corrispondano allo schema richiesto.
JournalEntryId,ActivityNameedEventTimesono campi essenziali. Aggiunga la colonnaLastDataUpdatee vi inserisca il timestamp dell’estrazione. - Convalida finale: Segua i passaggi descritti nella sezione «validationSteps» per verificare che i dati estratti siano completi e accurati prima di iniziare l’analisi.
Configurazione
- Autorizzazioni sul 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 flusso di lavoro è necessario anche l’accesso 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 per un intervallo di date specifico, così da garantire prestazioni adeguate delle query. La query fornita utilizza segnaposto per la data iniziale e finale, applicati alla data di creazione del documento (
BKPF.CPUDT). Per un’analisi iniziale si consiglia un intervallo da 3 a 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 un filtro per tipo di documento (BKPF.BLART), includendo solo i tipi di registrazione contabile pertinenti, ad esempio «SA» per i documenti di contabilità generale, ed escludendo 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 più di un anno di dati in una singola esecuzione.
- ID delle attività del flusso di lavoro: La query contiene segnaposto come «[WF_TASK_ID_SUBMIT]» e «[WF_TASK_ID_APPROVE]». Devono essere sostituiti con gli ID effettivi delle attività configurate nel flusso di lavoro delle registrazioni contabili del sistema. Può individuarli rivolgendosi a uno specialista SAP Workflow o analizzando la definizione tecnica del flusso di lavoro nella transazione PFTC.
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
- Stabilire la connessione SAP: nello strumento ETL di terze parti, configuri una nuova connessione di origine al sistema SAP ECC. In genere sono necessari i dati del server applicativo, il client, il numero di sistema e un utente SAP dedicato con le autorizzazioni RFC necessarie.
- Definire le origini dei dati: nel progetto di estrazione, aggiunga le tabelle SAP necessarie come origini dei dati. Le tabelle principali includono BKPF (testata del documento contabile), BSEG (partite del documento contabile), VBSEGK (testata del documento parcheggiato), CDHDR (testata delle modifiche), CDPOS (dettagli delle modifiche), SWW_WI2OBJ (collegamenti tra Workflow e oggetti), SWWLOGHIST (registro del Workflow) e SRGBTBREL (relazioni per gli allegati GOS).
- Estrarre gli eventi iniziali (creazione e parcheggio): 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 escludere i documenti di storno e quelli inizialmente parcheggiati. A questo scopo, può eseguire un anti-join con VBSEGK.
- Estrarre gli eventi del Workflow: crei un flusso di dati che unisca BKPF a SWW_WI2OBJ usando la chiave oggetto (società + numero documento + esercizio) per individuare l’ID dell’istanza del Workflow. Unisca quindi il risultato a SWWLOGHIST per estrarre eventi come «Inviata», «Approvata», «Rifiutata» e «Modifiche richieste», in base agli esiti delle attività del Workflow e alle decisioni degli utenti registrate nel log.
- Estrarre gli eventi di modifica e cancellazione: utilizzi le tabelle CDHDR e CDPOS per individuare le modifiche. Per «Registrazione contabile corretta», filtri le modifiche apportate ai documenti parcheggiati (Object Class «FIPP»). Per «Registrazione contabile parcheggiata eliminata», cerchi nei log delle modifiche i contrassegni di cancellazione dei documenti parcheggiati.
- Estrarre gli eventi relativi agli allegati: per acquisire l’evento «Documentazione allegata», unisca BKPF a SRGBTBREL, dove il tipo di oggetto è «BKPF» e la relazione è «[Your attachment relationship type]». La data di creazione del collegamento corrisponde all’ora dell’evento.
- Estrarre gli eventi di compensazione e storno: per «Partita della registrazione contabile compensata», interroghi la tabella BSEG per individuare i record in cui il campo del documento di compensazione (AUGBL) è valorizzato. L’ora dell’evento corrisponde alla data di registrazione del documento di compensazione (AUGDT). Per «Storno della registrazione contabile elaborato», interroghi BKPF per individuare i documenti di storno, identificati dalla presenza di un valore nel campo del documento stornato (STBLG).
- Derivare gli eventi calcolati: crei blocchi di logica separati per gli eventi calcolati. Per «Registrazione manuale identificata», filtri BKPF in base a un elenco di codici transazione manuali (ad es. FB01, FB50, F-02). Per «Registrazione intersocietaria identificata», raggruppi la tabella BSEG per ID documento e individui i documenti con più di un codice società distinto.
- Unire tutti i flussi di eventi: utilizzi una trasformazione UNION nello strumento ETL per unire i risultati dei singoli flussi di eventi (creazione, parcheggio, approvazione e così via) in un’unica tabella Event Log. Verifichi che i nomi delle colonne e i tipi di dati siano coerenti in tutti i flussi.
- Mappare lo schema finale: mappi i dati combinati nella struttura Event Log richiesta, creando
JournalEntryId,ActivityName,EventTime,Utentee gli altri attributi obbligatori e consigliati. Aggiunga colonne statiche comeSourceSysteme utilizzi l’ora di esecuzione del processo ETL perLastDataUpdate. - Configurare il caricamento incrementale: per le estrazioni successive, configuri una strategia di caricamento incrementale. Utilizzi l’ultima data di creazione o modifica (ad es. BKPF.CPUDT, CDHDR.UDATE) come valore di riferimento per estrarre solo i record nuovi o aggiornati dall’ultima esecuzione.
- Esportare i dati per ProcessMind: pianifichi il processo di estrazione e configuri il passaggio finale in modo da salvare l’Event Log in un file CSV o Parquet, in una posizione accessibile a ProcessMind per il caricamento.
Configurazione
- Prerequisiti: uno strumento ETL di terze parti con licenza (ad es. Theobald Xtract Universal, Informatica, Talend) dotato di un connettore SAP dedicato. Un account utente SAP con accesso RFC e autorizzazioni per leggere le tabelle finanziarie (ad es. 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: sono necessari l’indirizzo IP o il nome host del server applicativo SAP, il numero di sistema e l’ID client. Per il nome utente e la password SAP, è opportuno utilizzare un sistema sicuro di gestione delle credenziali.
- Filtri principali: applichi sempre filtri per società (BKPF.BUKRS) ed esercizio (BKPF.GJAHR) all’origine, così da limitare il volume dei dati. È inoltre fortemente consigliato filtrare per data di creazione del documento (BKPF.CPUDT) e 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 incrementali, utilizzi un valore di riferimento basato su un campo data e ora come
CPUDT, in modo da recuperare solo i nuovi record. - Considerazioni sulle prestazioni: le unioni con BSEG, CDPOS e le tabelle del Workflow possono essere molto lente. Se possibile, verifichi che lo strumento ETL applichi i filtri direttamente all’origine SAP. Se lo strumento lo consente, estragga i dati in blocchi o pacchetti più piccoli, soprattutto per i caricamenti di grandi volumi storici.
- Personalizzazione del Workflow: la logica per individuare attività del Workflow come «Approvata» o «Rifiutata» dipende in larga misura dai template specifici del sistema. Dovrà individuare gli ID corretti delle attività del Workflow e le chiavi delle decisioni degli utenti da utilizzare nei filtri.
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 a iniziare?
Utilizzi questo template di dati per avviare il Process Mining del processo Record to Report - Registrazione contabile. Ottenga informazioni più approfondite e migliori l’efficienza delle operazioni finanziarie.
Ottimizzi subito il processo Record to Report - Registrazione contabile
Riduca del 30% il tempo di ciclo delle registrazioni contabili e garantisca una rendicontazione accurata.
Non è necessaria una carta di credito: inizi a migliorare già oggi.