Il Suo template di dati per l’elaborazione delle fatture fornitori
Il Suo template di dati per l’elaborazione delle fatture fornitori
- Attributi consigliati per un’analisi completa
- Attività chiave del processo da monitorare
- Istruzioni dettagliate per l’estrazione dei dati
Attributi per l’elaborazione delle fatture fornitori
| Nome | Descrizione | ||
|---|---|---|---|
| Attività ActivityName | Nome di uno specifico evento o passaggio aziendale avvenuto durante il ciclo di elaborazione della fattura. | ||
| Descrizione L’attività rappresenta una fase o un’azione distinta nel processo di gestione dei debiti verso fornitori, come 'Fattura ricevuta', 'Fattura registrata' o 'Pagamento eseguito'. Le attività costituiscono gli elementi fondamentali della mappa del processo. L’analisi delle attività è alla base del Process Mining: consente di visualizzare il flusso del processo, individuare i percorsi più comuni, rilevare le deviazioni dal processo standard e misurare la frequenza e la durata di ogni passaggio. La sequenza delle attività associate a una fattura ne descrive il percorso nel processo. Perché è importante Definisce i passaggi del processo e consente di visualizzarne e analizzarne il flusso, individuare i colli di bottiglia e rilevare i cicli di rilavorazione. Dove reperirli Ricavata da diverse fonti, tra cui le modifiche allo stato del documento (ad esempio, BKPF-BSTAT), i documenti di modifica (tabelle CDHDR/CDPOS) o i registri del flusso di lavoro. In genere è necessaria una logica di estrazione personalizzata. Esempi Fattura ricevutaFattura approvataPagamento eseguitoFattura bloccata per il pagamento | |||
| Data e ora dell’evento EventTime | Data e ora esatte in cui si è verificata l’attività. | ||
| Descrizione La data e ora dell’evento è il riferimento temporale associato a ogni attività e definisce la sequenza cronologica degli eventi di una fattura. Questi dati sono essenziali per comprendere il flusso del processo e svolgere analisi basate sul tempo. Nell’analisi, la data e ora dell’evento serve a ordinare correttamente le attività, calcolare i tempi di attraversamento tra i diversi passaggi, individuare i tempi di attesa e analizzare le prestazioni del processo in periodi diversi, ad esempio mese per mese. È alla base di tutti i KPI basati sulla durata. Perché è importante Questo riferimento temporale è fondamentale per ordinare gli eventi cronologicamente e calcolare tutte le metriche basate sul tempo, come i tempi di ciclo e le durate, essenziali per il Process Mining. Dove reperirli Ricavata da diversi campi di data e ora nelle tabelle SAP, come la data di creazione (BKPF-CPUDT), la data di registrazione (BKPF-BUDAT), la data di compensazione (BSAK-AUGDT) o i riferimenti temporali del registro delle modifiche (CDHDR-UDATE/UTIME). Esempi 2023-10-01T09:00:00Z2023-10-05T14:30:15Z2023-10-15T11:21:05Z | |||
| Fattura Invoice | Identificativo univoco del documento fattura, utilizzato come ID caso principale per il processo di gestione dei debiti verso fornitori. | ||
| Descrizione La fattura è l’oggetto centrale che collega tutte le attività correlate, dalla ricezione al pagamento. In SAP S/4HANA, è in genere identificata da una chiave composta formata dal codice società (BUKRS), da un numero di documento univoco (BELNR) e dall’esercizio (GJAHR). L’analisi per fattura offre una visione completa del suo ciclo di vita. È fondamentale per calcolare metriche chiave come il tempo di attraversamento totale, individuare i colli di bottiglia delle singole fatture e comprendere i diversi percorsi che una fattura può seguire nel processo. Perché è importante Identifica in modo univoco il percorso di ogni fattura, consentendo di ricostruirne l’intero ciclo di vita e analizzare le prestazioni del processo caso per caso. Dove reperirli Chiave composta ricavata dalle tabelle BKPF (intestazione del documento contabile) o RBKP (intestazione del documento: ricezione fattura), utilizzando i campi BUKRS, BELNR e GJAHR. Esempi 1000-1900000001-20231710-1900000002-20232000-5100000003-2024 | |||
| Sistema di origine SourceSystem | Sistema da cui sono stati estratti i dati. | ||
| Descrizione Questo attributo identifica l’origine dei dati del processo. In questa vista, il valore sarà in genere 'SAP S/4HANA'. Negli ambienti con più sistemi ERP o sistemi integrati, questo campo è fondamentale per la tracciabilità dei dati e la loro separazione. Garantisce che l’analisi venga eseguita sul set di dati corretto e aiuta a diagnosticare i problemi di qualità dei dati risalendo alla fonte. Perché è importante Identifica l’origine dei dati, un’informazione fondamentale per la governance dei dati, la risoluzione dei problemi e gli ambienti con più sistemi. Dove reperirli In genere è un valore statico aggiunto durante l’estrazione dei dati per indicare l’origine del set di dati. Esempi SAP S/4HANASAP ECC 6.0S4H_PROD_100 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Data e ora dell’ultimo aggiornamento dei dati di questo record dal sistema di origine. | ||
| Descrizione Questo attributo indica la data e l’ora dell’estrazione o dell’aggiornamento più recente dei dati da SAP S/4HANA. È un campo di metadati fondamentale per capire quanto siano aggiornati i dati analizzati. Questa informazione consente agli utenti di sapere quanto è aggiornata l’analisi del processo. Aiuta a definire le aspettative sui ritardi di aggiornamento dei dati ed è importante per pianificare gli aggiornamenti e mantenere l’integrità dei dati. Perché è importante Indica quanto sono aggiornati i dati, così gli utenti possono sapere a quando risale l’analisi del processo. Dove reperirli Questo valore viene generato e registrato in ogni record al momento dell’estrazione dei dati dal sistema di origine. Esempi 2024-05-20T04:00:00Z2024-05-21T04:00:00Z | |||
| Codice società CompanyCode | Unità organizzativa per cui viene elaborata la fattura. | ||
| Descrizione Il codice società è la più piccola unità organizzativa per cui è possibile redigere un insieme completo e autonomo di conti ai fini della rendicontazione esterna. Nel processo di gestione dei debiti verso fornitori, rappresenta l’entità giuridica che deve pagare il fornitore. L’analisi per codice società consente di confrontare le prestazioni del processo tra le diverse entità giuridiche dell’organizzazione. Aiuta a individuare quali parti dell’azienda seguono i processi standard e quali presentano maggiore efficienza, tempi di attraversamento più lunghi o più rilavorazioni. Perché è importante Consente di confrontare le prestazioni del processo tra diverse entità giuridiche e di individuare problemi e buone pratiche specifici di un’area geografica o di un’unità aziendale. Dove reperirli Si trova nelle tabelle di intestazione del documento, principalmente in BKPF-BUKRS per le fatture FI e in RBKP-BUKRS per le fatture MM. Esempi 10001710US01DE01 | |||
| Data di scadenza della fattura InvoiceDueDate | Data entro cui la fattura deve essere pagata al fornitore. | ||
| Descrizione La data di scadenza della fattura è il termine entro cui pagare il fornitore per evitare penali per ritardi e mantenere un buon rapporto commerciale. Si calcola a partire dalla data di riferimento della fattura e dalle condizioni di pagamento concordate con il fornitore. Questa data è essenziale per la Dashboard 'Conformità e anzianità dei pagamenti' e per il KPI 'Percentuale di pagamenti puntuali'. Confrontando la scadenza con la data effettiva del pagamento, l’analisi mostra se i pagamenti sono puntuali, anticipati o in ritardo, con conseguenze dirette sul piano finanziario e sui rapporti con i fornitori. Perché è importante È il riferimento principale per analizzare la puntualità dei pagamenti e misurarne le prestazioni e l’impatto sui rapporti con i fornitori e sulle penali per ritardi. Dove reperirli Questa data è spesso calcolata. La data di scadenza netta si trova nel campo BSEG-NETDT. Può anche essere ricavata dalla data di riferimento per il pagamento (BSEG-ZFBDT) e dalle condizioni di pagamento (BSEG-ZTERM). Esempi 2023-10-312023-11-152024-01-10 | |||
| Importo della fattura InvoiceAmount | Importo lordo totale della fattura nella valuta originale del documento. | ||
| Descrizione È il valore totale della fattura inviata dal fornitore. Comprende il costo di beni o servizi, le imposte e gli altri oneri, prima di eventuali detrazioni o sconti. L’importo della fattura è un attributo finanziario fondamentale per numerose analisi. Aiuta a stabilire la priorità delle fatture di importo elevato, comprendere l’impatto finanziario dei ritardi nel processo, ad esempio le penali su fatture di importo consistente, e segmentare il processo, per esempio per verificare se le fatture di importo elevato seguono un percorso di approvazione diverso. È inoltre essenziale per individuare potenziali pagamenti duplicati. Perché è importante Fornisce il contesto finanziario del processo e consente analisi basate sul valore, di dare priorità alle fatture di importo elevato e di quantificare gli impatti finanziari. Dove reperirli Si trova in tabelle come RBKP-RMWWR (importo lordo della fattura) per le fatture MM oppure si calcola dalle righe della tabella BSEG (campo WRBTR) per le fatture FI. Esempi 1500.00250.7512345.50 | |||
| Nome del fornitore VendorName | Nome del fornitore che ha inviato la fattura. | ||
| Descrizione Questo attributo contiene la ragione sociale ufficiale del fornitore. È collegato tramite il numero fornitore memorizzato nel documento fattura. L’analisi dei fornitori è fondamentale per gestire i rapporti con loro e individuare problemi di processo specifici. Può aiutare a rispondere a domande come 'Quali fornitori inviano più fatture con discrepanze?' oppure 'Paghiamo sempre puntualmente alcuni fornitori strategici?'. Insieme al numero e all’importo della fattura, è inoltre un campo chiave per individuare potenziali pagamenti duplicati. Perché è importante Consente di analizzare le prestazioni del processo per fornitore, individuare quelli che creano problemi e gestire efficacemente i rapporti con i fornitori strategici. Dove reperirli Ricavato dalla tabella dei dati anagrafici dei fornitori LFA1 (campo NAME1), tramite il numero fornitore (LIFNR) presente in BKPF o RBKP. Esempi Office Supplies Inc.Global Consulting GroupMachine Parts GmbH | |||
| Nome utente UserName | ID utente della persona che ha eseguito l’attività. | ||
| Descrizione Questo attributo registra l’ID utente SAP della persona responsabile dell’esecuzione di una specifica attività, come la registrazione, l’approvazione o la compensazione di una fattura. Collega i passaggi del processo ai singoli utenti. L’analisi per nome utente è essenziale per comprendere la distribuzione del carico di lavoro, individuare gli utenti con i migliori risultati e identificare chi potrebbe aver bisogno di ulteriore formazione. È inoltre fondamentale per analizzare i colli di bottiglia nelle Dashboard di approvazione, perché permette di individuare gli approvatori che causano ritardi nel processo. Perché è importante Associa le attività a persone specifiche, consentendo di analizzare le prestazioni degli utenti, il carico di lavoro e la conformità alle policy di separazione delle mansioni. Dove reperirli Si trova in genere nelle tabelle di intestazione, come BKPF-USNAM (inserito da), o nelle tabelle dei documenti di modifica, come CDHDR-USERNAME (modificato da). Esempi ABROWNJSMITHAP_AUTOMATION | |||
| Numero dell’ordine di acquisto PurchaseOrderNumber | Identificativo univoco dell’ordine di acquisto associato alla fattura, se applicabile. | ||
| Descrizione Questo attributo collega una fattura a un ordine di acquisto (PO) approvato in precedenza. La presenza del numero dell’ordine di acquisto è alla base della riconciliazione a tre vie (ordine di acquisto, fattura, entrata merci). È un attributo essenziale per le analisi di conformità ed efficienza. Serve a calcolare il KPI 'Percentuale di fatture senza ordine di acquisto', che misura il rispetto delle policy di approvvigionamento. È inoltre fondamentale per la Dashboard 'Prestazioni della riconciliazione a tre vie', che consente di analizzare il processo di abbinamento delle fatture associate a un ordine di acquisto. Perché è importante È fondamentale per analizzare l’efficienza della riconciliazione a tre vie e misurare la conformità alle policy di approvvigionamento, individuando le fatture elaborate senza un ordine di acquisto. Dove reperirli Si trova nelle tabelle delle righe della fattura, ad esempio RSEG-EBELN per le fatture MM o BSEG-EBELN per le fatture FI. Esempi 45000012344500005678 | |||
| Condizioni di pagamento PaymentTerms | Le condizioni concordate con il fornitore per il pagamento di una fattura, che spesso includono la possibilità di ottenere uno sconto. | ||
| Descrizione Le condizioni di pagamento definiscono le scadenze e gli eventuali sconti per il pagamento anticipato. Per esempio, una condizione come 'Z001' può indicare 'Pagamento entro 30 giorni, sconto del 2% se si paga entro 10 giorni'. Questo attributo è alla base della Dashboard 'Tasso di acquisizione degli sconti per pagamento anticipato'. Analizzando le condizioni di pagamento, è possibile individuare tutte le fatture per cui era previsto uno sconto. Il confronto con gli sconti effettivamente ottenuti mette in luce le opportunità di risparmio perse e consente di misurare l’efficienza del processo di pagamento. Perché è importante È essenziale per analizzare le opportunità di sconto per pagamento anticipato, misurare i risultati finanziari del processo di pagamento e individuare i risparmi mancati. Dove reperirli Si trova nelle righe fornitore, nella tabella BSEG-ZTERM, oppure nell’intestazione della fattura in RBKP-ZTERM. Esempi Z0010001NT30 | |||
| Data di compensazione ClearingDate | La data in cui è stato effettuato il pagamento e la fattura è stata compensata tra le partite aperte. | ||
| Descrizione La data di compensazione indica il saldo finanziario della fattura. Corrisponde alla data in cui si verifica l’attività 'Pagamento compensato' e segna la fase finale della maggior parte dei percorsi di fatturazione completati correttamente. Questa data serve a calcolare la data effettiva del pagamento e a confrontarla con la data di scadenza della fattura. È quindi essenziale per calcolare il KPI 'Tasso di pagamenti puntuali' e per tutte le analisi relative ai risultati dei pagamenti. Inoltre, segna il termine del calcolo del tempo di ciclo complessivo della fattura. Perché è importante Segna il saldo finale di una fattura, costituisce il termine per il calcolo del tempo di ciclo e fornisce la base per analizzare i pagamenti puntuali. Dove reperirli Si trova nelle tabelle delle partite compensate, per esempio BSAK-AUGDT per i fornitori. Esempi 2023-10-282023-11-142024-01-09 | |||
| È automatizzata IsAutomated | Indicatore che specifica se l’attività è stata eseguita automaticamente dal sistema anziché da una persona. | ||
| Descrizione Questo attributo booleano distingue le attività avviate da una persona da quelle eseguite da processi pianificati, flussi di lavoro o bot. Per esempio, un’esecuzione automatizzata dei pagamenti o la registrazione di una fattura generata dal sistema viene contrassegnata come automatica. L’analisi di questo attributo aiuta a comprendere il livello di automazione del processo di gestione dei debiti verso fornitori. Può servire a misurare i risultati delle iniziative di automazione, confrontare l’efficienza dei passaggi automatizzati e manuali e individuare ulteriori opportunità di automazione. Perché è importante Aiuta a misurare il grado di automazione del processo, analizzarne l’efficacia e individuare opportunità di ulteriore miglioramento. Dove reperirli Deducibile dal nome utente, ad esempio dagli ID utente di sistema come 'SAP_SYSTEM' o 'BATCHUSER', oppure dai codici di transazione specifici associati ai processi automatizzati. Esempi truefalse | |||
| Motivo del blocco BlockingReason | Il motivo per cui una fattura è bloccata per il pagamento, che segnala una discrepanza. | ||
| Descrizione Quando una fattura non supera un controllo di convalida durante la verifica a tre vie o altre fasi di controllo, viene bloccata per il pagamento. Il motivo del blocco specifica la natura del problema, per esempio una discrepanza nelle quantità, una differenza di prezzo o una ricezione merci mancante. Questo attributo è fondamentale per la Dashboard 'Analisi delle rilavorazioni dovute a discrepanze nelle fatture'. Analizzare la frequenza dei diversi motivi di blocco aiuta a individuare le cause profonde delle inefficienze del processo. Per esempio, se la 'Differenza di prezzo' è un motivo ricorrente, potrebbero esserci problemi con i dati anagrafici nel sistema di acquisto. Perché è importante Fornisce indicazioni dirette sulle cause profonde delle discrepanze nelle fatture e delle rilavorazioni, consentendo di intervenire sul processo in modo mirato. Dove reperirli È memorizzato nelle tabelle delle righe fattura, come RSEG, nei campi che iniziano con SPGR* (per esempio SPGRP, SPGRQ, SPGRT). Può trovarsi anche in RBKP_BLOCKED. Esempi Discrepanza di prezzoDiscrepanza nelle quantitàRicezione merci mancante | |||
| Numero fattura del fornitore VendorInvoiceNumber | Il numero della fattura riportato dal fornitore sul documento. | ||
| Descrizione È il numero di riferimento del sistema contabile del fornitore, riportato sulla fattura cartacea o elettronica. Viene inserito manualmente o acquisito tramite OCR al momento della ricezione della fattura. Questo campo è molto importante per le attività operative e per le analisi, in particolare per la Dashboard 'Possibili pagamenti di fatture duplicate'. Un metodo comune per rilevare i duplicati consiste nel cercare più documenti di fattura interni che condividono lo stesso nome del fornitore, numero fattura del fornitore e importo della fattura. È il principale riferimento esterno per una fattura. Perché è importante È un campo chiave per individuare possibili pagamenti duplicati e costituisce il principale riferimento esterno per comunicare con i fornitori. Dove reperirli È memorizzato nel campo 'Riferimento' dell’intestazione del documento, in genere BKPF-XBLNR. Esempi INV-2023-9876733401120231015-001 | |||
| Pagamento in ritardo IsLatePayment | Indicatore booleano che segnala se la fattura è stata pagata dopo la data di scadenza. | ||
| Descrizione Questo attributo calcolato è un semplice indicatore vero/falso che segnala se il pagamento di una fattura è stato effettuato dopo la data di scadenza ufficiale. Si ottiene confrontando la 'Data di compensazione' con la 'Data di scadenza della fattura'. L’indicatore semplifica le analisi nella Dashboard 'Conformità dei pagamenti e anzianità delle partite' e il calcolo del KPI 'Tasso di pagamenti puntuali'. Consente di filtrare e aggregare facilmente i dati per contare i pagamenti in ritardo, calcolare la percentuale di pagamenti puntuali e individuare i fornitori o i codici società con un’elevata incidenza di ritardi. Perché è importante Misura direttamente il rispetto delle condizioni di pagamento, semplifica il calcolo del KPI sui pagamenti puntuali e aiuta a individuare le aree in cui i risultati dei pagamenti sono insoddisfacenti. Dove reperirli Attributo calcolato. La logica è: IF ClearingDate > InvoiceDueDate THEN true ELSE false. Esempi truefalse | |||
| Sconto ottenuto DiscountTaken | Indicatore booleano che segnala se è stato applicato correttamente uno sconto per pagamento anticipato. | ||
| Descrizione Questo attributo indica se, al momento del pagamento della fattura, è stato effettivamente ottenuto uno sconto in contanti. È un elemento fondamentale per misurare l’efficienza finanziaria del processo di contabilità fornitori. Questo indicatore è alla base del KPI 'Tasso di acquisizione degli sconti per pagamento anticipato'. Filtrando le fatture per cui era possibile ottenere uno sconto, in base alle condizioni di pagamento, e analizzando questo indicatore, un’azienda può calcolare con precisione quanto ha risparmiato e quante opportunità di risparmio ha perso. Si ottiene così una misura chiara e quantificabile dei risultati della contabilità fornitori. Perché è importante Misura direttamente il successo nell’ottenere gli sconti disponibili per i pagamenti anticipati, con un impatto diretto sui risultati economici dell’azienda. Dove reperirli Si ricava verificando se il campo dell’importo dello sconto (BSEG-SKNTO) è maggiore di zero nel documento di pagamento. Esempi truefalse | |||
| Tipo di documento fattura InvoiceDocumentType | Classificazione del documento fattura che determina le modalità di elaborazione in SAP. | ||
| Descrizione Il tipo di documento è un elemento di configurazione chiave in SAP che classifica i documenti contabili. Per esempio, 'KR' viene in genere utilizzato per le fatture fornitori, 'RE' per le fatture MM e 'KG' per le note di credito dei fornitori. Il tipo determina, tra le altre cose, l’intervallo di numerazione e i campi obbligatori. Nell’analisi del processo, filtrare per tipo di documento consente di confrontare i flussi di lavoro dei diversi tipi di fattura. Per esempio, il processo di approvazione di una nota di credito può essere diverso da quello di una fattura standard. Questa analisi è utile per la Dashboard 'Varianti del flusso di approvazione delle fatture'. Perché è importante Consente di segmentare il processo in base alle modalità di gestione dei diversi tipi di fattura, mettendo in luce le variazioni nei percorsi di elaborazione e nei tempi di attraversamento. Dove reperirli Direttamente dalla tabella dell’intestazione del documento, campo BKPF-BLART. Esempi KRREKG | |||
| Valuta della fattura InvoiceCurrency | Il codice della valuta in cui è espresso l’importo della fattura (per esempio USD, EUR). | ||
| Descrizione Questo attributo specifica la valuta in cui è espresso l’importo della fattura e fornisce un contesto essenziale per tutti i valori finanziari. In un’organizzazione multinazionale, analizzare le fatture senza considerare la valuta può portare a conclusioni fuorvianti. Questo campo consente di gestire correttamente i dati finanziari, convertendo tutti gli importi in un’unica valuta di rendicontazione oppure segmentando l’analisi per valuta, così da comprendere le attività finanziarie nelle diverse aree geografiche. Perché è importante Fornisce il contesto necessario per interpretare l’importo della fattura e consente analisi e rendicontazioni finanziarie accurate, soprattutto in contesti multinazionali. Dove reperirli Si trova principalmente nelle tabelle dell’intestazione del documento, in BKPF-WAERS o RBKP-WAERS. Esempi USDEURGBPJPY | |||
Attività di elaborazione delle fatture fornitori
| Attività | Descrizione | ||
|---|---|---|---|
| Fattura approvata | La fattura ha ricevuto tutte le approvazioni necessarie nel sistema di flusso di lavoro. Spesso è l’ultimo passaggio prima che la fattura possa essere registrata o sbloccata per il pagamento. | ||
| Perché è importante Questa tappa fondamentale segna la fine del ciclo di approvazione. Il tempo che intercorre tra l’invio per l’approvazione e l’approvazione è una metrica essenziale per misurare l’efficienza. Dove reperirli Rilevato nei registri di SAP Business Workflow come completamento o rilascio finale. In alternativa, può essere dedotto dalla rimozione di un blocco del pagamento dopo l’invio per l’approvazione. Acquisizione Estrarre gli eventi di completamento del flusso di lavoro dai registri SAP Workflow oppure individuare l’evento finale di 'rilascio'. Tipo di evento explicit | |||
| Fattura bloccata per il pagamento | Il sistema ha bloccato la fattura, automaticamente o manualmente, impedendone il pagamento. In genere il blocco è dovuto a discrepanze di prezzo o quantità oppure alla mancanza di approvazioni. | ||
| Perché è importante È un indicatore importante di problemi e rilavorazioni. Analizzare i motivi e la durata dei blocchi aiuta a individuare le cause profonde dei ritardi nei pagamenti e delle inefficienze del processo. Dove reperirli Si tratta di uno stato esplicito registrato nel campo chiave di blocco pagamento (ZLSPR) della riga fornitore del documento contabile (tabella BSEG). Acquisizione Registrato tramite documenti di modifica quando il campo BSEG-ZLSPR contiene un motivo di blocco. Tipo di evento explicit | |||
| Fattura registrata | La fattura viene registrata formalmente nel libro mastro, generando una passività finanziaria. Un documento parcheggiato diventa un documento registrato oppure viene effettuata una registrazione diretta. | ||
| Perché è importante È una tappa fondamentale dal punto di vista finanziario: conferma l’obbligo dell’azienda di pagare ed è spesso un prerequisito per pianificare il pagamento. Dove reperirli L’evento viene identificato tramite la data di registrazione (BUDAT) nell’intestazione del documento (BKPF). Per un documento registrato, il campo di stato del documento (BKPF-BSTAT) è vuoto. Acquisizione Utilizzare la data di registrazione (BKPF-BUDAT) per i documenti non parcheggiati (BKPF-BSTAT vuoto). Tipo di evento explicit | |||
| Fattura ricevuta | Questa attività corrisponde alla creazione di un documento fattura in SAP, manualmente o tramite un’interfaccia automatizzata come OCR/VIM. L’evento viene in genere rilevato dalla data e dall’ora di creazione dell’intestazione del documento contabile. | ||
| Perché è importante Essendo il punto di partenza del processo, questa attività è essenziale per calcolare il tempo di attraversamento complessivo della fattura e misurare il volume di attività dell’intero processo di gestione dei debiti verso fornitori. Dove reperirli L’evento viene rilevato nella tabella dell’intestazione del documento contabile (BKPF), utilizzando la data di creazione del documento (CPUDT) e l’ora (CPUTM). Acquisizione Utilizzare la data e l’ora di creazione (BKPF-CPUDT, BKPF-CPUTM) del documento fattura. Tipo di evento explicit | |||
| Fattura stornata | Il documento fattura è stato stornato, annullandone di fatto l’impatto finanziario. È uno stato finale alternativo del processo, spesso dovuto a inserimenti errati o a contestazioni del fornitore. | ||
| Perché è importante Monitorare gli storni aiuta a individuare le cause dei problemi nel processo, come invii duplicati o dati errati nelle fatture, che possono segnalare problemi nelle fasi precedenti. Dove reperirli L’evento viene registrato esplicitamente quando viene creato un documento di storno. Nell’intestazione del documento originale (BKPF) vengono compilati il numero del documento di storno (STBLG) e il motivo dello storno. Acquisizione Individuare la data di registrazione del documento di storno, collegata nell’intestazione del documento originale (BKPF-STBLG). Tipo di evento explicit | |||
| Pagamento compensato | Questa attività segna la chiusura definitiva della fattura: il pagamento e la fattura vengono compensati tra loro nel sottoconto. Indica che il processo è completato. | ||
| Perché è importante Essendo la conclusione definitiva del processo, questa attività è essenziale per calcolare con precisione il tempo di attraversamento complessivo. Conferma che la passività è stata saldata. Dove reperirli È un evento esplicito, registrato quando viene compilato il campo della data di compensazione (AUGDT) nella riga fornitore del documento fattura (tabella BSEG). Acquisizione Utilizzare la data di compensazione (BSEG-AUGDT) della riga della fattura. Tipo di evento explicit | |||
| Pagamento eseguito | La fattura è stata pagata. L’evento viene rilevato al completamento dell’esecuzione dei pagamenti, quando viene creato e registrato un documento di pagamento. | ||
| Perché è importante Questa attività è fondamentale per l’analisi dei flussi di cassa e per misurare il KPI 'Percentuale di pagamenti puntuali', confrontando la data del pagamento con la scadenza della fattura. Dove reperirli L’evento viene rilevato dalla data di registrazione del documento di pagamento che compensa la fattura. Il numero del documento di pagamento è collegato nel campo del documento di compensazione (AUGBL) della riga della fattura (BSEG). Acquisizione Individuare la data di registrazione (BUDAT) del documento di pagamento che compensa la riga della fattura. Tipo di evento explicit | |||
| Discrepanza risolta | Questa attività indica che un problema individuato in precedenza, che probabilmente aveva causato un blocco del pagamento, è stato analizzato e risolto. Viene rilevata quando il blocco del pagamento viene rimosso dalla fattura. | ||
| Perché è importante Monitorare questo ciclo di rilavorazione è fondamentale per la Dashboard 'Analisi delle rilavorazioni dovute a discrepanze nelle fatture'. Consente di quantificare il tempo e l’impegno necessari per correggere gli errori. Dove reperirli L’evento viene dedotto dai documenti di modifica che mostrano la rimozione di un blocco del pagamento. Il registro delle modifiche del campo BSEG-ZLSPR è la fonte principale. Acquisizione Individuare i documenti di modifica della tabella BSEG in cui il campo ZLSPR passa da un valore a vuoto. Tipo di evento inferred | |||
| Entrata merci abbinata | Questa attività indica che le quantità e gli importi della fattura sono stati abbinati correttamente al relativo documento di entrata merci. È la convalida finale nella riconciliazione a tre vie. | ||
| Perché è importante Monitorare questa attività aiuta a individuare le inefficienze nella riconciliazione a tre vie e le discrepanze tra le merci ricevute e quelle fatturate dal fornitore. Dove reperirli L’evento viene dedotto dalla presenza di un riferimento al documento materiale (entrata merci) nella riga della fattura, spesso collegato tramite lo storico della posizione dell’ordine di acquisto. Acquisizione Deducibile dalla presenza di un riferimento al documento di entrata merci nella riga della fattura (ad esempio, in RSEG per le fatture MIRO). Tipo di evento inferred | |||
| Fattura inviata per l’approvazione | La fattura è stata inserita in un flusso di lavoro per le approvazioni richieste, in base alle regole aziendali. Questo segna l’inizio del sottoprocesso di approvazione. | ||
| Perché è importante Questa attività è il punto di partenza per misurare il KPI 'Tempo medio di approvazione delle fatture' e analizzare i colli di bottiglia nelle approvazioni. Dove reperirli Può essere rilevata dai registri di SAP Business Workflow (tabelle SWW*), che registrano l’avvio di un’istanza del flusso di lavoro collegata all’oggetto fattura (ad esempio, BUS2081). Acquisizione Estrarre gli eventi di avvio del flusso di lavoro dai registri SAP Workflow (ad esempio, dalla tabella SWW_WIHEAD) collegati al documento fattura. Tipo di evento explicit | |||
| Fattura parcheggiata | Indica che la fattura è stata inserita nel sistema, ma non è ancora stata registrata nel libro mastro. Spesso si tratta di un passaggio intenzionale, che consente di salvare un documento incompleto per elaborarlo o approvarlo in un secondo momento. | ||
| Perché è importante Monitorare le fatture parcheggiate aiuta a individuare i ritardi prima dell’avvio della registrazione formale e può far emergere problemi di completezza dei dati o di convalida iniziale. Dove reperirli Lo stato viene dedotto dal campo di stato del documento nell’intestazione del documento contabile (BKPF-BSTAT = 'V' per Parked). L’evento si verifica quando viene impostato questo stato. Acquisizione Individuare i documenti di modifica della tabella BKPF in cui il campo BSTAT è impostato su 'V' (Vor-erfasst/Pre-entered). Tipo di evento inferred | |||
| Fattura rifiutata | Durante il flusso di lavoro di approvazione, un approvatore ha rifiutato la fattura. In genere, la fattura viene quindi rinviata all’addetto all’elaborazione per correggerla o fornire chiarimenti. | ||
| Perché è importante Monitorare i rifiuti permette di individuare i cicli di rilavorazione nel processo di approvazione e può segnalare problemi di conformità alle policy o una codifica errata della fattura. Dove reperirli L’evento viene registrato come esito specifico nei registri di SAP Business Workflow associati alla fattura. Acquisizione Estrarre dai registri SAP Workflow gli eventi con stato 'rifiutata' del flusso di lavoro. Tipo di evento explicit | |||
| Ordine di acquisto abbinato | Questa attività indica che la fattura è stata abbinata correttamente al relativo ordine di acquisto. È un passaggio fondamentale nella riconciliazione a tre vie delle fatture legate agli acquisti. | ||
| Perché è importante Analizzare questa attività permette di misurare l’efficienza del processo di abbinamento ed è fondamentale per i KPI 'Prestazioni della riconciliazione a tre vie' e 'Percentuale di fatture senza ordine di acquisto'. Dove reperirli L’evento viene dedotto quando una riga della fattura nella tabella BSEG o ACDOCA contiene un numero di ordine di acquisto valido (EBELN) e una posizione (EBELP). Acquisizione Deducibile dalla presenza di un riferimento all’ordine di acquisto (BSEG-EBELN) nel documento fattura al momento della creazione. Tipo di evento inferred | |||
| Proposta di pagamento creata | La fattura è stata inclusa in una proposta di pagamento nell’ambito di un’esecuzione dei pagamenti (ad esempio, F110). È quindi prevista per il pagamento, in attesa dell’esecuzione definitiva. | ||
| Perché è importante Questa attività mostra il passaggio da una passività aperta a una voce in preparazione per il pagamento e aiuta ad analizzare l’efficienza delle operazioni di pagamento. Dove reperirli L’evento è registrato esplicitamente nelle tabelle dei dati di esecuzione dei pagamenti, in particolare REGUP (voci elaborate dal programma di pagamento) e REGUH (intestazione). Acquisizione Individuare quando una fattura compare nella tabella REGUP per un’esecuzione dei pagamenti identificata in REGUH. Tipo di evento explicit | |||
| Scadenza della fattura superata | Evento calcolato che indica che la data di scadenza netta della fattura è trascorsa senza che sia stato registrato un pagamento a compensazione. Segnala un pagamento in ritardo o scaduto. | ||
| Perché è importante Essenziale per la Dashboard 'Conformità e anzianità dei pagamenti', questa attività aiuta a individuare e gestire in modo proattivo le fatture scadute e ad analizzare le cause profonde dei ritardi nei pagamenti. Dove reperirli Non è un evento esplicito in SAP. Si calcola confrontando la data corrente del sistema con la data di scadenza netta, determinata a partire da BSEG-ZFBDT o dalla data di riferimento e dalle condizioni di pagamento. Acquisizione Evento calcolato che si attiva quando la data e l’ora dell’evento sono successive alla data di scadenza netta della fattura. Tipo di evento calculated | |||
Guide all’estrazione
Passaggi
- Prerequisiti e accesso: verifichi di disporre di un utente con accesso in lettura allo schema del database SAP S/4HANA (in genere SAPABAP1 o simile) in cui risiedono le viste CDS. Le servirà un client SQL in grado di connettersi al database SAP HANA, ad esempio SAP HANA Studio, DBeaver o un altro strumento di interrogazione dei database.
- Individuazione delle viste CDS principali: le viste CDS principali per questa estrazione sono I_JournalEntry, I_JournalEntryItem, I_SupplierInvoiceAPI01, I_ChangeDocument, I_WorkflowStatusDetails e I_PaymentProposalItem. Prenda familiarità con i relativi campi chiave.
- Definizione dell’ambito della query: apra il client SQL e si connetta al database SAP HANA. Prima di eseguire la query completa, definisca l’ambito dell’estrazione impostando l’identificativo corretto del sistema di origine, l’intervallo di date delle fatture (CreationDateTime) e i codici società pertinenti.
- Preparazione della query principale: copi nel client SQL la query SQL completa riportata nella sezione dedicata. La query utilizza espressioni di tabella comuni (CTE) per selezionare prima un insieme di fatture di riferimento e poi creare un event log unendo i dati relativi a 15 attività diverse.
- Impostazione dei parametri della query: nella query SQL copiata, individui le variabili segnaposto. Sostituisca '[YYYY-MM-DD]' con le date di inizio e fine del periodo di analisi. Sostituisca '[Your Company Code 1]' e '[Your Company Code 2]' con l’elenco dei codici società SAP da analizzare.
- Esecuzione della query di estrazione: esegua la query SQL completa. A seconda del volume dei dati e dell’intervallo di date selezionato, l’operazione può richiedere da alcuni minuti a diverse ore.
- Revisione dei risultati preliminari: al termine della query, riveda le prime centinaia di righe restituite. Verifichi la coerenza dei dati, che tutte le colonne siano compilate come previsto e che siano presenti valori diversi per ActivityName.
- Esportazione dell’Event Log: esporti l’intero risultato dal client SQL in un file CSV. Si assicuri che il file utilizzi la codifica UTF-8 per evitare problemi con i caratteri. Assegni un nome descrittivo al file, ad esempio sap_s4hana_ap_event_log.csv.
- Preparazione al caricamento: prima di caricare i dati in uno strumento di Process Mining, verifichi che le intestazioni delle colonne nel file CSV corrispondano esattamente ai nomi degli attributi richiesti: Invoice, ActivityName, EventTime, SourceSystem, LastDataUpdate, UserName e così via.
- Caricamento nello strumento di Process Mining: carichi il file CSV generato nella piattaforma di Process Mining e associ le colonne ai campi corrispondenti per ID caso, attività e data e ora.
Configurazione
- Viste CDS principali: l’estrazione si basa su una combinazione di viste CDS standard di S/4HANA. Le viste principali sono:
- I_JournalEntry e I_JournalEntryItem: per le intestazioni dei documenti finanziari, le voci, i dettagli di registrazione e le informazioni di compensazione.
- I_SupplierInvoiceAPI01: per i dettagli specifici delle fatture MM (Logistics), inclusi i riferimenti agli ordini di acquisto e i blocchi di pagamento.
- I_ChangeDocument: per rilevare l’ora esatta delle modifiche, ad esempio l’impostazione o la rimozione di un blocco di pagamento.
- I_WorkflowStatusDetails: per estrarre gli eventi relativi al flusso di lavoro di approvazione delle fatture.
- I_PaymentProposalItem: per individuare quando una fattura viene inclusa in una proposta di esecuzione dei pagamenti.
- I_Supplier: per arricchire i dati con informazioni anagrafiche dei fornitori, come VendorName.
- Filtro per intervallo di date: è fondamentale applicare un filtro per intervallo di date per limitare il volume dei dati. La query fornita filtra CreationDateTime nella CTE Invoices_Base. Per l’analisi iniziale si consiglia un intervallo di 3-6 mesi, così da mantenere gestibili i tempi di esecuzione.
- Filtri obbligatori: applichi sempre un filtro per CompanyCode. Analizzare contemporaneamente i dati di tutti i codici società può essere molto lento e potrebbe non essere utile per l’attività. Filtri anche JournalEntryType per selezionare solo i documenti relativi ai fornitori (ad esempio, 'KR' e 'RE').
- Prerequisiti: l’utente del database che esegue la query deve disporre dell’autorizzazione SELECT su tutte le viste CDS utilizzate e sullo schema HANA sottostante. L’accesso a livello applicativo tramite SAP GUI non è sufficiente.
- Considerazioni sulle prestazioni: le query dirette su I_ChangeDocument possono richiedere molte risorse. La query fornita cerca di ridurre il carico filtrando prima le fatture. Per insiemi di dati molto ampi, valuti l’esecuzione dell’estrazione fuori dagli orari di punta o suddividendola in intervalli di date più brevi.
Query di esempio sql
-- Common Table Expression (CTE) to select the base set of AP Invoices
WITH Invoices_Base AS (
SELECT
I_JournalEntry.CompanyCode,
I_JournalEntry.AccountingDocument,
I_JournalEntry.FiscalYear,
CONCAT(I_JournalEntry.CompanyCode, CONCAT(I_JournalEntry.AccountingDocument, I_JournalEntry.FiscalYear)) AS InvoiceId,
I_JournalEntry.CreationDateTime,
I_JournalEntry.CreatedByUser,
I_JournalEntry.DocumentStatus,
I_JournalEntry.JournalEntryType,
I_JournalEntry.ReversalReferenceJournalEntry,
I_JournalEntry.IsReversed,
I_JournalEntry.ReversalDate,
IJE_ITEM.NetDueDate,
IJE_ITEM.Supplier,
SUP.SupplierName AS VendorName,
IJE_ITEM.AmountInCompanyCodeCurrency AS InvoiceAmount,
MM.PurchaseOrder AS PurchaseOrderNumber,
MM.PaymentBlockingReason
FROM I_JournalEntry
-- Join to get item details like due date and supplier
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON I_JournalEntry.CompanyCode = IJE_ITEM.CompanyCode
AND I_JournalEntry.AccountingDocument = IJE_ITEM.AccountingDocument
AND I_JournalEntry.FiscalYear = IJE_ITEM.FiscalYear
AND IJE_ITEM.IsSupplier = 'X'
-- Join to get vendor name from master data
LEFT JOIN I_Supplier AS SUP
ON IJE_ITEM.Supplier = SUP.Supplier
-- Join to get MM Invoice specific data like PO Number and Payment Block
LEFT JOIN I_SupplierInvoiceAPI01 AS MM
ON I_JournalEntry.AccountingDocument = MM.AccountingDocument
AND I_JournalEntry.CompanyCode = MM.CompanyCode
AND I_JournalEntry.FiscalYear = MM.FiscalYear
WHERE
I_JournalEntry.JournalEntryType IN ('KR', 'RE') -- Standard Vendor Invoice Types
AND I_JournalEntry.CompanyCode IN ('[Your Company Code 1]', '[Your Company Code 2]')
AND I_JournalEntry.CreationDateTime BETWEEN '[YYYY-MM-DD]T00:00:00Z' AND '[YYYY-MM-DD]T23:59:59Z'
)
-- Event: 1. Invoice Received
SELECT
B.InvoiceId AS "Invoice",
'Invoice Received' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
UNION ALL
-- Event: 2. Invoice Parked
SELECT
B.InvoiceId AS "Invoice",
'Invoice Parked' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.DocumentStatus = 'V' -- 'V' stands for Parked
UNION ALL
-- Event: 3. Purchase Order Matched
SELECT
B.InvoiceId AS "Invoice",
'Purchase Order Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PurchaseOrderNumber IS NOT NULL AND B.PurchaseOrderNumber <> ''
UNION ALL
-- Event: 4. Goods Receipt Matched
SELECT
B.InvoiceId AS "Invoice",
'Goods Receipt Matched' AS "ActivityName",
B.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_SupplierInvoiceItemAPI01 AS MM_ITEM
ON B.AccountingDocument = MM_ITEM.AccountingDocument
AND B.FiscalYear = MM_ITEM.FiscalYear
WHERE MM_ITEM.GoodsReceipt IS NOT NULL AND MM_ITEM.GoodsReceipt <> ''
UNION ALL
-- Event: 5. Invoice Blocked For Payment
SELECT
B.InvoiceId AS "Invoice",
'Invoice Blocked For Payment' AS "ActivityName",
B.CreationDateTime AS "EventTime", -- Approximates block time as creation time if blocked on entry
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.PaymentBlockingReason IS NOT NULL AND B.PaymentBlockingReason <> ''
UNION ALL
-- Event: 6. Discrepancy Resolved (Payment Block Removed)
SELECT
B.InvoiceId AS "Invoice",
'Discrepancy Resolved' AS "ActivityName",
CD.ChangeTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CD.UserName AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_ChangeDocument AS CD
ON CONCAT(B.CompanyCode, B.AccountingDocument, B.FiscalYear) = CD.ObjectValue
WHERE CD.ChangeDocumentObject = 'INVOICE'
AND CD.TableName = 'RBKP'
AND CD.FieldName = 'ZLSPR' -- Field for Payment Block
AND CD.NewFieldValue = '' -- Block was removed
UNION ALL
-- Event: 7, 8, 9. Workflow Events (Routed, Approved, Rejected)
SELECT
B.InvoiceId AS "Invoice",
CASE WF.WorkflowStatus
WHEN 'READY' THEN 'Invoice Routed For Approval'
WHEN 'APPROVED' THEN 'Invoice Approved'
WHEN 'REJECTED' THEN 'Invoice Rejected'
END AS "ActivityName",
WF.WorkflowStatusChangedDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
WF.WorkflowStatusChangedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_WorkflowStatusDetails AS WF
ON B.InvoiceId = WF.WorkflowScenarioInstance
WHERE WF.WorkflowStatus IN ('READY', 'APPROVED', 'REJECTED')
UNION ALL
-- Event: 10. Invoice Posted
SELECT
B.InvoiceId AS "Invoice",
'Invoice Posted' AS "ActivityName",
JE.PostingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntry AS JE
ON B.AccountingDocument = JE.AccountingDocument
AND B.CompanyCode = JE.CompanyCode
AND B.FiscalYear = JE.FiscalYear
WHERE B.DocumentStatus <> 'V' -- Any status other than Parked is considered Posted for AP
UNION ALL
-- Event: 11. Payment Proposal Created
SELECT
B.InvoiceId AS "Invoice",
'Payment Proposal Created' AS "ActivityName",
PPI.PaymentProposalRunDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
PPI.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_PaymentProposalItem AS PPI
ON B.CompanyCode = PPI.CompanyCode
AND B.AccountingDocument = PPI.AccountingDocument
AND B.FiscalYear = PPI.FiscalYear
UNION ALL
-- Event: 12. Payment Executed
-- This links the invoice to its clearing document, which is the payment document
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Executed' AS "ActivityName",
CLEAR_JE.CreationDateTime AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
CLEAR_JE.CreatedByUser AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
INNER JOIN I_JournalEntry AS CLEAR_JE
ON IJE_ITEM.ClearingJournalEntry = CLEAR_JE.AccountingDocument
AND IJE_ITEM.CompanyCode = CLEAR_JE.CompanyCode
WHERE IJE_ITEM.ClearingJournalEntry IS NOT NULL AND IJE_ITEM.ClearingJournalEntry <> ''
AND CLEAR_JE.JournalEntryType = 'KZ' -- Vendor Payment Document Type
UNION ALL
-- Event: 13. Invoice Due Date Passed
SELECT
B.InvoiceId AS "Invoice",
'Invoice Due Date Passed' AS "ActivityName",
ADD_DAYS(B.NetDueDate, 1) AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
'SYSTEM' AS "UserName",
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
LEFT JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE B.NetDueDate < CURRENT_DATE
AND IJE_ITEM.ClearingDate IS NULL -- Invoice is not yet cleared
UNION ALL
-- Event: 14. Payment Cleared
SELECT DISTINCT
B.InvoiceId AS "Invoice",
'Payment Cleared' AS "ActivityName",
IJE_ITEM.ClearingDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
IJE_ITEM.ChangedByUser AS "UserName", -- User who cleared it
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
INNER JOIN I_JournalEntryItem AS IJE_ITEM
ON B.CompanyCode = IJE_ITEM.CompanyCode
AND B.AccountingDocument = IJE_ITEM.AccountingDocument
AND B.FiscalYear = IJE_ITEM.FiscalYear
WHERE IJE_ITEM.ClearingDate IS NOT NULL
UNION ALL
-- Event: 15. Invoice Cancelled
SELECT
B.InvoiceId AS "Invoice",
'Invoice Cancelled' AS "ActivityName",
B.ReversalDate AS "EventTime",
'SAP_S4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate",
B.CreatedByUser AS "UserName", -- User who created the original document
B.CompanyCode AS "CompanyCode",
B.VendorName AS "VendorName",
B.InvoiceAmount AS "InvoiceAmount",
B.PurchaseOrderNumber AS "PurchaseOrderNumber",
B.NetDueDate AS "InvoiceDueDate"
FROM Invoices_Base B
WHERE B.IsReversed = 'X'; Passaggi
- Verifichi di disporre dell’accesso diretto in lettura allo schema SAP HANA contenente le tabelle SAP S/4HANA pertinenti. Si procuri la stringa di connessione, le credenziali, il nome dello schema e le autorizzazioni necessarie per leggere BKPF, ACDOCA e le eventuali tabelle aggiuntive configurate per documenti parcheggiati, flusso di lavoro, acquisti, entrata merci, proposte di pagamento, compensazioni e storni.
- Prima dell’esecuzione, verifichi il modello tecnico dei dati nel sistema di destinazione. Convalidi i nomi fisici, i campi chiave, i campi data e ora, le relazioni di storno, i collegamenti ai pagamenti e i dati persistenti del flusso di lavoro utilizzati dal sistema. Sostituisca ogni segnaposto tra parentesi quadre nella query con l’oggetto o il campo corrispondente del sistema. Non presuma che i dati del flusso di lavoro o dei documenti parcheggiati siano archiviati in un’unica tabella universale.
- Configuri i parametri di estrazione. Imposti [Start date], [End date], [Company code filter], [Document type filter] e [Schema name]. Inizi con un intervallo di tre-sei mesi, quindi lo estenda dopo aver verificato le prestazioni e la completezza dei dati.
- Esegua la query SQL in un client SQL SAP HANA approvato, ad esempio SAP HANA Database Explorer o un altro strumento di esecuzione SQL autorizzato. La query restituisce una riga per ogni attività estratta esplicitamente e non si affida a ProcessMind per dedurre gli eventi.
- Convalidi il risultato. Verifichi che Invoice sia l’identificativo del caso, che ActivityName contenga tutti i 15 nomi di attività richiesti, che EventTime sia compilato e presenti una sequenza cronologica plausibile, che SourceSystem identifichi SAP S/4HANA e che LastDataUpdate contenga l’ora di aggiornamento dell’estrazione. Riveda gli eventi duplicati, le relazioni di storno e le unioni tra documenti prima di caricare i dati.
- Applichi le eventuali mappature specifiche del sistema. Ad esempio, associ la fonte configurata per i documenti parcheggiati a Invoice Parked, la fonte del flusso di lavoro configurata a Invoice Routed For Approval, Invoice Approved e Invoice Rejected, e la fonte dei pagamenti configurata a Payment Proposal Created e Payment Executed. Se è necessario garantire la verificabilità, conservi gli identificativi di origine in colonne aggiuntive.
- Esporti il risultato in un file delimitato o come insieme di risultati del database, con un evento per riga. Utilizzi la codifica UTF-8, mantenga i timestamp in un fuso orario coerente e conservi esattamente i nomi delle colonne Invoice, ActivityName, EventTime, SourceSystem, LastDataUpdate, UserName, CompanyCode, VendorName, InvoiceAmount, PurchaseOrderNumber e InvoiceDueDate. Non aggreghi le attività per fattura.
- Carichi l’event log in ProcessMind e imposti Invoice come identificativo del caso, ActivityName come colonna delle attività ed EventTime come colonna dell’ora dell’evento. Verifichi che gli attributi facoltativi siano associati ai campi corrispondenti. Poiché ProcessMind legge l’event log così com’è, prima del caricamento si assicuri che ogni attività da visualizzare sia già presente in una riga.
Configurazione
- Intervallo di date: inizi con un periodo di tre-sei mesi. In base all’attività estratta, utilizzi la data di registrazione, la data di creazione del documento o la data dell’evento pertinente nel sistema di origine. Estenda l’intervallo solo dopo aver verificato i tempi di esecuzione della query e il periodo di conservazione dei dati nel sistema di origine.
- Filtro per società: configuri [Company code filter] per limitare l’estrazione ai codici società richiesti. Se non è necessario applicare restrizioni, utilizzi una selezione controllata di tutte le società, anziché eseguire una query di produzione senza filtri.
- Filtro per tipo di documento: configuri [Document type filter] solo dopo aver verificato quali tipi di documento vengono utilizzati nel sistema di destinazione per fatture fornitori, note di credito, documenti parcheggiati, documenti di pagamento e storni.
- Mappatura di schemi e oggetti: sostituisca [Schema name] e ogni oggetto o campo di origine tra parentesi quadre con valori verificati nel sistema SAP S/4HANA di destinazione. Una query diretta su HANA deve essere adattata alle applicazioni attivate, alle estensioni, alla configurazione del flusso di lavoro e al modello dei dati del sistema.
- Gestione dei timestamp: normalizzi tutti i timestamp di origine in un unico fuso orario. Se è disponibile solo la data, utilizzi un orario predefinito documentato e annoti questa limitazione nel dizionario dei dati.
- Semantica degli eventi: estragga ogni attività come riga separata. Non accorpi più attività in un unico record di fattura e non si aspetti che ProcessMind ricavi eventi di abbinamento, approvazione, scadenza o compensazione.
- Evento di scadenza: generi Invoice Due Date Passed solo per le fatture la cui data di scadenza precede l’ora di valutazione configurata e per le quali non risulta alcun evento di compensazione entro tale ora. La query utilizza [Evaluation timestamp] per questo calcolo.
- Prestazioni: limiti il periodo iniziale e l’ambito delle società, applichi filtri ai campi indicizzati o rilevanti per il partizionamento, eviti di selezionare colonne non necessarie ed esegua la query durante una finestra di reporting approvata. Se la query di produzione supera i tempi concordati, valuti la possibilità di predisporre sottoinsiemi dei dati di origine.
- Strategia di aggiornamento: imposti LastDataUpdate sull’ora di esecuzione dell’estrazione. Per i caricamenti incrementali, mantenga un watermark basato sul timestamp di modifica pertinente nel sistema di origine e includa un periodo di recupero per acquisire gli aggiornamenti tardivi e gli storni.
- Prerequisiti: autorizzazioni database necessarie, accesso alla produzione approvato, conoscenza della configurazione Universal Journal del sistema, accesso alle fonti configurate per documenti parcheggiati, acquisti, entrata merci, flusso di lavoro, pagamenti, compensazioni e storni, nonché eventuali approvazioni SAP relative a licenze o governance.
Query di esempio sql
WITH
params AS (
SELECT
TO_DATE('[Start date]') AS start_date,
TO_DATE('[End date]') AS end_date,
TO_TIMESTAMP('[Evaluation timestamp]') AS evaluation_ts,
TO_TIMESTAMP('[Extraction timestamp]') AS extraction_ts
FROM DUMMY
),
base_invoice AS (
SELECT
b.mandt,
b.bukrs,
b.belnr,
b.gjahr,
b.bldat,
b.budat,
b.cpudt,
b.cputm,
b.usnam,
b.blart,
b.xblnr,
b.stblg,
b.stjah,
a.lifnr,
a.wrbtr,
a.waers,
a.zfbdt,
a.zbd1t,
a.zbd2t,
a.zbd3t,
a.ebeln,
a.ebelp,
a.augbl,
a.augdt,
a.buzei,
v.name1 AS vendor_name,
CASE
WHEN a.zfbdt IS NOT NULL THEN ADD_DAYS(a.zfbdt, COALESCE(a.zbd1t, 0))
ELSE NULL
END AS invoice_due_date
FROM [Schema name].BKPF b
INNER JOIN [Schema name].ACDOCA a
ON a.mandt = b.mandt
AND a.rbukrs = b.bukrs
AND a.belnr = b.belnr
AND a.gjahr = b.gjahr
LEFT JOIN [Schema name].[Vendor master table] v
ON v.[Vendor key field] = a.lifnr
CROSS JOIN params p
WHERE b.bukrs IN ([Company code filter])
AND b.blart IN ([Document type filter])
AND b.cpudt BETWEEN p.start_date AND p.end_date
),
invoice_received AS (
SELECT DISTINCT
CAST(belnr AS NVARCHAR(40)) AS invoice,
'Invoice Received' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(cpudt, 'YYYY-MM-DD') || ' ' || COALESCE(TO_VARCHAR(cputm), '00:00:00')) AS event_time,
CAST(usnam AS NVARCHAR(80)) AS user_name,
bukrs AS company_code,
vendor_name,
wrbtr AS invoice_amount,
waers AS document_currency,
CAST(ebeln AS NVARCHAR(40)) AS purchase_order_number,
invoice_due_date
FROM base_invoice
),
invoice_parked AS (
SELECT
CAST([Parked invoice key field] AS NVARCHAR(40)) AS invoice,
'Invoice Parked' AS activity_name,
[Parked event timestamp field] AS event_time,
CAST([Parked user field] AS NVARCHAR(80)) AS user_name,
[Parked company code field] AS company_code,
[Parked vendor name field] AS vendor_name,
[Parked amount field] AS invoice_amount,
[Parked currency field] AS document_currency,
CAST([Parked purchase order field] AS NVARCHAR(40)) AS purchase_order_number,
[Parked due date field] AS invoice_due_date
FROM [Schema name].[Parked document source]
WHERE [Parked event date field] BETWEEN (SELECT start_date FROM params) AND (SELECT end_date FROM params)
AND [Parked company code field] IN ([Company code filter])
),
purchase_order_matched AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Purchase Order Matched' AS activity_name,
COALESCE([Purchase order match timestamp field], TO_TIMESTAMP(TO_VARCHAR(i.cpudt, 'YYYY-MM-DD') || ' ' || COALESCE(TO_VARCHAR(i.cputm), '00:00:00'))) AS event_time,
CAST(COALESCE([Purchase order match user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrBtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Purchase order match source] m
ON m.[Invoice document key field] = i.belnr
AND m.[Invoice company code field] = i.bukrs
AND m.[Invoice fiscal year field] = i.gjahr
WHERE i.ebeln IS NOT NULL
),
goods_receipt_matched AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Goods Receipt Matched' AS activity_name,
[Goods receipt match timestamp field] AS event_time,
CAST(COALESCE([Goods receipt match user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Goods receipt match source] g
ON g.[Invoice document key field] = i.belnr
AND g.[Invoice company code field] = i.bukrs
AND g.[Invoice fiscal year field] = i.gjahr
WHERE i.ebeln IS NOT NULL
),
invoice_blocked AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Blocked For Payment' AS activity_name,
[Payment block timestamp field] AS event_time,
CAST(COALESCE([Payment block user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment block source] b
ON b.[Invoice document key field] = i.belnr
AND b.[Invoice company code field] = i.bukrs
AND b.[Invoice fiscal year field] = i.gjahr
WHERE [Payment block value field] IS NOT NULL
),
discrepancy_resolved AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Discrepancy Resolved' AS activity_name,
[Payment block removal timestamp field] AS event_time,
CAST(COALESCE([Payment block removal user field], i.usnam) AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment block history source] h
ON h.[Invoice document key field] = i.belnr
AND h.[Invoice company code field] = i.bukrs
AND h.[Invoice fiscal year field] = i.gjahr
WHERE [Previous payment block value field] IS NOT NULL
AND [New payment block value field] IS NULL
),
invoice_routed_for_approval AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Routed For Approval' AS activity_name,
[Workflow routed timestamp field] AS event_time,
CAST([Workflow initiator field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Workflow event source] w
ON w.[Invoice document key field] = i.belnr
AND w.[Invoice company code field] = i.bukrs
AND w.[Invoice fiscal year field] = i.gjahr
WHERE [Workflow event type field] = '[Workflow routed event value]'
),
invoice_approved AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Approved' AS activity_name,
[Workflow approval timestamp field] AS event_time,
CAST([Workflow approver field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Workflow event source] w
ON w.[Invoice document key field] = i.belnr
AND w.[Invoice company code field] = i.bukrs
AND w.[Invoice fiscal year field] = i.gjahr
WHERE [Workflow event type field] = '[Workflow approved event value]'
),
invoice_rejected AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Rejected' AS activity_name,
[Workflow rejection timestamp field] AS event_time,
CAST([Workflow rejector field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Workflow event source] w
ON w.[Invoice document key field] = i.belnr
AND w.[Invoice company code field] = i.bukrs
AND w.[Invoice fiscal year field] = i.gjahr
WHERE [Workflow event type field] = '[Workflow rejected event value]'
),
invoice_posted AS (
SELECT DISTINCT
CAST(belnr AS NVARCHAR(40)) AS invoice,
'Invoice Posted' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(budat, 'YYYY-MM-DD') || ' 00:00:00') AS event_time,
CAST(usnam AS NVARCHAR(80)) AS user_name,
bukrs AS company_code,
vendor_name,
wrbtr AS invoice_amount,
waers AS document_currency,
CAST(ebeln AS NVARCHAR(40)) AS purchase_order_number,
invoice_due_date
FROM base_invoice
WHERE stblg IS NULL
),
payment_proposal_created AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Payment Proposal Created' AS activity_name,
[Payment proposal timestamp field] AS event_time,
CAST([Payment proposal user field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment proposal source] p
ON p.[Invoice document key field] = i.belnr
AND p.[Invoice company code field] = i.bukrs
AND p.[Invoice fiscal year field] = i.gjahr
),
payment_executed AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Payment Executed' AS activity_name,
[Payment execution timestamp field] AS event_time,
CAST([Payment execution user field] AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
INNER JOIN [Schema name].[Payment execution source] p
ON p.[Invoice document key field] = i.belnr
AND p.[Invoice company code field] = i.bukrs
AND p.[Invoice fiscal year field] = i.gjahr
),
invoice_due_date_passed AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Invoice Due Date Passed' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(i.invoice_due_date, 'YYYY-MM-DD') || ' 23:59:59') AS event_time,
CAST(i.usnam AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
WHERE i.invoice_due_date IS NOT NULL
AND TO_TIMESTAMP(TO_VARCHAR(i.invoice_due_date, 'YYYY-MM-DD') || ' 23:59:59') < (SELECT evaluation_ts FROM params)
AND i.augbl IS NULL
),
payment_cleared AS (
SELECT DISTINCT
CAST(i.belnr AS NVARCHAR(40)) AS invoice,
'Payment Cleared' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR(i.augdt, 'YYYY-MM-DD') || ' 00:00:00') AS event_time,
CAST(i.usnam AS NVARCHAR(80)) AS user_name,
i.bukrs AS company_code,
i.vendor_name,
i.wrbtr AS invoice_amount,
i.waers AS document_currency,
CAST(i.ebeln AS NVARCHAR(40)) AS purchase_order_number,
i.invoice_due_date
FROM base_invoice i
WHERE i.augbl IS NOT NULL
AND i.augdt IS NOT NULL
),
invoice_cancelled AS (
SELECT DISTINCT
CAST(belnr AS NVARCHAR(40)) AS invoice,
'Invoice Cancelled' AS activity_name,
TO_TIMESTAMP(TO_VARCHAR([Reversal posting date field], 'YYYY-MM-DD') || ' 00:00:00') AS event_time,
CAST(COALESCE([Reversal user field], usnam) AS NVARCHAR(80)) AS user_name,
bukrs AS company_code,
vendor_name,
wrbtr AS invoice_amount,
waers AS document_currency,
CAST(ebeln AS NVARCHAR(40)) AS purchase_order_number,
invoice_due_date
FROM base_invoice
WHERE stblg IS NOT NULL
),
all_events AS (
SELECT * FROM invoice_received
UNION ALL SELECT * FROM invoice_parked
UNION ALL SELECT * FROM purchase_order_matched
UNION ALL SELECT * FROM goods_receipt_matched
UNION ALL SELECT * FROM invoice_blocked
UNION ALL SELECT * FROM discrepancy_resolved
UNION ALL SELECT * FROM invoice_routed_for_approval
UNION ALL SELECT * FROM invoice_approved
UNION ALL SELECT * FROM invoice_rejected
UNION ALL SELECT * FROM invoice_posted
UNION ALL SELECT * FROM payment_proposal_created
UNION ALL SELECT * FROM payment_executed
UNION ALL SELECT * FROM invoice_due_date_passed
UNION ALL SELECT * FROM payment_cleared
UNION ALL SELECT * FROM invoice_cancelled
)
SELECT
invoice AS "Invoice",
activity_name AS "ActivityName",
event_time AS "EventTime",
'SAP S/4HANA' AS "SourceSystem",
(SELECT extraction_ts FROM params) AS "LastDataUpdate",
user_name AS "UserName",
company_code AS "CompanyCode",
vendor_name AS "VendorName",
invoice_amount AS "InvoiceAmount",
purchase_order_number AS "PurchaseOrderNumber",
invoice_due_date AS "InvoiceDueDate"
FROM all_events
WHERE invoice IS NOT NULL
AND event_time IS NOT NULL
ORDER BY "Invoice", "EventTime", "ActivityName"; Passaggi
- Specifica e progettazione: prima di scrivere il codice, collabori con gli analisti aziendali per confermare le condizioni di attivazione e i campi dati esatti per ciascuna delle 15 attività richieste. Individui le tabelle SAP pertinenti, i tipi di documento (ad esempio, 'KR' e 'RE') e i codici società da includere nell’ambito.
- Creazione del programma ABAP: avvii l’editor ABAP con il codice transazione SE38. Crei un nuovo programma eseguibile, ad esempio Z_PM_AP_INVOICE_EXTRACT. Inserisca un titolo descrittivo e imposti l’applicazione su 'Financial Accounting'.
- Definizione della schermata di selezione: nel programma, definisca una schermata di selezione (utilizzando le parole chiave PARAMETERS e SELECT-OPTIONS) che consenta agli utenti di specificare l’intervallo di date di estrazione (per la data di creazione della fattura), i codici società di destinazione (BUKRS) e i tipi di documento delle fatture pertinenti (BLART). Includa anche un parametro per il percorso del file di output sul server applicativo.
- Dichiarazione dei dati: definisca una struttura di tabella interna conforme al formato finale dell’event log (ad esempio, TY_EVENT_LOG), includendo tutti gli attributi obbligatori e consigliati. Dichiari le tabelle interne per contenere i dati selezionati da diverse tabelle SAP di origine, come BKPF, BSEG, RBKP, RSEG, CDHDR, CDPOS e REGUH.
- Selezione dei dati principali: avvii la logica di estrazione selezionando l’insieme principale delle fatture da RBKP (fatture logistiche) e BKPF (fatture finanziarie), in base ai criteri impostati nella schermata di selezione. Memorizzi le chiavi delle fatture principali in una tabella interna da utilizzare per le successive ricerche dei dati.
- Estrazione sequenziale delle attività: per ogni fattura dell’insieme principale, esegua una serie di selezioni per individuare timestamp e dettagli di ciascuna attività aziendale. Ad esempio, interroghi CDHDR e CDPOS per le modifiche ai blocchi di pagamento, REGUH e REGUP per i dati delle esecuzioni di pagamento e BKPF per i dettagli dei documenti di storno. Aggiunga una nuova riga alla tabella finale dell’event log per ogni attività individuata.
- Logica per gli eventi calcolati: implementi la logica ABAP per le attività non registrate direttamente in un campo di tabella. Per l’evento 'Invoice Due Date Passed', utilizzi la data di scadenza della fattura (BSEG-ZFBDT + termini di pagamento) e la data di compensazione (BSEG-AUGDT). Se la data di compensazione è successiva alla scadenza, crei un nuovo record di evento con timestamp impostato sulla data di scadenza.
- Trasformazione e arricchimento dei dati: durante la raccolta dei dati per ciascuna attività, compili tutti gli attributi richiesti. A tal fine, recuperi i nomi dei fornitori da LFA1, converti date e orari in un’unica stringa timestamp (CONCATENATE...INTO...) e imposti il valore SourceSystem.
- Generazione del file di output: dopo aver elaborato tutte le fatture e le relative attività e averle raccolte nella tabella interna finale, utilizzi le istruzioni OPEN DATASET, LOOP AT ... TRANSFER e CLOSE DATASET per scrivere i dati nel percorso del server applicativo specificato nella schermata di selezione.
- Download e preparazione al caricamento: utilizzi il codice transazione CG3Y per scaricare il file generato dal server applicativo sul computer locale. Si assicuri di salvare il file in formato CSV con codifica UTF-8. Prima di caricarlo nello strumento di Process Mining, verifichi che le intestazioni delle colonne corrispondano agli attributi richiesti (Invoice, ActivityName, EventTime e così via).
Configurazione
- Intervallo di date: definisca l’opzione di selezione P_CPUDT per la data di creazione della fattura (BKPF-CPUDT o RBKP-CPUDT). Per l’analisi iniziale si consiglia un intervallo di dati di 6-12 mesi.
- Codice società (P_BUKRS): parametro SELECT-OPTIONS obbligatorio per filtrare codici società specifici. Si sconsiglia di elaborare contemporaneamente tutti i codici società, salvo assoluta necessità.
- Tipo di documento della fattura (P_BLART): parametro SELECT-OPTIONS per filtrare i tipi di documento pertinenti. Tra i tipi più comuni figurano 'KR' (fattura fornitore), 'KG' (nota di credito fornitore) e 'RE' (verifica fattura logistica).
- Modalità di esecuzione: per volumi di dati elevati, il programma dovrebbe essere eseguito come processo in background (SM36/SM37), così da evitare timeout nella finestra di dialogo. Lo pianifichi fuori dagli orari di punta.
- Percorso del file di output: parametro per specificare il percorso e il nome del file sul server applicativo SAP (ad esempio, nella cartella /tmp/). Il file viene scritto in questo percorso prima del download.
- Prerequisiti: l’utente che esegue il report deve essere autorizzato a leggere le tabelle FI, CO e MM (BKPF, BSEG, RBKP, RSEG, LFA1), le tabelle delle modifiche ai documenti (CDHDR, CDPOS) e le tabelle del flusso di lavoro. È inoltre necessario l’oggetto di autorizzazione S_DATASET per scrivere file sul server applicativo.
Query di esempio abap
*&---------------------------------------------------------------------*
*& Report Z_PM_AP_INVOICE_EXTRACT
*&---------------------------------------------------------------------*
*& This report extracts Accounts Payable invoice lifecycle events for
*& process mining analysis.
*&---------------------------------------------------------------------*
REPORT z_pm_ap_invoice_extract.
*&---------------------------------------------------------------------*
*& Data Structures
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoice TYPE belnr_d,
activityname TYPE string,
eventtime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
username TYPE uname,
companycode TYPE bukrs,
vendorname TYPE name1_gp,
invoiceamount TYPE wrbtr,
purchaseordernumber TYPE ebeln,
invoiceduedate TYPE d,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gv_system_id TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs OBLIGATORY,
s_cpudt FOR bkpf-cpudt OBLIGATORY DEFAULT sy-datum,
s_blart FOR bkpf-blart.
PARAMETERS: p_fpath TYPE string OBLIGATORY DEFAULT '/tmp/ap_extract.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" Get System ID and Update Timestamp
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_system_id
EXCEPTIONS
own_logical_system_not_defined = 1
OTHERS = 2.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
" Internal tables for SAP data
DATA: lt_bkpf TYPE TABLE OF bkpf,
lt_rbkp TYPE TABLE OF rbkp.
" Select base documents
SELECT * FROM bkpf INTO TABLE lt_bkpf
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND blart IN s_blart
AND ( blart = 'KR' OR blart = 'KG' ). " Example FI Invoice Types
SELECT * FROM rbkp INTO TABLE lt_rbkp
WHERE bukrs IN s_bukrs
AND cpudt IN s_cpudt
AND blart IN s_blart
AND blart = 'RE'. " Example MM Invoice Type
" --- Process each invoice document ---
LOOP AT lt_bkpf ASSIGNING FIELD-SYMBOL(<fs_bkpf>).
PERFORM process_invoice USING <fs_bkpf>.
ENDLOOP.
LOOP AT lt_rbkp ASSIGNING FIELD-SYMBOL(<fs_rbkp>).
PERFORM process_mm_invoice USING <fs_rbkp>.
ENDLOOP.
" Write output to file
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form PROCESS_INVOICE (Handles FI Invoices)
*&---------------------------------------------------------------------*
FORM process_invoice USING iv_bkpf TYPE bkpf.
DATA: ls_bseg TYPE bseg,
ls_lfa1 TYPE lfa1,
ld_due_date TYPE d.
DATA: ls_event TYPE ty_event_log.
" Get Vendor and other details from first line item
SELECT SINGLE * FROM bseg INTO ls_bseg
WHERE bukrs = iv_bkpf-bukrs
AND belnr = iv_bkpf-belnr
AND gjahr = iv_bkpf-gjahr
AND koart = 'K'.
IF sy-subrc = 0.
SELECT SINGLE name1 FROM lfa1 INTO ls_lfa1-name1 WHERE lifnr = ls_bseg-lifnr.
CALL FUNCTION 'DETERMINE_DUE_DATE'
EXPORTING
i_zfbdt = ls_bseg-zfbdt
i_zbd1t = ls_bseg-zbd1t
i_zbd2t = ls_bseg-zbd2t
i_zbd3t = ls_bseg-zbd3t
i_zbd1p = ls_bseg-zbd1p
i_zbd2p = ls_bseg-zbd2p
i_zterm = ls_bseg-zterm
IMPORTING
e_faedt = ld_due_date.
ENDIF.
" Helper function to populate common fields
MACRO set_common_fields.
ls_event-invoice = iv_bkpf-belnr.
ls_event-sourcesystem = gv_system_id.
ls_event-lastdataupdate = gv_last_update.
ls_event-companycode = iv_bkpf-bukrs.
ls_event-vendorname = ls_lfa1-name1.
ls_event-invoiceduedate = ld_due_date.
SELECT SINGLE wrbtr FROM bseg INTO ls_event-invoiceamount WHERE belnr = iv_bkpf-belnr AND gjahr = iv_bkpf-gjahr AND koart = 'K'.
ENDMACRO.
" 1. Invoice Received
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Received'.
CONCATENATE iv_bkpf-cpudt iv_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
" 2. Invoice Parked (if document was created as parked)
IF iv_bkpf-bstat = 'V'.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Parked'.
CONCATENATE iv_bkpf-cpudt iv_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
" 10. Invoice Posted (For non-parked, same as received. For parked, this needs CDHDR/CDPOS logic not shown for brevity)
IF iv_bkpf-bstat <> 'V'.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Posted'.
CONCATENATE iv_bkpf-budat iv_bkpf-cputm INTO ls_event-eventtime. " Using posting date
ls_event-username = iv_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
" 5. & 7. Invoice Blocked / Discrepancy Resolved from Change Docs
DATA: lt_cdhdr TYPE TABLE OF cdhdr, lt_cdpos TYPE TABLE OF cdpos.
DATA(ld_objectkey) = |{ iv_bkpf-bukrs }{ iv_bkpf-belnr }{ iv_bkpf-gjahr }|.
SELECT * FROM cdhdr INTO TABLE lt_cdhdr WHERE objectclas = 'BELEG' AND objectid = ld_objectkey.
IF sy-subrc = 0.
SELECT * FROM cdpos INTO TABLE lt_cdpos FOR ALL ENTRIES IN lt_cdhdr
WHERE changenr = lt_cdhdr-changenr AND tabname = 'BSEG' AND fname = 'ZLSPR'.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>).
READ TABLE lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>) WITH KEY changenr = <fs_cdpos>-changenr.
IF sy-subrc = 0.
CLEAR ls_event.
set_common_fields.
IF <fs_cdpos>-value_new IS NOT INITIAL AND <fs_cdpos>-value_old IS INITIAL.
ls_event-activityname = 'Invoice Blocked For Payment'.
ELSEIF <fs_cdpos>-value_new IS INITIAL AND <fs_cdpos>-value_old IS NOT INITIAL.
ls_event-activityname = 'Discrepancy Resolved'.
ELSE.
CONTINUE.
ENDIF.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO ls_event-eventtime.
ls_event-username = <fs_cdhdr>-username.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDIF.
" 6. 8. 9. Workflow Events (Routed, Approved, Rejected) - Simplified Example
" This requires knowledge of specific workflow templates. Placeholder logic:
" SELECT ... FROM SWW_WI2OBJ ... WHERE INSTID = [Invoice Object]
" SELECT ... FROM SWWWIHEAD ... to get status and times
" 11. & 12. & 14. Payment Proposal, Executed, Cleared
IF ls_bseg-augbl IS NOT INITIAL.
DATA: ls_regup TYPE regup.
SELECT SINGLE * FROM regup INTO ls_regup WHERE vblnr = ls_bseg-belnr.
IF sy-subrc = 0.
DATA(ld_rundate) = ls_regup-laufd.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Proposal Created'.
CONCATENATE ld_rundate '000000' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Executed'.
CONCATENATE ls_bseg-augdt '120000' INTO ls_event-eventtime. " Using clearing date as proxy
APPEND ls_event TO gt_event_log.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Payment Cleared'.
CONCATENATE ls_bseg-augdt '120001' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
" 13. Invoice Due Date Passed (Calculated)
IF ls_bseg-augdt IS NOT INITIAL AND ld_due_date IS NOT INITIAL.
IF ls_bseg-augdt > ld_due_date.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Due Date Passed'.
CONCATENATE ld_due_date '235959' INTO ls_event-eventtime.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDIF.
" 15. Invoice Cancelled
IF iv_bkpf-stblg IS NOT INITIAL.
DATA: ls_rev_bkpf TYPE bkpf.
SELECT SINGLE * FROM bkpf INTO ls_rev_bkpf WHERE belnr = iv_bkpf-stblg.
IF sy-subrc = 0.
CLEAR ls_event.
set_common_fields.
ls_event-activityname = 'Invoice Cancelled'.
CONCATENATE ls_rev_bkpf-cpudt ls_rev_bkpf-cputm INTO ls_event-eventtime.
ls_event-username = ls_rev_bkpf-usnam.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROCESS_MM_INVOICE (Handles MM/Logistics Invoices)
*&---------------------------------------------------------------------*
FORM process_mm_invoice USING iv_rbkp TYPE rbkp.
" This form would be similar to PROCESS_INVOICE, but starts with RBKP.
" It needs to find the corresponding FI document in BKPF via AWKEY.
" The logic for PO/GR Matched would be included here.
" For demonstration, creating placeholder events for MM-specific activities.
DATA: ls_event TYPE ty_event_log.
ls_event-invoice = iv_rbkp-belnr.
ls_event-sourcesystem = gv_system_id.
ls_event-lastdataupdate = gv_last_update.
ls_event-companycode = iv_rbkp-bukrs.
" 1. Invoice Received (MM)
ls_event-activityname = 'Invoice Received'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" 3. Purchase Order Matched (Implicit)
ls_event-activityname = 'Purchase Order Matched'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" 4. Goods Receipt Matched (Implicit)
ls_event-activityname = 'Goods Receipt Matched'.
CONCATENATE iv_rbkp-cpudt iv_rbkp-cputm INTO ls_event-eventtime.
ls_event-username = iv_rbkp-usnam.
APPEND ls_event TO gt_event_log.
" NOTE: The rest of the events (Block, Pay, etc.) would be found by linking
" RBKP to BKPF and then reusing the logic from PROCESS_INVOICE.
" Link: BKPF-AWKEY = CONCATENATE( RBKP-BELNR, RBKP-GJAHR ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form WRITE_OUTPUT_FILE
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lv_string TYPE string.
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'Invoice,ActivityName,EventTime,SourceSystem,LastDataUpdate,UserName,CompanyCode,VendorName,InvoiceAmount,PurchaseOrderNumber,InvoiceDueDate'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
" Create a comma-separated string, handling potential commas in data
CONCATENATE <fs_event>-invoice
<fs_event>-activityname
<fs_event>-eventtime
<fs_event>-sourcesystem
<fs_event>-lastdataupdate
<fs_event>-username
<fs_event>-companycode
<fs_event>-vendorname
<fs_event>-invoiceamount
<fs_event>-purchaseordernumber
<fs_event>-invoiceduedate
INTO lv_string SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: / 'Extraction complete. File written to:', p_fpath.
ENDFORM. È pronto a iniziare?
Utilizzi questo template per avviare il Suo progetto di Process Mining e ottenere importanti miglioramenti nell’elaborazione delle fatture fornitori. Inizi oggi il percorso verso un processo più efficiente e snello.
Eviti le penali per i ritardi: migliori oggi l’elaborazione delle fatture fornitori
Riduca i costi di elaborazione del 60% ed elimini facilmente i pagamenti duplicati.
Non è richiesta la carta di credito: può iniziare in pochi minuti.