Il Suo template dei dati per Purchase to Pay - Ordine di acquisto
Il Suo template dei dati per Purchase to Pay - Ordine di acquisto
- Attributi consigliati per un’analisi dettagliata
- Attività principali da monitorare nel processo
- Istruzioni dettagliate per l’estrazione dei dati
Attributi del processo Purchase to Pay - Ordine di acquisto
| Nome | Descrizione | ||
|---|---|---|---|
| Attività ActivityName | Nome dell’evento o della fase aziendale che si è verificata nel processo dell’ordine di acquisto. | ||
| Descrizione Questo attributo descrive un’azione specifica o una modifica di stato nel ciclo di vita dell’ordine di acquisto, ad esempio «Ordine di acquisto creato», «Ordine di acquisto approvato» o «Entrata merci registrata». La sequenza di queste attività costituisce il flusso del processo. L’analisi della sequenza e della frequenza delle attività è alla base del Process Mining. Consente di individuare il processo effettivo, confrontarlo con il modello progettato, rilevare i colli di bottiglia, ad esempio lunghe attese dopo «Fattura ricevuta», e quantificare le rilavorazioni, come le ripetute attività «Ordine di acquisto modificato». Perché è importante Definisce le fasi del processo e consente di rappresentare e analizzare il flusso dall’inizio alla fine, le varianti e i colli di bottiglia. Dove reperirli In genere deriva dalla combinazione di tabelle e campi, come i campi di stato in EKKO/EKPO o i log dei documenti di modifica in CDHDR/CDPOS, per rappresentare le tappe aziendali principali. Esempi Ordine di acquisto creatoOrdine di acquisto approvatoEntrata merci registrataFattura ricevuta | |||
| Ora dell’evento EventTime | Marca temporale che indica quando si è verificata l’attività. | ||
| Descrizione Questo attributo registra la data e l’ora esatte di ogni attività del processo. È fondamentale per tutte le analisi temporali di Process Mining. L’ora dell’evento serve a ordinare cronologicamente le attività e ricostruire il flusso del processo. Inoltre, è la base per calcolare tutte le metriche di durata, come i tempi di ciclo tra le attività, i tempi di attesa e i tempi di elaborazione, essenziali per analizzare le prestazioni e individuare i colli di bottiglia. Perché è importante Questa marca temporale è fondamentale per ordinare correttamente gli eventi e calcolare tutte le metriche di prestazione, compresi i tempi di ciclo, i tempi di attraversamento e i tempi di attesa. Dove reperirli Campi di data e ora associati ad attività specifiche, come la data di creazione (EKKO-AEDAT per le modifiche) o la data di registrazione (MKPF-BUDAT per le entrate merci). Spesso è necessario combinare dati provenienti da più tabelle. Esempi 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Ordine di acquisto PurchaseOrderNumber | Identificativo univoco dell’ordine di acquisto (PO), utilizzato come ID del caso principale per monitorare il ciclo di approvvigionamento. | ||
| Descrizione Il numero dell’ordine di acquisto è l’identificativo centrale che collega tutte le attività correlate, dalla creazione iniziale fino all’entrata merci e al completamento. Funge da identificativo del caso per l’analisi di Process Mining. Raggruppando gli eventi in base a questo numero, è possibile ricostruire il percorso di ogni singolo ordine di acquisto. Questo è essenziale per calcolare i tempi di ciclo, analizzare le varianti di processo e individuare colli di bottiglia o deviazioni specifici di un singolo ordine. Perché è importante È la chiave essenziale per collegare tutti gli eventi di approvvigionamento in un unico processo dall’inizio alla fine e analizzare nel dettaglio il ciclo di vita di ogni ordine di acquisto. Dove reperirli Questo attributo si trova nella tabella EKKO di SAP S/4HANA, nel campo EBELN. Esempi 450001712345000171244500017125 | |||
| Sistema di origine SourceSystem | Identifica il sistema di origine da cui sono stati estratti i dati. | ||
| Descrizione Questo attributo specifica il sistema di origine dei dati degli eventi, ad esempio «SAP S/4HANA Produzione» o «SAP ECC». Negli ambienti con più sistemi, questo campo è fondamentale per la tracciabilità dei dati, la risoluzione dei problemi e la corretta interpretazione dei dati provenienti da fonti diverse. Aiuta a comprendere il contesto dei dati e consente di filtrare l’analisi in base a specifici ambienti di sistema. Perché è importante Fornisce informazioni essenziali sull’origine dei dati, fondamentali per la governance, la convalida e l’analisi dei dati in ambienti con più sistemi. Dove reperirli In genere è un valore statico aggiunto durante il processo di estrazione, trasformazione e caricamento dei dati (ETL) per indicare l’origine del set di dati. Esempi S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Marca temporale dell’ultimo aggiornamento o dell’ultima estrazione dei dati dal sistema di origine. | ||
| Descrizione Questo attributo indica quanto sono aggiornati i dati analizzati. Riporta la data e l’ora dell’estrazione più recente da SAP S/4HANA. Conoscere l’ora dell’ultimo aggiornamento dei dati è fondamentale per valutarne l’attualità e interpretare correttamente i risultati. Consente di capire se si stanno consultando informazioni in tempo reale o un’istantanea riferita a un momento specifico, un aspetto che incide sulla pertinenza delle azioni intraprese sulla base dell’analisi. Perché è importante Informa gli utenti sull’attualità dei dati, aiutandoli a comprendere il contesto e la pertinenza dei risultati dell’analisi. Dove reperirli È una marca temporale di metadati aggiunta durante il processo di estrazione, trasformazione e caricamento dei dati (ETL). Esempi 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Data di consegna richiesta RequestedDeliveryDate | Data entro cui l’azienda ha richiesto al fornitore di consegnare i beni o i servizi. | ||
| Descrizione Questo attributo indica la data di consegna prevista e concordata nell’ordine di acquisto. Costituisce la base di riferimento per misurare le prestazioni di consegna del fornitore. Nel Process Mining, questa data viene confrontata con la data effettiva di entrata merci, ossia la marca temporale di «Entrata merci registrata», per calcolare l’indicatore chiave di prestazione «Tasso di puntualità delle consegne dei fornitori». Analizzare gli scostamenti da questa data aiuta a valutare l’affidabilità del fornitore e a gestire i rischi della catena di approvvigionamento. Perché è importante Costituisce la base di riferimento per misurare la puntualità delle consegne dei fornitori, un indicatore chiave di prestazione fondamentale per la gestione della catena di approvvigionamento e la pianificazione operativa. Dove reperirli Si trova nella tabella delle righe di schedulazione EKET, nel campo EINDT. Esempi 2023-06-012023-06-152023-07-01 | |||
| ID fornitore VendorId | Identificativo univoco del fornitore che fornisce i beni o i servizi. | ||
| Descrizione L’ID fornitore è un dato anagrafico fondamentale che collega un ordine di acquisto a un fornitore specifico. Viene utilizzato in tutto il processo di approvvigionamento per le comunicazioni, le consegne e i pagamenti. Nel Process Mining, questo attributo consente di segmentare l’analisi delle prestazioni per fornitore. È essenziale per Dashboard come «Prestazioni dei tempi di attraversamento dei fornitori» e «Tasso di reso delle merci per fornitore» e aiuta a individuare i fornitori più affidabili e quelli che potrebbero causare ritardi o problemi di qualità. Perché è importante Consente di analizzare le prestazioni per fornitore, valutare i risultati, individuare i fornitori con prestazioni migliori o peggiori e ottimizzare la catena di approvvigionamento. Dove reperirli Questo attributo si trova nella tabella EKKO di SAP S/4HANA, nel campo LIFNR. Esempi 100023100045100088 | |||
| Importo netto totale TotalNetAmount | Valore totale dell’ordine di acquisto, al netto di imposte e costi di trasporto. | ||
| Descrizione Questo attributo rappresenta il valore monetario netto dell’ordine di acquisto. È un dato finanziario fondamentale che indica l’entità della transazione di approvvigionamento. Questo importo è essenziale per le analisi finanziarie, ad esempio per classificare gli ordini in base al valore, alto o basso, e verificare se seguono percorsi di processo diversi. Può inoltre servire a stabilire le priorità dell’analisi, concentrandosi sugli ordini di valore elevato, che possono comportare maggiori rischi finanziari o avere un impatto più significativo sull’attività. Perché è importante Consente di analizzare i dati dal punto di vista finanziario, segmentare gli ordini di acquisto in base al valore e dare priorità agli interventi di miglioramento dei processi nelle aree con le spese più elevate. Dove reperirli Questo attributo si trova nella tabella EKKO di SAP S/4HANA, nel campo NETWR. Esempi 1500.0025000.50125.75 | |||
| Richiesta di acquisto PurchaseRequisitionNumber | Identificativo della richiesta di acquisto (PR) da cui ha avuto origine l’ordine di acquisto. | ||
| Descrizione Questo attributo collega l’ordine di acquisto alla richiesta da cui ha avuto origine. Gli ordini creati direttamente potrebbero non essere associati a una richiesta. Questo collegamento è essenziale per analizzare l’intero processo di approvvigionamento dall’inizio, a partire dalla richiesta iniziale. Supporta indicatori chiave di prestazione come «Tempo di approvazione della richiesta di acquisto» ed è fondamentale per individuare gli acquisti fuori procedura, ovvero gli ordini creati senza una richiesta precedente e approvata. Perché è importante Collega l’ordine di acquisto alla richiesta iniziale, consentendo l’analisi del processo dall’inizio alla fine e l’individuazione degli acquisti fuori procedura non conformi. Dove reperirli Questo attributo si trova nella tabella EKPO di SAP S/4HANA, a livello di posizione dell’ordine di acquisto, nel campo BANFN. Esempi 1001005110010052 | |||
| Tipo di documento dell’ordine di acquisto DocumentType | Classificazione che distingue i diversi tipi di ordini di acquisto, ad esempio ordini standard, ordini di servizi o ordini di trasferimento delle scorte. | ||
| Descrizione Il tipo di documento è un elemento chiave della configurazione SAP che determina il flusso del processo, l’intervallo di numerazione e i campi dell’ordine di acquisto. Consente alle aziende di adattare il processo di approvvigionamento a scenari diversi. Analizzare il processo in base al tipo di documento è fondamentale per comprendere le variazioni. Ad esempio, il processo di un ordine standard di beni può differire notevolmente da quello di un ordine di servizi o di trasferimento delle scorte. Questo attributo consente di filtrare e confrontare i diversi flussi di processo per individuare opportunità di miglioramento specifiche. Perché è importante Classifica gli ordini di acquisto, consentendo di confrontare i diversi processi di approvvigionamento e aiutando a spiegare le variazioni nei flussi di processo e nei tempi di ciclo. Dove reperirli Questo attributo si trova nella tabella EKKO di SAP S/4HANA, nel campo BSART. Esempi NBFOUB | |||
| Utente UserName | Identificativo dell’utente che ha eseguito una specifica attività. | ||
| Descrizione Questo attributo registra l’ID utente SAP responsabile della creazione, della modifica o dell’approvazione di un documento. Consente di tracciare le azioni eseguite nel sistema. L’analisi per utente aiuta a individuare esigenze di formazione, distribuire i carichi di lavoro e valutare le prestazioni individuali. Ad esempio, consente di verificare se determinati utenti sono associati con regolarità a tempi di approvazione lunghi o a frequenti modifiche successive all’approvazione, fornendo indicazioni utili per la gestione delle risorse e il miglioramento dei processi. Perché è importante Consente di attribuire le responsabilità e analizzare le prestazioni a livello individuale o di team, aiutando a individuare opportunità di formazione o vincoli legati alle risorse. Dove reperirli Queste informazioni si trovano in campi come ERNAM (Creato da) in EKKO o nel campo utente delle tabelle dei documenti di modifica (CDHDR-USERNAME). Esempi CB9980000012JSMITHRROE | |||
| Categoria posizione ItemCategory | Classifica una posizione dell’ordine di acquisto, ad esempio come standard, in conto deposito, in subappalto o relativa a un servizio. | ||
| Descrizione La categoria della posizione determina le modalità di gestione ed elaborazione dell’approvvigionamento di uno specifico materiale o servizio. Influisce sulle fasi successive, come l’entrata merci e la verifica della fattura. Questo attributo è importante per analizzare le varianti di processo in base a ciò che viene acquistato. Ad esempio, il processo per una posizione di servizio, che richiede un foglio entrata servizi, differisce notevolmente da quello per una posizione standard di magazzino. L’analisi per categoria della posizione aiuta a spiegare queste differenze e a definire interventi mirati per migliorare il processo. Perché è importante Descrive le varianti del processo distinguendo tra i diversi tipi di approvvigionamento, ad esempio beni, servizi o subappalti. Dove reperirli Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo PSTYP. Esempi 093 | |||
| Consegna puntuale del fornitore SupplierOnTimeDelivery | Indicatore calcolato che segnala se la registrazione della ricezione dei beni è avvenuta entro la data di consegna richiesta. | ||
| Descrizione Questo attributo booleano viene calcolato confrontando la data e l’ora dell’attività 'Ricezione dei beni registrata' con la 'Data di consegna richiesta'. Se la ricezione avviene entro la data richiesta, l’indicatore assume il valore 'true'. Questo attributo alimenta direttamente il KPI 'Tasso di consegne puntuali dei fornitori'. Semplifica l’analisi consentendo di filtrare facilmente le consegne puntuali o in ritardo, un aspetto essenziale per le Dashboard sulle prestazioni dei fornitori e per la valutazione dei fornitori. Perché è importante Misura direttamente l’affidabilità dei fornitori, costituisce la base del KPI sulle consegne puntuali e consente una gestione efficace delle loro prestazioni. Dove reperirli Calcolato confrontando la data e l’ora dell’attività 'Ricezione dei beni registrata' con l’attributo 'RequestedDeliveryDate'. Esempi truefalse | |||
| È un acquisto non autorizzato IsMaverickSpend | Indicatore calcolato che segnala se un ordine di acquisto è stato creato senza una richiesta di acquisto approvata in precedenza. | ||
| Descrizione Questo indicatore booleano viene calcolato durante l’elaborazione dei dati. Assume il valore 'true' se all’ordine di acquisto non è associata una richiesta di acquisto oppure se la creazione dell’ordine non segue il flusso di lavoro standard di approvazione. Questo attributo alimenta direttamente la Dashboard 'Individuazione degli acquisti non autorizzati' e i relativi KPI. Aiuta a quantificare l’entità degli acquisti non conformi, consentendo alle aziende di intervenire su reparti o gruppi di utenti specifici per rafforzare le politiche e i controlli sugli approvvigionamenti. Perché è importante Individua direttamente gli acquisti non conformi, aiutando a quantificare le deviazioni dal processo e a far rispettare i controlli finanziari e le politiche di approvvigionamento. Dove reperirli Campo calcolato in base all’assenza di un valore in 'PurchaseRequisitionNumber' per determinati tipi di documento oppure all’analisi della sequenza degli eventi. Esempi truefalse | |||
| È una rilavorazione IsRework | Indicatore calcolato che segnala se l’ordine di acquisto ha richiesto una rilavorazione, ad esempio una modifica successiva all’approvazione o un reso di beni. | ||
| Descrizione Questo attributo booleano viene calcolato analizzando la sequenza delle attività di ciascun ordine di acquisto. Assume il valore 'true' se l’evento 'Ordine di acquisto modificato' si verifica dopo l’evento 'Ordine di acquisto approvato' oppure se è presente l’evento 'Beni resi'. L’indicatore semplifica il calcolo del KPI 'Tasso di elaborazione senza interventi'. Consente di filtrare e visualizzare facilmente tutti gli ordini di acquisto che hanno richiesto un intervento manuale o una correzione, aiutando a quantificare il costo e la frequenza delle rilavorazioni. Perché è importante Aiuta a quantificare le inefficienze del processo segnalando i casi che hanno richiesto una rilavorazione, un dato essenziale per calcolare il tasso di elaborazione senza interventi e individuare le cause profonde delle deviazioni. Dove reperirli Campo calcolato in base alla sequenza delle attività. La logica verifica se l’evento 'Ordine di acquisto modificato' si verifica dopo un’approvazione o se è presente l’evento 'Beni resi'. Esempi truefalse | |||
| Gruppo acquisti PurchasingGroup | Gruppo specifico di acquirenti responsabile di determinate attività di approvvigionamento. | ||
| Descrizione Un gruppo acquisti è costituito da uno o più acquirenti responsabili di specifiche attività di acquisto, materiali o fornitori. È il principale punto di contatto per i fornitori. Questo attributo permette di analizzare il carico di lavoro e i risultati con un livello di dettaglio maggiore rispetto all’organizzazione acquisti. Può servire a individuare team sovraccarichi, misurare l’efficienza dei diversi gruppi di acquirenti e capire quali siano più esposti a deviazioni dal processo, come gli acquisti non autorizzati. Perché è importante Offre una visione dettagliata dei risultati dei gruppi di acquirenti e consente di analizzare carico di lavoro, efficienza e rispetto del processo a livello di team. Dove reperirli Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EKGRP. Esempi 001002N00 | |||
| Numero materiale MaterialNumber | Identificativo del materiale o del bene specifico oggetto dell’approvvigionamento. | ||
| Descrizione In SAP, il numero materiale è un codice univoco assegnato a ogni record dell’anagrafica materiali. Viene utilizzato per tutte le transazioni relative al materiale, inclusi approvvigionamento, gestione delle scorte e vendite. L’analisi per numero o gruppo di materiali consente di esaminare gli acquisti per categoria merceologica. Aiuta a individuare i processi di approvvigionamento relativi a determinati materiali che risultano meno efficienti, hanno tempi di attraversamento più lunghi o sono più soggetti a resi, fornendo indicazioni utili per la gestione delle categorie. Perché è importante Consente di analizzare gli acquisti per categoria merceologica e di individuare problemi di processo o criticità nelle prestazioni dei fornitori legati a prodotti o materiali specifici. Dove reperirli Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo MATNR. Esempi RM100-100FG210SERV-CONSULT | |||
| Organizzazione acquisti PurchasingOrganization | Unità organizzativa responsabile dell’acquisto di materiali e servizi e della negoziazione con i fornitori. | ||
| Descrizione L’organizzazione acquisti è un’unità organizzativa fondamentale per gli approvvigionamenti. Può essere strutturata a livello di gruppo, società o stabilimento ed è responsabile di tutte le attività di acquisto. L’analisi del processo per organizzazione acquisti aiuta a valutare l’efficienza e i risultati dei diversi team o delle diverse aree geografiche. Può mettere in luce differenze nelle negoziazioni con i fornitori, nella conformità ai processi o nei tempi di approvazione tra le unità organizzative. Perché è importante Consente di confrontare i risultati dei diversi reparti acquisti o delle diverse aree geografiche, aiutando a individuare le buone pratiche e gli aspetti da migliorare. Dove reperirli Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EKORG. Esempi 10101710US01 | |||
| Società CompanyCode | Identificativo della persona giuridica o della società per cui viene creato l’ordine di acquisto. | ||
| Descrizione La società rappresenta un’unità contabile indipendente all’interno di un’organizzazione. Tutte le transazioni finanziarie relative a un ordine di acquisto vengono registrate presso una specifica società. È un attributo organizzativo fondamentale, che consente di filtrare e confrontare i processi di approvvigionamento tra diverse persone giuridiche. L’analisi per società può far emergere incoerenze nell’esecuzione dei processi, differenze di efficienza o livelli di conformità diversi all’interno dell’organizzazione. Perché è importante Consente di segmentare l’analisi dei processi per persona giuridica e di confrontare prestazioni e conformità tra le diverse aree aziendali. Dove reperirli Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo BUKRS. Esempi 101017102000 | |||
| Stabilimento Plant | Sede operativa o luogo in cui vengono consegnati i beni o prestati i servizi. | ||
| Descrizione In SAP, uno stabilimento è un luogo fisico in cui si producono o si immagazzinano beni oppure si prestano servizi. È un elemento fondamentale per la logistica e la pianificazione. Segmentare l’analisi dei processi per stabilimento può far emergere differenze regionali o specifiche di una sede nel processo di approvvigionamento. Ad esempio, può mostrare se alcuni stabilimenti registrano tempi di consegna più lunghi o un numero maggiore di resi, segnalando possibili problemi locali di logistica o controllo qualità. Perché è importante Consente di analizzare i processi in base alla sede e di mettere in evidenza le differenze nei risultati tra stabilimenti, sedi operative o magazzini. Dove reperirli Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo WERKS. Esempi 10101710DE01 | |||
Attività del processo Purchase to Pay - Ordine di acquisto
| Attività | Descrizione | ||
|---|---|---|---|
| Entrata merci registrata | Indica la ricezione fisica dei beni dal fornitore e la relativa registrazione nel sistema. È una transazione esplicita che aggiorna la cronologia dell’ordine di acquisto. | ||
| Perché è importante È una tappa importante che conclude il tempo di attraversamento del fornitore e dà inizio alla verifica interna delle fatture. È essenziale per monitorare la puntualità delle consegne. Dove reperirli Registrata come documento materiale nelle tabelle MKPF (testata) e MSEG (posizione) e collegata alla cronologia dell’ordine di acquisto nella tabella EKBE tramite un tipo di movimento specifico, ad esempio 101. Acquisizione Data di registrazione (BUDAT) della testata del documento materiale (MKPF), collegata tramite EKBE. Tipo di evento explicit | |||
| Fattura ricevuta | Indica l’inserimento nel sistema SAP della fattura del fornitore e il suo collegamento al relativo ordine di acquisto. È una registrazione contabile esplicita che crea un documento contabile. | ||
| Perché è importante È una tappa fondamentale che collega il processo di approvvigionamento a quello dei debiti verso fornitori. Consente di analizzare il tempo che intercorre tra l’entrata merci e l’elaborazione della fattura. Dove reperirli Viene creato un documento contabile nella tabella BKPF (testata); le relative posizioni si trovano in BSEG o nel libro giornale universale ACDOCA. Il documento è collegato all’ordine di acquisto nella tabella RSEG. Acquisizione Data di inserimento del documento (CPUDT) nella tabella di testata dei documenti contabili BKPF. Tipo di evento explicit | |||
| Ordine di acquisto approvato | Indica che l’ordine di acquisto ha ricevuto tutte le approvazioni interne necessarie ed è autorizzato per l’invio al fornitore. L’evento si deduce da una modifica dello stato nella strategia di rilascio dell’ordine. | ||
| Perché è importante È una tappa fondamentale per misurare l’efficienza delle approvazioni e le rilavorazioni successive. Analizzare il tempo tra la creazione e l’approvazione dell’ordine evidenzia i ritardi nei processi interni. Dove reperirli Si deduce dall’indicatore di rilascio (FRGKE) nella tabella EKKO. La marca temporale si determina consultando la cronologia delle modifiche (CDHDR/CDPOS) per individuare quando il campo è stato aggiornato allo stato «rilasciato». Acquisizione Si deduce dai log delle modifiche al campo dell’indicatore di rilascio (FRGKE) nella tabella EKKO. Tipo di evento inferred | |||
| Ordine di acquisto completato | Questa attività indica che una posizione dell’ordine di acquisto è considerata chiusa dal punto di vista logistico. Si deduce quando sono impostati sia l’indicatore «Consegna completata» sia quello «Fattura finale». | ||
| Perché è importante Rappresenta il punto finale per l’analisi del ciclo di vita dell’ordine di acquisto. Misurare il tempo necessario per raggiungere questo evento consente di calcolare il tempo di ciclo complessivo delle operazioni di approvvigionamento. Dove reperirli Si deduce dagli indicatori di stato della tabella delle posizioni dell’ordine di acquisto EKPO. L’evento si verifica quando sono impostati su true sia l’indicatore «Consegna completata» (ELIKZ) sia l’indicatore «Fattura finale» (EREKZ). Acquisizione Si deduce dai log delle modifiche quando i campi ELIKZ ed EREKZ della tabella EKPO risultano entrambi contrassegnati come completati. Tipo di evento inferred | |||
| Ordine di acquisto creato | Segna la creazione del documento ufficiale dell’ordine di acquisto, che può essere creato con o senza riferimento a una richiesta di acquisto. È un evento esplicito, registrato quando il documento dell’ordine viene salvato per la prima volta nel sistema. | ||
| Perché è importante Questa attività può rappresentare un punto di partenza alternativo per il processo, soprattutto nell’analisi degli acquisti fuori procedura. È un evento fondamentale per misurare il tempo complessivo di elaborazione dell’ordine di acquisto. Dove reperirli Registrato nella tabella di testata degli ordini di acquisto EKKO. La data di creazione (AEDAT) e l’ora del documento sono memorizzate direttamente in questa tabella. Acquisizione Marca temporale di creazione (AEDAT) del documento dell’ordine di acquisto nella tabella EKKO. Tipo di evento explicit | |||
| Richiesta di acquisto approvata | Indica l’approvazione formale di una richiesta di acquisto da parte di un responsabile o di un approvatore designato. In genere si deduce da una modifica dello stato del documento di richiesta, che segnala che è pronto per essere convertito in un ordine di acquisto. | ||
| Perché è importante È una tappa fondamentale per misurare i tempi del ciclo di approvazione e individuare i colli di bottiglia. I ritardi in questa fase incidono direttamente sulla rapidità con cui l’ordine di acquisto può essere creato e inviato al fornitore. Dove reperirli Si deduce dai campi relativi allo stato di rilascio nella tabella EBAN, ad esempio FRGZU, indicatore di rilascio. La marca temporale deriva dai documenti di modifica (CDHDR/CDPOS), che registrano quando è stato impostato lo stato di rilascio finale. Acquisizione Si deduce dai log delle modifiche (CDHDR/CDPOS) dei campi relativi allo stato di rilascio nella tabella EBAN. Tipo di evento inferred | |||
| Richiesta di acquisto creata | Questa attività segna la richiesta formale di beni o servizi e dà inizio al processo di approvvigionamento. L’evento viene registrato esplicitamente quando un utente salva un nuovo documento di richiesta di acquisto, ad esempio tramite la transazione ME51N. | ||
| Perché è importante È il punto di partenza principale per molti cicli di vita degli ordini di acquisto. Analizzare il tempo che intercorre tra questo evento e la creazione dell’ordine aiuta a individuare ritardi nell’approvvigionamento e nell’elaborazione interna. Dove reperirli Registrato nella tabella EBAN (richiesta di acquisto). La marca temporale dell’evento di creazione si trova nelle tabelle della cronologia delle modifiche CDHDR e CDPOS per l’oggetto EBAN. Acquisizione Evento registrato alla creazione di un documento nella tabella EBAN. Tipo di evento explicit | |||
| Conferma del servizio inserita | Questa attività segna la conferma dell’erogazione di un servizio specificato in un ordine di acquisto. Viene registrata esplicitamente con la creazione di un foglio entrata servizi. | ||
| Perché è importante Per gli acquisti di servizi, equivale a un’entrata merci. È essenziale per monitorare i tempi di erogazione del servizio e consentire pagamenti puntuali ai fornitori. Dove reperirli Registrata tramite la creazione di un foglio entrata servizi, con i dati memorizzati nelle tabelle ESSR (testata) ed ESLL (righe). La data di creazione funge da marca temporale. Acquisizione Data di creazione del documento Foglio entrata servizi nella tabella ESSR. Tipo di evento explicit | |||
| Fattura pagata | Segna il saldo finale della fattura del fornitore tramite una proposta di pagamento o un pagamento manuale. È una transazione finanziaria esplicita che crea un documento di compensazione. | ||
| Perché è importante Sebbene faccia tecnicamente parte del processo di pagamento, includere questa attività offre una visione completa del ciclo procure-to-pay. È fondamentale per analizzare le condizioni e le prestazioni di pagamento. Dove reperirli Il pagamento viene registrato come documento di compensazione in BKPF/ACDOCA. La data di compensazione (AUGDT) della posizione della fattura nella tabella BSEG o ACDOCA indica l’evento di pagamento. Acquisizione Data di compensazione (AUGDT) del documento della fattura, disponibile in BSEG o ACDOCA. Tipo di evento explicit | |||
| Merci restituite | Indica che merci ricevute in precedenza sono state restituite al fornitore, in genere per problemi di qualità, danni o spedizioni errate. L’evento viene registrato esplicitamente come movimento di storno delle merci. | ||
| Perché è importante Questa attività mette in evidenza le rilavorazioni e i possibili problemi di qualità del fornitore o di accuratezza dell’ordine. Un numero elevato di resi per un determinato fornitore o materiale segnala un problema. Dove reperirli Registrato come documento materiale con uno specifico tipo di movimento di reso, ad esempio 122. L’evento viene riportato in MKPF/MSEG e collegato all’ordine di acquisto nella tabella della cronologia EKBE. Acquisizione Data di registrazione del documento materiale con un tipo di movimento di reso in EKBE. Tipo di evento explicit | |||
| Ordine di acquisto eliminato | Indica l’annullamento o l’eliminazione logica di una posizione dell’ordine di acquisto o dell’intero documento. L’evento viene registrato quando un utente imposta un indicatore di eliminazione sul documento. | ||
| Perché è importante Questa attività rappresenta un possibile punto finale alternativo del processo e indica un errore o un annullamento. Analizzare i motivi dell’eliminazione degli ordini può far emergere problemi nella pianificazione della domanda o nella definizione dei requisiti. Dove reperirli Acquisito dall’indicatore di eliminazione (LOEKZ) nelle tabelle della testata (EKKO) o delle posizioni (EKPO) dell’ordine di acquisto. La marca temporale deriva dai documenti di modifica (CDHDR/CDPOS). Acquisizione Marca temporale dei documenti di modifica (CDHDR/CDPOS) al momento dell’impostazione dell’indicatore di eliminazione (LOEKZ). Tipo di evento explicit | |||
| Ordine di acquisto inviato al fornitore | Indica il momento in cui l’ordine di acquisto viene comunicato al fornitore, ad esempio tramite EDI, e-mail o stampa. Spesso l’evento viene registrato nei log di gestione degli output del sistema. | ||
| Perché è importante Questa attività segna l’effettivo inizio del tempo di attraversamento del fornitore. È essenziale per misurare con precisione le prestazioni del fornitore dal momento in cui riceve l’ordine. Dove reperirli Acquisito dalla tabella di controllo degli output NAST, che registra i messaggi inviati per un documento di acquisto. Si possono utilizzare la data e l’ora del tipo di output pertinente, ad esempio EDI o e-mail. Acquisizione Marca temporale del primo messaggio di output inviato correttamente per l’ordine di acquisto nella tabella NAST. Tipo di evento inferred | |||
| Ordine di acquisto modificato | Questa attività indica che l’ordine di acquisto è stato modificato dopo la creazione iniziale, ad esempio per una variazione della quantità, del prezzo o della data di consegna. La modifica viene registrata esplicitamente nei log delle modifiche del sistema. | ||
| Perché è importante Monitorare le modifiche, soprattutto quelle successive all’approvazione, è fondamentale per individuare inefficienze, rilavorazioni e possibili problemi di conformità. Modifiche frequenti possono indicare specifiche iniziali poco accurate. Dove reperirli Registrato nelle tabelle dei documenti di modifica CDHDR (testata) e CDPOS (posizione) per gli oggetti degli ordini di acquisto (EINKBELEG). Ogni modifica genera una voce dettagliata nel log. Acquisizione Evento registrato per le modifiche ai campi chiave delle tabelle EKKO o EKPO, riportate in CDHDR/CDPOS. Tipo di evento explicit | |||
Guide all’estrazione
Passaggi
- Prerequisiti e accesso: verifichi di disporre di un utente con le autorizzazioni necessarie per interrogare le viste Core Data Services (CDS) nel sistema SAP S/4HANA. Può accedere tramite SAP HANA Studio, ABAP Development Tools (ADT) per Eclipse oppure uno strumento di estrazione dati di terze parti che supporti connessioni SQL al database SAP HANA.
- Individuazione dei dati di connessione al sistema: recuperi i parametri necessari per connettersi al sistema SAP S/4HANA, inclusi host, numero di istanza e credenziali di autenticazione.
- Connessione al database: utilizzi il client SQL che preferisce per connettersi al database SAP S/4HANA in cui si trovano le viste CDS.
- Preparazione della query SQL: copi nell’editor SQL la query completa fornita nella sezione dedicata di questo documento. La query estrae tutte le attività e gli attributi richiesti.
- Impostazione dei parametri di filtro: individui nella query i valori segnaposto. Sostituisca _start_date e _end_date con l’intervallo di date desiderato per l’analisi, ad esempio '20230101' e '20231231'. Modifichi il filtro poh.CompanyCode per includere i codici società da analizzare.
- Esecuzione della query: esegua la query SQL modificata sul database S/4HANA. L’operazione potrebbe richiedere del tempo, a seconda del volume dei dati e dell’intervallo di date specificato.
- Revisione dei risultati preliminari: al termine della query, controlli rapidamente i risultati nel client SQL. Verifichi che siano presenti le diverse attività, che i timestamp siano valorizzati correttamente e che l’ID del caso (PurchaseOrderNumber) sia coerente.
- Esportazione dei dati: esporti l’intero set di risultati dallo strumento SQL in un file CSV (Comma Separated Values). Si assicuri che il file utilizzi la codifica UTF-8 per evitare problemi con i caratteri.
- Preparazione del caricamento: prima di caricare il file in ProcessMind, apra il CSV e verifichi che le intestazioni delle colonne corrispondano esattamente agli attributi definiti nei requisiti dei dati (PurchaseOrderNumber, ActivityName, EventTime e così via). Se lo strumento di esportazione ha modificato i nomi delle colonne, li corregga.
- Caricamento in ProcessMind: carichi il file CSV definitivo nel progetto ProcessMind. Durante l’importazione, associ le colonne del file ai campi corrispondenti per ID del caso, attività e timestamp.
Configurazione
- Viste CDS principali utilizzate: la logica di estrazione si basa su un insieme di viste CDS standard e semanticamente ricche. Le viste principali includono:
- I_PurchaseOrderItemAPI01: dati essenziali sulle righe degli ordini di acquisto.
- I_PurchaseRequisitionItemAPI01: dettagli sulle richieste di acquisto.
- I_MaterialDocumentItem: movimenti merci, come entrate e resi.
- I_ServiceEntrySheetAPI01: eventi di conferma dei servizi.
- I_SupplierInvoiceAPI01: informazioni sulle fatture dei fornitori.
- I_OperationalAcctgDocItem: collegamento delle fatture ai documenti contabili per monitorare i pagamenti.
- I_ChangeDocument: registrazione delle modifiche agli ordini di acquisto.
- Filtro per intervallo di date: è fondamentale applicare un filtro per intervallo di date, così da gestire le prestazioni e il volume dei dati. La query utilizza i segnaposto _start_date e _end_date sulla data di creazione dell’ordine di acquisto (PurchaseOrderDate). Per iniziare, si consiglia un intervallo da 3 a 6 mesi.
- Filtro organizzativo: la query deve sempre essere filtrata per CompanyCode, in modo da limitare l’estrazione alle unità aziendali pertinenti. Per affinare ulteriormente i risultati, è possibile aggiungere alla common table expression PO_base filtri per PurchaseOrderType o PurchasingOrganization.
- Prerequisiti: l’utente che esegue la query deve disporre dell’autorizzazione SELECT su tutte le viste CDS elencate sopra. In genere, l’accesso a queste viste viene concesso tramite ruoli specifici per le funzioni aziendali o di analisi in S/4HANA. Senza le autorizzazioni necessarie, la query non verrà eseguita.
Query di esempio sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Passaggi
- Verifichi che sia disponibile l’accesso SQL diretto allo schema SAP HANA contenente EKKO ed EKPO e che siano state concesse le autorizzazioni di lettura necessarie. Sostituisca i segnaposto relativi allo schema e alla connessione con i valori configurati per il Suo sistema.
- Definisca l’intervallo di estrazione usando [Start timestamp] e [End timestamp]. Per il caricamento iniziale si consiglia un periodo da tre a sei mesi. Applichi i filtri per codice società e tipo di documento solo se richiesti dall’ambito dei report.
- Individui gli ordini di acquisto in EKKO ed EKPO, mantenendo il numero dell’ordine, il fornitore, il tipo di documento, il codice società, la data e l’ora di creazione e gli attributi a livello di riga. Aggreghi i valori netti di EKPO per calcolare TotalNetAmount a livello di ordine di acquisto.
- Estragga da EBAN gli eventi di creazione e approvazione delle richieste di acquisto, utilizzando il numero della richiesta e il riferimento alla riga disponibile in EKPO per associare le richieste agli ordini di acquisto. Poiché gli indicatori e i timestamp di approvazione delle richieste variano in base alla configurazione della versione, imposti le espressioni per lo stato e il timestamp di approvazione in funzione della strategia di rilascio SAP attiva in [Configure based on your system].
- Estragga gli eventi di creazione, approvazione, modifica, eliminazione e completamento degli ordini di acquisto. Per la creazione utilizzi la data e l’ora di creazione di EKKO. Per approvazione, modifica ed eliminazione sono necessarie fonti relative alla strategia di rilascio o alla cronologia delle modifiche. Configuri le espressioni delle fonti corrispondenti usando [Your table name] e [Your column name] quando la cronologia pertinente non è esposta nello schema selezionato.
- Estragga gli eventi di comunicazione con i fornitori, entrata merci, conferma dei servizi, reso merci, ricezione delle fatture e pagamento delle fatture dalle fonti pertinenti di output, documenti materiali, registrazioni dei servizi, fatture, contabilità e compensazione. La query include segnaposto espliciti per gli oggetti specifici del sistema, poiché queste fonti non sono rappresentate dalle sole tabelle EKKO ed EKPO.
- Normalizzi tutti gli eventi delle fonti secondo la stessa struttura dell’Event Log. Ogni riga deve contenere PurchaseOrderNumber, ActivityName, EventTime, SourceSystem, LastDataUpdate, VendorId, UserName, TotalNetAmount, PurchaseRequisitionNumber, RequestedDeliveryDate e DocumentType. Mantenga le occorrenze multiple di un’attività quando la fonte contiene più eventi validi.
- Convalidi i timestamp, rimuova solo le righe duplicate esattamente e non deduca attività prive di un record nella fonte. ProcessMind legge l’Event Log così com’è: ogni attività mostrata nella visualizzazione del processo deve quindi essere presente in una riga esplicita.
- Esporti i risultati in un file delimitato o in un set di risultati del database, con una riga di intestazione e nomi di colonna stabili. Utilizzi un formato timestamp supportato dalla configurazione di caricamento di ProcessMind, mantenga PurchaseOrderNumber come testo e carichi l’intero Event Log tramite la connessione dati ProcessMind configurata.
Configurazione
- Oggetti di origine: EKKO ed EKPO sono le fonti confermate per le testate e le righe degli ordini di acquisto. Gli oggetti aggiuntivi relativi a richieste, stato di rilascio, cronologia delle modifiche, output, movimenti merci, registrazioni dei servizi, fatture, pagamenti e compensazione devono essere configurati in base alla versione SAP S/4HANA e al modello dati attivo.
- Identificativo del caso: utilizzi PurchaseOrderNumber come identificativo del caso. Gli eventi a livello di riga devono essere associati al numero dell’ordine di acquisto; se necessario, mantenga i riferimenti alle righe in un’ulteriore colonna specifica della fonte.
- Intervallo di date: inizi con un periodo da tre a sei mesi. Per i caricamenti storici, elabori intervalli più brevi e riconcili le finestre sovrapposte per evitare omissioni.
- Filtri: configuri i filtri per Company Code, Document Type, VendorId, organizzazione acquisti, gruppo acquisti e data dell’evento in base all’ambito richiesto. I filtri per codice società e tipo di documento devono utilizzare valori validi nel sistema di destinazione.
- Semantica degli eventi: la creazione e l’eliminazione possono essere registrate esplicitamente quando sono disponibili i campi o i log pertinenti. Approvazione e completamento sono eventi basati sullo stato e richiedono timestamp di stato configurati. Non crei righe basandosi soltanto sullo stato corrente, se non è disponibile un timestamp dell’evento attendibile.
- Prestazioni: applichi fin dall’inizio i filtri sulle date degli eventi e sull’ambito organizzativo, aggreghi EKPO prima di unirla alle fonti degli eventi quando possibile ed esegua i caricamenti storici di grandi dimensioni per intervalli temporali. Verifichi che le statistiche del database siano adeguate ed eviti join senza restrizioni tra le fonti delle righe, della contabilità e della cronologia delle modifiche.
- Timestamp di aggiornamento: imposti LastDataUpdate sul timestamp di esecuzione dell’estrazione per ogni riga del caricamento.
- Prerequisiti: sono necessari la connettività SAP HANA, l’autorizzazione di lettura per tutti gli oggetti di origine configurati, l’accesso ai dati pertinenti relativi ad acquisti, gestione delle scorte, approvvigionamento di servizi, verifica delle fatture e contabilità fornitori, nonché una connessione ProcessMind in grado di importare il file o il set di risultati selezionato.
- Configurazione specifica del sistema: sostituisca ogni segnaposto tra parentesi quadre nella query con una tabella, vista, colonna o espressione approvata del sistema SAP S/4HANA di destinazione. Non inserisca credenziali nella query o nella configurazione dell’estrazione.
Query di esempio sql
WITH
params AS (
SELECT
CAST('[Start timestamp]' AS TIMESTAMP) AS start_ts,
CAST('[End timestamp]' AS TIMESTAMP) AS end_ts,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update,
CAST('[Source system]' AS NVARCHAR(100)) AS source_system
FROM DUMMY
),
po_base AS (
SELECT
h.MANDT,
h.EBELN AS PurchaseOrderNumber,
h.LIFNR AS VendorId,
h.BSART AS DocumentType,
h.BUKRS AS CompanyCode,
CAST(h.AEDAT AS DATE) AS POChangedDate,
CAST(h.AEDAT AS TIMESTAMP) AS POChangedTimestamp,
CAST(h.ERNAM AS NVARCHAR(100)) AS POCreatedBy,
CAST(h.BEDAT AS DATE) AS PODate,
CAST(h.EBELN AS NVARCHAR(20)) AS PurchaseOrderKey,
CAST(SUM(COALESCE(i.NETWR, 0)) AS DECIMAL(23, 2)) AS TotalNetAmount,
CAST(MIN(i.BEDNR) AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
CAST(MIN(i.EINDT) AS DATE) AS RequestedDeliveryDate
FROM EKKO h
INNER JOIN EKPO i
ON i.MANDT = h.MANDT
AND i.EBELN = h.EBELN
WHERE h.AEDAT >= (SELECT start_ts FROM params)
AND h.AEDAT < (SELECT end_ts FROM params)
AND h.BUKRS IN ([Company Code filter])
AND h.BSART IN ([Document Type filter])
GROUP BY
h.MANDT,
h.EBELN,
h.LIFNR,
h.BSART,
h.BUKRS,
h.AEDAT,
h.ERNAM,
h.BEDAT
),
po_items AS (
SELECT
i.MANDT,
i.EBELN AS PurchaseOrderNumber,
i.EBELP,
i.BANFN AS PurchaseRequisitionNumber,
i.BEDNR,
i.EINDT AS RequestedDeliveryDate
FROM EKPO i
),
events AS (
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(r.[Purchase requisition creation timestamp] AS TIMESTAMP) AS EventTime,
s.source_system AS SourceSystem,
s.last_data_update AS LastDataUpdate,
p.VendorId,
CAST(r.[Purchase requisition created by] AS NVARCHAR(100)) AS UserName,
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)) AS PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition source table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition creation timestamp] >= s.start_ts
AND r.[Purchase requisition creation timestamp] < s.end_ts
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(r.[Purchase requisition approval timestamp] AS TIMESTAMP) AS EventTime,
s.source_system,
s.last_data_update,
p.VendorId,
CAST(r.[Purchase requisition approver] AS NVARCHAR(100)),
p.TotalNetAmount,
CAST(r.[Purchase requisition number] AS NVARCHAR(20)),
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your requisition approval history table or view] r
ON r.[Client] = p.MANDT
AND r.[Purchase requisition number] = p.PurchaseRequisitionNumber
CROSS JOIN params s
WHERE r.[Purchase requisition approval timestamp] >= s.start_ts
AND r.[Purchase requisition approval timestamp] < s.end_ts
AND r.[Approval status] = '[Approved status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Created',
CAST(p.PODate AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
p.POCreatedBy,
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
CROSS JOIN params s
WHERE p.PODate >= CAST(s.start_ts AS DATE)
AND p.PODate < CAST(s.end_ts AS DATE)
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Approved',
CAST(a.[Purchase order approval timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(a.[Approver] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order release history table or view] a
ON a.[Client] = p.MANDT
AND a.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE a.[Purchase order approval timestamp] >= s.start_ts
AND a.[Purchase order approval timestamp] < s.end_ts
AND a.[Release status] = '[Approved release status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Sent to Vendor',
CAST(o.[Output timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(o.[Output user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order output source table or view] o
ON o.[Client] = p.MANDT
AND o.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE o.[Output timestamp] >= s.start_ts
AND o.[Output timestamp] < s.end_ts
AND o.[Output status] = '[Successfully processed output status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Changed',
CAST(c.[Change timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(c.[Changed by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order change history table or view] c
ON c.[Client] = p.MANDT
AND c.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE c.[Change timestamp] >= s.start_ts
AND c.[Change timestamp] < s.end_ts
AND c.[Change indicator] = '[Changed indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Receipt Posted',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods receipt movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Services Confirmation Entered',
CAST(v.[Service entry timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(v.[Entered by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your service entry sheet source table or view] v
ON v.[Client] = p.MANDT
AND v.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE v.[Service entry timestamp] >= s.start_ts
AND v.[Service entry timestamp] < s.end_ts
AND v.[Service entry status] = '[Accepted service entry status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Goods Returned',
CAST(g.[Goods movement timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(g.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your goods movement source table or view] g
ON g.[Client] = p.MANDT
AND g.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE g.[Goods movement timestamp] >= s.start_ts
AND g.[Goods movement timestamp] < s.end_ts
AND g.[Movement type] IN ([Goods return movement types])
AND g.[Reversal indicator] IS NULL
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Received',
CAST(i.[Invoice posting timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Posted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Invoice posting timestamp] >= s.start_ts
AND i.[Invoice posting timestamp] < s.end_ts
AND i.[Invoice status] = '[Posted invoice status]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Invoice Paid',
CAST(i.[Clearing timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(i.[Cleared by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your supplier invoice clearing source table or view] i
ON i.[Client] = p.MANDT
AND i.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE i.[Clearing timestamp] >= s.start_ts
AND i.[Clearing timestamp] < s.end_ts
AND i.[Clearing status] = '[Cleared status value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Completed',
CAST(x.[Completion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(x.[Completion user] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order item status source table or view] x
ON x.[Client] = p.MANDT
AND x.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE x.[Completion timestamp] >= s.start_ts
AND x.[Completion timestamp] < s.end_ts
AND x.[Delivery completed indicator] = '[Set indicator value]'
AND x.[Final invoice indicator] = '[Set indicator value]'
UNION ALL
SELECT
p.PurchaseOrderNumber,
'Purchase Order Deleted',
CAST(d.[Deletion timestamp] AS TIMESTAMP),
s.source_system,
s.last_data_update,
p.VendorId,
CAST(d.[Deleted by] AS NVARCHAR(100)),
p.TotalNetAmount,
p.PurchaseRequisitionNumber,
p.RequestedDeliveryDate,
p.DocumentType
FROM po_base p
INNER JOIN [Your purchase order deletion history table or view] d
ON d.[Client] = p.MANDT
AND d.[Purchase order number] = p.PurchaseOrderNumber
CROSS JOIN params s
WHERE d.[Deletion timestamp] >= s.start_ts
AND d.[Deletion timestamp] < s.end_ts
AND d.[Deletion indicator] = '[Set deletion indicator value]'
)
SELECT
PurchaseOrderNumber,
ActivityName,
EventTime,
SourceSystem,
LastDataUpdate,
VendorId,
UserName,
TotalNetAmount,
PurchaseRequisitionNumber,
RequestedDeliveryDate,
DocumentType
FROM events
WHERE PurchaseOrderNumber IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY PurchaseOrderNumber, EventTime, ActivityName; Passaggi
- Specifiche e progettazione: definisca la struttura finale del file Event Log, includendo tutti gli attributi obbligatori e consigliati. Documenti le tabelle SAP specifiche, ad esempio EKKO, EKPO, EKBE, CDHDR e CDPOS, che verranno utilizzate come fonti per ciascuna delle 13 attività richieste.
- Creazione del programma: nella SAP GUI, acceda all’editor ABAP tramite il codice transazione SE38 o SE80. Crei un nuovo programma eseguibile, ad esempio Z_PM_PO_EXTRACT.
- Definizione della schermata di selezione: programmi la schermata di selezione del report, che consente agli utenti di filtrare i dati da estrarre. Includa i parametri per l’intervallo di date di creazione dell’ordine di acquisto (P_AEDAT), il codice società (P_BUKRS) e il tipo di documento acquisti (P_BSART).
- Dichiarazione dei dati: definisca le tabelle interne e le strutture dati necessarie al programma. Includa una tabella interna per l’Event Log finale, conforme alla struttura definita nelle specifiche.
- Implementazione della logica di selezione dei dati: scriva la logica ABAP principale per selezionare i dati relativi a ciascuna delle 13 attività. A tal fine, utilizzi una serie di istruzioni SELECT sulle tabelle SAP pertinenti, con le join necessarie. Per gli eventi basati sulle modifiche, legga i log delle modifiche dalle tabelle CDHDR e CDPOS.
- Trasformazione e mappatura dei dati: per ogni record recuperato, associ i campi delle tabelle SAP alle colonne corrispondenti della tabella interna dell’Event Log finale. Imposti ActivityName in base all’evento elaborato, ad esempio 'Purchase Order Created'. Converta i campi di data e ora in un formato timestamp uniforme per EventTime.
- Consolidamento dei dati degli eventi: dopo aver elaborato tutti i 13 tipi di attività, raccolga i dati in un’unica tabella interna. Questa tabella rappresenta l’Event Log completo degli ordini di acquisto selezionati.
- Implementazione dell’output su file: aggiunga una funzione per scrivere la tabella interna finale su un file. Si consiglia di utilizzare il metodo cl_gui_frontend_services=>gui_download, che consente agli utenti di salvare il file in formato CSV sul computer locale, oppure OPEN DATASET per salvarlo nel percorso del server applicativo SAP ed elaborarlo in background.
- Creazione del codice transazione (facoltativa): per rendere il programma facilmente accessibile agli utenti aziendali, utilizzi il codice transazione SE93 per creare un codice transazione personalizzato, ad esempio ZPM_PO_EXTRACT, che esegua il programma ABAP.
- Pianificazione di un job in background: per volumi di dati elevati o estrazioni automatizzate, utilizzi il codice transazione SM36 per pianificare l’esecuzione del programma come job in background. Il file di output verrà scritto nel percorso del server applicativo specificato nella logica del programma.
Configurazione
- Criteri di selezione: il programma deve includere parametri di selezione per filtrare i dati in modo efficace. I filtri principali sono:
- Intervallo di date: un intervallo obbligatorio per la data di creazione dell’ordine di acquisto (EKKO-AEDAT). Per gestire il volume dei dati e le prestazioni del report, si consiglia di iniziare con un periodo da 3 a 6 mesi.
- Codice società (BUKRS): essenziale per le organizzazioni con più entità giuridiche, consente di circoscrivere l’ambito dell’estrazione.
- Tipo di documento acquisti (BSART): consente di filtrare tipi specifici di ordini di acquisto, come ordini standard, ordini quadro o ordini di trasferimento scorte, per concentrare l’analisi.
- Lettura del log delle modifiche: per estrarre attività come 'Purchase Order Approved' o 'Purchase Order Changed' è necessario leggere le tabelle SAP del log delle modifiche (CDHDR, CDPOS). Questa operazione può richiedere molte risorse. La logica ABAP deve essere ottimizzata per selezionare solo le classi di oggetti necessarie (EINKBELEG, BANF) e le combinazioni di tabelle e campi pertinenti.
- Autorizzazioni: l’utente o l’account tecnico che esegue il report deve disporre di ampie autorizzazioni di lettura per le tabelle di più moduli SAP, tra cui Materials Management (MM), Financial Accounting (FI) e le tabelle di sistema. Sono incluse tabelle come EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR e CDPOS.
- Esecuzione in background: per le estrazioni che coprono più di qualche mese di dati o vengono eseguite in un sistema con un volume elevato di transazioni, esegua sempre il programma in background per evitare timeout dei processi interattivi.
Query di esempio abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log. È pronto a iniziare?
Questo template offre una solida base per avviare il Suo percorso di Process Mining. Inizi a sfruttare i dati di SAP S/4HANA per individuare opportunità di efficienza e trasformare da subito il processo Purchase to Pay.
Ottimizzi gli ordini di acquisto P2P e riduca subito il tempo di ciclo
Elimini le inefficienze e riduca del 30% il tempo di ciclo degli ordini di acquisto P2P.
Non è richiesta alcuna carta di credito. La configurazione richiede pochi minuti.