Il Suo template dei dati per la gestione della supply chain
Il Suo template dei dati per la gestione della supply chain
- Attributi consigliati da raccogliere
- Attività principali da monitorare
- Indicazioni per l’estrazione
Attributi della gestione della supply chain
| Nome | Descrizione | ||
|---|---|---|---|
| Nome dell’attività ActivityName | Nome dell’attività aziendale o dell’evento che si è verificato in un determinato momento del processo della catena di approvvigionamento. | ||
| Descrizione Questo attributo descrive una fase o una tappa specifica del ciclo di vita dell’ordine logistico, ad esempio 'Ordine di acquisto emesso' o 'Uscita merci registrata'. Queste attività formano la sequenza di eventi che costituisce il processo. L’analisi della sequenza delle attività è alla base del Process Mining. Consente di individuare il flusso effettivo del processo, confrontarlo con le procedure operative standard e identificare le fasi che causano ritardi o richiedono rilavorazioni. Perché è importante Definisce le fasi del processo, un elemento fondamentale per individuare le mappe di processo, analizzare le varianti e misurare i tempi di ciclo tra le attività. Dove reperirli Generato associando i codici di transazione o le modifiche di stato delle diverse tabelle SAP, ad esempio EKKO, LIKP e VBUK, a nomi di attività comprensibili durante la trasformazione dei dati. Esempi Ordine d’acquisto emessoEntrata merci per ordine d’acquisto registrataConsegna in uscita creataProva di consegna confermata | |||
| Ora dell’evento EventTime | Data e ora che indicano quando si è verificata l’attività. | ||
| Descrizione Questo attributo fornisce la data e l’ora precise di ogni attività del processo. Costituisce la base cronologica dell’Event Log e ordina le fasi del processo secondo la sequenza in cui si sono verificate. L’ora dell’evento è fondamentale per tutte le analisi basate sul tempo. Viene utilizzata per calcolare i tempi di ciclo tra le attività, misurare il tempo di attraversamento complessivo di un processo, individuare le tendenze delle prestazioni nel tempo e capire quando è più probabile che si verifichino colli di bottiglia. Perché è importante Questa data e ora sono essenziali per calcolare tutte le durate e le metriche di prestazione, consentendo di analizzare i colli di bottiglia e i tempi di attraversamento del processo. Dove reperirli Estratta dai campi data e ora associati alla creazione dei documenti o alle modifiche di stato nelle tabelle SAP principali, come CDHDR/CDPOS per i documenti di modifica o i campi specifici ERDAT/ERZET nelle tabelle di intestazione. Esempi 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| Ordine logistico LogisticsOrder | Identificativo univoco di un singolo processo della catena di approvvigionamento, dall’esigenza iniziale alla conferma finale della consegna. | ||
| Descrizione L’ordine logistico funge da identificativo principale del caso e collega tutte le attività relative a una specifica esigenza o richiesta di evasione nella catena di approvvigionamento. Questo approccio consente di seguire l’intero ciclo di vita del prodotto, dalla pianificazione e dall’approvvigionamento fino alla produzione e alla distribuzione, offrendo una visione completa del processo. Nel Process Mining, l’analisi per ordine logistico mostra il percorso completo seguito per soddisfare un’esigenza. Aiuta a individuare le varianti più comuni, i colli di bottiglia e le deviazioni lungo l’intera catena di approvvigionamento, anziché analizzare separatamente processi isolati come gli acquisti o le vendite. Perché è importante È la chiave essenziale per collegare tutti gli eventi correlati in un’unica istanza di processo e consentire l’analisi dell’intera catena di approvvigionamento, dall’inizio alla fine. Dove reperirli È un identificativo concettuale che potrebbe dover essere ricostruito collegando diversi numeri di documento, ad esempio il numero di un ordine cliente ai successivi numeri dell’ordine di acquisto e della consegna. Consultare la documentazione SAP S/4HANA Supply Chain o un esperto del settore. Esempi LO-4500078192LO-4500078193LO-4500078194 | |||
| Sistema di origine SourceSystem | Il sistema da cui provengono i dati. | ||
| Descrizione Identifica l’istanza specifica del sistema di origine in cui sono stati generati i dati degli eventi. In un’architettura complessa, un’azienda può avere più istanze SAP S/4HANA per regioni o unità aziendali diverse. Questo attributo è importante per la governance dei dati e per segmentare l’analisi. Consente agli analisti di confrontare le prestazioni dei processi tra sistemi diversi o di isolare i dati provenienti da un’unica fonte autorevole. Perché è importante Fornisce un contesto essenziale sull’origine dei dati, utile per convalidarli e confrontare i processi tra architetture di sistema diverse. Dove reperirli In genere è un valore statico aggiunto durante l’estrazione dei dati per identificarne l’origine, ad esempio l’ID del sistema SAP (SAPSID). Esempi S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Data e ora dell’ultimo aggiornamento o dell’ultima estrazione dei dati dal sistema di origine. | ||
| Descrizione Questo attributo indica l’ultimo aggiornamento dei dati dell’Event Log. Fornisce un riferimento temporale sull’attualità dei dati analizzati, così che gli utenti possano valutarne la tempestività. In qualsiasi analisi, conoscere quanto siano recenti i dati è fondamentale per prendere decisioni informate. Questa data e ora aiutano gli utenti a fare affidamento sui dati e a comprendere l’intervallo temporale coperto dalle Dashboard e dai KPI. Perché è importante Garantisce trasparenza sull’attualità dei dati, permettendo agli utenti di sapere quanto è aggiornata l’analisi del processo. Dove reperirli È un campo di metadati che viene in genere generato e compilato dallo strumento di estrazione dei dati o di ETL al termine di un aggiornamento riuscito. Esempi 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| Data di consegna richiesta RequestedDeliveryDate | Data entro cui è stato richiesto al fornitore di consegnare le merci. | ||
| Descrizione È la data di consegna indicata nell’ordine di acquisto e rappresenta l’obiettivo concordato con il fornitore. Costituisce la base di riferimento per misurare le prestazioni effettive di consegna. Questa data è essenziale per calcolare il KPI della puntualità di consegna dei fornitori. Confrontando la data effettiva di entrata merci con quella richiesta, un’azienda può misurare in modo oggettivo se i fornitori rispettano gli impegni. Perché è importante È la data di riferimento utilizzata per calcolare il KPI della 'puntualità di consegna dei fornitori' ed è quindi fondamentale per la gestione delle prestazioni dei fornitori. Dove reperirli Si trova nella tabella delle posizioni dell’ordine di acquisto EKPO, nel campo EINDT (data di consegna). Esempi 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| Esito del controllo qualità QualityInspectionResult | Esito di un controllo qualità, ad esempio 'Superato' o 'Non superato'. | ||
| Descrizione Questo attributo registra l’esito di un controllo qualità eseguito sulle merci prodotte o ricevute. L’esito determina se le merci possono passare alla fase successiva o se devono essere rilavorate, restituite o scartate. È un attributo fondamentale per la Dashboard e il KPI dei tassi di rifiuto nel controllo qualità. Analizzare la frequenza e le cause degli esiti negativi aiuta a individuare problemi di qualità sistemici legati a prodotti, fornitori o linee di produzione specifici. Perché è importante Supporta direttamente il calcolo dei KPI relativi alla qualità e aiuta a individuare le cause della scarsa qualità nella catena di approvvigionamento. Dove reperirli Queste informazioni sono in genere memorizzate nel modulo Quality Management (QM). I dati possono provenire da tabelle dei lotti di controllo, come QALS, e dai codici delle decisioni d’uso in QAVE. Esempi SuperatoNon superatoRilavorazione necessariaSuperato con deroga | |||
| Nome del cliente CustomerName | Nome del cliente per cui viene evaso l’ordine. | ||
| Descrizione Questo attributo identifica il cliente finale associato a un ordine cliente e alle successive attività di evasione. Fornisce un contesto relativo alla domanda nella catena di approvvigionamento. Nel Process Mining, l’analisi per cliente aiuta a individuare modalità di evasione o livelli di prestazione diversi per i clienti strategici. Viene utilizzata in Dashboard come l’analisi del ritardo nella prova di consegna per verificare se alcuni clienti tendono a ritardare le conferme. Perché è importante Consente di segmentare l’analisi per cliente, mettendo in luce comportamenti specifici, colli di bottiglia o il rispetto degli accordi sul livello di servizio. Dove reperirli Il numero del cliente (KUNNR) è memorizzato nei documenti di vendita, ad esempio nella tabella VBAK. Il nome viene recuperato dalla tabella centrale dei dati anagrafici dei clienti KNA1. Esempi Retail CorpInnovate SolutionsManufacturing Partners | |||
| Nome del fornitore SupplierName | Nome del fornitore associato alle attività di approvvigionamento. | ||
| Descrizione Questo attributo identifica il fornitore da cui vengono acquistati beni o servizi. È generalmente associato ad attività come 'Richiesta di acquisto creata' e 'Ordine di acquisto emesso'. Il nome del fornitore è essenziale per la Dashboard di analisi delle prestazioni di consegna dei fornitori. Consente di filtrare e segmentare i dati per confrontare la puntualità delle consegne, i tempi di attraversamento e i livelli di qualità dei diversi fornitori, un aspetto fondamentale per le decisioni strategiche di approvvigionamento e la gestione dei rapporti con i fornitori. Perché è importante Consente di analizzare le prestazioni dei singoli fornitori, un elemento fondamentale per ottimizzare il processo di approvvigionamento e valutarne l’affidabilità. Dove reperirli Il numero del fornitore (LIFNR) è memorizzato nei documenti di acquisto, ad esempio nelle tabelle EKKN ed EBAN. Il nome viene recuperato dalla tabella centrale dei dati anagrafici dei fornitori LFA1. Esempi Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| Numero materiale MaterialNumber | Identificativo univoco del prodotto o del materiale in lavorazione. | ||
| Descrizione Il numero materiale, spesso chiamato SKU, è il codice univoco che identifica un prodotto specifico in SAP. Collega le attività del processo ai beni fisici o digitali prodotti, acquistati o spediti. Questo attributo è fondamentale per le analisi incentrate sui prodotti. Aiuta a individuare se determinati prodotti sono più soggetti a problemi di qualità, ritardi di produzione o esaurimenti delle scorte. Le Dashboard possono essere filtrate per materiale per analizzare le prestazioni di specifiche linee di prodotto. Perché è importante Consente di analizzare i processi a livello di prodotto e di individuare se problemi come ritardi o difetti di qualità riguardano materiali specifici. Dove reperirli Si trova nelle tabelle di posizione della maggior parte dei documenti, ad esempio VBAP per gli ordini cliente, EKPO per gli ordini di acquisto e LIPS per le consegne. Il campo si chiama in genere MATNR. Esempi FG-100-ARM-2034-BSA-5500 | |||
| Stabilimento Plant | Impianto di produzione o centro di distribuzione in cui si è svolta l’attività. | ||
| Descrizione Lo stabilimento è un’unità organizzativa SAP che rappresenta una sede in cui le merci vengono prodotte, immagazzinate o distribuite. Fornisce un contesto geografico o funzionale alle attività del processo. Analizzare le prestazioni dei processi per stabilimento è un’esigenza comune. Consente di confrontare efficienza, produttività e conformità tra diversi siti operativi e di individuare le prassi efficaci o le sedi che necessitano di miglioramenti. Perché è importante Fornisce una dimensione geografica o organizzativa per l’analisi e consente di confrontare le prestazioni tra impianti diversi. Dove reperirli Si trova in molte tabelle di posizione dei documenti, ad esempio VBAP (vendite), EKPO (acquisti) e LIPS (consegne). Il campo si chiama in genere WERKS. Esempi 100021003500 | |||
| Utente che ha eseguito l’attività ExecutingUser | ID dell’utente che ha eseguito l’attività. | ||
| Descrizione Questo attributo registra il nome utente o l’ID SAP del dipendente che ha svolto l’attività, ad esempio creando un ordine di acquisto o registrando un’entrata merci. Collega le fasi del processo alle persone coinvolte. L’analisi per utente aiuta a comprendere la distribuzione dei carichi di lavoro, individuare esigenze di formazione e rilevare differenze nelle prestazioni tra persone o team. È utile anche per l’analisi della conformità, perché permette di verificare chi ha eseguito le fasi critiche del processo. Perché è importante Associa le attività a utenti specifici, consentendo di analizzare i carichi di lavoro, confrontare le prestazioni e verificare eventuali azioni non conformi. Dove reperirli Si trova nei campi 'Creato da' o 'Modificato da' di molte tabelle SAP, ad esempio ERNAM in EKKO (intestazione dell’ordine di acquisto), LIKP (intestazione della consegna) e VBRK (intestazione della fattura). Esempi CBROWNJSMITHASINGH | |||
| Consegna in ritardo IsLateDelivery | Indicatore booleano che segnala se la consegna del fornitore è avvenuta dopo la data richiesta. | ||
| Descrizione Questo indicatore calcolato segnala in modo semplice se una consegna è avvenuta o meno nei tempi previsti. Si ottiene confrontando la data e ora dell’attività 'Entrata merci per ordine di acquisto registrata' con l’attributo 'Data di consegna richiesta'. Questo attributo semplifica la creazione di Dashboard e KPI relativi alle prestazioni dei fornitori. Consente di filtrare e aggregare rapidamente i dati per calcolare la puntualità di consegna dei fornitori e individuare quelli, i materiali o le regioni in cui i ritardi sono più frequenti. Perché è importante Semplifica l’analisi delle prestazioni dei fornitori fornendo un esito chiaro e binario per ogni consegna, essenziale per il KPI della puntualità delle consegne. Dove reperirli È un campo calcolato. La logica è: IF ('Entrata merci per ordine di acquisto registrata'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. Esempi truefalse | |||
| Nome del vettore CarrierName | Nome dell’azienda di trasporto o dello spedizioniere che gestisce la spedizione. | ||
| Descrizione Il nome del vettore identifica il fornitore di servizi logistici responsabile del trasporto delle merci tra diverse sedi, ad esempio dal magazzino al cliente. Questo attributo è essenziale per la Dashboard di analisi del tempo di ciclo del trasporto. Consente di confrontare i tempi di transito, i costi e l’affidabilità dei diversi vettori, migliorando la pianificazione logistica e la scelta del vettore. Perché è importante Consente di analizzare le prestazioni dei fornitori di servizi di trasporto, un aspetto fondamentale per ottimizzare i costi logistici e i tempi di consegna. Dove reperirli L’ID del vettore, ovvero dello spedizioniere, è memorizzato nei documenti di spedizione, ad esempio nella tabella VTTK (intestazione della spedizione). Il nome viene recuperato da tabelle dei dati anagrafici come LFA1. Esempi DHLFedExMaersk Logistics | |||
| Numero dell’ordine cliente SalesOrderNumber | Identificativo univoco del documento dell’ordine cliente (SO). | ||
| Descrizione Il numero dell’ordine cliente è il numero ufficiale del documento che conferma una vendita a un cliente. È un identificativo fondamentale nella fase dalla ricezione dell’ordine all’incasso della catena di approvvigionamento. Questo attributo è essenziale per seguire l’evasione di uno specifico ordine cliente. Collega la richiesta iniziale del cliente alle attività successive, come la consegna e la fatturazione, e supporta l’analisi del tempo di attraversamento dell’evasione degli ordini. Perché è importante È un identificativo fondamentale per il sottoprocesso di evasione dell’ordine e collega la domanda del cliente alla logistica e al regolamento finanziario. Dove reperirli Si trova nella tabella dell’intestazione degli ordini cliente VBAK e nella tabella delle posizioni VBAP. Il campo si chiama VBELN. Esempi 100023451000234610002347 | |||
| Numero dell’ordine di acquisto PurchaseOrderNumber | Identificativo univoco del documento dell’ordine di acquisto (PO). | ||
| Descrizione Il numero dell’ordine di acquisto è il numero ufficiale del documento utilizzato per ordinare materiali a un fornitore. È un identificativo fondamentale nella fase di approvvigionamento della catena di fornitura. Questo attributo consente di analizzare in dettaglio il processo di approvvigionamento. Viene utilizzato nella Dashboard del tempo di ciclo end-to-end degli acquisti e per calcolare il KPI della puntualità di consegna dei fornitori, collegando le attività di richiesta, ordine, ricezione e pagamento. Perché è importante È un identificativo fondamentale per analizzare in dettaglio il sottoprocesso di approvvigionamento e collegare gli eventi correlati. Dove reperirli Si trova nella tabella dell’intestazione degli ordini di acquisto EKKO e nella tabella delle posizioni EKPO. Il campo si chiama EBELN. Esempi 450007819245000781934500078194 | |||
| Ora di fine EndTime | Data e ora che indicano quando è stata completata un’attività; vengono utilizzate per calcolare il tempo di elaborazione. | ||
| Descrizione L’ora di fine indica il completamento di una specifica attività. Mentre l’ora di inizio (EventTime) indica quando l’attività comincia, l’ora di fine è necessaria per capire quanto tempo ha richiesto, soprattutto nel caso di attività non istantanee. In fase di analisi, disporre sia dell’ora di inizio sia di quella di fine consente di misurare con precisione il tempo di elaborazione e quello di attesa. In questo modo è possibile distinguere il tempo dedicato al lavoro effettivo da quello trascorso in attesa della fase successiva, un aspetto fondamentale per individuare opportunità di miglioramento dell’efficienza. Perché è importante Consente di calcolare con precisione i tempi di elaborazione delle attività e di distinguere il lavoro che crea valore dal tempo di attesa. Dove reperirli Può essere ricavata dalle modifiche di stato in SAP. Ad esempio, l’inizio corrisponde all’aggiornamento dello stato 'In corso' e la fine all’aggiornamento dello stato 'Completato' nelle tabelle JEST/JCDS. Per gli eventi istantanei, EndTime può coincidere con StartTime. Esempi 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| Quantità dell’ordine OrderQuantity | Quantità del materiale nella posizione dell’ordine. | ||
| Descrizione Questo attributo indica il numero di unità di un materiale richieste in una posizione di un ordine cliente o di acquisto. Fornisce una misura del volume di ogni transazione. L’analisi per quantità aiuta a dare priorità agli ordini con volumi elevati, che possono avere un impatto maggiore sull’attività. Può inoltre servire a normalizzare altre metriche, ad esempio per calcolare il costo per unità, o a capire in che modo le dimensioni dell’ordine incidono sui tempi di elaborazione. Perché è importante Fornisce il contesto dei volumi delle transazioni e consente di analizzarne l’impatto e segmentare i casi in base alle dimensioni. Dove reperirli Si trova nelle tabelle delle posizioni, ad esempio nel campo MENGE di EKPO (ordine di acquisto) o nel campo KWMENG di VBAP (ordine cliente). Esempi 100500025 | |||
| Rilavorazione IsRework | Indicatore che segnala se un’attività o una sequenza di attività rappresenta una rilavorazione. | ||
| Descrizione Questo attributo booleano segnala le attività che ripetono fasi precedenti del processo, indicando una rilavorazione o una correzione. Ad esempio, se a un’attività 'Controllo qualità' segue la fase 'Ordine di produzione creato' e poi un altro 'Controllo qualità', il secondo controllo può essere contrassegnato come rilavorazione. Individuare le rilavorazioni è fondamentale per comprendere le inefficienze del processo e i costi nascosti. Questo indicatore aiuta a quantificare la frequenza e l’impatto dei cicli di rilavorazione, supporta il calcolo del KPI del tasso di errori nell’elaborazione degli ordini e mette in evidenza le aree da migliorare. Perché è importante Aiuta a quantificare le inefficienze del processo identificando e contando esplicitamente le attività che fanno parte di un ciclo di rilavorazione. Dove reperirli In genere viene calcolato nello strumento di Process Mining individuando le sequenze di attività ripetute all’interno dello stesso caso. Esempi truefalse | |||
Attività di gestione della supply chain
| Attività | Descrizione | ||
|---|---|---|---|
| Entrata merci per ordine d’acquisto registrata | Indica la ricezione fisica delle materie prime o delle merci dal fornitore, in riferimento a un ordine d’acquisto. L’evento viene registrato quando la merce arriva in magazzino o nello stabilimento. | ||
| Perché è importante Questa attività conclude la fase di consegna del fornitore nel ciclo di acquisto. È essenziale per calcolare la percentuale di consegne puntuali dei fornitori e comprendere le prestazioni della logistica in entrata. Dove reperirli È un evento esplicito, registrato tramite la contabilizzazione di un documento materiale. La marca temporale dell’evento si trova nella tabella di testata dei documenti materiale (MKPF, campo BUDAT). Il collegamento all’ordine d’acquisto è nella tabella delle posizioni (MSEG). Acquisizione Utilizzi la data di contabilizzazione (MKPF-BUDAT) del documento materiale associato all’ordine d’acquisto. Tipo di evento explicit | |||
| Merce prodotta | Questa attività indica che la produzione della merce è terminata. In genere viene registrata come entrata merci dall’ordine di produzione, con il trasferimento del prodotto finito a magazzino. | ||
| Perché è importante Segna la fine del ciclo di produzione. Il tempo che intercorre tra la creazione dell’ordine di produzione e questo evento corrisponde al tempo di attraversamento della produzione, un indicatore fondamentale dell’efficienza produttiva. Dove reperirli L’evento può essere registrato esplicitamente tramite la contabilizzazione di un documento materiale (entrata merci dall’ordine di produzione) oppure dedotto dalla conferma finale dell’ordine di produzione (tabella AFRU) o dal cambiamento di stato in «Consegnato». Acquisizione Dedurre l’evento dalla data di contabilizzazione del documento materiale dell’entrata merci finale per l’ordine di produzione oppure da un cambiamento di stato. Tipo di evento inferred | |||
| Ordine cliente creato | Questa attività indica la creazione di un nuovo ordine cliente, che registra formalmente la richiesta di merci da parte del cliente. È un evento esplicito, registrato quando un utente salva nel sistema un nuovo documento d’ordine cliente. | ||
| Perché è importante È il principale punto di partenza del processo dall’ordine all’incasso. Analizzare il tempo che intercorre tra questo evento e quelli successivi permette di misurare il tempo complessivo di attraversamento dell’ordine e individuare i ritardi iniziali di elaborazione. Dove reperirli L’evento viene registrato esplicitamente. È possibile trovarlo nei documenti di modifica delle tabelle degli ordini cliente (CDHDR/CDPOS) oppure utilizzare la marca temporale di creazione nella tabella di testata degli ordini cliente (VBAK, campo ERDAT). Acquisizione Utilizzi la data di creazione (VBAK-ERDAT) e l’ora (VBAK-ERZET) del documento d’ordine cliente. Tipo di evento explicit | |||
| Ordine d’acquisto emesso | Indica la creazione e l’emissione formale di un ordine d’acquisto a un fornitore esterno per i materiali necessari. Con questa attività, la richiesta d’acquisto diventa un impegno giuridicamente vincolante nei confronti del fornitore. | ||
| Perché è importante Questa attività è una tappa fondamentale per misurare i tempi di consegna dei fornitori e i tempi di ciclo degli acquisti. Fornisce la base di riferimento per valutare le prestazioni delle consegne puntuali dei fornitori. Dove reperirli È un evento esplicito, registrato al momento della creazione dell’ordine d’acquisto. La marca temporale di creazione è memorizzata nella tabella di testata degli ordini d’acquisto (EKKO, campo AEDAT). Acquisizione Utilizzi la data di creazione del documento (EKKO-AEDAT) dell’ordine d’acquisto. Tipo di evento explicit | |||
| Prova di consegna confermata | Indica la conferma formale del cliente o del vettore che le merci sono state ricevute secondo quanto previsto. Spesso viene registrata aggiornando la consegna in uscita con le informazioni della prova di consegna. | ||
| Perché è importante Questa attività segna la conclusione definitiva del processo di evasione dell’ordine. È fondamentale per fatturare correttamente, risolvere eventuali contestazioni e misurare l’ultima tratta del ciclo di consegna. Dove reperirli È un evento esplicito. La data della prova di consegna viene registrata nella tabella dell’intestazione della consegna (LIKP, campo PODAT) o nelle tabelle POD correlate (VLPOD). Acquisizione Utilizzare la data della prova di consegna (LIKP-PODAT) del documento di consegna. Tipo di evento explicit | |||
| Uscita merci registrata | Questa attività rappresenta l’uscita fisica e legale delle merci dal magazzino. Riduce l’inventario e registra il costo del venduto, segnando la spedizione ufficiale dell’ordine. | ||
| Perché è importante È una tappa fondamentale, che segna l’inizio del periodo di transito. Indica il momento preciso in cui le merci lasciano la disponibilità dell’azienda per essere consegnate. Dove reperirli Si tratta di un evento esplicito che crea un documento materiale. La data e l’ora vengono registrate nell’intestazione del documento materiale (MKPF, campo BUDAT) e aggiornano lo stato del movimento merci nel documento di consegna (LIKP, campo WBSTK). Acquisizione Utilizzare la data di registrazione (MKPF-BUDAT) del documento materiale relativo all’uscita merci associato alla consegna in uscita. Tipo di evento explicit | |||
| Consegna in uscita creata | Indica la creazione di un documento di consegna, che autorizza il prelievo e la spedizione della merce al cliente. Con questa attività, il processo passa dalla gestione degli ordini all’esecuzione logistica. | ||
| Perché è importante È una fase fondamentale che avvia l’evasione fisica dell’ordine. I ritardi tra la creazione dell’ordine e quella della consegna possono indicare problemi di pianificazione o di disponibilità. Dove reperirli È un evento esplicito. La marca temporale di creazione è registrata nella tabella di testata delle consegne (LIKP, campo ERDAT). Acquisizione Utilizzi la data di creazione (LIKP-ERDAT) e l’ora (LIKP-ERZET) dalla testata del documento di consegna. Tipo di evento explicit | |||
| Controllo di qualità eseguito | Indica il completamento del controllo di qualità sulla merce prodotta. L’esito dell’ispezione, positivo o negativo, viene registrato in una decisione d’uso. | ||
| Perché è importante Questa attività è fondamentale per monitorare la qualità dei prodotti e individuare i problemi di produzione. Un’elevata percentuale di rifiuti o tempi di ispezione lunghi possono costituire importanti colli di bottiglia. Dove reperirli È un evento esplicito, registrato quando viene presa una decisione d’uso per un lotto di controllo qualità. La data della decisione si trova nella tabella QALS (campo PASTRTERM) o nella tabella QAVE. Acquisizione Utilizzi la marca temporale della registrazione della decisione d’uso per il lotto di controllo (tabelle QALS/QAVE). Tipo di evento explicit | |||
| Disponibilità delle scorte verificata | Indica la verifica, automatica o manuale, della disponibilità a magazzino degli articoli richiesti per evadere l’ordine cliente. Spesso è un passaggio automatico durante la creazione dell’ordine, ma potrebbe non essere registrato come evento distinto. | ||
| Perché è importante Conoscere il tempo che intercorre tra l’ordine e questa verifica, insieme al suo esito, aiuta a capire come i livelli delle scorte incidono sui tempi di evasione. Eventuali ritardi in questa fase portano spesso ad avviare attività di acquisto o produzione. Dove reperirli In genere, non è un evento esplicito. Può essere dedotto dalla creazione della prima riga di pianificazione confermata nella tabella delle posizioni dell’ordine cliente (VBEP) oppure dalle modifiche di stato della posizione. Acquisizione Dedurre l’evento dall’aggiornamento dello stato di conferma della riga di pianificazione dell’ordine cliente (tabella VBEP). Tipo di evento inferred | |||
| Fattura cliente creata | Questa attività segna la creazione del documento di fatturazione per il cliente, relativo alle merci o ai servizi consegnati. Avvia la fase conclusiva di regolamento finanziario del processo. | ||
| Perché è importante Questa attività è fondamentale per analizzare il tempo di ciclo della fatturazione. I ritardi tra la conferma della consegna e l’emissione della fattura possono incidere negativamente sul flusso di cassa. Dove reperirli È un evento esplicito. La data e ora di creazione vengono registrate nella tabella dell’intestazione del documento di fatturazione (VBRK, campo ERDAT). Acquisizione Utilizzare la data di creazione (VBRK-ERDAT) dell’intestazione del documento di fatturazione. Tipo di evento explicit | |||
| Merci scaricate a destinazione | Questa attività indica lo scarico fisico delle merci presso la sede del cliente. L’evento potrebbe non essere registrato esplicitamente in SAP e spesso deve essere dedotto dai dati del vettore o da eventi successivi. | ||
| Perché è importante Segna la fine della tratta di trasporto. Il tempo che intercorre tra l’uscita merci e questo momento corrisponde al tempo di trasporto, un dato fondamentale per ottimizzare la logistica. Dove reperirli Nel sistema ERP di base, questo evento raramente viene registrato in modo esplicito. Può essere dedotto dai messaggi EDI del vettore, dai dati del modulo Transportation Management (TM) o, se disponibile, dalla data e ora del documento di prova di consegna. Acquisizione Dedurre l’evento dagli aggiornamenti di stato del vettore, ad esempio EDI 214, oppure utilizzare la data e ora della prova di consegna come indicatore approssimativo. Tipo di evento inferred | |||
| Ordine di produzione creato | Indica la creazione di un ordine di produzione per realizzare i prodotti finiti richiesti dall’ordine cliente. Segna l’avvio formale della produzione interna. | ||
| Perché è importante La creazione di un ordine di produzione segna l’inizio del tempo di attraversamento della produzione. Analizzarla aiuta a individuare i ritardi tra il segnale della domanda e l’avvio della produzione. Dove reperirli È un evento esplicito. La data di creazione è registrata nella tabella di testata degli ordini di produzione (AUFK, campo ERDAT). Acquisizione Utilizzi la data di creazione (AUFK-ERDAT) dalla tabella di testata dell’ordine. Tipo di evento explicit | |||
| Prelievo completato | Questa attività indica il completamento del prelievo fisico degli articoli dal magazzino per la consegna in uscita. In molti sistemi, viene confermata quando si aggiorna lo stato di prelievo del documento di consegna. | ||
| Perché è importante Un prelievo efficiente è fondamentale per la produttività del magazzino. Monitorare questa attività aiuta a individuare i colli di bottiglia nelle operazioni di magazzino e a misurare le prestazioni del prelievo. Dove reperirli Spesso non si tratta di un singolo evento distinto, ma lo si può dedurre dalle modifiche di stato. L’evento viene registrato quando lo stato di prelievo nella tabella delle posizioni di consegna (LIPS, campo KOSTA) viene impostato su 'C' (elaborato completamente). Acquisizione Dedurre l’evento dai documenti di modifica, quando lo stato di prelievo (LIPS-KOSTA) viene aggiornato a prelievo completato. Tipo di evento inferred | |||
| Richiesta d’acquisto creata | Questa attività indica la creazione di una richiesta interna per l’acquisto dei beni o delle materie prime necessari. Spesso viene avviata quando le scorte non bastano a evadere un ordine cliente o scendono sotto il punto di riordino. | ||
| Perché è importante È la prima fase del ciclo di acquisto. Monitorarne la creazione aiuta a individuare i ritardi nell’avvio degli acquisti e ad analizzare l’intero processo. Dove reperirli È un evento esplicito. La marca temporale di creazione è registrata nella tabella di testata delle richieste d’acquisto (EBAN, campo BADAT). Acquisizione Utilizzi la data di creazione (EBAN-BADAT) del documento di richiesta d’acquisto. Tipo di evento explicit | |||
| Spedizione creata | Indica la creazione di un documento di spedizione, che raggruppa una o più consegne ai fini della pianificazione del trasporto. Il documento contiene informazioni sul vettore, sull’itinerario e sulla modalità di trasporto. | ||
| Perché è importante Questa attività segna l’avvio della pianificazione formale del trasporto. Analizzare il tempo che intercorre tra la registrazione dell’uscita merci e il completamento della spedizione permette di valutare l’efficienza del processo di trasporto. Dove reperirli È un evento esplicito registrato nella tabella dell’intestazione della spedizione (VTTK, campo ERDAT). Fa parte del modulo LE-TRA, che potrebbe non essere utilizzato da tutte le organizzazioni. Acquisizione Utilizzare la data di creazione (VTTK-ERDAT) dell’intestazione del documento di spedizione. Tipo di evento explicit | |||
Guide all’estrazione
Passaggi
- Prerequisiti: Verifichi di disporre di un utente con autorizzazioni sufficienti per accedere alle viste SAP S/4HANA Core Data Services (CDS) necessarie. In genere è richiesto un ruolo specifico assegnato dal team di sicurezza SAP. Le servirà anche un client SQL, ad esempio DBeaver o SAP HANA Studio, in grado di connettersi al database SAP HANA.
- Stabilisca la connessione al database: Configuri il client SQL per connettersi al database SAP S/4HANA. Le occorrono il nome host del server database, la porta (ad es. 3xx15, dove xx indica il numero dell’istanza), un nome utente del database e una password.
- Prepari la query SQL: Copi la query SQL completa fornita nella sezione dedicata del documento e la incolli nell’editor del client SQL. La query estrae tutte le attività specificate dai diversi moduli logistici e commerciali.
- Imposti i parametri di estrazione: Prima di eseguire la query, individui le condizioni segnaposto nelle clausole
WHEREdi ogni sottoquery. Sostituisca'YourCompanyCode'con il codice azienda effettivo da analizzare e modifichi i segnaposto dell’intervallo di date, come'YYYY-MM-DD', per definire il periodo di estrazione desiderato. - Esegua la query: Avvii l’intero script SQL. Il tempo di esecuzione varia in base all’intervallo di date selezionato e al volume di dati nel sistema. È consigliabile eseguire l’operazione nelle fasce orarie di minore attività per ridurre il carico sul sistema.
- Riveda i risultati iniziali: Al termine della query, controlli rapidamente i risultati nel client SQL. Verifichi che il numero di righe sia ragionevole, che colonne come LogisticsOrder, ActivityName ed EventTime contengano dati e che siano presenti diversi nomi di attività.
- Esporti i dati in CSV: Esporti l’intero risultato dal client SQL in un file CSV. Scelga la codifica UTF-8 per evitare problemi con i caratteri speciali.
- Prepari il file per il caricamento: Verifichi che le intestazioni delle colonne nel file CSV finale corrispondano esattamente ai nomi degli attributi richiesti per l’importazione (ad es.
LogisticsOrder,ActivityName,EventTime). Se utilizza la query fornita, non dovrebbe essere necessaria un’ulteriore trasformazione dei dati.
Configurazione
- Prerequisiti: È necessario poter accedere al database SAP HANA sottostante. L’utente del database deve disporre dei privilegi
SELECTsu tutte le viste CDS richiamate nella query, incluse, a titolo esemplificativo, I_SalesOrderItem, I_PurchaseOrderItem, I_OutboundDeliveryItem, I_MaterialDocumentItem, I_ProductionOrder, I_QualityInspection, I_Shipment e I_BillingDocumentItem. - Filtro per intervallo di date: La query fornita include un segnaposto per filtrare un intervallo di date, in genere applicato a un campo data di creazione (
CreationDateoDocumentDate). Per un’analisi iniziale, si consiglia un periodo da 3 a 6 mesi, così da ottenere un insieme di dati rappresentativo senza sovraccaricare il sistema. - Filtri aziendali principali: È fondamentale filtrare i dati per specifiche unità organizzative, in modo che i risultati siano pertinenti. La query include già un segnaposto per
CompanyCode. In base all’ambito dell’analisi, può essere utile aggiungere filtri perSalesOrganization,DistributionChanneloPlant. - Considerazioni sulle prestazioni: La query è complessa e unisce numerose viste CDS di grandi dimensioni. L’esecuzione può richiedere risorse di sistema considerevoli. Pianifichi le estrazioni fuori dall’orario lavorativo. Per insiemi di dati molto grandi, valuti di eseguire la query in più blocchi sequenziali, uno per mese.
a Query di esempio sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; Passaggi
- Verifichi che sia disponibile l’accesso diretto in lettura allo schema SAP HANA contenente i dati pertinenti di logistica, vendite, approvvigionamento, inventario, produzione, qualità, consegne, spedizioni, prove di consegna e fatturazione. Richieda il nome dello schema, i dettagli di connessione e le autorizzazioni al team SAP Basis o al team della piattaforma dati. Non scriva nel sistema di origine.
- Verifichi il modello dati S/4HANA esatto del sistema di destinazione. EKKO ed EKPO sono utilizzate per gli ordini di acquisto, LIKP e LIPS per le consegne in uscita; per gli ordini di vendita, le richieste di acquisto, i documenti materiale, gli ordini di produzione, i risultati dei controlli qualità, le spedizioni, le prove di consegna e la fatturazione occorre configurare oggetti aggiuntivi. Sostituisca ogni segnaposto tra parentesi quadre relativo a oggetti o colonne nella query con oggetti verificati nel dizionario dati del sistema.
- Definisca la regola di correlazione LogisticsOrder. La regola preferita si basa su una relazione verificata nel flusso documentale dall’ordine di vendita ai documenti successivi di consegna, materiale, produzione o approvvigionamento e fatturazione. Se non è disponibile una relazione diretta, configuri una tabella di correlazione documentata o una mappatura specifica per l’azienda. Non correli i casi utilizzando soltanto il numero materiale o la data.
- Imposti il periodo di estrazione con [Start date parameter] e [End date parameter]. Applichi lo stesso periodo ai timestamp degli eventi, mantenendo però i documenti creati in precedenza quando servono a spiegare eventi avvenuti nel periodo selezionato.
- Configuri il codice azienda, l’organizzazione commerciale, lo stabilimento, l’organizzazione acquisti, il tipo di documento e gli altri filtri aziendali nella sezione indicata. Applichi i filtri solo dopo averne verificato i valori nel sistema di destinazione.
- Sostituisca i riferimenti a tabelle e colonne tra parentesi quadre in ogni ramo delle attività con nomi verificati. Ogni ramo deve restituire le stesse colonne con tipi di dati compatibili. La query genera esplicitamente una riga per ciascuna delle 15 attività richieste, poiché ProcessMind non deduce gli eventi mancanti.
- Esegua la query in SAP HANA Database Explorer, nella console SQL di SAP HANA cockpit o nel client SQL approvato. Verifichi separatamente ogni ramo delle attività prima di eseguire la query completa con UNION ALL. Riveda i piani di esecuzione e limiti il test iniziale a un intervallo di date breve.
- Convalidi le relazioni tra documenti, i timestamp, gli identificativi utente, i dati di fornitori e clienti, i dati di materiali e stabilimenti e i risultati dei controlli qualità. Verifichi le righe duplicate dovute a join a livello di posizione e applichi la regola configurata per la granularità degli eventi, ad esempio un evento per documento o un evento per posizione del documento.
- Esporti il risultato in formato CSV UTF-8 o in un altro formato tabellare supportato da ProcessMind. Mantenga esattamente i nomi delle colonne di output LogisticsOrder, ActivityName, EventTime, SourceSystem, LastDataUpdate, ExecutingUser, SupplierName, CustomerName, MaterialNumber, Plant, RequestedDeliveryDate e QualityInspectionResult. Verifichi che EventTime sia un timestamp e che LastDataUpdate sia valorizzato in modo coerente.
- Carichi il file in ProcessMind e associ LogisticsOrder all’identificativo del caso, ActivityName all’attività ed EventTime al timestamp dell’evento. Verifichi che tutte le 15 etichette delle attività siano considerate eventi espliciti e pianifichi un aggiornamento controllato dopo aver convalidato il comportamento dell’estrazione incrementale.
Configurazione
- Intervallo di date: Inizi con 3-6 mesi di dati. Per i test iniziali utilizzi un periodo più breve e lo estenda solo dopo aver convalidato le prestazioni e le relazioni tra documenti.
- Schema di origine: Imposti [SAP HANA schema name] sullo schema contenente le tabelle o le viste S/4HANA verificate. Non presuma che una tabella ERP classica sia disponibile con lo stesso nome in tutte le installazioni di S/4HANA.
- Ambito dei documenti: Configuri [Company Code filter], [Sales Organization filter], [Plant filter], [Purchasing Organization filter] e [Document Type filter] in base all’ambito del processo.
- Correlazione: Configuri [Your document flow or correlation object] in modo che ogni evento sia associato a un LogisticsOrder. Le correlazioni mancanti o ambigue devono essere segnalate, non assegnate senza avviso.
- Granularità degli eventi: Scelga un evento per documento, per posizione del documento o per modifica di stato rilevante per l’attività aziendale. Applichi la stessa regola a tutti i rami ed elimini solo le righe duplicate per motivi tecnici.
- Priorità dei timestamp: Per ogni attività utilizzi il timestamp verificato di registrazione, creazione, conferma, modifica dello stato, controllo qualità, consegna, scarico, prova di consegna o fatturazione. Non sostituisca l’ora dell’evento aziendale con quella di estrazione.
- Etichetta del sistema di origine: Imposti [Source system label] su un valore stabile, ad esempio l’identificativo approvato del sistema SAP S/4HANA.
- Timestamp di aggiornamento: Imposti [Last data update expression] sul timestamp di estrazione approvato o sul timestamp di aggiornamento del sistema di origine.
- Prestazioni: Applichi subito i filtri per data e unità organizzative, selezioni solo le colonne necessarie, eviti join senza restrizioni a livello di posizione, controlli il piano di esecuzione e valuti una vista di estrazione persistente o una tabella di staging per i caricamenti ricorrenti.
- Autorizzazioni: È necessario disporre dell’accesso in lettura agli oggetti pertinenti dello schema SAP HANA e dell’autorizzazione a eseguire query SQL. Per la convalida aziendale occorre poter accedere ai dati pertinenti di vendite, approvvigionamento, inventario, produzione, qualità, esecuzione logistica, trasporti e fatturazione.
- Ambito funzionale: Verifichi che il sistema installato includa i processi aziendali rappresentati dalle attività richieste. I dati relativi a spedizioni, scarico, prove di consegna, qualità, produzione e fatturazione possono risiedere in applicazioni o estensioni separate.
- Sicurezza: Applichi le regole dell’organizzazione per i dati di clienti, fornitori, materiali, dati finanziari e utenti. Mascheri o limiti l’accesso ai campi sensibili quando necessario.
a Query di esempio sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; Passaggi
- Prerequisiti: Verifichi di disporre di una chiave sviluppatore e delle autorizzazioni necessarie nel sistema SAP S/4HANA per creare ed eseguire programmi ABAP (accesso alla transazione SE38) e leggere tabelle della supply chain come VBAK, LIKP, EKKO e MKPF.
- Crei il programma: Apra l’editor ABAP tramite il codice transazione
SE38. Inserisca un nome per il nuovo programma, ad esempioZ_PM_SCM_EXTRACTION, e selezioni «Crea». Inserisca un titolo descrittivo e imposti il tipo di programma su «Programma eseguibile». - Inserisca il codice: Copi il codice ABAP completo dalla sezione «query» qui sotto e lo incolli nell’editor ABAP del nuovo programma.
- Definisca gli elementi di testo: Selezioni Vai a > Elementi di testo > Testi di selezione. Attivi tutte le etichette proposte per la schermata di selezione, così da rendere l’interfaccia chiara e facile da usare.
- Attivi il programma: Salvi e attivi il programma premendo CTRL+S e poi CTRL+F3, oppure utilizzando l’icona di attivazione nella barra degli strumenti. Risolva eventuali errori di sintassi dovuti alla configurazione specifica del sistema.
- Esegua il programma: Avvii il programma premendo F8 o selezionando il pulsante «Elaborazione diretta». Verrà visualizzata una schermata di selezione che consente di filtrare i dati da estrarre.
- Imposti i parametri di estrazione: Nella schermata di selezione, specifichi l’intervallo di date per la data di creazione dell’ordine di vendita. Si consiglia vivamente di applicare anche un filtro per codici azienda o organizzazioni commerciali specifici, così da gestire il volume dei dati. Inserisca il percorso completo del file di output sul server applicativo SAP.
- Esegua in background: Per insiemi di dati ampi che coprono diversi mesi, è fondamentale eseguire il programma in background per evitare timeout della transazione. Dal menu, selezioni Programma > Esegui in background e pianifichi il job.
- Recuperi il file di dati: Al termine dell’esecuzione del programma, utilizzi il codice transazione
AL11per raggiungere la directory specificata sul server applicativo. Individui il file generato e lo scarichi sul computer locale tramite la transazioneCG3Y. - Prepari il file per il caricamento: Verifichi che il file scaricato sia in formato testo semplice, ad esempio CSV con separatori virgola o punto e virgola, e utilizzi la codifica UTF-8. Il file è ora pronto per essere caricato nello strumento di Process Mining.
Configurazione
- Intervallo di date per la selezione (S_ERDAT): È il filtro più importante. Definisce l’intervallo temporale per la selezione iniziale degli ordini di vendita in base alla data di creazione (
VBAK-ERDAT). Inizi con un periodo circoscritto, ad esempio gli ultimi 3-6 mesi, per mantenere gestibile il volume dei dati. - Organizzazione commerciale (S_VKORG): Filtro facoltativo per limitare l’estrazione a specifiche organizzazioni commerciali. È utile per concentrare l’analisi su una determinata unità aziendale o area geografica.
- Codice azienda (S_BUKRS): Filtro facoltativo per limitare i dati a specifici codici azienda. È fortemente consigliato per ridurre l’ambito dei dati e migliorare le prestazioni.
- Percorso del file di output (P_FILE): Percorso completo sul server applicativo SAP in cui verrà salvato il file Event Log finale. L’utente che esegue il programma deve disporre dell’autorizzazione di scrittura per questa directory. Esempio:
/usr/sap/trans/tmp/scm_event_log.csv. - Modalità di esecuzione: Il programma può essere eseguito in primo piano per estrazioni di prova di piccole dimensioni. Per volumi di dati significativi, l’elaborazione in background è obbligatoria per evitare timeout e ridurre il carico sul sistema nelle ore di punta.
- Autorizzazioni di sistema: L’utente che esegue il report deve poter leggere tutte le tabelle sottostanti, incluse, a titolo esemplificativo, VBAK, VBAP, EKKO, EKPO, MSEG, MKPF, LIKP, LIPS, VBRK, AUFK, QAVE, KNA1 e LFA1.
a Query di esempio abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF. È pronto a iniziare?
Utilizzi questo template per preparare i dati e iniziare subito a migliorare le prestazioni della supply chain. La accompagniamo in ogni fase del percorso.
Ottimizzi subito la gestione della supply chain
Ottenga visibilità end-to-end e migliori la precisione delle previsioni fino al 90% in pochi giorni.
Prova gratuita di 14 giorni, senza carta di credito.