Il Suo Template dati Purchase to Pay - Purchase Order
Il Suo Template dati Purchase to Pay - Purchase Order
- Attributi consigliati da raccogliere
- Attività chiave da monitorare
- Indicazioni per l'estrazione da SAP ECC
Purchase to Pay - Purchase Order: attributi
| Nome | Descrizione | ||
|---|---|---|---|
| Attività Activity | Il nome dello specifico evento o passaggio aziendale che si è verificato durante il ciclo di vita dell'ordine di acquisto. | ||
| Descrizione Questo attributo descrive un singolo passaggio del processo, come «Ordine di acquisto creato», «Ordine di acquisto approvato» o «Entrata merci registrata». La sequenza di queste attività costituisce il flusso di processo per ogni ordine di acquisto. Analizzare la sequenza, la frequenza e la durata tra le attività è il fulcro del Process Mining. Aiuta a individuare colli di bottiglia, cicli di rilavorazione e deviazioni dal processo standard, consentendo miglioramenti mirati e iniziative di standardizzazione. Perché è importante Le attività definiscono i passaggi del processo. Analizzarne la sequenza e la tempistica rivela il flusso effettivo del processo, i colli di bottiglia e le deviazioni. Dove reperirlo Derivato da diverse tabelle SAP e dai log delle transazioni, come CDHDR/CDPOS per le modifiche, EKBE per GR/IR ed EBAN per le richieste. Spesso richiede una logica personalizzata o un programma di estrazione dedicato per essere generato. Esempi Ordine di acquisto creatoOrdine di acquisto approvatoEntrata merci registrata | |||
| Ora dell'evento EventTime | La data e l'ora precise in cui si è verificata l'attività. | ||
| Descrizione Questo timestamp indica il momento esatto in cui si è verificato un evento, ad esempio quando è stato approvato un PO o registrata un'entrata merci. Fornisce l'ordine cronologico di tutte le attività all'interno di un caso. I timestamp sono fondamentali per il Process Mining, poiché consentono tutte le analisi basate sul tempo. Tra queste rientrano il calcolo dei tempi di ciclo tra le attività, l'individuazione dei ritardi, l'analisi della produttività del processo e la misurazione delle prestazioni rispetto agli accordi sul livello di servizio, SLA. Perché è importante Questo timestamp è fondamentale per calcolare tutte le metriche basate sulla durata, come i tempi di ciclo e i colli di bottiglia, e per ordinare cronologicamente gli eventi. Dove reperirlo Derivato da diversi campi di data e ora nelle tabelle SAP, come EKKO-AEDAT, data di modifica, CDHDR-UDATE/UTIME, timestamp del log delle modifiche, o EKBE-BUDAT, data di registrazione. Esempi 2023-04-15T10:05:31Z2023-04-16T14:22:00Z2023-05-01T09:00:15Z | |||
| Ordine di acquisto PurchaseOrder | L'identificativo univoco del documento dell'ordine di acquisto, che funge da caso principale per monitorare il processo di approvvigionamento. | ||
| Descrizione Il numero dell'ordine di acquisto è l'identificativo centrale che collega tutte le attività, dalla creazione alla registrazione finale dell'entrata merci e al completamento. Ogni numero di PO univoco rappresenta una singola istanza del processo di approvvigionamento. Nel Process Mining, questo attributo è essenziale per ricostruire il percorso completo di ogni acquisto. Consente di analizzare in dettaglio i tempi di ciclo, le variazioni del processo e i controlli di Conformità per ogni singolo ordine, costituendo la base dell'intero modello di processo. Perché è importante È l'identificativo principale che collega tutti gli eventi correlati, rendendo possibile analizzare l'intero ciclo di vita di ogni singolo ordine di acquisto. Dove reperirlo Tabella: EKKO, Campo: EBELN Esempi 450001762345000176244500017625 | |||
| Gruppo merci MaterialGroup | Una classificazione utilizzata per raggruppare materiali o servizi con caratteristiche simili. | ||
| Descrizione Il gruppo merci, o categoria di acquisto, viene utilizzato per classificare il tipo di beni o servizi acquistati. Tra gli esempi rientrano «Hardware IT», «Forniture per ufficio» o «Servizi professionali». Questo attributo è fondamentale per l'analisi della spesa e la comprensione dei modelli di approvvigionamento. Consente di filtrare il processo per analizzare come vengono gestite le diverse categorie, chi le approva e quali fornitori le forniscono. È una dimensione chiave della Dashboard «Purchase Order Value Analysis». Perché è importante Consente di segmentare il processo per categoria di prodotto o servizio, evidenziando comportamenti, tempi di ciclo o fornitori differenti per i diversi tipi di spesa. Dove reperirlo Tabella: EKPO, Campo: MATKL Esempi 00101IT_HWCONSULT | |||
| Importo dell'ordine OrderAmount | Il valore monetario totale della posizione dell'ordine di acquisto. | ||
| Descrizione Questo attributo rappresenta il valore totale di una specifica posizione dell'ordine di acquisto, calcolato moltiplicando la quantità per il prezzo netto. Per ottenere il valore complessivo del PO, è necessario aggregare gli importi delle posizioni. Analizzare il processo in base all'importo dell'ordine è fondamentale per individuare le transazioni di valore elevato, che potrebbero richiedere controlli più rigorosi o percorsi di approvazione differenti. Questo attributo alimenta la Dashboard «Purchase Order Value Analysis» e aiuta a dare priorità agli interventi di miglioramento sui processi con maggiore rilevanza finanziaria. Perché è importante Quantifica l'impatto finanziario di ogni acquisto, consentendo analisi basate sul valore per dare priorità agli ordini di importo elevato o individuare opportunità di risparmio. Dove reperirlo Tabella: EKPO, Campo: NETWR, valore netto dell'ordine. Esempi 1500.00250.7512345.50 | |||
| Nome utente UserName | L'ID utente della persona che ha eseguito l'attività. | ||
| Descrizione Questo attributo acquisisce il nome utente SAP del dipendente che ha creato, modificato o approvato un documento. Per i passaggi automatizzati, può mostrare l'ID di un utente di sistema o batch. L'analisi per utente aiuta a individuare esigenze formative, persone con prestazioni elevate o potenziali problemi di Conformità. È fondamentale per creare Dashboard relative alla distribuzione del carico di lavoro, alla Conformità della matrice di approvazione e alla comprensione delle prestazioni di team o singoli individui. Perché è importante Attribuisce le azioni degli utenti a persone specifiche, consentendo di analizzare le prestazioni, il carico di lavoro e il rispetto dei protocolli di Conformità. Dove reperirlo Tabella: EKKO, Campo: ERNAM, creato da; Tabella: CDHDR, Campo: USERNAME, modificato da. Esempi JSMITHMBROWNBATCH_USER | |||
| Numero fornitore VendorNumber | L'identificativo univoco del fornitore. | ||
| Descrizione È il codice che identifica univocamente il fornitore dal quale vengono acquistati i beni o i servizi. Costituisce un elemento fondamentale dei dati anagrafici nel processo di approvvigionamento. Questo attributo è essenziale per l'analisi incentrata sui fornitori. Consente di valutare le prestazioni di consegna, confrontare i tempi di consegna tra diversi fornitori e analizzare i modelli di spesa. È la dimensione principale della Dashboard «Vendor Delivery Performance». Perché è importante Consente di analizzare le prestazioni dei fornitori, aiutando a individuare quelli affidabili e quelli che causano ritardi o problemi di qualità. Dove reperirlo Tabella: EKKO, Campo: LIFNR Esempi 100345V-20598700112 | |||
| Società CompanyCode | L'identificativo dell'entità giuridica o della società che avvia l'acquisto. | ||
| Descrizione La società rappresenta un'entità giuridica indipendente in SAP. Tutte le transazioni vengono registrate a livello di società, che costituisce quindi un'unità organizzativa fondamentale. Analizzare il processo per società consente di confrontare l'efficienza e la Conformità degli approvvigionamenti tra diverse unità aziendali o Paesi. Aiuta a individuare le best practice di un'entità che potrebbero essere replicate altrove oppure a identificare le unità che incontrano difficoltà nel processo. Perché è importante Rappresenta l'entità giuridica e consente di confrontare le prestazioni del processo e verificare la Conformità tra diverse aree dell'organizzazione. Dove reperirlo Tabella: EKKO, Campo: BUKRS Esempi 10002100US01 | |||
| Tipo di documento DocumentType | Un codice che classifica i diversi tipi di ordini di acquisto. | ||
| Descrizione Il tipo di documento è una configurazione SAP che controlla l'intervallo di numerazione, la selezione dei campi e il flusso complessivo del processo per un ordine di acquisto. Ad esempio, possono esistere tipi diversi per i PO standard, i PO relativi a servizi o gli ordini di trasferimento delle scorte. Questo attributo è una dimensione potente per l'analisi, poiché tipi di documento diversi seguono spesso processi intenzionalmente differenti. Filtrare per tipo di documento consente un confronto più accurato tra tempi di ciclo e flussi di processo realmente omogenei. Perché è importante Distingue i diversi tipi di processo di acquisto, ad esempio standard, servizi o resi, che spesso presentano percorsi e aspettative di prestazione differenti. Dove reperirlo Tabella: EKKO, Campo: BSART Esempi NBFOUB | |||
| Consegna puntuale IsOnTimeDelivery | Indicatore che segnala se le merci sono state ricevute entro o prima della data di consegna richiesta. | ||
| Descrizione Questo attributo booleano è vero se il timestamp dell'attività 'Goods Receipt Posted' è uguale o precedente alla 'Requested Delivery Date'. Fornisce un esito chiaro e binario delle prestazioni di consegna per ogni riga dell'ordine di acquisto. Questo attributo costituisce la base del KPI 'On-Time Goods Receipt Rate'. Semplifica l'analisi delle prestazioni dei fornitori e dell'efficienza interna nella ricezione, consentendo di aggregare e filtrare facilmente le consegne puntuali e quelle in ritardo. Perché è importante Fornisce una metrica chiara di successo o insuccesso della puntualità delle consegne e supporta direttamente i KPI e le Dashboard sulle prestazioni dei fornitori. Dove reperirlo Si tratta di un attributo calcolato confrontando la data di registrazione della ricezione merci (EKBE-BUDAT) con la data di consegna richiesta (EKPO-EINDT). Esempi truefalse | |||
| Data di consegna richiesta RequestedDeliveryDate | La data entro la quale l'azienda ha richiesto al fornitore di consegnare i beni o i servizi. | ||
| Descrizione È la data di consegna obiettivo specificata nell'ordine di acquisto. Costituisce il riferimento rispetto al quale vengono misurate le prestazioni effettive di consegna. Questa data è essenziale per calcolare il KPI «On-Time Goods Receipt Rate». Confrontando la data effettiva dell'entrata merci con quella richiesta, le organizzazioni possono misurare quantitativamente l'affidabilità del fornitore e l'efficienza interna nella ricezione, fornendo un supporto diretto alla Dashboard «Vendor Delivery Performance». Perché è importante È la data obiettivo della consegna, essenziale per calcolare i KPI relativi alla puntualità e valutare l'affidabilità del fornitore. Dove reperirlo Tabella: EKPO, Campo: EINDT Esempi 2023-06-102023-07-222023-08-01 | |||
| Gruppo acquisti PurchasingGroup | L'acquirente specifico o il gruppo di acquirenti responsabile dell'attività di approvvigionamento. | ||
| Descrizione Il gruppo acquisti rappresenta la persona o il team di acquirenti responsabile di una determinata attività di acquisto. Costituisce il principale punto di contatto per i fornitori. Questo attributo offre un livello di analisi più granulare rispetto all'organizzazione acquisti. Aiuta a comprendere la distribuzione del carico di lavoro tra gli acquirenti e a individuare differenze di prestazione a livello individuale, fornendo indicazioni utili per l'allocazione delle risorse e le iniziative formative. Perché è importante Offre una visione granulare del responsabile di un acquisto, consentendo un'analisi dettagliata del carico di lavoro e delle prestazioni a livello di acquirente o team. Dove reperirlo Tabella: EKKO, Campo: EKGRP Esempi 001002N01 | |||
| Modifica successiva all'approvazione IsPostApprovalChange | Indicatore che segnala se una modifica all'ordine di acquisto è avvenuta dopo l'approvazione iniziale. | ||
| Descrizione Questo attributo booleano è vero se viene rilevata un'attività 'Purchase Order Changed' dopo un'attività 'Purchase Order Approved' per lo stesso ordine di acquisto. Consente di isolare le modifiche problematiche che si verificano nelle fasi avanzate del processo. Questo campo calcolato supporta direttamente il KPI 'Post-Approval PO Change Rate' e la Dashboard 'Purchase Order Rework and Changes'. Consente di quantificare ed evidenziare le modifiche disruptive che possono causare ritardi e richiedere una nuova approvazione, indicando possibili problemi nella specifica iniziale o nella definizione dell'ambito. Perché è importante Misura direttamente il rework successivo all'approvazione, un KPI fondamentale per la stabilità e l'efficienza del processo. Valori elevati indicano problemi nella definizione dei requisiti a monte. Dove reperirlo Si tratta di un attributo calcolato, derivato dalla sequenza delle attività nell'event log. Esempi truefalse | |||
| Motivo del rifiuto RejectionReason | Il codice o il testo che spiega perché una richiesta di acquisto o un ordine di acquisto è stato rifiutato. | ||
| Descrizione Questo attributo registra il motivo specifico indicato quando un ordine di acquisto viene rifiutato durante il Workflow di approvazione. Queste informazioni sono fondamentali per comprendere le cause alla radice del rework e dei ritardi. L'analisi dei motivi di rifiuto aiuta a individuare problemi ricorrenti, come prezzi errati, superamento del budget o selezione di fornitori non conforme. Queste informazioni consentono all'azienda di intervenire sulle cause alla radice, migliorare la qualità della creazione iniziale dell'ordine di acquisto e rendere più efficiente il processo di approvazione. Perché è importante Fornisce informazioni dirette sul motivo per cui le approvazioni non vanno a buon fine, consentendo miglioramenti mirati per ridurre il rework e abbreviare i tempi del ciclo di approvazione. Dove reperirlo Queste informazioni possono essere difficili da individuare. Potrebbero essere memorizzate in campi di testo esteso o dipendere dalla configurazione personalizzata del Workflow. Spesso è necessaria una conoscenza specifica dell'implementazione. Esempi Prezzo erratoBudget superatoRichiesta duplicata | |||
| Nome fornitore VendorName | La denominazione legale del fornitore. | ||
| Descrizione Il nome descrittivo del fornitore, più intuitivo del numero fornitore. Generalmente proviene dai dati anagrafici dei fornitori. Mentre il numero fornitore viene utilizzato per i join e l'identificazione univoca, il nome fornitore è fondamentale per le Dashboard e i report destinati agli utenti. Rende le analisi più intuitive e accessibili agli utenti aziendali che potrebbero non conoscere i codici dei fornitori. Perché è importante Fornisce un nome leggibile del fornitore, rendendo Dashboard e report molto più semplici da comprendere per gli utenti aziendali. Dove reperirlo Tabella: LFA1, Campo: NAME1. È necessario un join da EKKO-LIFNR a LFA1-LIFNR. Esempi Staples Inc.Global Tech SolutionsOffice Supply Co. | |||
| Organizzazione acquisti PurchasingOrganization | L'unità organizzativa responsabile della negoziazione dei prezzi e dell'acquisto di materiali o servizi. | ||
| Descrizione L'organizzazione acquisti è un'unità organizzativa chiave in SAP, responsabile delle attività di approvvigionamento. Può essere centralizzata per l'intera azienda oppure decentralizzata per stabilimento o area geografica. Analizzare le prestazioni del processo per organizzazione acquisti aiuta a individuare i team di approvvigionamento più efficienti. Consente di confrontare metriche come tempi di ciclo, tassi di rilavorazione e costi tra diverse unità organizzative, mettendo in evidenza le best practice e le aree che necessitano di supporto. Perché è importante Identifica il team di approvvigionamento responsabile, consentendo confronti delle prestazioni e analisi tra diverse unità organizzative. Dove reperirlo Tabella: EKKO, Campo: EKORG Esempi 1000US01DE01 | |||
| Richiesta d’acquisto PurchaseRequisition | L'identificativo della richiesta di acquisto che ha preceduto l'ordine di acquisto. | ||
| Descrizione Questo attributo collega l'ordine di acquisto alla richiesta di acquisto da cui ha avuto origine. Non tutti i PO sono preceduti da una richiesta. Il collegamento è fondamentale per analizzare la Dashboard «Requisition to Order Conversion» e il KPI «PR to PO Conversion Rate». Consente di misurare l'efficienza del processo a monte, dalla richiesta iniziale alla creazione di un ordine formale, e di individuare i PO creati senza una richiesta, in violazione della Conformità. Perché è importante Collega il PO alla richiesta di origine, consentendo di analizzare il processo di conversione da PR a PO e individuare i PO creati senza una richiesta precedente. Dove reperirlo Tabella: EKPO, Campo: BANFN Esempi 1001589010015891 | |||
| Sistema di origine SourceSystem | Il sistema dal quale sono stati estratti i dati. | ||
| Descrizione Questo attributo identifica l'origine dei dati, che generalmente corrisponde all'identificativo di un'istanza SAP ECC, ad esempio «ECC_PROD_100». Negli ambienti con più sistemi, aiuta a distinguere le diverse fonti di dati. Per la governance e la tracciabilità dei dati, conoscere il sistema di origine è fondamentale. Garantisce l'integrità dei dati e facilita la risoluzione dei problemi di estrazione o qualità, soprattutto quando i dati vengono uniti tra diversi sistemi ERP o moduli. Perché è importante Identifica l'origine dei dati, un elemento fondamentale per la governance dei dati, la convalida e la gestione delle analisi tra più sistemi. Dove reperirlo Si tratta generalmente di un valore statico aggiunto durante il processo di estrazione dei dati per contrassegnare il dataset con il relativo sistema di origine. Esempi SAP_ECC_PRODECC_EU_100S4H_FIN | |||
| Stabilimento Plant | La sede fisica o lo stabilimento presso cui devono essere consegnati i beni. | ||
| Descrizione Lo stabilimento è un'unità organizzativa che rappresenta un impianto produttivo, un magazzino o un'altra sede in cui vengono ricevuti beni o servizi. Analizzare i dati per stabilimento aiuta a comprendere le differenze geografiche nel processo di approvvigionamento. Può evidenziare variazioni nei tempi di consegna dei fornitori verso determinate sedi o mettere in luce stabilimenti con processi di ricezione inefficienti, supportando l'analisi della puntualità nella registrazione dell'entrata merci. Perché è importante Specifica il luogo di consegna, utile per analizzare le differenze regionali del processo e le prestazioni logistiche. Dove reperirlo Tabella: EKPO, Campo: WERKS Esempi 100011002000 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Il timestamp che indica quando i dati sono stati aggiornati l'ultima volta dal sistema di origine. | ||
| Descrizione Questo attributo registra la data e l'ora dell'estrazione o dell'aggiornamento più recente dei dati. Fornisce il contesto relativo all'attualità dei dati analizzati. Visualizzare queste informazioni nelle Dashboard è fondamentale per consentire agli utenti di capire se gli insight si basano su dati quasi in tempo reale o su un'istantanea storica. In questo modo si gestiscono le aspettative degli utenti e si garantisce che le decisioni vengano prese sulla base di dati di cui si conosce l'età. Perché è importante Informa gli utenti sull'attualità dei dati, assicurando che comprendano se l'analisi riflette lo stato operativo più recente. Dove reperirlo Questo timestamp viene generato e aggiunto dal processo di estrazione dei dati o ETL al momento dell'esecuzione. Esempi 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Valuta Currency | Il codice della valuta dell'importo dell'ordine di acquisto. | ||
| Descrizione Questo attributo specifica la valuta in cui è espresso il valore dell'ordine di acquisto, ad esempio USD, EUR o GBP. Fornisce il contesto essenziale per tutti i valori monetari. Per le organizzazioni internazionali, la valuta è fondamentale per un'analisi finanziaria corretta. Consente di aggregare e confrontare correttamente i valori degli ordini; tutti i KPI monetari devono essere interpretati nel contesto della relativa valuta. Perché è importante Fornisce il contesto necessario per tutti i valori monetari, garantendo un'analisi finanziaria accurata, soprattutto nelle organizzazioni multinazionali. Dove reperirlo Tabella: EKKO, Campo: WAERS Esempi USDEURJPY | |||
Purchase to Pay - Purchase Order: attività
| Attività | Descrizione | ||
|---|---|---|---|
| Entrata merci registrata | Questa attività indica la ricezione fisica dei beni da parte del fornitore in relazione a uno specifico ordine di acquisto. La registrazione dell'entrata merci è un'azione esplicita, ad esempio tramite la transazione MIGO, che crea un documento materiale e aggiorna le scorte. | ||
| Perché è importante È una tappa fondamentale per monitorare le prestazioni di consegna del fornitore e l'avvio del processo di verifica delle fatture. Viene utilizzata per calcolare i tassi di puntualità delle consegne e la tempestività della registrazione dell'entrata merci. Dove reperirlo Viene registrato alla creazione di un documento materiale. Il timestamp dell'evento è la data di registrazione, MKPF-BUDAT, oppure la data di creazione, MKPF-CPUDT, della tabella di testata dei documenti materiali, MKPF, collegata al PO tramite la tabella di dettaglio, MSEG. Acquisizione Utilizzare il timestamp di registrazione o creazione della tabella MKPF per i documenti materiali che fanno riferimento al PO. Tipo di evento explicit | |||
| Ordine di acquisto approvato | Rappresenta l'approvazione finale dell'ordine di acquisto, che ne autorizza l'invio al fornitore. Questa tappa fondamentale viene generalmente dedotta dalla modifica dello stato di rilascio del PO a uno stato di rilascio completo o di approvazione. | ||
| Perché è importante Questa attività è essenziale per calcolare il KPI relativo al tempo del ciclo di approvazione del PO e individuare i colli di bottiglia nel Workflow di approvazione. Costituisce un prerequisito per la maggior parte delle attività successive, come l'invio dell'ordine al fornitore. Dove reperirlo Viene dedotto monitorando i log delle modifiche, CDHDR/CDPOS, della tabella di testata dell'ordine di acquisto, EKKO, per individuare il momento in cui viene applicato il codice di rilascio finale o in cui l'indicatore dello stato di rilascio complessivo, EKKO-FRGKE, viene impostato su «rilasciato». Acquisizione Individuare il timestamp in cui lo stato di rilascio complessivo del PO, EKKO-FRGKE, passa allo stato finale di approvazione. Tipo di evento inferred | |||
| Ordine di acquisto completato | Indica che una posizione dell'ordine di acquisto è considerata completamente consegnata. È un evento dedotto, generalmente ricavato dall'impostazione automatica o manuale dell'indicatore «Consegna completata» sulla posizione dell'ordine di acquisto. | ||
| Perché è importante Questa attività costituisce il punto finale logico della parte di evasione dell'ordine. È essenziale per calcolare il tempo complessivo del ciclo del PO, dalla creazione al completamento. Dove reperirlo Viene dedotto dai documenti di modifica, CDHDR/CDPOS, che registrano il momento in cui l'indicatore «Consegna completata», EKPO-ELIKZ, viene impostato su «X» per una posizione del PO. L'impostazione a completata dell'ultima posizione può indicare il completamento dell'intero PO. Acquisizione Individuare il timestamp nei documenti di modifica relativo all'impostazione del flag EKPO-ELIKZ. Tipo di evento inferred | |||
| Ordine di acquisto creato | Questa attività indica la creazione di un documento formale di ordine di acquisto, che costituisce un contratto vincolante con un fornitore. È un evento esplicito, registrato quando un utente crea e salva un ordine di acquisto, ad esempio tramite la transazione ME21N, generando voci nelle tabelle EKKO ed EKPO. | ||
| Perché è importante Segna l'avvio ufficiale del ciclo di vita dell'ordine di acquisto. Costituisce una tappa fondamentale per misurare sia il tempo di conversione da PR a PO sia il tempo complessivo di evasione dell'ordine. Dove reperirlo Viene acquisito dalla data di creazione, EKKO-AEDAT, nella tabella di testata degli ordini di acquisto, EKKO, per il numero di PO corrispondente, EKKO-EBELN. Acquisizione Utilizzare il timestamp di creazione della tabella EKKO per ogni nuovo ordine di acquisto. Tipo di evento explicit | |||
| Ordine di acquisto inviato al fornitore | Questa attività indica il momento in cui l'ordine di acquisto approvato viene trasmesso ufficialmente al fornitore, ad esempio tramite EDI, e-mail o stampa. È un evento esplicito, acquisito nelle tabelle di controllo dei messaggi quando un messaggio di output viene elaborato correttamente. | ||
| Perché è importante È una tappa fondamentale, poiché avvia il conteggio del tempo di consegna del fornitore. Analizzare il tempo che intercorre tra questo evento e la registrazione dell'entrata merci è essenziale per valutare le prestazioni del fornitore e la puntualità delle consegne. Dove reperirlo Viene registrato nella tabella degli stati dei messaggi, NAST. Il timestamp può essere ricavato da NAST-DATVR e NAST-UHRVR quando lo stato di elaborazione, NAST-VSTAT, è «1», ovvero elaborato correttamente, per il tipo di output PO pertinente. Acquisizione Utilizzare il timestamp di elaborazione della tabella NAST per il messaggio di output del PO. Tipo di evento explicit | |||
| Richiesta di acquisto creata | Questa attività indica la creazione di una richiesta formale di beni o servizi. Si tratta di un evento esplicito, acquisito quando un utente salva un nuovo documento di richiesta di acquisto, utilizzando transazioni come ME51N, con la conseguente generazione di un record univoco nella tabella EBAN. | ||
| Perché è importante È il principale punto di avvio del processo di approvvigionamento. Analizzare il tempo che intercorre tra questo evento e la creazione dell'ordine di acquisto consente di misurare l'efficienza con cui la domanda interna viene trasformata in ordini operativi. Dove reperirlo Viene registrato alla creazione di una voce nella tabella di testata delle richieste di acquisto, EBAN. La data di creazione, EBAN-BADAT, e l'ora costituiscono il timestamp dell'evento. Acquisizione Individuare le nuove voci nella tabella EBAN in base alla data di creazione. Tipo di evento explicit | |||
| Approvazione dell'ordine di acquisto richiesta | Indica che un ordine di acquisto creato o modificato è stato sottoposto ad approvazione secondo la strategia di rilascio configurata. L'evento viene dedotto quando la strategia di rilascio viene attivata e il PO entra in uno stato di approvazione in sospeso. | ||
| Perché è importante Distinguere tra la creazione del PO e l'avvio del processo di approvazione consente di misurare con precisione il KPI relativo al tempo del ciclo di approvazione. In questo modo è possibile evidenziare eventuali ritardi prima dell'avvio del Workflow di approvazione. Dove reperirlo Viene dedotto dai documenti di modifica, CDHDR/CDPOS, relativi all'ordine di acquisto, oggetto EINKBELEG, che mostrano l'impostazione iniziale di uno stato di rilascio, oppure quando lo stato di rilascio complessivo, EKKO-FRGKE, viene impostato per la prima volta su un valore che indica l'attivazione di un processo di approvazione. Acquisizione Individuare la prima voce del documento di modifica che attiva la strategia di rilascio del PO. Tipo di evento inferred | |||
| Beni restituiti | Rappresenta la restituzione al fornitore di beni precedentemente ricevuti, spesso a causa di problemi di qualità o di spedizioni errate. È un evento esplicito, acquisito tramite la registrazione di un documento materiale con un tipo di movimento specifico per i resi. | ||
| Perché è importante Questa attività evidenzia problemi nella qualità del fornitore o nella correttezza dell'ordine ed è un indicatore importante della rilavorazione del processo. È fondamentale per calcolare il KPI Goods Receipt Variance Rate. Dove reperirlo Viene registrato nelle tabelle dei documenti materiali, MKPF/MSEG, quando viene utilizzato un tipo di movimento per reso, ad esempio «122» per la restituzione al fornitore. La data di registrazione, MKPF-BUDAT, costituisce il timestamp. Acquisizione Individuare i documenti materiali con un tipo di movimento per reso, ad esempio 122, che fanno riferimento al PO originale. Tipo di evento explicit | |||
| Conferma dei servizi inserita | Per gli ordini di acquisto relativi a servizi, questa attività rappresenta la conferma dell'avvenuta erogazione dei servizi. È un evento esplicito, acquisito tramite la creazione di un Service Entry Sheet, ad esempio mediante la transazione ML81N. | ||
| Perché è importante È l'equivalente dell'entrata merci per i servizi ed è essenziale per monitorare l'evasione degli ordini di servizio. Attiva il processo finanziario per il pagamento dei servizi. Dove reperirlo Viene acquisito dalla data di creazione, ESSR-ERDAT, nella tabella di testata dei Service Entry Sheet, ESSR. Il collegamento all'ordine di acquisto si trova nella tabella ESLL. Acquisizione Utilizzare il timestamp di creazione della tabella ESSR per i Service Entry Sheet collegati al PO. Tipo di evento explicit | |||
| Ispezione qualità eseguita | Indica che i beni ricevuti sono stati sottoposti a un'ispezione di qualità. Questa attività viene generalmente dedotta quando, per un lotto di ispezione creato al momento dell'entrata merci, viene presa una decisione d'uso nel modulo Quality Management. | ||
| Perché è importante Nei settori in cui la qualità è fondamentale, questa attività aiuta ad analizzare la durata e gli esiti del processo di ispezione. I ritardi in questa fase possono creare colli di bottiglia tra la ricezione dei beni e la loro disponibilità per l'utilizzo. Dove reperirlo Viene dedotto dal modulo Quality Management. Un lotto di ispezione viene creato nella tabella QALS al momento dell'entrata merci e l'attività è contrassegnata dalla creazione di una decisione d'uso nella tabella QAVE, che include un timestamp. Acquisizione Individuare il timestamp della decisione d'uso nella tabella QAVE per il lotto di ispezione collegato al documento materiale. Tipo di evento inferred | |||
| Ordine di acquisto eliminato | Rappresenta l'annullamento o l'eliminazione logica di una posizione dell'ordine di acquisto, impedendo ulteriori elaborazioni come la registrazione dell'entrata merci o la fatturazione. È un evento dedotto, acquisito quando l'indicatore di eliminazione viene impostato sulla posizione del PO. | ||
| Perché è importante È un'attività terminale che indica l'annullamento di un ordine. Analizzare perché e quando gli ordini vengono eliminati può far emergere problemi nella pianificazione della domanda o nella selezione dei fornitori. Dove reperirlo Viene dedotto dai documenti di modifica, CDHDR/CDPOS, che mostrano l'impostazione su «L» dell'indicatore di eliminazione, EKPO-LOEKZ, per una posizione dell'ordine di acquisto. Acquisizione Individuare il timestamp nei documenti di modifica relativo all'impostazione del flag EKPO-LOEKZ. Tipo di evento inferred | |||
| Ordine di acquisto modificato | Rappresenta qualsiasi modifica apportata a un ordine di acquisto dopo la sua creazione iniziale, ad esempio a quantità, prezzo o date di consegna. Queste modifiche vengono registrate esplicitamente nel sistema dei documenti di modifica SAP. | ||
| Perché è importante Modifiche frequenti, soprattutto dopo l'approvazione, indicano inefficienze di processo, una pianificazione iniziale inadeguata o un ampliamento dell'ambito. Questa attività è essenziale per la Dashboard PO Rework and Changes e per i KPI correlati. Dove reperirlo Viene registrato esplicitamente nelle tabelle di testata e di dettaglio dei documenti di modifica, CDHDR e CDPOS, per l'oggetto ordine di acquisto, EINKBELEG. Ogni modifica genera una nuova voce con il relativo timestamp. Acquisizione Estrarre gli eventi di modifica e i relativi timestamp dalle tabelle CDHDR e CDPOS collegate al numero dell'ordine di acquisto. Tipo di evento explicit | |||
| Ordine di acquisto rifiutato | Questa attività si verifica quando un approvatore rifiuta un ordine di acquisto durante il Workflow di approvazione. È un evento dedotto, ricavato dalla modifica dello stato nei dati della strategia di rilascio del PO, che indica l'avvenuto rifiuto. | ||
| Perché è importante Monitorare i rifiuti aiuta a individuare problemi nella qualità dei dati del PO, nella mancata Conformità alle politiche o nella matrice di approvazione. Spesso comporta attività di rilavorazione e aumenta la durata complessiva del ciclo. Dove reperirlo Viene dedotto dai documenti di modifica, CDHDR/CDPOS, relativi allo stato di rilascio dell'ordine di acquisto. Un rifiuto viene generalmente registrato quando un codice di rilascio viene annullato o viene impostato uno specifico stato di rifiuto. Acquisizione Monitorare i log delle modifiche per individuare l'annullamento di un codice di rilascio o una modifica dello stato che indichi un rifiuto. Tipo di evento inferred | |||
| Richiesta di acquisto approvata | Rappresenta l'approvazione formale di una richiesta di acquisto, che ne autorizza la conversione in un ordine di acquisto. L'evento viene dedotto dalle modifiche ai campi dello stato di rilascio nei dati della richiesta di acquisto, monitorate tramite il Workflow della strategia di rilascio SAP. | ||
| Perché è importante Monitorare le approvazioni è fondamentale per individuare i colli di bottiglia nella fase precedente all'ordine e garantire la Conformità alle politiche di approvazione. I ritardi in questa fase incidono direttamente sulla durata complessiva del ciclo di approvvigionamento. Dove reperirlo Viene dedotto dai log delle modifiche della tabella delle richieste di acquisto, EBAN, monitorando in particolare le modifiche ai campi dello stato di rilascio, ad esempio EBAN-FRGZU, oppure analizzando i documenti di modifica in CDHDR/CDPOS per l'oggetto EBAN. Acquisizione Monitorare i documenti di modifica relativi ai campi dello stato di rilascio di EBAN per individuare il timestamp dell'approvazione finale. Tipo di evento inferred | |||
Guide all'estrazione
Passaggi
- Crei il programma ABAP: apra l'ABAP Editor utilizzando il codice transazione SE38. Inserisca un nome per il nuovo programma, ad esempio Z_PM_PO_EXTRACT, e faccia clic su 'Create'. Inserisca un titolo come 'Process Mining PO Data Extraction' e imposti il tipo su 'Executable Program'.
- Definisca la schermata di selezione: nel programma, definisca i parametri della schermata di selezione. In questo modo gli utenti potranno filtrare i dati da estrarre. I parametri principali includono l'intervallo di date di creazione del Purchase Order, il Company Code (BUKRS) e il Purchasing Document Type (BSART).
- Definisca le strutture dati: dichiari una struttura di tabella interna che corrisponda al formato finale dell'event log. La struttura deve includere tutti gli attributi obbligatori e consigliati: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode e DocumentType.
- Implementi la logica di selezione dei dati: scriva la logica ABAP principale per selezionare i dati relativi alle 14 attività obbligatorie. Ciò richiede interrogazioni su più tabelle SAP, tra cui EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS e NAST. Utilizzi una subroutine separata (PERFORM) per ogni attività, così da mantenere il codice organizzato.
- Selezioni i dati delle richieste di acquisto: interroghi la tabella EBAN per gli eventi 'Purchase Requisition Created', collegandoli ai Purchase Order tramite la tabella EKPO. Utilizzi le tabelle del registro delle modifiche (CDHDR, CDPOS) per identificare gli eventi 'Purchase Requisition Approved', monitorando le variazioni nei campi dello stato di rilascio.
- Selezioni gli eventi principali del Purchase Order: interroghi le tabelle EKKO ed EKPO per l'evento 'Purchase Order Created'. Utilizzi le tabelle del registro delle modifiche (CDHDR, CDPOS) sull'oggetto EINKBELEG per estrarre gli eventi 'Purchase Order Changed', 'Purchase Order Approved', 'Purchase Order Rejected', 'Purchase Order Completed' e 'Purchase Order Deleted', sulla base delle variazioni a campi specifici come gli indicatori di rilascio e gli indicatori di cancellazione.
- Selezioni gli eventi di comunicazione del PO: interroghi la tabella NAST per individuare i record in cui il PO è stato trasmesso correttamente, acquisendo l'attività 'Purchase Order Sent to Vendor'.
- Selezioni gli eventi relativi a merci e servizi: interroghi la tabella EKBE per individuare le registrazioni dei documenti materiali e identificare le attività 'Goods Receipt Posted' e 'Goods Returned' in base alla categoria del tipo di movimento. Interroghi ESSR ed ESLL per i service entry sheet, così da acquisire 'Services Confirmation Entered'.
- Selezioni gli eventi di Quality Management: se il modulo Quality Management è in uso, interroghi le tabelle QALS e QAVE per identificare il momento in cui è stata presa una decisione d'uso per un lotto di ispezione collegato a un PO, rappresentato dall'attività 'Quality Inspection Performed'.
- Combini e formatti i dati: consolidi i dati provenienti da tutte le selezioni individuali in un'unica tabella interna finale. Verifichi che il campo EventTime sia formattato in modo coerente, ad esempio YYYY-MM-DDTHH:MI:SS.
- Implementi il download del file: aggiunga la funzionalità per scaricare la tabella interna finale come file. Il formato consigliato è un file delimitato da tabulazioni o CSV, ottenibile tramite il function module GUI_DOWNLOAD.
- Esegua e salvi: esegua il programma tramite la transazione SE38 o SA38. Compili i criteri di selezione ed esegua il report. Quando richiesto, salvi il file di output sul computer locale con estensione .csv, pronto per il caricamento.
Configurazione
- Intervallo di date: è fondamentale definire un intervallo di date specifico per l'estrazione, generalmente basato sulla data di creazione del Purchase Order (EKKO-AEDAT). Un intervallo di 3-6 mesi è spesso un buon punto di partenza per bilanciare il volume dei dati e le informazioni ottenute sul processo.
- Company Code (BUKRS): filtri uno o più Company Code per limitare l'estrazione alle entità giuridiche pertinenti. Si tratta di un parametro importante per le prestazioni e la rilevanza dell'analisi.
- Purchasing Document Type (BSART): filtri i tipi di documento specifici, ad esempio 'NB' per il PO standard, per concentrarsi sui processi standard ed escludere, se necessario, tipologie di approvvigionamento speciali.
- Granularità dei dati: l'estrazione è progettata a livello di riga del Purchase Order. Il Case ID corrisponde al numero del Purchase Order (EBELN). Tutti gli eventi, compresi quelli a livello di riga come le ricezioni merci, vengono collegati a questo Case ID principale.
- Considerazioni sulle prestazioni: per dataset di grandi dimensioni, pianifichi l'esecuzione del programma come job in background (SM36), così da evitare errori di timeout. Verifichi che esistano indici del database sui campi chiave utilizzati nelle clausole WHERE, in particolare per tabelle come CDHDR e CDPOS.
- Prerequisiti: l'utente che esegue il report deve disporre dell'autorizzazione ad accedere all'ABAP workbench (SE38) e dei diritti necessari per sviluppare ed eseguire il programma. Deve inoltre avere accesso in lettura a tutte le tabelle sottostanti, incluse EKKO, EKPO, EKBE, CDHDR, CDPOS, EBAN, NAST, ESSR e le tabelle QM.
a Query di esempio abap
REPORT Z_PM_PO_EXTRACT.
TABLES: ekko, ekpo, eban.
*&---------------------------------------------------------------------*
*& Data Structures for Event Log
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
purchaseorder TYPE ebeln,
activity TYPE string,
eventtime TYPE timestamp,
username TYPE ernam,
vendornumber TYPE lifnr,
orderamount TYPE netwr_ak,
materialgroup TYPE matkl,
companycode TYPE bukrs,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_aedat FOR ekko-aedat OBLIGATORY, " PO Creation Date
s_bukrs FOR ekko-bukrs, " Company Code
s_bsart FOR ekko-bsart, " PO Document Type
s_ebeln FOR ekko-ebeln. " PO Number
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_po_headers.
IF gt_event_log IS NOT INITIAL.
PERFORM get_pr_created.
PERFORM get_pr_approved.
PERFORM get_po_created.
PERFORM get_po_release_events. " Approved, Rejected, Approval Requested
PERFORM get_po_sent_to_vendor.
PERFORM get_po_changed.
PERFORM get_goods_receipt_posted.
PERFORM get_services_confirmed.
PERFORM get_quality_inspection.
PERFORM get_goods_returned.
PERFORM get_po_completed.
PERFORM get_po_deleted.
PERFORM download_to_csv.
ELSE.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'I'.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_PO_HEADERS (Base data)
*&---------------------------------------------------------------------*
FORM get_po_headers.
SELECT h~ebeln, h~lifnr, h~bukrs, h~bsart, p~netwr, p~matkl
FROM ekko AS h
INNER JOIN ekpo AS p ON h~ebeln = p~ebeln
INTO TABLE @DATA(lt_po_base)
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
AND h~ebeln IN @s_ebeln.
SORT lt_po_base BY ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_CREATED
*&---------------------------------------------------------------------*
FORM get_pr_created.
DATA: lt_pr_events TYPE TABLE OF ty_event_log.
SELECT p~ebeln AS purchaseorder,
'Purchase Requisition Created' AS activity,
b~erdat AS event_date,
'000000' AS event_time,
b~ernam AS username,
h~lifnr AS vendornumber,
p~netwr AS orderamount,
p~matkl AS materialgroup,
h~bukrs AS companycode,
h~bsart AS documenttype
FROM ekpo AS p
JOIN eban AS b ON p~banfn = b~banfn AND p~bnfpo = b~bnfpo
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~ebeln IN @s_ebeln
AND p~banfn IS NOT NULL AND p~banfn <> ''
AND h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND h~bsart IN @s_bsart
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created ASSIGNING FIELD-SYMBOL(<fs_pr>).
DATA(ls_event) = CORRESPONDING ty_event_log(<fs_pr>).
CONCATENATE <fs_pr>-event_date <fs_pr>-event_time INTO DATA(lv_ts).
CONVERT DATE <fs_pr>-event_date TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PR_APPROVED
*&---------------------------------------------------------------------*
FORM get_pr_approved.
DATA: lt_pr_list TYPE TABLE OF eban-banfn.
SELECT DISTINCT p~banfn FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE h~aedat IN @s_aedat
AND h~bukrs IN @s_bukrs
AND p~banfn IS NOT NULL AND p~banfn <> ''
INTO TABLE @lt_pr_list.
IF lt_pr_list IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~fname, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
FOR ALL ENTRIES IN @lt_pr_list
WHERE h~objectclas = 'BANF'
AND h~objectid = @lt_pr_list-table_line
AND p~tabname = 'EBAN'
AND p~fname = 'FRGZU'
INTO TABLE @DATA(lt_cd_pr).
LOOP AT lt_cd_pr ASSIGNING FIELD-SYMBOL(<fs_cd>) WHERE <fs_cd>-value_new = 'X'.
SELECT SINGLE p~ebeln, p~netwr, p~matkl, h~lifnr, h~bukrs, h~bsart
FROM ekpo AS p
JOIN ekko AS h ON p~ebeln = h~ebeln
WHERE p~banfn = @<fs_cd>-objectid(10)
INTO @DATA(ls_po_info).
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = ls_po_info-ebeln
activity = 'Purchase Requisition Approved'
username = <fs_cd>-username
vendornumber = ls_po_info-lifnr
orderamount = ls_po_info-netwr
materialgroup = ls_po_info-matkl
companycode = ls_po_info-bukrs
documenttype = ls_po_info-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CREATED
*&---------------------------------------------------------------------*
FORM get_po_created.
LOOP AT lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>).
SELECT SINGLE aedat, ernam FROM ekko INTO @DATA(ls_ekko)
WHERE ebeln = @<fs_po>-ebeln.
IF sy-subrc = 0.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Created'
username = ls_ekko-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE ls_ekko-aedat TIME '000000' INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_RELEASE_EVENTS
*&---------------------------------------------------------------------*
FORM get_po_release_events.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime, p~value_new
FROM cdhdr AS h
JOIN cdpos AS p ON h~objectid = p~objectid AND h~changenr = p~changenr
WHERE h~objectclas = 'EINKBELEG'
AND h~objectid IN lt_ebeln
AND p~tabname = 'EKKO'
AND p~fname = 'FRGKE'
INTO TABLE @DATA(lt_cd_po).
LOOP AT lt_cd_po ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
CASE <fs_cd>-value_new.
WHEN '2' OR 'R'. " Final Release
ls_event-activity = 'Purchase Order Approved'.
WHEN '1'. " Blocked
ls_event-activity = 'Purchase Order Rejected'.
WHEN OTHERS. " Any other change implies a pending state
ls_event-activity = 'Purchase Order Approval Requested'.
ENDCASE.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_SENT_TO_VENDOR
*&---------------------------------------------------------------------*
FORM get_po_sent_to_vendor.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT objky, erdat, eruhr, ernam
FROM nast
WHERE kapol = 'EF' AND objky IN lt_ebeln AND vstat = '1'
INTO TABLE @DATA(lt_nast).
LOOP AT lt_nast ASSIGNING FIELD-SYMBOL(<fs_nast>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_nast>-objky.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Sent to Vendor'
username = <fs_nast>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_nast>-erdat TIME <fs_nast>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_CHANGED
*&---------------------------------------------------------------------*
FORM get_po_changed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT DISTINCT objectid, username, udate, utime
FROM cdhdr
WHERE objectclas = 'EINKBELEG' AND objectid IN lt_ebeln AND tcode <> 'ME21N' AND tcode <> 'ME22'
INTO TABLE @DATA(lt_cdhdr_chg).
LOOP AT lt_cdhdr_chg ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Changed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RECEIPT_POSTED
*&---------------------------------------------------------------------*
FORM get_goods_receipt_posted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam, k~bewtp
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bewtp = 'E' AND k~shkzg = 'S'
INTO TABLE @DATA(lt_gr).
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<fs_gr>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_gr>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Receipt Posted'
username = <fs_gr>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_gr>-cpudt TIME <fs_gr>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_SERVICES_CONFIRMED
*&---------------------------------------------------------------------*
FORM get_services_confirmed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT l~ebeln, h~erdat, h~eruhr, h~ernam
FROM essr AS h JOIN esll AS l ON h~lblni = l~lblni
WHERE l~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_ses).
LOOP AT lt_ses ASSIGNING FIELD-SYMBOL(<fs_ses>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ses>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Services Confirmation Entered'
username = <fs_ses>-ernam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ses>-erdat TIME <fs_ses>-eruhr INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_QUALITY_INSPECTION
*&---------------------------------------------------------------------*
FORM get_quality_inspection.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT q~ebeln, v~vdatum, v~vzeit, v~vname
FROM qals AS q JOIN qave AS v ON q~prueflos = v~prueflos
WHERE q~ebeln IN lt_ebeln
INTO TABLE @DATA(lt_qm).
LOOP AT lt_qm ASSIGNING FIELD-SYMBOL(<fs_qm>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_qm>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Quality Inspection Performed'
username = <fs_qm>-vname
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_qm>-vdatum TIME <fs_qm>-vzeit INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_GOODS_RETURNED
*&---------------------------------------------------------------------*
FORM get_goods_returned.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT k~ebeln, m~cpudt, m~cputm, m~usnam
FROM ekbe AS k JOIN mkpf AS m ON k~belnr = m~mblnr AND k~gjahr = m~mjahr
WHERE k~ebeln IN lt_ebeln AND k~bwart = '122'
INTO TABLE @DATA(lt_ret).
LOOP AT lt_ret ASSIGNING FIELD-SYMBOL(<fs_ret>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_ret>-ebeln.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Goods Returned'
username = <fs_ret>-usnam
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_ret>-cpudt TIME <fs_ret>-cputm INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_COMPLETED
*&---------------------------------------------------------------------*
FORM get_po_completed.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'ELIKZ' AND p~value_new = 'X'
INTO TABLE @DATA(lt_cd_comp).
LOOP AT lt_cd_comp ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Completed'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_PO_DELETED
*&---------------------------------------------------------------------*
FORM get_po_deleted.
DATA: lt_ebeln TYPE RANGE OF ebeln, ls_ebeln LIKE LINE OF lt_ebeln.
LOOP AT lt_po_base INTO DATA(ls_po_base).
ls_ebeln-sign = 'I'. ls_ebeln-option = 'EQ'. ls_ebeln-low = ls_po_base-ebeln.
APPEND ls_ebeln TO lt_ebeln.
ENDLOOP.
IF lt_ebeln IS INITIAL. RETURN. ENDIF.
SELECT h~objectid, h~username, h~udate, h~utime
FROM cdhdr AS h JOIN cdpos AS p ON h~changenr = p~changenr AND h~objectid = p~objectid
WHERE h~objectclas = 'EINKBELEG' AND h~objectid IN lt_ebeln AND p~tabname = 'EKPO' AND p~fname = 'LOEKZ' AND p~value_new = 'L'
INTO TABLE @DATA(lt_cd_del).
LOOP AT lt_cd_del ASSIGNING FIELD-SYMBOL(<fs_cd>).
READ TABLE lt_po_base ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY ebeln = <fs_cd>-objectid.
IF sy-subrc <> 0. CONTINUE. ENDIF.
DATA(ls_event) = VALUE ty_event_log(
purchaseorder = <fs_po>-ebeln
activity = 'Purchase Order Deleted'
username = <fs_cd>-username
vendornumber = <fs_po>-lifnr
orderamount = <fs_po>-netwr
materialgroup = <fs_po>-matkl
companycode = <fs_po>-bukrs
documenttype = <fs_po>-bsart
).
CONVERT DATE <fs_cd>-udate TIME <fs_cd>-utime INTO TIME STAMP ls_event-eventtime TIME ZONE sy-zonlo.
APPEND ls_event TO gt_event_log.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TO_CSV
*&---------------------------------------------------------------------*
FORM download_to_csv.
DATA: lv_filename TYPE string.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'PurchaseOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'EventTime' TO lt_fieldnames.
APPEND 'UserName' TO lt_fieldnames.
APPEND 'VendorNumber' TO lt_fieldnames.
APPEND 'OrderAmount' TO lt_fieldnames.
APPEND 'MaterialGroup' TO lt_fieldnames.
APPEND 'CompanyCode' TO lt_fieldnames.
APPEND 'DocumentType' TO lt_fieldnames.
DATA(lv_header) = REDUCE string( INIT h = '' FOR f IN lt_fieldnames NEXT h = h && f && cl_abap_char_utilities=>horizontal_tab ).
REPLACE LAST OCCURRENCE OF cl_abap_char_utilities=>horizontal_tab IN lv_header WITH cl_abap_char_utilities=>cr_lf.
DATA(lv_file_content) = lv_header.
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
DATA lv_line TYPE string.
DATA lv_eventtime_str TYPE string.
lv_eventtime_str = |{ <fs_log>-eventtime TIMESTAMP = ISO }|.
lv_line = <fs_log>-purchaseorder && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-activity && cl_abap_char_utilities=>horizontal_tab &&
lv_eventtime_str && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-username && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-vendornumber && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-orderamount && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-materialgroup && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-companycode && cl_abap_char_utilities=>horizontal_tab &&
<fs_log>-documenttype && cl_abap_char_utilities=>cr_lf.
CONCATENATE lv_file_content lv_line INTO lv_file_content.
ENDLOOP.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lv_file_content. Passaggi
- Stabilisca la connessione al database: ottenga credenziali di sola lettura e i dettagli di connessione, ovvero hostname, porta e nome del database, per il database sottostante SAP ECC. Verifichi di avere installato strumenti client adeguati, come DBeaver, SQL Developer o SSMS.
- Identifichi lo schema SAP: si connetta al database e identifichi lo schema SAP principale in cui si trovano le tabelle. Spesso si tratta di SAPSR3, SAPHANADB o di un nome analogo specifico del sistema. Se non è lo schema predefinito per il Suo utente, dovrà anteporre questo schema a tutti i nomi delle tabelle nella query.
- Esamini la query SQL: apra lo script SQL fornito nel Suo strumento client. Questa query completa è progettata per estrarre 14 attività distinte dal processo Purchase-to-Pay tramite join tra più tabelle SAP.
- Personalizzi i parametri della query: individui la Common Table Expression (CTE) PO_BASE all'inizio dello script. Modifichi i valori segnaposto per definire l'ambito dell'estrazione:
- [START_DATE] e [END_DATE]: imposti l'intervallo di date per l'analisi, ad esempio '20230101' e '20230630'. Si consiglia di filtrare il campo AEDAT (Changed On).
- [COMPANY_CODE_1], [COMPANY_CODE_2]: specifichi i Company Code SAP da includere.
- [DOC_TYPE_1], [DOC_TYPE_2]: specifichi i tipi di documento PO da includere.
- [Your SAP Schema]: sostituisca questo segnaposto con il nome effettivo dello schema SAP in tutto lo script.
- Esegua la query: esegua lo script SQL personalizzato sul database SAP. Il tempo di esecuzione varierà in base all'intervallo di date, al volume dei dati e alle prestazioni del database.
- Esamini i risultati: al termine della query, esegua una rapida verifica dell'output. Controlli che il numero di righe sia plausibile e che le colonne chiave, come PurchaseOrder, Activity ed EventTime, siano valorizzate come previsto.
- Esporti i dati in CSV: esporti l'intero set di risultati dal client SQL in un file CSV. Utilizzi la codifica UTF-8 per evitare problemi con i caratteri.
- Prepari il caricamento: verifichi che le intestazioni delle colonne nel file CSV corrispondano esattamente ai nomi degli attributi richiesti: PurchaseOrder, Activity, EventTime, UserName, VendorNumber, OrderAmount, MaterialGroup, CompanyCode, DocumentType.
- Carichi i dati nello strumento di Process Mining: carichi il file CSV finale nella Sua applicazione di Process Mining per l'analisi e la visualizzazione.
Configurazione
- Prerequisiti: è necessario disporre di accesso diretto e in sola lettura al database sottostante SAP ECC. Gli utenti devono avere autorizzazioni sufficienti per interrogare tabelle come EKKO, EKPO, EKBE, EBAN, CDHDR, CDPOS e NAST.
- Filtro per intervallo di date: è fondamentale applicare un filtro per intervallo di date per limitare il volume dei dati. Il filtro su EKKO.AEDAT (data di modifica del PO) per un periodo di 3-6 mesi è un punto di partenza comune. Intervalli più ampi possono determinare tempi di esecuzione estremamente lunghi.
- Filtri dati principali: per garantire un'analisi mirata, applichi sempre i filtri su EKKO.BUKRS (Company Code) ed EKKO.BSART (Document Type). In questo modo restringerà l'ambito alle entità giuridiche e ai processi aziendali pertinenti.
- Considerazioni sulle prestazioni: la query esegue join tra diverse tabelle di grandi dimensioni, incluse le tabelle della cronologia delle modifiche (CDHDR, CDPOS). L'operazione può richiedere molte risorse. Si consiglia vivamente di eseguire l'estrazione negli orari di minore utilizzo o su un database replicato non di produzione, per evitare di compromettere le prestazioni del sistema.
- Registrazione dei documenti di modifica: l'accuratezza di attività come 'Approved', 'Rejected', 'Completed' e 'Changed' dipende dal fatto che la registrazione dei documenti di modifica sia attiva per i campi SAP pertinenti. Verifichi con l'amministratore SAP che la registrazione sia abilitata tramite la transazione SCDO.
a Query di esempio sql
WITH PO_BASE AS (
SELECT
H.EBELN, -- Purchase Order Number
I.EBELP, -- Purchase Order Item
H.LIFNR, -- Vendor Number
H.BUKRS, -- Company Code
H.BSART, -- Document Type
I.NETWR, -- Order Amount (Item Level)
I.MATKL, -- Material Group
I.BANFN, -- Purchase Requisition Number
I.BNFPO -- Purchase Requisition Item
FROM [Your SAP Schema].EKKO AS H
JOIN [Your SAP Schema].EKPO AS I ON H.EBELN = I.EBELN
WHERE H.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- Filter on PO Change Date, e.g., '20230101' and '20231231'
AND H.BUKRS IN ('[COMPANY_CODE_1]', '[COMPANY_CODE_2]') -- Specify Company Codes
AND H.BSART IN ('[DOC_TYPE_1]', '[DOC_TYPE_2]') -- Specify PO Document Types
)
-- 1. Purchase Requisition Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Created' AS "Activity",
TO_TIMESTAMP(CONCAT(pr.ERDAT, '000000'), 'YYYYMMDDHH24MISS') AS "EventTime", -- Time is not available in EBAN
pr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EBAN pr ON po.BANFN = pr.BANFN AND po.BNFPO = pr.BNFPO
WHERE po.BANFN IS NOT NULL AND po.BANFN <> ''
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Requisition Approved' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'BANF' AND ch.OBJECTID = po.BANFN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EBAN' AND cp.FNAME = 'FRGZU' AND cp.VALUE_NEW = 'X' -- Release indicator set to 'released'
UNION ALL
-- 3. Purchase Order Created
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Created' AS "Activity",
TO_TIMESTAMP(CONCAT(ekko.ERDAT, ' ', ekko.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
ekko.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (from Change Docs)
SELECT
po.EBELN AS "PurchaseOrder",
CASE
WHEN cp.VALUE_NEW > cp.VALUE_OLD THEN 'Purchase Order Approval Requested'
WHEN cp.VALUE_NEW = ekko.FRGKE AND ekko.FRGKE = 'R' THEN 'Purchase Order Approved'
ELSE 'Purchase Order Rejected' -- Simplified logic, may need adjustment
END AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKKO ekko ON po.EBELN = ekko.EBELN
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKKO' AND cp.FNAME = 'FRGZU' -- Release status
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Sent to Vendor' AS "Activity",
TO_TIMESTAMP(CONCAT(na.ERDAT, ' ', na.ERUHR), 'YYYYMMDD HH24MISS') AS "EventTime",
na.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].NAST na ON na.OBJKY = po.EBELN AND na.KSCHL = '[Your PO Output Type]' -- e.g., 'NEU'
WHERE na.VSTAT = '1' -- Successfully processed
UNION ALL
-- 8. Purchase Order Changed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Changed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID = po.EBELN
WHERE ch.TCODE IN ('ME22', 'ME22N') -- Filter for change transactions
UNION ALL
-- 9. Goods Receipt Posted
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Receipt Posted' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Receipt
AND ekbe.SHKZG = 'S' -- Debit/Credit Indicator: Goods Receipt
UNION ALL
-- 10. Services Confirmation Entered
SELECT
po.EBELN AS "PurchaseOrder",
'Services Confirmation Entered' AS "Activity",
TO_TIMESTAMP(CONCAT(essr.ERDAT, ' ', essr.ERZET), 'YYYYMMDD HH24MISS') AS "EventTime",
essr.ERNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].ESSR essr ON ekbe.LBLNI = essr.LBLNI
WHERE ekbe.BEWTP = 'L' -- Service Entry Sheet
UNION ALL
-- 11. Quality Inspection Performed
SELECT
po.EBELN AS "PurchaseOrder",
'Quality Inspection Performed' AS "Activity",
TO_TIMESTAMP(CONCAT(qave.VDATUM, ' ', qave.VZEIT), 'YYYYMMDD HH24MISS') AS "EventTime",
qave.VNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].EKBE ekbe ON po.EBELN = ekbe.EBELN AND po.EBELP = ekbe.EBELP
JOIN [Your SAP Schema].QALS qals ON qals.MBLNR = ekbe.BELNR AND qals.MJAHR = ekbe.GJAHR
JOIN [Your SAP Schema].QAVE qave ON qals.PRUEFLOS = qave.PRUEFLOS
WHERE ekbe.BEWTP = 'E' -- Linked to a Goods Receipt
UNION ALL
-- 12. Goods Returned
SELECT
ekbe.EBELN AS "PurchaseOrder",
'Goods Returned' AS "Activity",
TO_TIMESTAMP(CONCAT(mkpf.CPUDT, ' ', mkpf.CPUTM), 'YYYYMMDD HH24MISS') AS "EventTime",
mkpf.USNAM AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM [Your SAP Schema].EKBE AS ekbe
JOIN [Your SAP Schema].MKPF AS mkpf ON ekbe.BELNR = mkpf.MBLNR AND ekbe.GJAHR = mkpf.MJAHR
JOIN PO_BASE AS po ON ekbe.EBELN = po.EBELN AND ekbe.EBELP = po.EBELP
WHERE ekbe.BEWTP = 'E' -- Goods Movement
AND ekbe.SHKZG = 'H' -- Debit/Credit Indicator: Return
AND ekbe.BWART = '122' -- Movement type for return to vendor
UNION ALL
-- 13. Purchase Order Completed
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Completed' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'ELIKZ' AND cp.VALUE_NEW = 'X' -- Delivery completed indicator
UNION ALL
-- 14. Purchase Order Deleted
SELECT
po.EBELN AS "PurchaseOrder",
'Purchase Order Deleted' AS "Activity",
TO_TIMESTAMP(CONCAT(ch.UDATE, ' ', ch.UTIME), 'YYYYMMDD HH24MISS') AS "EventTime",
ch.USERNAME AS "UserName",
po.LIFNR AS "VendorNumber",
po.NETWR AS "OrderAmount",
po.MATKL AS "MaterialGroup",
po.BUKRS AS "CompanyCode",
po.BSART AS "DocumentType"
FROM PO_BASE po
JOIN [Your SAP Schema].CDHDR ch ON ch.OBJECTCLASS = 'EINKBELEG' AND ch.OBJECTID LIKE CONCAT(po.EBELN, po.EBELP, '%')
JOIN [Your SAP Schema].CDPOS cp ON ch.OBJECTCLASS = cp.OBJECTCLASS AND ch.OBJECTID = cp.OBJECTID AND ch.CHANGENR = cp.CHANGENR
WHERE cp.TABNAME = 'EKPO' AND cp.FNAME = 'LOEKZ' AND cp.VALUE_NEW = 'L'; -- Deletion indicator Passaggi
- Prerequisiti e connessione: verifichi che lo strumento ETL di terze parti disponga del connettore certificato SAP installato e dotato di licenza. Nella console di amministrazione dello strumento ETL, configuri una nuova connessione al sistema SAP ECC. Le serviranno l'host del server applicativo, il numero di sistema, l'ID client e un utente SAP dedicato con le autorizzazioni RFC e di lettura delle tabelle appropriate.
- Identifichi le tabelle di origine: nel job ETL o nel flusso di dati, definisca le tabelle SAP richieste come origini dati. Le tabelle principali includono EKKO (testata PO), EKPO (riga PO), EBAN (richiesta di acquisto), CDHDR (testata del documento di modifica), CDPOS (riga del documento di modifica), MSEG (segmento documento: materiale), MKPF (testata del documento materiale), NAST (stato del messaggio), ESSR (testata del service entry sheet) e QALS (lotto di ispezione).
- Estragga 'Purchase Order Created': crei un flusso di dati basato sulla tabella EKKO. Filtri i record in base all'intervallo di date desiderato, ad esempio utilizzando AEDAT, e all'ambito organizzativo, ad esempio BUKRS per Company Code e BSART per Document Type. Mappi EKKO.EBELN su PurchaseOrder, 'Purchase Order Created' su Activity e combini AEDAT ed ERZET per EventTime. Mappi anche gli altri attributi richiesti.
- Estragga 'Goods Receipt Posted': crei un flusso di dati separato basato su MSEG, con join a MKPF tramite MBLNR e MJAHR. Filtri i tipi di movimento pertinenti, come '101'. Mappi MSEG.EBELN su PurchaseOrder, 'Goods Receipt Posted' su Activity e utilizzi MKPF.CPUDT e MKPF.CPUTM per EventTime.
- Estragga gli eventi basati sulle modifiche, approvazioni, modifiche e cancellazioni: crei un flusso di dati basato su CDHDR e CDPOS, con join tramite CHANGENR. Questa singola origine può essere utilizzata per derivare più attività.
- Filtri OBJECTCLAS = 'EINKBELEG' e TABNAME = 'EKPO'.
- Per 'Purchase Order Approved', filtri le modifiche al campo dello stato di rilascio, ad esempio FNAME = 'FRGZU', in cui il nuovo valore (VALUE_NEW) indica l'approvazione finale.
- Per 'Purchase Order Deleted', filtri le modifiche all'indicatore di cancellazione, FNAME = 'LOEKZ', in cui il nuovo valore è 'L'.
- Per 'Purchase Order Changed', filtri le modifiche agli altri campi pertinenti, escludendo i campi di stato specifici utilizzati per le altre attività.
- Per tutti questi eventi, utilizzi CDHDR.UDATE e CDHDR.UTIME per EventTime.
- Estragga gli eventi delle richieste di acquisto: crei un flusso di dati da EBAN per 'Purchase Requisition Created'. Per collegarlo a un Case ID PurchaseOrder, esegua il join tra EBAN ed EKPO utilizzando il numero della richiesta (BANFN) e la riga (BNFPO). Per 'Purchase Requisition Approved', utilizzi CDHDR/CDPOS con OBJECTCLAS = 'BANF'. È necessaria una mappatura accurata per associare l'evento al Purchase Order risultante.
- Estragga 'PO Sent to Vendor': crei un flusso di dati basato sulla tabella NAST. Filtri OBJECTKEY, che contiene il numero del PO, il tipo di output pertinente (KSCHL) e uno stato di elaborazione completata con successo (VSTAT = '1'). Utilizzi ERDAT e UHR per EventTime.
- Combini i flussi delle attività: utilizzi una trasformazione 'Union' o 'Merge' nello strumento ETL per combinare gli output di tutti i flussi di dati individuali creati nei passaggi precedenti. Verifichi che i nomi e i tipi di dati delle colonne siano coerenti in tutti i flussi, inclusi PurchaseOrder, Activity ed EventTime.
- Converta i tipi e i formati dei dati: verifichi che la colonna EventTime sia convertita in un formato timestamp coerente, ad esempio YYYY-MM-DD HH:MM:SS. Converta OrderAmount in un formato decimale standard.
- Definisca la destinazione: configuri una destinazione o un 'sink' per il flusso di dati combinato. In genere si tratta di un file semplice, come un file CSV o Parquet. Configuri il delimitatore, i qualificatori di testo e le opzioni per l'intestazione.
- Esegua e convalidi: esegua il job ETL completo. Esegua controlli di convalida sul file di output per verificare che siano presenti tutte le 14 attività, che il numero di righe sia plausibile e che gli attributi chiave siano valorizzati correttamente.
- Pianifichi ed esporti: dopo la convalida, pianifichi l'esecuzione periodica del job ETL, ad esempio ogni notte, per mantenere aggiornati i dati. Il file generato è ora pronto per essere caricato nel Suo strumento di Process Mining.
Configurazione
- Prerequisiti: uno strumento ETL commerciale, ad esempio Informatica PowerCenter, Talend o SAP Data Services, con il relativo SAP Certified Connector per ECC. È inoltre necessario un utente SAP di dialogo o di sistema con autorizzazioni S_RFC e S_TABU_DIS per le tabelle richieste.
- Connessione SAP: il connettore deve essere configurato con il server applicativo SAP, il numero di sistema, il client, l'utente e la password. Si raccomanda l'utilizzo di Secure Network Communications (SNC).
- Filtro per intervallo di date: è fondamentale applicare un filtro per intervallo di date, così da limitare il volume dei dati. Una prassi comune consiste nel filtrare EKKO.AEDAT (data di creazione del PO) agli ultimi 3-12 mesi. Il filtro deve essere applicato alla fonte per evitare di estrarre una quantità eccessiva di dati da SAP.
- Filtri per ambito organizzativo: applichi sempre un filtro per EKKO.BUKRS (codice società) e valuti l'opportunità di filtrare anche per EKPO.WERKS (stabilimento) o EKKO.EKORG (organizzazione acquisti), così da restringere l'analisi a una specifica unità aziendale.
- Filtro per tipo di documento: utilizzi EKKO.BSART per includere esclusivamente i tipi di ordine di acquisto pertinenti ed escludere i trasferimenti di stock o altri documenti interni che non rientrano nel processo P2P standard.
- Ottimizzazione delle prestazioni: l'estrazione dalle tabelle dei documenti di modifica (CDHDR, CDPOS) può essere lenta. Verifichi che siano applicati filtri su OBJECTCLAS, OBJECTID e UDATE. Regoli l'impostazione 'Packet Size' nel connettore SAP per ottimizzare la velocità di trasferimento dei dati. Per i sistemi di grandi dimensioni, valuti un caricamento storico iniziale seguito da caricamenti delta pianificati.
a Query di esempio sql
/*
This is a logical representation of the transformations performed within the ETL tool.
The tool's graphical interface will be used to configure these separate data flows, which are then combined with a UNION transformation.
Placeholders like [Your ETL Tool Functions] and [Filter Values] must be configured in the tool.
*/
-- 1. Purchase Requisition Created
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Created' AS Activity,
[Your ETL Tool Functions].DateTime(eban.ERDAT, eban.ERZET) AS EventTime,
eban.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM EBAN AS eban
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 2. Purchase Requisition Approved (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Requisition Approved' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EBAN AS eban ON cdhdr.OBJECTID = eban.BANFN
INNER JOIN EKPO AS ekpo ON eban.BANFN = ekpo.BANFN AND eban.BNFPO = ekpo.BNFPO
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'BANF' AND cdpos.TABNAME = 'EBAN' AND cdpos.FNAME = 'FRGZU' AND cdpos.VALUE_NEW = '[Final Release Indicator for PR]'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 3. Purchase Order Created
SELECT
EBELN AS PurchaseOrder,
'Purchase Order Created' AS Activity,
[Your ETL Tool Functions].DateTime(AEDAT, ERZET) AS EventTime,
ERNAM AS UserName,
LIFNR AS VendorNumber,
NULL AS OrderAmount, -- Amount is at item level
NULL AS MaterialGroup, -- Attribute is at item level
BUKRS AS CompanyCode,
BSART AS DocumentType
FROM EKKO
WHERE AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 4. Purchase Order Approval Requested / 5. Approved / 6. Rejected (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
CASE
WHEN cdpos.VALUE_NEW = '[Final Release Code]' THEN 'Purchase Order Approved'
WHEN cdpos.VALUE_NEW = '[Rejection Release Code]' THEN 'Purchase Order Rejected'
ELSE 'Purchase Order Approval Requested'
END AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKKO' AND cdpos.FNAME = 'FRGKE'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 7. Purchase Order Sent to Vendor
SELECT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Sent to Vendor' AS Activity,
[Your ETL Tool Functions].DateTime(nast.ERDAT, nast.UHR) AS EventTime,
nast.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM NAST AS nast
INNER JOIN EKKO AS ekko ON nast.OBJKY = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE nast.KAPPL = 'EF' AND nast.VSTAT = '1' AND nast.KSCHL IN ([Your PO Output Types])
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 8. Purchase Order Changed (inferred from change documents, simplified example)
SELECT DISTINCT
ekko.EBELN AS PurchaseOrder,
'Purchase Order Changed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKKO AS ekko ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekko.EBELN
INNER JOIN EKPO AS ekpo ON ekko.EBELN = ekpo.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.FNAME NOT IN ('FRGKE', 'FRGZU', 'LOEKZ', 'ELIKZ')
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 9. Goods Receipt Posted
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Receipt Posted' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '101' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 10. Services Confirmation Entered
SELECT
essr.EBELN AS PurchaseOrder,
'Services Confirmation Entered' AS Activity,
[Your ETL Tool Functions].DateTime(essr.ERDAT, essr.ERZET) AS EventTime,
essr.ERNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM ESSR AS essr
INNER JOIN EKKO AS ekko ON essr.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON essr.EBELN = ekpo.EBELN AND essr.EBELP = ekpo.EBELP
WHERE ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 11. Quality Inspection Performed
SELECT
qals.EBELN AS PurchaseOrder,
'Quality Inspection Performed' AS Activity,
[Your ETL Tool Functions].DateTime(qals.PASTRTERM, '000000') AS EventTime, -- Time is often not available
qals.PRUEFER AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM QALS AS qals
INNER JOIN EKKO AS ekko ON qals.EBELN = ekko.EBELN
INNER JOIN EKPO AS ekpo ON qals.EBELN = ekpo.EBELN AND qals.EBELP = ekpo.EBELP
WHERE qals.VCODE <> '' -- A usage decision code exists
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 12. Goods Returned
SELECT
mseg.EBELN AS PurchaseOrder,
'Goods Returned' AS Activity,
[Your ETL Tool Functions].DateTime(mkpf.CPUDT, mkpf.CPUTM) AS EventTime,
mkpf.USNAM AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM MSEG AS mseg
INNER JOIN MKPF AS mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
INNER JOIN EKPO AS ekpo ON mseg.EBELN = ekpo.EBELN AND mseg.EBELP = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE mseg.BWART = '122' AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 13. Purchase Order Completed (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Completed' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'ELIKZ' AND cdpos.VALUE_NEW = 'X'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]);
UNION ALL
-- 14. Purchase Order Deleted (inferred from change documents)
SELECT
ekpo.EBELN AS PurchaseOrder,
'Purchase Order Deleted' AS Activity,
[Your ETL Tool Functions].DateTime(cdhdr.UDATE, cdhdr.UTIME) AS EventTime,
cdhdr.USERNAME AS UserName,
ekko.LIFNR AS VendorNumber,
ekpo.NETWR AS OrderAmount,
ekpo.MATKL AS MaterialGroup,
ekko.BUKRS AS CompanyCode,
ekko.BSART AS DocumentType
FROM CDHDR AS cdhdr
INNER JOIN CDPOS AS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
INNER JOIN EKPO AS ekpo ON SUBSTRING(cdhdr.OBJECTID, 1, 10) = ekpo.EBELN AND SUBSTRING(cdhdr.OBJECTID, 11, 5) = ekpo.EBELP
INNER JOIN EKKO AS ekko ON ekpo.EBELN = ekko.EBELN
WHERE cdhdr.OBJECTCLAS = 'EINKBELEG' AND cdpos.TABNAME = 'EKPO' AND cdpos.FNAME = 'LOEKZ' AND cdpos.VALUE_NEW = 'L'
AND ekko.AEDAT BETWEEN '[START_DATE]' AND '[END_DATE]' AND ekko.BUKRS IN ([YOUR_COMPANY_CODES]); Pronto per iniziare?
Con questo Template dispone del modello necessario per ottimizzare il processo Purchase to Pay - Purchase Order in SAP ECC. Inizi oggi stesso a utilizzare i Suoi dati per individuare informazioni utili e migliorare l'efficienza.
Ottimizzi il Purchase Order P2P: inizi oggi la prova gratuita
Elimini i colli di bottiglia e riduca il tempo di ciclo del 30% o più.
Non è necessaria alcuna carta di credito: inizi in pochi minuti