Il Suo template dei dati per Order to Cash - Elaborazione degli ordini di vendita
Il Suo template dei dati per Order to Cash - Elaborazione degli ordini di vendita
- Attributi consigliati da raccogliere
- Attività principali da monitorare
- Indicazioni per l’estrazione da SAP ECC
Attributi di Order to Cash - Elaborazione degli ordini di vendita
| Nome | Descrizione | ||
|---|---|---|---|
| Ordine cliente SalesOrder | Identificativo univoco del documento dell’ordine cliente, utilizzato come caso principale per monitorare l’intero processo dall’ordine all’incasso. | ||
| Descrizione L’ordine cliente è il documento centrale del processo di vendita e rappresenta la richiesta di beni o servizi da parte di un cliente. Contiene tutte le informazioni necessarie per gestire la richiesta dall’inizio alla fine. Nel Process Mining, questo attributo viene utilizzato come ID del caso. Ogni numero univoco di ordine cliente corrisponde a un’istanza completa del processo. Analizzare i processi per ordine cliente consente di monitorarne l’intero ciclo di vita, misurare i tempi di ciclo e individuare le variazioni per ciascun ordine. Perché è importante È la chiave essenziale per collegare tutte le attività e gli eventi correlati e analizzare in modo completo il percorso di ciascun ordine cliente. Dove reperirli Si trova nella tabella dei dati di testata del documento di vendita (VBAK), nel campo VBELN. Esempi 900001234590000123469000012347 | |||
| Attività Activity | Nome di una specifica fase aziendale o di un evento verificatosi nel processo dell’ordine cliente. | ||
| Descrizione Questo attributo descrive una singola fase del processo dall’ordine all’incasso, ad esempio 'Ordine cliente creato', 'Consegna creata' o 'Pagamento ricevuto'. Queste attività costituiscono gli elementi con cui si ricostruisce il flusso del processo per ciascun ordine cliente. L’analisi della sequenza e dei tempi di queste attività è alla base del Process Mining. Consente di visualizzare la mappa del processo, individuare i colli di bottiglia, scoprire le varianti del processo e verificare la conformità rispetto a un modello standard. In genere, le attività vengono ricavate combinando eventi di creazione dei documenti, modifiche di stato o codici di transazione specifici registrati nel sistema. Perché è importante Le attività costituiscono la struttura portante della mappa del processo e ne consentono la visualizzazione e l’analisi del flusso, delle deviazioni e dei colli di bottiglia. Dove reperirli È un attributo derivato, in genere generato durante l’estrazione dei dati associando i codici di transazione SAP (T-Code), le modifiche di stato dei documenti (ad esempio nelle tabelle VBUK e VBUP) o i registri delle modifiche (tabelle CDHDR e CDPOS) a nomi di attività comprensibili. Esempi Ordine cliente creatoConsegna creataUscita merci registrataFattura creataPagamento ricevuto | |||
| Ora di inizio StartTime | Data e ora che indicano quando è iniziata un’attività o un evento. | ||
| Descrizione L’ora di inizio, detta anche data e ora dell’evento, registra la data e l’ora esatte in cui si è verificata una specifica attività. Ad esempio, indica quando è stato creato un ordine cliente, quando è stata registrata l’uscita merci o quando è stata registrata una fattura. Questo dato è fondamentale per tutte le analisi temporali nel Process Mining. Viene utilizzato per calcolare i tempi di ciclo tra le attività, misurare la durata complessiva di un caso e individuare ritardi o colli di bottiglia. Le date e ore registrate con precisione sono essenziali per le Dashboard di analisi delle prestazioni, ad esempio quelle che monitorano le consegne puntuali o i tempi di attraversamento dell’evasione. Perché è importante È un attributo fondamentale per calcolare tutte le metriche di prestazione, come i tempi di ciclo e le durate, necessarie per individuare i colli di bottiglia. Dove reperirli È un attributo composto, in genere ricavato combinando un campo data (ad esempio ERDAT) e un campo ora (ad esempio ERZET) di diverse tabelle SAP, come VBAK (ordine cliente), LIKP (consegna) e VBRK (fattura). Esempi 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
| Sistema di origine SourceSystem | Identifica il sistema di origine da cui sono stati estratti i dati. | ||
| Descrizione Questo attributo specifica il sistema di origine, ad esempio il nome di una specifica istanza SAP ECC o il numero del client. Fornisce un contesto ai dati, soprattutto negli ambienti con più sistemi di produzione o con dati provenienti da sistemi precedenti. Nelle analisi, viene utilizzato per filtrare o segmentare i dati in base alla loro origine. È particolarmente utile per confrontare i processi tra sistemi diversi o durante i progetti di migrazione, così da verificare l’integrità e la coerenza dei dati. Perché è importante Fornisce un contesto essenziale, soprattutto negli ambienti con più sistemi, e consente di confrontare i processi e di ricostruire chiaramente la provenienza dei dati. Dove reperirli Questo valore viene in genere aggiunto durante l’estrazione dei dati ed è spesso un valore statico che rappresenta l’ID del sistema SAP (SAPSID) o il client (MANDT). Esempi ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
| Ultimo aggiornamento dei dati LastDataUpdate | Data e ora dell’ultimo aggiornamento dei dati di questo record dal sistema di origine. | ||
| Descrizione Questo attributo registra la data e l’ora dell’estrazione o dell’aggiornamento più recente dei dati relativi a un evento o a un caso. Indica quanto sono aggiornati i dati analizzati. Nelle Dashboard e nei report, questa informazione è fondamentale per valutare l’attualità delle analisi. Aiuta a capire se i risultati riflettono lo stato più recente delle attività o si basano su dati meno aggiornati, chiarendo così agli utenti quanto siano recenti i dati. Perché è importante Permette agli utenti di sapere quanto sono aggiornati i dati, un’informazione essenziale per prendere decisioni tempestive e consapevoli sulla base dell’analisi di Process Mining. Dove reperirli È un attributo di metadati valorizzato dallo strumento o dal processo di estrazione al momento dell’acquisizione dei dati. Non è memorizzato nelle tabelle SAP di origine. Esempi 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
| Blocco della consegna DeliveryBlock | Codice che indica se un ordine cliente è bloccato per la consegna, impedendo la creazione del documento di consegna. | ||
| Descrizione Il blocco della consegna è uno stato impostato su un ordine cliente, a livello di testata o di posizione, per sospendere temporaneamente il processo prima della fase di consegna. Può essere impostato manualmente da un utente oppure automaticamente dal sistema, ad esempio in caso di superamento del limite di credito o di dati incompleti. Questo attributo è fondamentale per la Dashboard 'Analisi dei blocchi e delle rilavorazioni degli ordini cliente'. Analizzare la frequenza, la durata e i motivi dei blocchi della consegna aiuta a individuare i principali colli di bottiglia nel processo di evasione. Ridurre questi blocchi è essenziale per migliorare la puntualità delle consegne e il tempo di ciclo complessivo. Perché è importante Individua direttamente i colli di bottiglia nel processo di evasione. Analizzare perché e con quale frequenza gli ordini vengono bloccati è fondamentale per migliorare l’efficienza del flusso. Dove reperirli Si trova nella tabella dei dati di testata del documento di vendita (VBAK), nel campo LIFSK. Esempi 0102Z1 | |||
| Importo netto NetAmount | Valore totale dell’ordine cliente, al netto di imposte e sconti a livello di testata. | ||
| Descrizione L’importo netto rappresenta il valore monetario dell’ordine cliente. È una metrica finanziaria fondamentale associata a ogni istanza del processo. Questo attributo è essenziale per il Process Mining basato sul valore. Consente di dare priorità alle iniziative di miglioramento concentrandosi sugli ordini di maggior valore. Gli analisti possono mettere in relazione problemi di processo, come ritardi o rilavorazioni, e il loro impatto finanziario, rafforzando così le motivazioni aziendali a favore del cambiamento. Ad esempio, permette di verificare se gli ordini di valore elevato vengono gestiti con maggiore o minore efficienza rispetto a quelli di valore inferiore. Perché è importante Consente analisi basate sul valore e aiuta a concentrare gli interventi di miglioramento sugli ordini con il maggiore impatto finanziario per l’azienda. Dove reperirli Si trova nella tabella dei dati di testata del documento di vendita (VBAK), nel campo NETWR. Esempi 1500.0012550.75850.50 | |||
| Motivo di rifiuto RejectionReason | Codice che indica il motivo per cui una posizione dell’ordine cliente è stata rifiutata o annullata. | ||
| Descrizione Il motivo di rifiuto spiega perché un ordine cliente o una sua specifica posizione non è stata evasa. Le cause possono includere l’annullamento da parte del cliente, l’indisponibilità del prodotto o altri motivi aziendali. Questo attributo è essenziale per la Dashboard 'Andamento degli annullamenti degli ordini cliente'. Analizzando i motivi di rifiuto più frequenti, un’azienda può individuare le cause profonde delle vendite perse. Queste informazioni possono guidare interventi sulla gestione delle scorte, sulle strategie di prezzo o sulla comunicazione con i clienti, contribuendo a ridurre il tasso di annullamento degli ordini. Perché è importante Spiega i motivi degli annullamenti degli ordini e consente di analizzarne le cause profonde, ridurre le vendite perse e migliorare l’accuratezza delle previsioni. Dove reperirli Si trova nella tabella dei dati di posizione del documento di vendita (VBAP), nel campo ABGRU. Esempi 0215Z5 | |||
| Numero cliente CustomerNumber | Identificativo univoco del cliente che ha effettuato l’ordine. | ||
| Descrizione Questo attributo rappresenta il cliente committente ('Sold-to Party'), ovvero il conto cliente principale associato all’ordine. Collega la transazione a uno specifico cliente nei dati anagrafici. L’analisi per numero cliente consente di segmentare il processo e comprendere i comportamenti e le prestazioni specifici di ciascun cliente. Aiuta a rispondere a domande come: quali clienti hanno i tempi di ciclo più lunghi, i tassi di rilavorazione più elevati o il maggior numero di modifiche agli ordini? È un’informazione essenziale per migliorare la gestione delle relazioni con i clienti e i livelli di servizio. Perché è importante Consente un’analisi incentrata sul cliente, aiutando a individuare i problemi di processo che riguardano clienti specifici e a misurare le prestazioni per ciascun cliente. Dove reperirli Si trova nella tabella dei dati di testata del documento di vendita (VBAK), nel campo KUNNR. Esempi 100234100567200112 | |||
| Numero materiale MaterialNumber | Identificativo univoco del prodotto o servizio venduto. | ||
| Descrizione Il numero materiale identifica l’articolo specifico di una riga dell’ordine cliente. Poiché un singolo ordine può includere più materiali, questo attributo viene in genere analizzato a livello di posizione. L’analisi del processo per numero materiale aiuta a individuare problemi specifici dei prodotti. Può rivelare se determinati prodotti sono associati a tempi di evasione più lunghi, a un maggior numero di blocchi della consegna o a più frequenti discrepanze nelle fatture. È un’informazione essenziale per ottimizzare il processo in base alle diverse linee di prodotto e supportare la gestione della catena di approvvigionamento. Perché è importante Consente di analizzare i processi per prodotto e di individuare quelli associati a inefficienze, come ritardi, blocchi o rilavorazioni. Dove reperirli Si trova nella tabella dei dati di posizione del documento di vendita (VBAP), nel campo MATNR. Esempi FG-1001-ARAW-205BSERV-INSTALL | |||
| Organizzazione commerciale SalesOrganization | Unità organizzativa responsabile della vendita di prodotti o servizi. | ||
| Descrizione L’organizzazione commerciale è un’entità organizzativa fondamentale in SAP, che struttura l’azienda in base alle esigenze di vendita. È responsabile della negoziazione delle condizioni di vendita e della distribuzione di beni e servizi. Nel Process Mining, questo attributo è una dimensione di analisi fondamentale. Consente di confrontare le prestazioni, l’efficienza e la conformità dei processi tra diverse unità di vendita, aree geografiche o divisioni. Aiuta così a individuare le prassi efficaci nelle unità con i risultati migliori e le aree da migliorare nelle altre. Perché è importante Consente confronti tra unità organizzative e permette di valutare l’efficienza e la conformità dei processi nelle diverse unità aziendali o aree geografiche. Dove reperirli Si trova nella tabella dei dati di testata del documento di vendita (VBAK), nel campo VKORG. Esempi 100025003100 | |||
| Utente User | ID dell’utente che ha creato o modificato per ultimo il documento o eseguito l’attività. | ||
| Descrizione Questo attributo registra l’ID dell’utente SAP responsabile di un determinato evento del processo. Ad esempio, identifica l’addetto alle vendite che ha creato l’ordine o il personale di magazzino che ha registrato l’uscita merci. L’analisi per utente aiuta a comprendere la distribuzione del carico di lavoro, individuare esigenze di formazione e rilevare differenze nel modo in cui gli utenti svolgono la stessa attività. È essenziale per le Dashboard dedicate alle prestazioni delle risorse, alla conformità e all’individuazione degli interventi manuali. Perché è importante Offre visibilità sulle prestazioni delle risorse e sul carico di lavoro, aiuta a individuare le deviazioni del processo associate a singoli utenti ed è utile per le analisi di conformità e automazione. Dove reperirli Si trova in molte tabelle di testata SAP nel campo 'Creato da' (ERNAM) o 'Modificato da' (AENAM), ad esempio in VBAK, LIKP e VBRK. Esempi CBURKEJSMITHRWILLIAMS | |||
| Condizioni di spedizione ShippingConditions | Definiscono la strategia generale per la spedizione dei beni al cliente. | ||
| Descrizione Le condizioni di spedizione determinano le modalità di spedizione di un ordine, ad esempio 'Standard', 'Espressa' o 'Ritiro'. Sono concordate con il cliente e influiscono sulla pianificazione logistica. Questo attributo viene utilizzato nell’analisi 'Efficienza e costi delle modalità di spedizione'. Segmentando il processo in base alle condizioni di spedizione, le aziende possono verificare se alcune modalità sono più soggette a ritardi o comportano tempi di ciclo più lunghi. Questi dati aiutano a ottimizzare la logistica e a gestire le aspettative dei clienti sui tempi di consegna. Perché è importante Consente di analizzare le prestazioni logistiche e di verificare se determinate modalità di spedizione sono associate a ritardi o a una maggiore efficienza. Dove reperirli Si trova nella tabella dei dati di testata del documento di vendita (VBAK), nel campo VSBED. Esempi 011020 | |||
| Consegna puntuale IsOnTimeDelivery | Indicatore booleano che segnala se la merce è stata spedita entro la data di consegna confermata. | ||
| Descrizione Questo attributo calcolato confronta la data effettiva di uscita merci con la 'ConfirmedDeliveryDate' dell’ordine cliente. Se l’uscita merci avviene entro la data confermata, il valore è vero; altrimenti è falso. Questo attributo semplifica la creazione della Dashboard 'Prestazioni delle consegne puntuali' e il calcolo del KPI del tasso di consegne puntuali. Consente di aggregare e visualizzare facilmente le prestazioni, senza dover confrontare le date ogni volta all’interno di un’analisi o di un grafico. Offre così una misura chiara e immediata dell’affidabilità delle consegne. Perché è importante Fornisce una misura chiara e semplice delle prestazioni delle consegne e facilita il calcolo del KPI complessivo del tasso di consegne puntuali. Dove reperirli È un attributo calcolato. La logica confronta la data e ora dell’attività 'Uscita merci' con il valore dell’attributo 'ConfirmedDeliveryDate'. Esempi truefalse | |||
| Data di consegna confermata ConfirmedDeliveryDate | Data in cui è stata confermata al cliente la consegna dei beni o dei servizi. | ||
| Descrizione È la data di consegna concordata con il cliente, definita in base alla disponibilità dei materiali e alla pianificazione. Costituisce la base di riferimento per misurare le prestazioni delle consegne. Questo attributo è alla base della Dashboard 'Prestazioni delle consegne puntuali' e del KPI del tasso di consegne puntuali. Confrontando la data di consegna confermata con la data effettiva di 'Uscita merci', l’analisi determina se un ordine è stato consegnato in anticipo, puntualmente o in ritardo. È una misura fondamentale dell’affidabilità della catena di approvvigionamento e della soddisfazione dei clienti. Perché è importante È il valore di riferimento per misurare le prestazioni delle consegne puntuali, un KPI fondamentale per la soddisfazione dei clienti e l’efficienza della catena di approvvigionamento. Dove reperirli Si trova nella tabella delle righe di schedulazione del documento di vendita (VBEP), nel campo EDATU. Esempi 2023-05-102023-06-202023-07-01 | |||
| È una rilavorazione IsRework | Indicatore booleano che segnala se un ordine cliente ha subito una modifica significativa o una rilavorazione dopo la creazione iniziale. | ||
| Descrizione Questo attributo calcolato individua le istanze del processo che hanno richiesto una rilavorazione, ad esempio una o più attività 'Ordine cliente modificato'. La logica specifica che definisce una rilavorazione, come una modifica del prezzo, della quantità o della data di consegna, viene stabilita durante la configurazione del progetto. Questo attributo è fondamentale per la Dashboard 'Rilavorazioni e frequenza delle modifiche degli ordini cliente' e per il KPI del tasso di rilavorazione degli ordini cliente. Semplifica l’analisi consentendo di filtrare e confrontare direttamente gli ordini che hanno seguito un percorso senza interruzioni con quelli che hanno richiesto modifiche manuali. Aiuta così a quantificare l’impatto delle rilavorazioni sui tempi di ciclo e sui costi. Perché è importante Quantifica direttamente la frequenza delle rilavorazioni e consente di analizzarne le cause e l’impatto sull’efficienza complessiva del processo e sui tempi di ciclo. Dove reperirli È un attributo calcolato a partire dall’Event Log. La logica verifica la presenza di attività 'Ordine cliente modificato' o di specifici eventi di modifica nelle tabelle CDHDR/CDPOS. Esempi truefalse | |||
| Stato della verifica del credito CreditCheckStatus | Indica lo stato della verifica del credito per il documento di vendita. | ||
| Descrizione Questo attributo mostra l’esito della verifica del credito, automatica o manuale, effettuata su un ordine cliente. Gli stati più comuni sono 'Approvato', 'Rifiutato' o 'Bloccato'. È un attributo fondamentale per la Dashboard 'Analisi dei tempi di elaborazione della verifica del credito'. Ritardi o blocchi in questa fase possono incidere notevolmente sul tempo di ciclo complessivo di evasione dell’ordine. Analizzare questo stato aiuta a comprendere l’efficienza del processo di gestione del credito e il suo impatto sulla velocità delle vendite. Perché è importante Incide direttamente sulla velocità di elaborazione degli ordini. Analizzare questo stato aiuta a individuare i colli di bottiglia nella gestione del credito che ritardano l’evasione degli ordini. Dove reperirli Si trova nella tabella degli stati di testata del documento di vendita (VBUK) o direttamente in VBAK, nel campo dello stato del credito (ad esempio CMGST). Esempi ABD | |||
Attività di Order to Cash - Elaborazione degli ordini di vendita
| Attività | Descrizione | ||
|---|---|---|---|
| Fattura creata | Indica la creazione della fattura cliente o del documento di fatturazione. È un evento esplicito che genera un nuovo documento nel sistema e avvia la fase di pagamento del processo. | ||
| Perché è importante È una tappa fondamentale, perché avvia il conteggio del tempo di ciclo dalla fattura al pagamento. I ritardi nella fatturazione incidono direttamente sul flusso di cassa. Dove reperirli È registrata nella tabella VBRK (documento di fatturazione: dati di testata) in base alla data di creazione (ERDAT). Il collegamento all’ordine cliente o alla consegna si trova nella tabella VBFA. Acquisizione Evento basato sulla data e ora di creazione (ERDAT) nella tabella VBRK. Tipo di evento explicit | |||
| Ordine cliente creato | Indica la creazione di un nuovo documento di ordine cliente. È un evento esplicito, registrato quando un utente salva un nuovo ordine, in genere tramite la transazione VA01 in SAP. | ||
| Perché è importante È l’evento di inizio principale del processo Order to Cash. Analizzarne la data e l’ora è fondamentale per misurare il tempo di ciclo complessivo e il volume degli ordini ricevuti. Dove reperirli Registrato nella tabella VBAK (dati di intestazione del documento di vendita), utilizzando la data di creazione (ERDAT) e l’ora (ERZET). Il codice della transazione è memorizzato in VBAK-TCODE. Acquisizione Evento basato sulla data e sull’ora di creazione (ERDAT, ERZET) nella tabella VBAK. Tipo di evento explicit | |||
| Ordine confermato | Questa attività indica che l’ordine cliente ha superato tutti i controlli iniziali ed è confermato per l’evasione. In genere si deduce quando l’ordine non è più bloccato e le righe di schedulazione riportano quantità confermate. | ||
| Perché è importante È una tappa fondamentale che segna il passaggio dall’inserimento dell’ordine alla sua evasione. Costituisce il punto di partenza per misurare i tempi di attraversamento dell’evasione e le prestazioni delle consegne puntuali. Dove reperirli Si può dedurre quando le righe di schedulazione in VBEP riportano una quantità confermata (BMENG > 0) e l’ordine non è bloccato per la consegna, ad esempio quando VBUK-LIFSK è vuoto. Acquisizione Si deduce dalla conferma della riga di schedulazione (VBEP-BMENG > 0) e dalla rimozione dei blocchi a livello di intestazione. Tipo di evento inferred | |||
| Pagamento ricevuto | Questo evento indica che il pagamento del cliente è stato ricevuto e imputato alla fattura, chiudendo la partita aperta dei crediti verso clienti. È un evento contabile, dedotto dalla chiusura di un documento finanziario. | ||
| Perché è importante È l’ultimo passaggio per incassare il ricavato della vendita. Segna il termine del tempo di ciclo dalla fattura al pagamento e del tempo di ciclo complessivo di evasione dell’ordine cliente. Dove reperirli Si deduce dai dati del documento di compensazione nella tabella BSEG, relativi alla partita del cliente. Quando BSEG-AUGBL (documento di compensazione) e BSEG-AUGDT (data di compensazione) sono valorizzati, il pagamento risulta ricevuto. Acquisizione Si deduce dalla valorizzazione della data di compensazione (AUGDT) nella tabella BSEG per la partita dei crediti verso clienti. Tipo di evento inferred | |||
| Posizione dell’ordine chiusa | Questa attività segna la chiusura definitiva di una posizione dell’ordine cliente e indica che la merce è stata interamente consegnata, fatturata e che la posizione è completa. La chiusura si deduce dallo stato complessivo della posizione. | ||
| Perché è importante Segna la conclusione positiva del processo. Analizzare quando si chiudono le posizioni aiuta a comprendere la durata complessiva del processo e a individuare gli ordini che restano aperti senza necessità. Dove reperirli Si deduce dal campo dello stato complessivo della posizione nella tabella VBUP (documento di vendita: stato posizione). Quando VBUP-GBSTA è 'C' (Elaborato completamente), la posizione risulta chiusa. Acquisizione Si deduce dal passaggio dello stato della posizione (VBUP-GBSTA) a 'C' (Elaborato completamente). Tipo di evento inferred | |||
| Uscita merci registrata | È un evento critico in cui la proprietà delle merci viene trasferita e queste lasciano ufficialmente il magazzino. Si tratta di una registrazione contabile esplicita che crea un documento materiale e aggiorna le scorte. | ||
| Perché è importante È l’evento di spedizione e una tappa fondamentale per misurare la puntualità delle consegne e i tempi di attraversamento dell’evasione. Attiva gli aggiornamenti contabili e segna un punto di non ritorno nel processo di evasione fisica. Dove reperirli Creazione di un documento materiale (MKPF/MSEG) con un tipo di movimento di uscita merci, ad esempio 601, collegato al documento di consegna. Acquisizione Creazione di un documento materiale (MKPF/MSEG) con un tipo di movimento di uscita merci, collegato alla consegna. Tipo di evento explicit | |||
| Blocco della consegna impostato | Indica l’applicazione di un blocco della consegna all’ordine cliente, che impedisce la creazione del documento di consegna. L’evento può essere registrato esplicitamente nei log delle modifiche oppure dedotto dalle tabelle di stato. | ||
| Perché è importante Questa attività è direttamente collegata al KPI «Tasso di blocco degli ordini cliente». Individuare perché e con quale frequenza vengono impostati i blocchi aiuta a capire le cause dei ritardi nell’evasione. Dove reperirli È possibile trovarlo nei log delle modifiche (CDHDR/CDPOS) per il campo VBAK-LIFSK. In alternativa, si deduce quando il campo VBAK-LIFSK risulta valorizzato. Acquisizione Evento ricavato dai documenti di modifica del campo VBAK-LIFSK o VBAP-LIFSP. Tipo di evento explicit | |||
| Conferma della prova di consegna | Questa attività rappresenta la conferma che il cliente ha ricevuto la merce. Viene registrata quando la prova di consegna è inserita nel sistema, aggiornando spesso lo stato del documento di consegna. | ||
| Perché è importante Questo evento fornisce la data effettiva di consegna, indispensabile per calcolare con precisione il tasso di consegne puntuali rispetto alla data promessa. Dove reperirli Si deduce dall’impostazione dello stato della prova di consegna (VBUK-PODAT) su 'C' (Confermato). La data di conferma è memorizzata in VLPOD-PODAT. Questa implementazione non è sempre presente. Acquisizione Si deduce dall’aggiornamento dello stato della prova di consegna (POD) nel documento di consegna (VBUK-PODAT) o da una voce nella tabella VLPOD. Tipo di evento inferred | |||
| Consegna creata | Questo evento indica la creazione del documento di consegna in uscita, che dà al magazzino l’istruzione di avviare le attività di prelievo e spedizione. È un evento esplicito, registrato nel flusso dei documenti. | ||
| Perché è importante È il primo passaggio del processo di evasione fisica. Il tempo tra la conferma dell’ordine e la creazione della consegna indica la rapidità con cui viene avviato il processo logistico. Dove reperirli Creazione di un record nella tabella LIKP (documento SD: dati di intestazione della consegna). Il collegamento all’ordine cliente è mantenuto nella tabella del flusso dei documenti VBFA. Acquisizione Evento basato sulla data e sull’ora di creazione nella tabella LIKP, collegata tramite la tabella VBFA. Tipo di evento explicit | |||
| Controllo del credito completato | Indica il completamento del controllo del credito, automatico o manuale, sul cliente associato all’ordine. In genere si deduce da una modifica dello stato complessivo del credito del documento. | ||
| Perché è importante Il controllo del credito è spesso un collo di bottiglia critico. Misurare il tempo necessario per completarlo è essenziale per l’analisi dei tempi di elaborazione dei controlli del credito e per accelerare l’elaborazione degli ordini. Dove reperirli Si deduce dai campi dello stato del credito nella tabella VBUK (documento di vendita: stato dell’intestazione). La modifica di VBUK-CMGST da bloccato a rilasciato contrassegna questa attività. Acquisizione Si deduce dalle modifiche al campo dello stato complessivo del credito (VBUK-CMGST). Tipo di evento inferred | |||
| Fattura annullata | Rappresenta lo storno di un documento di fatturazione creato in precedenza. È una transazione esplicita che crea un nuovo documento di annullamento per compensare quello originale. | ||
| Perché è importante Monitorare gli annullamenti delle fatture aiuta a individuare problemi di prezzo, discrepanze nelle spedizioni o errori nei dati. Questa analisi supporta il KPI del tasso di discrepanze delle fatture. Dove reperirli Evento esplicito, registrato con la creazione di un documento di annullamento della fatturazione (VBRK-VBTYP = 'N' o 'O'). La fattura originale è indicata in VBRK-SFAKN. Acquisizione Creazione di un documento di annullamento in VBRK, con riferimento alla fattura originale. Tipo di evento explicit | |||
| Ordine annullato | Indica che un ordine cliente è stato annullato prima dell’evasione. In genere, l’annullamento viene registrato assegnando un motivo di rifiuto a tutte le posizioni pertinenti dell’ordine. | ||
| Perché è importante È un esito negativo critico, direttamente collegato al KPI del tasso di annullamento degli ordini. Capire quando e perché gli ordini vengono annullati permette di individuare problemi nel processo di vendita. Dove reperirli Si deduce dalla valorizzazione del campo VBAP-ABGRU (motivo di rifiuto) per tutte le posizioni attive di un ordine cliente. La data della modifica è disponibile in CDHDR/CDPOS. Acquisizione Si deduce dalla valorizzazione del campo 'Motivo di rifiuto' (VBAP-ABGRU) per tutte le posizioni. Tipo di evento inferred | |||
| Ordine cliente modificato | Rappresenta una modifica apportata a un ordine cliente esistente dopo la creazione iniziale. Le modifiche vengono registrate nelle tabelle dedicate ai log delle modifiche (CDHDR, CDPOS) quando vengono aggiornati campi come quantità, prezzo o date. | ||
| Perché è importante Monitorare le modifiche aiuta a individuare rilavorazioni, instabilità del processo e problemi di qualità dei dati. Modifiche frequenti possono indicare problemi nell’inserimento iniziale dell’ordine e causare ritardi. Dove reperirli Ricavato dalle tabelle dei documenti di modifica CDHDR (intestazione) e CDPOS (riga) per OBJECTCLAS = 'VERKBELEG'. È possibile identificare la data e l’ora e il campo modificato. Acquisizione Evento ricavato dalle tabelle dei documenti di modifica (CDHDR, CDPOS) per gli oggetti dei documenti di vendita. Tipo di evento explicit | |||
| Prelievo completato | Indica che tutti gli articoli della consegna sono stati prelevati fisicamente dal magazzino. Se si utilizza Warehouse Management (WM), l’evento può essere dedotto dallo stato dell’ordine di trasferimento. | ||
| Perché è importante Analizzare i tempi di prelievo aiuta a ottimizzare le operazioni di magazzino. I ritardi in questa fase incidono direttamente sui tempi complessivi di spedizione e sul ciclo di evasione. Dove reperirli Si deduce quando lo stato di prelievo della riga di consegna nella tabella LIPS-KOSTA passa a 'C' (prelievo completato). Se WM è attivo, l’evento può essere dedotto dalla conferma dell’ordine di trasferimento (tabelle LTAK/LTAP). Acquisizione Si deduce dalla modifica dello stato di prelievo (LIPS-KOSTA) o dalla conferma dell’ordine di trasferimento WM. Tipo di evento inferred | |||
Guide all’estrazione
Passaggi
- Sviluppare il programma: utilizzando la transazione SE38 o SE80, crei un nuovo programma ABAP eseguibile. Il programma conterrà tutta la logica di estrazione.
- Definire la schermata di selezione: nel programma, crei una schermata per filtrare i dati. Includa i parametri Data di creazione del documento di vendita (VBAK-ERDAT), Organizzazione commerciale (VBAK-VKORG) e Tipo di documento di vendita (VBAK-AUART). In questo modo l’estrazione sarà riutilizzabile e gestibile.
- Dichiarare i dati: definisca le tabelle interne e le strutture necessarie a contenere i dati delle varie tabelle SAP, ad esempio VBAK, VBAP, VBFA, CDHDR, CDPOS, VBRK e BSAD. Definisca inoltre la struttura finale dell’output dell’Event Log, con gli attributi richiesti.
- Selezionare gli ordini di vendita di base: scriva l’istruzione SELECT iniziale per recuperare le testate degli ordini di vendita (VBAK) e le relative posizioni (VBAP) in base ai valori inseriti dall’utente nella schermata di selezione. Questo costituisce il set di dati principale dei casi da analizzare.
- Estrarre l’evento di creazione: scorra i record VBAK selezionati. Per ciascuno, compili la struttura dell’Event Log con l’attività 'Ordine di vendita creato', utilizzando VBAK-ERDAT e VBAK-ERZET per StartTime.
- Estrarre gli eventi dal registro delle modifiche: selezioni da CDHDR e CDPOS i record in cui OBJECTCLAS è 'VERKBELEG' per gli ordini di vendita selezionati. Scorra i risultati per individuare le modifiche a campi specifici. Ad esempio, una modifica a VBAK-LIFSK indica 'Blocco consegna impostato', mentre una modifica a VBUK-CMGST indica 'Controllo del credito eseguito'. Le altre modifiche pertinenti possono essere registrate come 'Ordine di vendita modificato'.
- Estrarre i dati del flusso documentale: per gli ordini di vendita selezionati, interroghi la tabella del flusso dei documenti (VBFA), che collega gli ordini ai documenti successivi, come consegne, movimenti merci e fatture. Selezioni tutti i documenti correlati per le successive elaborazioni.
- Estrarre gli eventi di consegna ed evasione: utilizzando i numeri dei documenti di consegna ricavati da VBFA, interroghi LIKP e LIPS per individuare gli eventi 'Consegna creata'. Interroghi MKPF e MSEG per i documenti di uscita merci (tipo movimento '601') e registri l’evento 'Merci uscite'. Se è attiva la gestione del magazzino, interroghi LTAK e LTAP per trovare l’ora di conferma dell’ultima posizione dell’ordine di trasferimento e determinare 'Prelievo completato'. Verifichi lo stato della testata della consegna VBUK-PODAT per individuare 'Prova di consegna confermata'.
- Estrarre gli eventi di fatturazione e pagamento: utilizzando i numeri dei documenti di fatturazione ricavati da VBFA, interroghi VBRK e VBRP per individuare gli eventi 'Fattura creata' e 'Fattura annullata' (dove VBRK-FKSTO = 'X'). Per rilevare 'Pagamento ricevuto', colleghi la fattura di VBRK al documento contabile in BKPF, quindi individui il documento di compensazione e la relativa data in BSAD.
- Estrarre gli eventi basati sullo stato: utilizzi le tabelle di stato VBUP (stato delle posizioni) e VBUK (stato della testata) per dedurre gli eventi aziendali. Ad esempio, una posizione è considerata 'Posizione dell’ordine chiusa' quando VBUP-GBSTA è uguale a 'C'. Un ordine è 'Ordine annullato' quando è impostato un 'Motivo del rifiuto' (VBAP-ABGRU) per tutte le posizioni pertinenti.
- Consolidare e formattare i dati: riunisca tutti gli eventi rilevati in un’unica tabella interna finale. Verifichi che tutti gli attributi (SalesOrder, Activity, StartTime, User ecc.) siano compilati correttamente per ogni record di evento. Aggiunga i timestamp SourceSystem e LastDataUpdate.
- Generare il file di output: utilizzi il modulo funzione GUI_DOWNLOAD o il metodo cl_gui_frontend_services=>gui_download per esportare la tabella interna finale in un file CSV sul computer locale dell’utente. Verifichi che il file sia salvato con codifica UTF-8.
Configurazione
- Prerequisiti: autorizzazioni per lo sviluppo ABAP, ad esempio accesso alla transazione SE38, e permessi di lettura per tutte le tabelle SAP necessarie, tra cui VBAK, VBAP, CDHDR, CDPOS, VBFA, LIKP, LIPS, VBRK, VBRP, MKPF, MSEG e BSAD.
- Parametri di selezione: il programma deve includere una schermata di selezione con parametri di filtro. I principali sono:
- Intervallo di date: un intervallo obbligatorio per la data di creazione degli ordini di vendita (VBAK-ERDAT). Per mantenere gestibile il set di dati, inizi con un periodo recente di 3-6 mesi.
- Organizzazione commerciale: filtri per VBAK-VKORG per concentrare l’analisi su specifiche unità aziendali.
- Tipo di documento di vendita: filtri per VBAK-AUART per includere solo i tipi di ordine pertinenti, ad esempio gli ordini standard, ed escludere gli altri, come offerte e resi.
- Considerazioni sulle prestazioni: l’estrazione di grandi volumi di dati dalle tabelle del registro delle modifiche (CDHDR, CDPOS) e del flusso documentale (VBFA) può essere molto lenta. Il programma deve essere ottimizzato utilizzando i campi indicizzati nelle clausole WHERE. Per estrazioni molto ampie, pianifichi l’esecuzione del programma come processo in background nelle ore di minore attività, tramite la transazione SM36.
- Attivazione del registro delle modifiche: questo metodo si basa sulla funzionalità SAP dei documenti di modifica. Verifichi che la registrazione delle modifiche sia attiva per gli elementi dati principali, ad esempio LIFSK, CMGST e ABGRU. Può controllarlo tramite la transazione SCDO per l’oggetto VERKBELEG.
Query di esempio abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
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~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM. Passaggi
- Prerequisiti: verifichi di disporre dell’accesso diretto in sola lettura al database SAP ECC sottostante. Per connettersi ed eseguire le query, occorre un client di database come DBeaver, SQL Server Management Studio o Oracle SQL Developer.
- Recuperare lo script SQL: copi la query SQL completa fornita nella sezione 'query' di questo documento.
- Connettersi al database: apra il client di database e stabilisca una connessione all’istanza del database SAP ECC. Le serviranno l’indirizzo del server, la porta, il nome del database e le credenziali di accesso appropriate.
- Configurare la query: incolli lo script SQL in una nuova finestra dell’editor di query. Individui la sezione di configurazione all’interno della Common Table Expression (CTE) principale denominata SalesOrders. Sostituisca i valori segnaposto per la data iniziale ('{StartDate}'), la data finale ('{EndDate}'), le organizzazioni commerciali ('{SalesOrgs}') e i tipi di documento ('{DocTypes}') con i valori effettivi per l’analisi.
- Eseguire la query: esegua lo script SQL configurato. A seconda dell’intervallo di date e delle dimensioni del database SAP, l’elaborazione potrebbe richiedere alcuni minuti.
- Rivedere i risultati: al termine dell’esecuzione, verrà visualizzato un set di risultati. Controlli rapidamente che contenga le colonne previste (SalesOrder, Activity, StartTime ecc.) e che siano presenti righe relative a diverse attività.
- Esportare i dati: utilizzi la funzione di esportazione del client di database per salvare il set di risultati in un file CSV. Assegni al file un nome descrittivo, ad esempio SAP_O2C_Event_Log.csv.
- Preparare il file per ProcessMind: apra il file CSV in un foglio di calcolo. Verifichi che le intestazioni delle colonne corrispondano esattamente agli attributi richiesti, ad esempio SalesOrder, Activity e StartTime. Si assicuri che il formato di data e ora di StartTime e LastDataUpdate sia coerente e supportato da ProcessMind, ad esempio YYYY-MM-DD HH:MI:SS.
- Caricare i dati in ProcessMind: carichi il file CSV finale, formattato correttamente, nel progetto ProcessMind per avviare l’analisi.
Configurazione
- Intervallo di date: la query utilizza i segnaposto ('{StartDate}' e '{EndDate}') per filtrare gli ordini di vendita in base alla data di creazione (VBAK.ERDAT). Un periodo di analisi tipico comprende da 3 a 6 mesi di dati, così da ottenere un campione rappresentativo senza sovraccaricare il database.
- Filtro per organizzazione commerciale: utilizzi il segnaposto '{SalesOrgs}' per limitare l’estrazione a specifiche organizzazioni commerciali, ad esempio '1000' e '2000'. Questo filtro è essenziale per concentrare l’analisi e migliorare le prestazioni della query.
- Filtro per tipo di documento: utilizzi il segnaposto '{DocTypes}' per selezionare specifici tipi di ordine di vendita, ad esempio 'OR' per un ordine standard. In questo modo è possibile escludere dal flusso principale del processo documenti non pertinenti, come consegne gratuite o resi.
- Identificativo del sistema di origine: il segnaposto codificato '{SourceSystemName}' serve ad assegnare a ogni record il nome del sistema di origine. Lo sostituisca con un nome significativo per l’istanza SAP ECC, ad esempio SAP_ECC_PRD.
- Compatibilità del database: la funzione utilizzata per combinare i campi di data e ora, [Your DB-specific timestamp function], è un segnaposto. Deve sostituirla con la funzione corretta per il database in uso, ad esempio TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS') per SAP HANA oppure CAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME) per SQL Server.
- Prerequisiti: questo metodo richiede credenziali di accesso diretto al database in sola lettura. L’utente del database deve essere autorizzato ad accedere a tutte le tabelle indicate nella query, tra cui VBAK, VBAP, VBFA, CDHDR, CDPOS, LIKP, VBRK e BSAD.
Query di esempio sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''; È pronto a iniziare?
Sfrutti questo template dei dati per valorizzare appieno il processo Order to Cash - Elaborazione degli ordini di vendita. Inizi oggi il percorso verso una maggiore efficienza e un flusso di cassa più rapido.
Ottimizzi oggi l’elaborazione degli ordini di vendita nel processo Order to Cash
Elimini i colli di bottiglia, riduca del 30% il tempo di ciclo e migliori rapidamente il flusso di cassa.
Non è richiesta alcuna carta di credito. La configurazione richiede pochi minuti.