Il Suo Template dati Purchase to Pay - Ordine di acquisto
Il Suo Template dati Purchase to Pay - Ordine di acquisto
- Attributi consigliati per un’analisi dettagliata
- Attività chiave da monitorare nel processo
- Indicazioni dettagliate per l’estrazione dei dati
Purchase to Pay - Purchase Order: attributi
| Nome | Descrizione | ||
|---|---|---|---|
| Attività ActivityName | Il nome dell’evento aziendale o della fase che si è verificata nel processo Purchase Order. | ||
| Descrizione Questo Attributo descrive un’azione specifica o una modifica di stato nel ciclo di vita del Purchase Order, come “Purchase Order Created”, “Purchase Order Approved” o “Goods Receipt Posted”. La sequenza di queste attività forma il flusso del processo. Analizzare la sequenza e la frequenza delle attività è il fulcro del Process Mining. Aiuta a scoprire il processo effettivo, confrontarlo con il modello progettato, identificare i colli di bottiglia, ad esempio lunghe attese dopo “Invoice Received”, e quantificare la rilavorazione, ad esempio attività ripetute di “Purchase Order Changed”. Perché è importante Definisce le fasi del processo, consentendo la visualizzazione e l’analisi del flusso end-to-end, l’analisi delle varianti e l’identificazione dei colli di bottiglia. Dove reperirlo In genere deriva da una 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 principali tappe aziendali. Esempi Purchase Order creatoPurchase Order approvatoEntrata merci registrataFattura ricevuta | |||
| Ora dell’evento EventTime | Il timestamp che indica quando si è verificata l’attività. | ||
| Descrizione Questo Attributo registra la data e l’ora esatte di ogni attività nel processo. È fondamentale per tutte le analisi basate sul tempo nel Process Mining. L’Event Time viene utilizzato per ordinare cronologicamente le attività e costruire il flusso del processo. Inoltre, costituisce la base per calcolare tutte le metriche basate sulla durata, come i tempi di ciclo tra le attività, i tempi di attesa e i tempi di elaborazione, essenziali per l’analisi delle performance e l’identificazione dei colli di bottiglia. Perché è importante Questo timestamp è fondamentale per ordinare correttamente gli eventi e calcolare tutte le metriche di performance, inclusi tempi di ciclo, lead time e tempi di attesa. Dove reperirlo Campi timestamp 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 | L’identificativo univoco del Purchase Order, PO, che funge da ID del caso principale per monitorare il ciclo di vita dell’approvvigionamento. | ||
| Descrizione Il numero del Purchase Order è l’identificativo centrale che collega tutte le attività correlate, dalla creazione iniziale fino alla ricezione finale delle merci e al completamento. Funge da identificativo del caso per l’analisi di Process Mining. Nell’analisi, raggruppare gli eventi in base a questo numero consente di ricostruire il percorso di ogni singolo PO. È essenziale per calcolare i tempi di ciclo, analizzare le varianti di processo e identificare 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 end-to-end, consentendo un’analisi dettagliata del ciclo di vita di ogni Purchase Order. Dove reperirlo Questo Attributo si trova nella tabella SAP S/4HANA EKKO, campo EBELN. Esempi 450001712345000171244500017125 | |||
| Sistema di origine SourceSystem | Identifica il sistema di origine dal quale sono stati estratti i dati. | ||
| Descrizione Questo Attributo specifica il sistema di origine dei dati degli eventi, ad esempio “SAP S/4HANA Production” o “SAP ECC”. Negli ambienti con più sistemi, questo campo è fondamentale per la data lineage, la risoluzione dei problemi e la corretta interpretazione dei dati provenienti da fonti diverse. Aiuta a comprendere il contesto dei dati e può essere utilizzato per filtrare l’analisi in base a specifici ambienti di sistema. Perché è importante Fornisce il contesto essenziale sull’origine dei dati, fondamentale per la governance dei dati, la validazione e l’analisi in ambienti multi-sistema. Dove reperirlo In genere è un valore statico aggiunto durante il processo di estrazione, trasformazione e caricamento, ETL, per indicare l’origine del dataset. Esempi S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Il timestamp dell’ultimo aggiornamento o dell’ultima estrazione dei dati dal sistema di origine. | ||
| Descrizione Questo Attributo indica l’aggiornamento dei dati analizzati. Mostra la data e l’ora dell’estrazione più recente dei dati da SAP S/4HANA. Conoscere l’ora dell’ultimo aggiornamento dei dati è fondamentale per comprendere la tempestività dell’analisi. Aiuta a interpretare correttamente i risultati, indicando se si stanno esaminando informazioni in tempo reale o un’istantanea relativa a un momento specifico, con conseguenze sulla rilevanza delle azioni intraprese sulla base dell’analisi. Perché è importante Informa gli utenti sulla tempestività dei dati, assicurando che comprendano il contesto e la rilevanza dei risultati delle analisi. Dove reperirlo È un timestamp di metadati aggiunto durante il processo di estrazione, trasformazione e caricamento, ETL, dei dati. Esempi 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Data di consegna richiesta RequestedDeliveryDate | La data entro la quale l’azienda ha richiesto al fornitore di consegnare i beni o i servizi. | ||
| Descrizione Questo Attributo specifica la data di consegna obiettivo concordata nel Purchase Order. Costituisce il riferimento per misurare le performance di consegna del fornitore. Nel Process Mining, questa data viene confrontata con la data effettiva di ricezione delle merci, il timestamp “Goods Receipt Posted”, per calcolare il KPI “Supplier On-Time Delivery Rate”. Analizzare le deviazioni rispetto a questa data aiuta a valutare l’affidabilità del fornitore e a gestire i rischi della supply chain. Perché è importante Costituisce il riferimento per misurare le performance di consegna puntuale dei fornitori, un KPI fondamentale per la gestione della supply chain e la pianificazione operativa. Dove reperirlo Si trova nella tabella delle righe di schedulazione EKET, campo EINDT. Esempi 2023-06-012023-06-152023-07-01 | |||
| ID fornitore VendorId | L’identificativo univoco del fornitore che fornisce i beni o i servizi. | ||
| Descrizione L’ID fornitore è un elemento fondamentale dei dati master che collega un Purchase Order a uno specifico fornitore. Viene utilizzato durante l’intero processo di approvvigionamento per la comunicazione, la consegna e il pagamento. Nel Process Mining, questo Attributo consente di segmentare l’analisi delle performance per fornitore. È essenziale per Dashboard come “Supplier Lead Time Performance” e “Goods Return Rate by Vendor”, che aiutano a individuare i fornitori più affidabili e quelli che possono causare ritardi o problemi di qualità. Perché è importante Consente un’analisi incentrata sui fornitori, aiutando a valutarne le performance, individuare quelli con risultati migliori o peggiori e ottimizzare la supply chain. Dove reperirlo Questo Attributo si trova nella tabella SAP S/4HANA EKKO, campo LIFNR. Esempi 100023100045100088 | |||
| Importo netto totale TotalNetAmount | Il valore totale del Purchase Order, al netto di imposte e costi di trasporto. | ||
| Descrizione Questo Attributo rappresenta il valore monetario netto del Purchase Order. È un dato finanziario fondamentale che indica l’entità della transazione di approvvigionamento. Questo importo è essenziale per l’analisi finanziaria, ad esempio per classificare i PO in base al valore, alto o basso, e verificare se i relativi percorsi di processo differiscono. Può inoltre essere utilizzato per stabilire le priorità dell’analisi, concentrandosi sugli ordini di valore elevato, che possono comportare maggiori rischi finanziari o avere un impatto più significativo sull’azienda. Perché è importante Consente un’analisi basata sul valore finanziario, aiutando a segmentare i Purchase Order per importo e a concentrare gli interventi di miglioramento sulle aree con la spesa più elevata. Dove reperirlo Questo Attributo si trova nella tabella SAP S/4HANA EKKO, campo NETWR. Esempi 1500.0025000.50125.75 | |||
| Richiesta d’acquisto PurchaseRequisitionNumber | L’identificativo della Purchase Requisition, PR, che ha originato il Purchase Order. | ||
| Descrizione Questo Attributo collega il Purchase Order alla Purchase Requisition di origine. Non tutti i PO dispongono di una PR, poiché possono essere creati direttamente. Questo collegamento è essenziale per analizzare il processo di approvvigionamento completo end-to-end, a partire dalla richiesta iniziale. Supporta KPI come “Purchase Requisition Approval Time” ed è fondamentale per identificare la “Maverick Spend”, ovvero i PO creati senza una Purchase Requisition precedente e approvata. Perché è importante Collega il PO alla richiesta iniziale, consentendo l’analisi end-to-end del processo e l’identificazione della spesa non autorizzata e non conforme. Dove reperirlo Questo Attributo si trova nella tabella SAP S/4HANA EKPO, a livello di posizione del PO, campo BANFN. Esempi 1001005110010052 | |||
| Tipo di documento PO DocumentType | Una classificazione che distingue diversi tipi di Purchase Order, come PO standard, PO per servizi o ordini di trasferimento delle scorte. | ||
| Descrizione Il tipo di documento è un elemento di configurazione fondamentale in SAP, che controlla il flusso del processo, l’intervallo di numerazione e i campi di un Purchase Order. Consente alle aziende di adattare il processo di approvvigionamento a scenari diversi. Analizzare il processo per tipo di documento è fondamentale per comprendere le varianti di processo. Ad esempio, il processo relativo a un PO standard per beni può essere molto diverso da quello di un PO per servizi o di un trasferimento di scorte. Questo Attributo consente di filtrare e confrontare questi flussi distinti per individuare opportunità di miglioramento specifiche. Perché è importante Classifica i Purchase Order, consentendo di confrontare diversi processi di approvvigionamento e contribuendo a spiegare le variazioni nei flussi di processo e nei tempi di ciclo. Dove reperirlo Questo Attributo si trova nella tabella SAP S/4HANA EKKO, campo BSART. Esempi NBFOUB | |||
| Utente UserName | L’identificativo dell’utente che ha eseguito una specifica attività. | ||
| Descrizione Questo Attributo acquisisce l’ID utente SAP responsabile della creazione, della modifica o dell’approvazione di un documento. Fornisce tracciabilità sulle azioni eseguite nel sistema. L’analisi per utente aiuta a individuare esigenze formative, distribuzione del carico di lavoro e performance individuali. Ad esempio, consente di verificare se determinati utenti sono associati sistematicamente 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 Fornisce responsabilità e consente di analizzare le performance a livello individuale o di team, aiutando a individuare opportunità formative o vincoli di risorse. Dove reperirlo Queste informazioni si trovano in campi come ERNAM, “Created by”, in EKKO o nel campo utente delle tabelle dei documenti di modifica, CDHDR-USERNAME. Esempi CB9980000012JSMITHRROE | |||
| Categoria posizione ItemCategory | Classifica una posizione del Purchase Order, ad esempio standard, conto deposito, subfornitura o servizio. | ||
| Descrizione La categoria posizione determina come viene gestito ed elaborato l’approvvigionamento di uno specifico materiale o servizio. Influenza le fasi successive, come la ricezione delle 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 relativo a una posizione di servizio, che richiede un Service Entry Sheet, differisce significativamente da quello relativo a una posizione standard di magazzino. L’analisi per categoria posizione aiuta a spiegare queste differenze e consente di definire miglioramenti mirati. Perché è importante Spiega le varianti di processo distinguendo tra diversi tipi di approvvigionamento, come beni, servizi o subfornitura. Dove reperirlo Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo PSTYP. Esempi 093 | |||
| Consegna puntuale del fornitore SupplierOnTimeDelivery | Un flag calcolato che indica se la registrazione della ricezione delle merci è avvenuta entro o prima della data di consegna richiesta. | ||
| Descrizione Questo attributo booleano viene derivato confrontando il timestamp dell’attività 'Goods Receipt Posted' con la 'Requested Delivery Date'. Se la ricezione delle merci avviene entro o prima della data richiesta, il valore è impostato su 'true'. Questo attributo supporta direttamente il KPI 'Tasso di consegna puntuale dei fornitori'. Semplifica l’analisi consentendo agli utenti di filtrare facilmente le consegne puntuali o in ritardo, un elemento essenziale per le Dashboard sulle prestazioni dei fornitori e per la valutazione degli stessi. Perché è importante Misura direttamente l’affidabilità dei fornitori, costituendo la base per il KPI della consegna puntuale e consentendo una gestione efficace delle prestazioni dei fornitori. Dove reperirlo Calcolato confrontando il timestamp dell’attività 'Goods Receipt Posted' con l’attributo 'RequestedDeliveryDate'. Esempi truefalse | |||
| Gruppo acquisti PurchasingGroup | Il gruppo specifico di buyer responsabile di determinate attività di approvvigionamento. | ||
| Descrizione Un gruppo acquisti è costituito da un buyer o da un gruppo di buyer responsabili di specifiche attività di acquisto, materiali o fornitori. Rappresenta il principale punto di contatto per i fornitori. Questo attributo consente un’analisi più granulare del carico di lavoro e delle prestazioni rispetto all’organizzazione acquisti. Può essere utilizzato per individuare i team sovraccarichi, misurare l’efficienza dei diversi gruppi di buyer e comprendere quali gruppi siano più soggetti a deviazioni dal processo, come gli acquisti non autorizzati. Perché è importante Offre una visione granulare delle prestazioni dei gruppi di buyer, consentendo di analizzare carico di lavoro, efficienza e aderenza al processo a livello di team. Dove reperirlo Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EKGRP. Esempi 001002N00 | |||
| Indica acquisto non autorizzato IsMaverickSpend | Un flag calcolato che indica se un ordine di acquisto è stato creato senza una richiesta di acquisto approvata precedente. | ||
| Descrizione Questo flag booleano viene derivato durante l’elaborazione dei dati. È impostato su 'true' se un ordine di acquisto non dispone di una richiesta di acquisto associata o se la creazione dell’ordine bypassa il Workflow di approvazione standard. Questo attributo supporta direttamente la Dashboard 'Identificazione degli acquisti non autorizzati' e i relativi KPI. Aiuta a quantificare l’entità dei comportamenti di acquisto non conformi, consentendo alle aziende di intervenire su reparti o gruppi di utenti specifici per rafforzare le politiche e i controlli di approvvigionamento. Perché è importante Identifica 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 reperirlo Campo calcolato in base all’assenza di un valore in 'PurchaseRequisitionNumber' per specifici tipi di documento oppure analizzando la sequenza degli eventi. Esempi truefalse | |||
| Indica rilavorazione IsRework | Un flag calcolato che indica se l’ordine di acquisto è stato sottoposto a rilavorazione, ad esempio a seguito di una modifica successiva all’approvazione o di un reso delle merci. | ||
| Descrizione Questo attributo booleano viene calcolato analizzando la sequenza delle attività per ciascun ordine di acquisto. È contrassegnato come 'true' se un evento 'Purchase Order Changed' si verifica dopo un evento 'Purchase Order Approved' oppure se è presente un evento 'Goods Returned'. Questo flag semplifica il calcolo del KPI 'Tasso di elaborazione straight-through'. Consente di filtrare e visualizzare facilmente tutti gli ordini di acquisto che hanno richiesto un intervento o una correzione manuale, aiutando a quantificare il costo e la frequenza delle rilavorazioni. Perché è importante Aiuta a quantificare l’inefficienza del processo segnalando i casi con rilavorazione, un elemento essenziale per calcolare i tassi di elaborazione straight-through e individuare le cause alla radice delle deviazioni. Dove reperirlo Campo calcolato in base alla sequenza delle attività. La logica verifica se un evento 'Purchase Order Changed' segue un’approvazione o se esiste un evento 'Goods Returned'. Esempi truefalse | |||
| Numero materiale MaterialNumber | L’identificativo dello specifico materiale o bene oggetto dell’approvvigionamento. | ||
| Descrizione Il numero materiale è un codice univoco assegnato a ciascun record dell’anagrafica materiali in SAP. Viene utilizzato per tutte le transazioni relative a quel materiale, inclusi approvvigionamento, gestione delle scorte e vendite. L’analisi per numero materiale o gruppo di materiali consente di esaminare le categorie merceologiche. Può aiutare a individuare se i processi di approvvigionamento relativi a determinati tipi di materiali siano meno efficienti, presentino tempi di attraversamento più lunghi o siano più soggetti a resi, fornendo informazioni utili per la gestione delle categorie. Perché è importante Consente un’analisi per categoria merceologica, aiutando a individuare problemi di processo o criticità nelle prestazioni dei fornitori relative a specifici prodotti o materiali. Dove reperirlo Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo MATNR. Esempi RM100-100FG210SERV-CONSULT | |||
| Organizzazione acquisti PurchasingOrganization | L’unità organizzativa responsabile dell’approvvigionamento di materiali e servizi e della negoziazione con i fornitori. | ||
| Descrizione L’organizzazione acquisti è un’unità organizzativa fondamentale nell’approvvigionamento. Può essere strutturata a livello aziendale, di società o di stabilimento ed è responsabile di tutte le attività di acquisto. L’analisi del processo per organizzazione acquisti aiuta a valutare l’efficienza e le prestazioni dei diversi team o delle diverse aree geografiche di approvvigionamento. Può mettere in evidenza differenze nella negoziazione con i fornitori, nella conformità dei processi o nei ritardi delle approvazioni tra le unità organizzative. Perché è importante Consente di confrontare le prestazioni di diversi reparti o aree geografiche di approvvigionamento, aiutando a individuare le best practice e gli ambiti di miglioramento. Dove reperirlo Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EKORG. Esempi 10101710US01 | |||
| Società CompanyCode | L’identificativo dell’entità 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 in una società specifica. Si tratta di un attributo organizzativo fondamentale, che consente di filtrare e confrontare i processi di approvvigionamento tra diverse entità giuridiche. L’analisi per società può evidenziare incoerenze nell’esecuzione dei processi, diversi livelli di efficienza o tassi di conformità variabili all’interno dell’organizzazione. Perché è importante Consente di segmentare l’analisi dei processi per entità giuridica, facilitando il confronto delle prestazioni e della conformità tra le diverse aree dell’azienda. Dove reperirlo Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo BUKRS. Esempi 101017102000 | |||
| Stabilimento Plant | La struttura operativa o la sede presso cui vengono consegnate le merci o prestati i servizi. | ||
| Descrizione In SAP, uno stabilimento è un luogo fisico in cui vengono prodotti o stoccati i beni oppure vengono prestati i servizi. È un elemento fondamentale per la logistica e la pianificazione. Segmentare l’analisi dei processi per stabilimento può rivelare variazioni regionali o specifiche di una determinata sede nel processo di approvvigionamento. Ad esempio, può mostrare se alcuni stabilimenti registrano tempi di consegna più lunghi o tassi più elevati di reso delle merci, indicando problemi logistici o di controllo qualità localizzati. Perché è importante Consente un’analisi basata sulla sede, mettendo in evidenza le differenze nelle prestazioni dei processi tra diversi siti operativi, stabilimenti o magazzini. Dove reperirlo Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo WERKS. Esempi 10101710DE01 | |||
Purchase to Pay - Purchase Order: attività
| Attività | Descrizione | ||
|---|---|---|---|
| Entrata merci registrata | Rappresenta la ricezione fisica delle merci dal fornitore e la relativa registrazione nel sistema. Si tratta di una transazione esplicita che aggiorna la cronologia del Purchase Order. | ||
| Perché è importante È una tappa importante che conclude il lead time del fornitore e avvia il processo interno di verifica della fattura. È essenziale per monitorare i tassi di consegna puntuale. Dove reperirlo Registrato come documento materiale nelle tabelle MKPF, testata, e MSEG, posizione, e collegato alla cronologia del Purchase Order nella tabella EKBE con uno specifico tipo di movimento, ad esempio 101. Acquisizione Data di registrazione, BUDAT, della testata del documento materiale MKPF collegato tramite EKBE. Tipo di evento explicit | |||
| Fattura ricevuta | Rappresenta l’inserimento della fattura di un fornitore nel sistema SAP, con collegamento al Purchase Order corrispondente. È una registrazione finanziaria esplicita che crea un documento contabile. | ||
| Perché è importante È una tappa fondamentale che collega il processo di approvvigionamento al processo di contabilità fornitori. Consente di analizzare il tempo che intercorre tra la ricezione delle merci e l’elaborazione della fattura. Dove reperirlo Un documento contabile viene creato nella tabella BKPF, testata, mentre le relative posizioni si trovano in BSEG o nel giornale universale ACDOCA. Il documento è collegato al PO nella tabella RSEG. Acquisizione Data di inserimento del documento, CPUDT, dalla tabella di testata del documento contabile BKPF. Tipo di evento explicit | |||
| Purchase Order approvato | Indica che il Purchase Order ha ricevuto tutte le approvazioni interne necessarie ed è autorizzato per l’invio al fornitore. L’evento viene dedotto da una modifica dello stato nella strategia di rilascio del Purchase Order. | ||
| Perché è importante È una tappa fondamentale per misurare l’efficienza delle approvazioni e la rilavorazione successiva all’approvazione. Analizzare il tempo tra la creazione e l’approvazione del PO mette in evidenza i ritardi del processo interno. Dove reperirlo Deducibile dall’indicatore di rilascio FRGKE nella tabella EKKO. Il timestamp viene determinato consultando la cronologia delle modifiche CDHDR/CDPOS per individuare il momento in cui questo campo è stato aggiornato allo stato “rilasciato”. Acquisizione Deducibile dai log delle modifiche relativi al campo dell’indicatore di rilascio FRGKE nella tabella EKKO. Tipo di evento inferred | |||
| Purchase Order completato | Questa attività indica che una posizione del Purchase Order è considerata chiusa dal punto di vista logistico. Viene dedotta quando sono impostati entrambi gli indicatori “Delivery Completed” e “Final Invoice”. | ||
| Perché è importante Rappresenta il punto finale per l’analisi del ciclo di vita del Purchase Order. Misurare il tempo fino a questo evento fornisce il tempo di ciclo end-to-end delle attività di approvvigionamento. Dove reperirlo Deducibile dai flag di stato nella tabella delle posizioni del Purchase Order, EKPO. L’evento si verifica quando entrambi gli indicatori “Delivery Completed”, ELIKZ, e “Final Invoice”, EREKZ, sono impostati su true. Acquisizione Deducibile dai log delle modifiche quando i campi ELIKZ ed EREKZ di EKPO sono entrambi contrassegnati come completati. Tipo di evento inferred | |||
| Purchase Order creato | Registra la creazione del documento ufficiale Purchase Order, che può essere creato con o senza riferimento a una Purchase Requisition. È un evento esplicito acquisito quando il documento PO viene salvato per la prima volta nel sistema. | ||
| Perché è importante Questa attività può rappresentare un punto di avvio alternativo del processo, soprattutto per l’analisi degli acquisti non autorizzati. È un evento fondamentale per monitorare il tempo complessivo di elaborazione dei PO. Dove reperirlo Registrato nella tabella di testata dei Purchase Order EKKO. La data di creazione, AEDAT, e l’ora sono memorizzate direttamente in questa tabella per il documento. Acquisizione Timestamp di creazione, AEDAT, nella tabella EKKO per il documento Purchase Order. Tipo di evento explicit | |||
| Purchase Requisition approvata | Rappresenta l’approvazione formale di una Purchase Requisition da parte di un responsabile o di un approvatore designato. In genere viene dedotta da una modifica dello stato del documento di richiesta, che indica che il documento è pronto per essere convertito in un Purchase Order. | ||
| Perché è importante È una tappa fondamentale per monitorare i tempi del ciclo di approvazione e individuare i colli di bottiglia. I ritardi in questa fase incidono direttamente sulla rapidità con cui un Purchase Order può essere creato e inviato a un fornitore. Dove reperirlo Deducibile dai campi relativi allo stato di rilascio nella tabella EBAN, ad esempio FRGZU, indicatore di rilascio. Il timestamp deriva dai documenti di modifica CDHDR/CDPOS, che registrano il momento in cui è stato impostato lo stato di rilascio finale. Acquisizione Deducibile dai log delle modifiche relativi ai campi dello stato di rilascio nella tabella EBAN, registrati in CDHDR/CDPOS. Tipo di evento inferred | |||
| Purchase Requisition creata | Questa attività registra la richiesta formale di beni o servizi e avvia il processo di approvvigionamento. L’evento viene acquisito esplicitamente quando un utente salva un nuovo documento Purchase Requisition, ad esempio utilizzando la transazione ME51N. | ||
| Perché è importante Questo è il principale punto di avvio per molti cicli di vita dei Purchase Order. Analizzare il tempo che intercorre tra questo evento e la creazione del PO aiuta a individuare ritardi nel sourcing e nell’elaborazione interna. Dove reperirlo Registrato nella tabella EBAN (Purchase Requisition). Il timestamp dell’evento di creazione è disponibile 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 dei servizi inserita | Questa attività registra la conferma che un servizio specificato in un Purchase Order è stato erogato. Viene acquisita esplicitamente attraverso la creazione di un Service Entry Sheet. | ||
| Perché è importante Per gli approvvigionamenti basati sui servizi, equivale a un’entrata merci. È fondamentale per monitorare i tempi di erogazione del servizio e consentire pagamenti puntuali ai fornitori. Dove reperirlo Registrato tramite la creazione di un Service Entry Sheet, con dati memorizzati nelle tabelle ESSR, testata, ed ESLL, righe. La data di creazione funge da timestamp. Acquisizione Data di creazione del documento Service Entry Sheet nella tabella ESSR. Tipo di evento explicit | |||
| Fattura pagata | Registra il saldo finale della fattura del fornitore tramite un payment run 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 performance di pagamento. Dove reperirlo Il pagamento viene registrato come documento di compensazione in BKPF/ACDOCA. La data di compensazione, AUGDT, sulla 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 precedentemente ricevute sono state restituite al fornitore, generalmente a causa di problemi di qualità, danni o spedizioni errate. Viene acquisito come movimento di storno esplicito delle merci. | ||
| Perché è importante Questa attività evidenzia rilavorazioni e potenziali problemi relativi alla qualità del fornitore o all’accuratezza dell’ordine. Un’elevata frequenza di resi per uno specifico fornitore o materiale segnala un problema. Dove reperirlo Registrato come documento materiale con uno specifico tipo di movimento di reso, ad esempio 122. L’evento viene registrato in MKPF/MSEG e collegato al PO 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 | |||
| Purchase Order eliminato | Rappresenta l’annullamento o l’eliminazione logica di una posizione del Purchase Order o dell’intero documento. Viene acquisito quando un utente imposta un flag di eliminazione sul documento. | ||
| Perché è importante Questa attività rappresenta un punto finale alternativo del processo e indica un errore o un annullamento. Analizzare le ragioni dell’eliminazione dei PO può far emergere problemi nella pianificazione della domanda o nella definizione dei requisiti. Dove reperirlo Acquisito dal flag dell’indicatore di eliminazione, LOEKZ, nelle tabelle della testata, EKKO, o delle posizioni, EKPO, del Purchase Order. Il timestamp deriva dai documenti di modifica CDHDR/CDPOS. Acquisizione Timestamp dei documenti di modifica CDHDR/CDPOS relativo all’impostazione del flag di eliminazione, LOEKZ. Tipo di evento explicit | |||
| Purchase Order inviato al fornitore | Rappresenta il momento in cui il Purchase Order viene comunicato al fornitore, ad esempio tramite EDI, e-mail o stampa. Questo evento viene spesso acquisito attraverso i log della gestione degli output del sistema. | ||
| Perché è importante Questa attività segna l’effettivo inizio del lead time del fornitore. È essenziale per misurare con precisione le performance del fornitore a partire dal momento in cui riceve l’ordine. Dove reperirlo Acquisito dalla tabella di controllo degli output NAST, che registra i messaggi inviati per un documento di acquisto. È possibile utilizzare la data e l’ora del tipo di output pertinente, ad esempio EDI o e-mail. Acquisizione Timestamp del primo messaggio di output inviato con successo per il PO nella tabella NAST. Tipo di evento inferred | |||
| Purchase Order modificato | Questa attività indica che il Purchase Order è stato modificato dopo la creazione iniziale, ad esempio nella quantità, nel prezzo o nella data di consegna. Viene acquisita esplicitamente nei log delle modifiche del sistema. | ||
| Perché è importante Monitorare le modifiche, soprattutto quelle successive all’approvazione, è fondamentale per individuare inefficienze di processo, rilavorazioni e potenziali problemi di conformità. Modifiche frequenti possono indicare specifiche iniziali inadeguate. Dove reperirlo Registrato nelle tabelle dei documenti di modifica CDHDR, testata, e CDPOS, posizione, per gli oggetti Purchase Order EINKBELEG. Ogni modifica genera una voce dettagliata nel log. Acquisizione Evento registrato per le modifiche ai campi principali nelle tabelle EKKO o EKPO, acquisito 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. L’accesso può avvenire 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.
- Individui i dettagli della connessione al sistema: recuperi i parametri di connessione necessari per il Suo sistema SAP S/4HANA, inclusi host, numero di istanza e credenziali di autenticazione.
- Si connetta al database: utilizzando il client SQL che preferisce, stabilisca una connessione al database SAP S/4HANA in cui risiedono le viste CDS.
- Prepari la query SQL: copi la query SQL completa fornita nella sezione dedicata alle query di questo documento nel Suo editor SQL. La query è progettata per estrarre tutte le attività e gli attributi richiesti.
- Imposti i parametri di filtro: individui i valori segnaposto nella query. 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 includendo i codici azienda specifici che desidera analizzare.
- Esegua la query: esegua la query SQL modificata sul database S/4HANA. A seconda del volume dei dati e dell’intervallo di date specificato, l’esecuzione potrebbe richiedere del tempo.
- Esamini i risultati preliminari: al termine della query, esegua una rapida verifica dell’output nel Suo client SQL. Controlli la presenza di attività differenti, verifichi che i timestamp siano valorizzati correttamente e accerti la coerenza del case ID (PurchaseOrderNumber).
- Esporti i dati: esporti l’intero set di risultati dallo strumento SQL in un file CSV (Comma Separated Values). Verifichi che il file utilizzi la codifica UTF-8 per evitare problemi con i caratteri.
- Prepari il caricamento: prima di caricare il file in ProcessMind, apra il file CSV e verifichi che le intestazioni delle colonne corrispondano esattamente agli attributi definiti nei requisiti dei dati (PurchaseOrderNumber, ActivityName, EventTime, ecc.). Modifichi i nomi delle colonne se lo strumento di esportazione li ha alterati.
- Carichi i dati in ProcessMind: carichi il file CSV definitivo nel Suo progetto ProcessMind. Durante il processo di importazione, associ le colonne del file ai campi corrispondenti per case ID, attività e timestamp.
Configurazione
- Principali viste CDS utilizzate: la logica di estrazione si basa su un insieme di viste CDS standard e semanticamente ricche. Le viste principali includono:
- I_PurchaseOrderItemAPI01: per i dati principali degli articoli degli ordini di acquisto.
- I_PurchaseRequisitionItemAPI01: per i dettagli delle richieste di acquisto.
- I_MaterialDocumentItem: per i movimenti delle merci, come entrate e resi.
- I_ServiceEntrySheetAPI01: per gli eventi di conferma dei servizi.
- I_SupplierInvoiceAPI01: per le informazioni sulle fatture dei fornitori.
- I_OperationalAcctgDocItem: per collegare le fatture ai documenti contabili e monitorare i pagamenti.
- I_ChangeDocument: per acquisire le modifiche agli ordini di acquisto.
- Filtro dell’intervallo di date: è fondamentale applicare un filtro sull’intervallo di date per 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). Come intervallo iniziale si consiglia un periodo compreso tra 3 e 6 mesi di dati.
- Filtro organizzativo: la query deve essere sempre filtrata per CompanyCode, così da limitare l’estrazione alle unità aziendali pertinenti. Per un’ulteriore definizione dell’ambito, è possibile aggiungere filtri su PurchaseOrderType o PurchasingOrganization all’espressione di tabella comune PO_base.
- Prerequisiti: l’utente che esegue la query deve disporre dell’autorizzazione SELECT su tutte le viste CDS elencate sopra. L’accesso a queste viste viene generalmente concesso tramite ruoli aziendali o analitici specifici in S/4HANA. In assenza delle autorizzazioni necessarie, la query non verrà eseguita correttamente.
a 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 ottenga le autorizzazioni di lettura necessarie. Sostituisca i segnaposto relativi allo schema e alla connessione con i valori configurati per il Suo sistema.
- Definisca la finestra di estrazione utilizzando [Start timestamp] e [End timestamp]. Per il caricamento iniziale si consiglia una finestra da tre a sei mesi. Applichi i filtri per codice azienda e tipo di documento solo quando sono richiesti dall’ambito della reportistica.
- Individui gli ordini di acquisto in EKKO ed EKPO, mantenendo numero dell’ordine di acquisto, fornitore, tipo di documento, codice azienda, data di creazione, ora di creazione e attributi a livello di articolo. 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 all’articolo 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 del rilascio, configuri le espressioni relative allo stato e al timestamp di approvazione in base alla 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. Approvazione, modifica ed eliminazione richiedono fonti relative alla cronologia dei rilasci o delle modifiche. Configuri le espressioni delle fonti corrispondenti utilizzando [Your table name] e [Your column name] quando la cronologia pertinente non è esposta nello schema selezionato.
- Estragga gli eventi relativi alle comunicazioni con i fornitori, alle entrate merci, alle conferme dei servizi, ai resi delle merci, alla ricezione delle fatture e al pagamento delle fatture dalle fonti applicabili per output, documenti materiali, entrate servizi, fatture, contabilità e compensazione. La query include segnaposto espliciti per gli oggetti specifici del sistema, poiché queste fonti non sono rappresentate esclusivamente da EKKO ed EKPO.
- Normalizzi ogni evento di origine nella 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 esclusivamente le righe duplicate esatte della fonte e non deduca attività prive di un record di origine. ProcessMind legge l’event log così come viene fornito, pertanto ogni attività visualizzata nel processo deve essere presente come riga esplicita.
- Esporti il risultato come file delimitato o set di risultati del database, con una sola 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’event log completo tramite la connessione dati ProcessMind configurata.
Configurazione
- Oggetti di origine: EKKO ed EKPO sono le fonti confermate per testata e articoli degli ordini di acquisto. Gli oggetti aggiuntivi relativi a richieste, stato dei rilasci, cronologia delle modifiche, output, movimenti delle merci, fogli di entrata servizi, fatture, pagamenti e compensazione devono essere configurati in base alla release SAP S/4HANA e al modello dati attivo.
- Identificativo del case: utilizzi PurchaseOrderNumber come identificativo del case. Gli eventi a livello di articolo devono essere associati al numero dell’ordine di acquisto, mentre i riferimenti agli articoli devono essere conservati in una colonna aggiuntiva specifica della fonte, se necessario.
- Intervallo di date: inizi con un periodo da tre a sei mesi. Per i caricamenti storici, elabori finestre più brevi e riconcili i limiti sovrapposti 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 azienda e tipo di documento devono utilizzare valori validi nel sistema di destinazione.
- Semantica degli eventi: creazione ed eliminazione possono essere esplicite quando sono disponibili i relativi campi o log dei documenti. Approvazione e completamento sono eventi basati sullo stato e richiedono timestamp di stato configurati. Non crei righe basandosi esclusivamente su uno stato corrente privo di un timestamp dell’evento adeguatamente documentato.
- Prestazioni: applichi tempestivamente i filtri sulle date degli eventi e sull’ambito organizzativo, aggreghi EKPO prima dei join con le fonti degli eventi quando possibile ed esegua i caricamenti storici di grandi dimensioni in finestre temporali. Verifichi la presenza di statistiche adeguate nel database ed eviti join senza restrizioni tra fonti di articoli, contabilità e cronologia delle modifiche.
- Timestamp di aggiornamento: imposti LastDataUpdate sul timestamp di esecuzione dell’estrazione per ogni riga del caricamento.
- Prerequisiti: i prerequisiti necessari includono la connettività SAP HANA, l’autorizzazione di lettura per tutti gli oggetti di origine configurati, l’accesso ai dati pertinenti di 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 della fonte racchiuso tra parentesi quadre nella query con una tabella, vista, colonna o espressione approvata del sistema SAP S/4HANA di destinazione. Non esponga le credenziali nella query o nella configurazione dell’estrazione.
a 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
- Specifica e progettazione: definisca la struttura dati finale del file di event log, includendo tutti gli attributi obbligatori e consigliati. Documenti le tabelle SAP specifiche, ad esempio EKKO, EKPO, EKBE, CDHDR, CDPOS e BKPF, che verranno utilizzate per acquisire i dati relativi a ciascuna delle 13 attività richieste.
- Creazione del programma: nella SAP GUI, acceda all’ABAP Editor tramite il codice transazione SE38 o SE80. Crei un nuovo programma eseguibile, ad esempio Z_PM_PO_EXTRACT.
- Definizione della schermata di selezione: codifichi la schermata di selezione del report. Questa consente agli utenti di filtrare i dati da estrarre. Includa parametri per l’intervallo di date di creazione dell’ordine di acquisto (P_AEDAT), il codice azienda (P_BUKRS) e il tipo di documento di acquisto (P_BSART).
- Dichiarazione dei dati: definisca le tabelle interne e le strutture dati necessarie per il programma. Ciò include una tabella interna per l’event log finale, corrispondente alla struttura definita nella fase di specifica.
- Implementazione della logica di selezione dei dati: scriva la logica ABAP principale per selezionare i dati relativi a ciascuna delle 13 attività. Ciò comporta una serie di istruzioni SELECT sulle tabelle SAP pertinenti, con join ove necessario. Per gli eventi basati sulle modifiche, legga le tabelle del change log CDHDR e CDPOS.
- Trasformazione e mappatura dei dati: per ogni record recuperato, associ i campi delle tabelle SAP alle colonne corrispondenti nella 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 coerente per EventTime.
- Consolidamento dei dati degli eventi: dopo aver elaborato tutti i 13 tipi di attività, verifichi che tutti i dati siano raccolti in un’unica tabella interna unificata. Questa tabella rappresenta ora l’event log completo degli ordini di acquisto selezionati.
- Implementazione dell’output su file: aggiunga la funzionalità per scrivere la tabella interna finale in un file. L’approccio consigliato consiste nell’utilizzare il metodo cl_gui_frontend_services=>gui_download per consentire agli utenti di salvare il file come CSV sul proprio computer oppure OPEN DATASET per salvarlo sul 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 grandi volumi di dati 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 efficacemente i dati. I filtri principali includono:
- 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 azienda (BUKRS): essenziale per le organizzazioni con più entità giuridiche, consente di restringere l’ambito dell’estrazione.
- Tipo di documento di acquisto (BSART): consente di filtrare tipi specifici di ordini di acquisto, come Standard PO, Framework Order o Stock Transport Order, per concentrare l’analisi.
- Lettura del change log: l’estrazione di attività come 'Purchase Order Approved' o 'Purchase Order Changed' si basa sulla lettura delle tabelle SAP del change log (CDHDR, CDPOS). Questa operazione può richiedere molte risorse. La logica ABAP deve essere ottimizzata per selezionare solo le classi oggetto necessarie (EINKBELEG, BANF) e le combinazioni di tabella e campo pertinenti.
- Autorizzazioni: l’utente o l’account tecnico che esegue il report necessita di ampie autorizzazioni di lettura per le tabelle di diversi 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 alcuni mesi di dati o che vengono eseguite in un sistema con un elevato volume di transazioni, esegua sempre il programma in background per evitare timeout dei processi dialog.
a 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 per iniziare?
Questo Template offre una base solida per il Suo percorso nel Process Mining. Inizi oggi stesso a utilizzare i dati di SAP S/4HANA per individuare le opportunità di efficienza e trasformare il Suo processo Purchase to Pay.
Ottimizzi il Suo ordine di acquisto P2P: riduca subito il tempo di ciclo
Elimini le inefficienze e riduca del 30% il tempo di ciclo del Suo ordine di acquisto P2P.
Non è richiesta alcuna carta di credito. Configuri tutto in pochi minuti.