Il suo Template dati Purchase to Pay - Ordine d'Acquisto
Il suo Template dati Purchase to Pay - Ordine d'Acquisto
- Attributi raccomandati per un'analisi dettagliata
- Attività chiave da tracciare all'interno del processo
- Guida all'estrazione dei dati passo dopo passo
Procure to Pay - Attributi dell’ordine di acquisto
| Nome | Descrizione | ||
|---|---|---|---|
| Activity ActivityName | Il nome dell'event o della fase di business che si è verificato nel processo dell'ordine di acquisto. | ||
| Descrizione Questo attributo descrive un'azione specifica o un cambio di status all'interno del ciclo di vita dell'ordine di acquisto, come 'Ordine di Acquisto Creato', 'Ordine di Acquisto Approvato' o 'Ricevimento Merci Registrato'. La sequenza di queste attività forma il flusso di processo. Analizzare la sequenza e la frequenza delle attività è il cuore del Process Mining. Aiuta a scoprire il processo effettivo, confrontarlo con il modello progettato, identificare bottleneck (es. lunghe attese dopo 'Fattura Ricevuta') e quantificare il rilavoro (es. attività ripetute di 'Ordine di Acquisto Modificato'). Perché è importante Definisce i passaggi del processo, consentendo la visualizzazione e l'analisi del flusso end-to-end, l'analisi delle varianti e l'identificazione dei bottleneck. Dove trovare Tipicamente derivato da una combinazione di tabelle e campi, come i campi di status in EKKO/EKPO o i log dei documenti di modifica in CDHDR/CDPOS, per rappresentare milestone chiave del business. Esempi Ordine di acquisto creatoOrdine di acquisto approvatoRicevimento merce registratoFattura Ricevuta | |||
| Ordine d'Acquisto PurchaseOrderNumber | L'identificatore univoco per l'Ordine di Acquisto (OA), che serve come ID case primario per il tracciamento del ciclo di vita dell'approvvigionamento. | ||
| Descrizione Il Numero dell'Ordine di Acquisto è l'identificatore centrale che collega tutte le attività correlate, dalla creazione iniziale al ricevimento finale della merce e al completamento. Agisce come identificatore del case per l'analisi di Process Mining. Nell'analisi, raggruppare gli event per questo numero consente la ricostruzione del percorso di ogni singolo OA. Questo è essenziale per calcolare i tempi di ciclo, analizzare le varianti di processo e identificare bottleneck o deviazioni specifiche di un singolo ordine. Perché è importante È la chiave essenziale per collegare tutti gli eventi di approvvigionamento in un unico processo end-to-end, consentendo un'analisi dettagliata del ciclo di vita di ogni ordine di acquisto. Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EBELN. Esempi 450001712345000171244500017125 | |||
| Timestamp Evento EventTime | Il timestamp che indica quando l'attività si è verificata. | ||
| Descrizione Questo attributo registra la data e l'ora esatte di ogni attività nel processo. È fondamentale per tutte le analisi temporali nel Process Mining. Il Tempo Evento viene utilizzato per ordinare cronologicamente le attività al fine di costruire il flusso di processo. Inoltre, è la base per il calcolo di tutte le metriche basate sulla durata, come i tempi di ciclo tra le attività, i tempi di attesa e i tempi di elaborazione, che sono critici per l'analisi delle prestazioni e l'identificazione dei bottleneck. Perché è importante Questo timestamp è critico per ordinare correttamente gli event e calcolare tutte le metriche di performance, inclusi tempi di ciclo, lead time e tempi di attesa. Dove trovare Campi timestamp associati ad attività specifiche, come la data di creazione (EKKO-AEDAT per le modifiche) o la data di registrazione (MKPF-BUDAT per i ricevimenti merci). Spesso richiede la combinazione di dati da più tabelle. Esempi 2023-04-15T10:00:00Z2023-04-15T14:30:00Z2023-05-01T09:15:00Z | |||
| Sistema di Origine SourceSystem | Identifica il sistema sorgente da cui sono stati estratti i `dati`. | ||
| Descrizione Questo attributo specifica il sistema di origine per i dati dell'event, ad esempio, 'SAP S/4HANA Production' o 'SAP ECC'. In ambienti con più sistemi, questo campo è cruciale per la data lineage, il troubleshooting e per garantire che i dati da diverse fonti siano correttamente interpretati. Aiuta a comprendere il contesto dei dati e può essere utilizzato per filtrare l'analisi per specifici ambienti di sistema. Perché è importante Fornisce il contesto essenziale sull'origine dei dati, che è critico per la data governance, la convalida e l'analisi in architetture multi-sistema. Dove trovare Questo è tipicamente un valore statico aggiunto durante il processo di estrazione, trasformazione e caricamento (ETL) per etichettare il dataset con la sua origine. Esempi S4H_PROD_100ECC_EU_200S4H_US_300 | |||
| Ultimo `Data Update` LastDataUpdate | Il timestamp di quando i dati sono stati aggiornati o estratti l'ultima volta dal sistema di origine. | ||
| Descrizione Questo attributo indica la freschezza dei dati analizzati. Mostra la data e l'ora dell'estrazione più recente dei dati da SAP S/4HANA. Conoscere l'ora dell'ultimo aggiornamento dei dati è vitale per gli utenti per comprendere la tempestività della loro analisi. Li aiuta a interpretare correttamente i risultati, sapendo se stanno osservando informazioni in tempo reale o uno snapshot da un punto specifico nel tempo, il che influisce sulla rilevanza di qualsiasi azione intrapresa in base all'analisi. Perché è importante Informa gli utenti sulla tempestività dei Dove trovare Questo è un timestamp di metadata aggiunto durante il processo di estrazione, trasformazione e caricamento (ETL). Esempi 2024-05-21T02:00:00Z2024-05-20T02:00:00Z2024-05-19T02:00:00Z | |||
| Data di consegna richiesta RequestedDeliveryDate | La data in cui l'azienda ha richiesto al fornitore la consegna dei beni o servizi. | ||
| Descrizione Questo attributo specifica la data di consegna target concordata nell'ordine di acquisto. Serve come baseline per misurare le prestazioni di consegna del fornitore. Nel Process Mining, questa data viene confrontata con la data effettiva di ricevimento merci (timestamp 'Ricevimento Merci Registrato') per calcolare il KPI 'Tasso di Consegna Puntuale del Fornitore'. L'analisi delle deviazioni da questa data aiuta a valutare l'affidabilità del fornitore e a gestire i rischi della supply chain. Perché è importante Serve come baseline per misurare le prestazioni di consegna puntuale dei fornitori, un KPI critico per la gestione della supply chain e la pianificazione operativa. Dove trovare Questo si trova nella tabella delle righe di scadenza EKET, campo EINDT. Esempi 2023-06-012023-06-152023-07-01 | |||
| ID Fornitore VendorId | L'identificatore univoco per il fornitore o venditore che fornisce i beni o i servizi. | ||
| Descrizione L'ID Fornitore è un elemento critico di master data che collega un ordine di acquisto a uno specifico fornitore. Viene utilizzato in tutto il processo di approvvigionamento per la comunicazione, la consegna e il pagamento. Nel Process Mining, questo attributo consente di segmentare l'analisi delle prestazioni per fornitore. È essenziale per dashboard come 'Prestazioni Tempo di Consegna Fornitore' e 'Tasso di Reso Merci per Fornitore', aiutando a identificare i fornitori più affidabili e quelli che potrebbero causare ritardi o problemi di qualità. Perché è importante Consente un'analisi incentrata sui fornitori, aiutando a valutare le Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo LIFNR. Esempi 100023100045100088 | |||
| Importo Netto Totale TotalNetAmount | Il valore totale dell'ordine di acquisto, escluse tasse e costi di trasporto. | ||
| Descrizione Questo attributo rappresenta il valore monetario netto dell'ordine di acquisto. È una cifra finanziaria chiave che indica la dimensione della transazione di approvvigionamento. Questo importo è cruciale per l'analisi finanziaria, come la categorizzazione degli OA per valore (high-value vs. low-value) per vedere se i loro percorsi di processo differiscono. Può anche essere utilizzato per dare priorità all'analisi, concentrandosi sugli ordini di alto valore che possono comportare un maggiore rischio finanziario o avere un impatto maggiore sul business. Perché è importante Consente un'analisi basata sulla finanza, aiutando a segmentare gli ordini di acquisto per valore e a prioritizzare gli sforzi di miglioramento del processo nelle aree ad alta spesa. Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo NETWR. Esempi 1500.0025000.50125.75 | |||
| Richiesta di acquisto PurchaseRequisitionNumber | L'identificatore della richiesta di acquisto (RA) che ha avviato l'ordine di acquisto. | ||
| Descrizione Questo attributo collega l'ordine di acquisto alla sua richiesta di acquisto di origine. Non tutti gli OA avranno una RA se vengono creati direttamente. Questo collegamento è essenziale per analizzare l'intero processo di approvvigionamento end-to-end, partendo dalla richiesta iniziale. Supporta KPI come 'Tempo di Approvazione Richiesta di Acquisto' ed è fondamentale per identificare la Maverick Spend, dove gli OA vengono creati senza una richiesta precedente e approvata. Perché è importante Collega l'OA alla richiesta iniziale, consentendo un'analisi di processo Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKPO (livello voce OA), campo BANFN. Esempi 1001005110010052 | |||
| Tipo Documento OA DocumentType | Una classificazione che distingue diversi tipi di ordini di acquisto, come OA standard, OA di servizio o ordini di trasferimento stock. | ||
| Descrizione Il Tipo Documento è un elemento chiave di configurazione in SAP che controlla il flusso di processo, l'intervallo di numerazione e i campi per un ordine di acquisto. Permette alle aziende di personalizzare il processo di approvvigionamento per diversi scenari. Analizzare il processo per tipo di documento è cruciale per comprendere le variazioni di processo. Ad esempio, il processo per un OA di merce standard può essere molto diverso da un OA di servizio o da un trasferimento di magazzino. Questo attributo consente di filtrare e confrontare questi flussi di processo distinti per trovare specifiche opportunità di miglioramento. Perché è importante Categorizza gli ordini di acquisto, consentendo il confronto di diversi processi di approvvigionamento e aiutando a spiegare le variazioni nei flussi di processo e nei tempi di ciclo. Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo BSART. Esempi NBFOUB | |||
| Utente UserName | L'identificatore dell'utente che ha eseguito un'attività specifica. | ||
| Descrizione Questo attributo cattura l'ID utente SAP responsabile della creazione, modifica o approvazione di un documento. Fornisce tracciabilità per le azioni intraprese all'interno del sistema. Analizzare per utente aiuta a identificare le esigenze di formazione, la distribuzione del carico di lavoro e le prestazioni individuali. Ad esempio, può essere utilizzato per vedere se utenti specifici sono costantemente associati a lunghi tempi di approvazione o a frequenti modifiche post-approvazione, il che può informare la gestione delle risorse e le iniziative di miglioramento dei processi. Perché è importante Fornisce responsabilità e consente l'analisi delle prestazioni a livello individuale o di team, aiutando a identificare opportunità di formazione o vincoli di risorse. Dove trovare Questa informazione si trova in campi come ERNAM (Creato da) in EKKO o dal campo utente nelle tabelle dei documenti di modifica (CDHDR-USERNAME). Esempi CB9980000012JSMITHRROE | |||
| Categoria dell'articolo ItemCategory | Classifica una voce di riga dell'ordine di acquisto, come standard, conto deposito, subappalto o servizio. | ||
| Descrizione La Categoria Articolo determina come viene controllato ed elaborato l'approvvigionamento di uno specifico materiale o servizio. Influisce sui passaggi successivi come il ricevimento merci e la verifica delle fatture. Questo attributo è importante per analizzare le varianti di processo in base a ciò che viene acquistato. Ad esempio, il processo per una voce di servizio (che richiede una service entry sheet) differisce significativamente da una voce di magazzino standard. L'analisi per categoria articolo aiuta a spiegare queste differenze e consente miglioramenti mirati del processo. Perché è importante Spiega le variazioni di processo distinguendo tra diversi tipi di approvvigionamento, come beni, servizi o subappalto. Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo PSTYP. Esempi 093 | |||
| Codice Società CompanyCode | L'identificatore per l'entità legale o la società per cui viene creato l'ordine di acquisto. | ||
| Descrizione Il Codice Società rappresenta un'unità contabile indipendente all'interno di un'organizzazione. Tutte le transazioni finanziarie relative a un ordine di acquisto vengono registrate in uno specifico codice società. Questo è un attributo organizzativo fondamentale che consente di filtrare e confrontare i processi di approvvigionamento tra diverse entità legali. L'analisi per codice società può rivelare incongruenze nell'esecuzione dei processi, diversi livelli di efficienza o tassi di conformità variabili all'interno dell'organizzazione. Perché è importante Consente di segmentare l'analisi di processo per entità legale, facilitando i confronti delle Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo BUKRS. Esempi 101017102000 | |||
| Consegna Puntuale del Fornitore SupplierOnTimeDelivery | Un `flag` calcolato che indica se la ricezione della merce è stata registrata alla data di consegna richiesta o prima. | ||
| Descrizione Questo attributo booleano è derivato confrontando il timestamp dell'attività 'Ricevimento Merci Registrato' con la 'Data di Consegna Richiesta'. Se il ricevimento merci avviene alla data richiesta o prima, viene contrassegnato come 'true'. Questo attributo supporta direttamente il KPI 'Tasso di Consegna Puntuale del Fornitore'. Semplifica l'analisi consentendo agli utenti di filtrare facilmente le consegne puntuali o in ritardo, il che è essenziale per le dashboard delle prestazioni dei fornitori e lo scorecarding dei fornitori. Perché è importante Misura direttamente l'affidabilità dei fornitori, costituendo la base per il Dove trovare Calcolato confrontando il Esempi truefalse | |||
| È spesa Maverick IsMaverickSpend | Un `flag` calcolato che indica se un ordine di acquisto è stato creato senza una precedente richiesta di acquisto approvata. | ||
| Descrizione Questo flag booleano è derivato durante l'elaborazione dei dati. Viene impostato su 'true' se un ordine di acquisto non ha una richiesta di acquisto associata o se la creazione dell'OA bypassa il workflow di approvazione standard. Questo attributo supporta direttamente la dashboard di 'Identificazione Maverick Spend' e i KPI correlati. Aiuta a quantificare l'entità del comportamento di acquisto non conforme, consentendo alle aziende di mirare a dipartimenti o gruppi di utenti specifici per rafforzare le politiche e i controlli di approvvigionamento. Perché è importante Identifica direttamente acquisti non conformi, aiutando a quantificare le deviazioni di processo e a far rispettare i controlli finanziari e le politiche di approvvigionamento. Dove trovare Campo calcolato basato sull'assenza di un valore in 'NumeroRichiestaAcquisto' per specifici tipi di documento, o analizzando la sequenza degli Esempi truefalse | |||
| È una Rilavorazione IsRework | Un `flag` calcolato che indica se l'ordine di acquisto ha subito rilavorazioni, come una modifica post-approvazione o un reso merce. | ||
| Descrizione Questo attributo booleano è calcolato analizzando la sequenza di attività per ogni ordine di acquisto. Viene contrassegnato come 'true' se un event 'Ordine di Acquisto Modificato' si verifica dopo un event 'Ordine di Acquisto Approvato', o se un event 'Merci Rese' è presente. Questo flag semplifica il calcolo del KPI 'Straight-Through Processing Rate'. Consente un facile filtraggio e la visualizzazione di tutti gli OA che hanno richiesto intervento manuale o correzione, aiutando a quantificare il costo e la frequenza delle rilavorazioni. Perché è importante Aiuta a quantificare l'inefficienza del processo segnalando i casi con rilavorazioni, il che è cruciale per il calcolo dei tassi di elaborazione Dove trovare Campo calcolato basato sulla sequenza delle attività. La logica verifica se un Esempi truefalse | |||
| Gruppo acquisti PurchasingGroup | Lo specifico gruppo di acquirenti responsabile di determinate attività di approvvigionamento. | ||
| Descrizione Un Gruppo Acquisti è un acquirente o un gruppo di acquirenti responsabili di specifiche attività di acquisto, materiali o fornitori. Sono il punto di contatto primario per i fornitori. Questo Perché è importante Fornisce una visione granulare delle prestazioni del gruppo acquirenti, consentendo l'analisi del carico di lavoro, dell'efficienza e dell'adesione al processo a livello di team. Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EKGRP. Esempi 001002N00 | |||
| Numero materiale MaterialNumber | L'identificatore per lo specifico materiale o bene in fase di approvvigionamento. | ||
| Descrizione Il Codice Materiale è un codice univoco assegnato a ogni record anagrafico materiale in SAP. Viene utilizzato per tutte le transazioni relative a quel materiale, inclusi approvvigionamento, gestione dell'inventario e vendite. L'analisi per codice materiale o gruppo di materiali consente un'analisi basata sulla merce. Può aiutare a identificare se i processi di approvvigionamento per determinati tipi di materiali sono meno efficienti, hanno tempi di consegna più lunghi o sono più inclini ai resi, fornendo insight per la gestione delle categorie. Perché è importante Consente un'analisi basata sulle materie prime, aiutando a identificare problemi di processo o problemi di Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo MATNR. Esempi RM100-100FG210SERV-CONSULT | |||
| Organizzazione acquisti PurchasingOrganization | L'unità organizzativa responsabile dell'approvvigionamento di materiali e servizi e della negoziazione con i fornitori. | ||
| Descrizione L'Organizzazione Acquisti è un'unità organizzativa chiave nell'approvvigionamento. Può essere strutturata a livello aziendale, di società o di stabilimento ed è responsabile di tutte le attività di acquisto. Analizzare il processo per organizzazione acquisti aiuta a valutare l'efficienza e le prestazioni di diversi team di approvvigionamento o regioni. Può evidenziare differenze nella negoziazione con i fornitori, nella conformità dei processi o nei ritardi di approvazione tra le unità organizzative. Perché è importante Consente il confronto delle Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKKO, campo EKORG. Esempi 10101710US01 | |||
| Stabilimento Plant | La struttura operativa o la località a cui vengono consegnate le merci o erogati i servizi. | ||
| Descrizione In Segmentare l'analisi di processo per stabilimento può rivelare variazioni regionali o specifiche del sito nel processo di approvvigionamento. Ad esempio, può mostrare se certi stabilimenti registrano tempi di consegna più lunghi o hanno tassi più elevati di resi merce, indicando problemi localizzati di logistica o controllo qualità. Perché è importante Consente un'analisi basata sulla localizzazione, evidenziando le differenze di Dove trovare Questo attributo si trova nella tabella SAP S/4HANA EKPO, campo WERKS. Esempi 10101710DE01 | |||
| Tempo di ciclo di approvazione del PO PoApprovalCycleTime | La durata calcolata dal momento della creazione di un ordine di acquisto fino alla ricezione dell'approvazione finale. | ||
| Descrizione Questa metrica misura il tempo trascorso tra l'attività 'Ordine di Acquisto Creato' e l'attività 'Ordine di Acquisto Approvato'. È calcolata per ogni case di ordine di acquisto. Questo attributo fornisce una misura diretta dell'efficienza dell'approvazione interna. È la metrica primaria per la dashboard e il KPI 'Tempo di Ciclo di Approvazione OA', aiutando a identificare dove si verificano i ritardi nel processo di approvazione e a individuare le opportunità di accelerazione. Perché è importante Misura direttamente l'efficienza del processo di approvazione interno, aiutando a identificare e affrontare i Dove trovare Calcolato trovando la differenza di tempo tra l' Esempi P2D4H30MP0D2H15MP5D | |||
Procure to Pay - Attività dell’ordine di acquisto
| Activity | Descrizione | ||
|---|---|---|---|
| Fattura Ricevuta | Rappresenta l'inserimento di una fattura del fornitore nel sistema SAP, collegandola all'ordine di acquisto corrispondente. Questa è una registrazione finanziaria esplicita che crea un documento contabile. | ||
| Perché è importante Questa è una milestone critica che collega il processo di approvvigionamento con il processo di contabilità fornitori. Consente l'analisi del tempo tra il ricevimento merci e l'elaborazione delle fatture. Dove trovare Un documento contabile viene creato nella tabella Acquisisci Data di inserimento documento ( Tipo di evento explicit | |||
| Ordine d’acquisto completato | Questa attività significa che una voce dell'ordine di acquisto è considerata chiusa da una prospettiva logistica. Viene inferito quando sono impostati sia gli indicatori 'Consegna Completata' che 'Fattura Finale'. | ||
| Perché è importante Questo serve come punto finale per l'analisi del ciclo di vita dell'ordine di acquisto. Misurare il tempo fino a questo event fornisce il tempo di ciclo end-to-end per le operazioni di approvvigionamento. Dove trovare Deducibile dai Acquisisci Deducibile dai Tipo di evento inferred | |||
| Ordine di acquisto approvato | Significa che l'ordine di acquisto ha ricevuto tutte le necessarie approvazioni interne ed è autorizzato per il rilascio al fornitore. L'event si inferisce da un cambio di status nella strategia di rilascio dell'ordine di acquisto. | ||
| Perché è importante Questa è una milestone chiave per misurare l'efficienza dell'approvazione e le rilavorazioni post-approvazione. L'analisi del tempo tra la creazione e l'approvazione dell'OA evidenzia i ritardi interni del processo. Dove trovare Deducibile dall'indicatore di rilascio ( Acquisisci Deducibile dai Tipo di evento inferred | |||
| Ordine di acquisto creato | Contrassegna la creazione del documento ufficiale dell'ordine di acquisto, che può essere creato con o senza riferimento a una richiesta di acquisto. Questo è un event esplicito acquisito quando il documento dell'OA viene salvato per la prima volta nel sistema. | ||
| Perché è importante Questa attività può fungere da punto di partenza alternativo per il processo, specialmente per l'analisi della maverick buying. È un event fondamentale per il tracciamento del tempo complessivo di elaborazione dell'OA. Dove trovare Registrato nella tabella dell'intestazione dell'ordine di acquisto EKKO. La data di creazione (AEDAT) e l'ora sono memorizzate direttamente in questa tabella per il documento. Acquisisci Timestamp di creazione ( Tipo di evento explicit | |||
| Ricevimento merce registrato | Rappresenta il ricevimento fisico delle merci dal fornitore e la corrispondente registrazione nel sistema. Questa è una transazione esplicita che aggiorna la storia degli ordini di acquisto. | ||
| Perché è importante Questa è una milestone importante che conclude il lead time del fornitore e inizia il processo interno di verifica delle fatture. È essenziale per il tracciamento dei tassi di consegna puntuale. Dove trovare Registrato come documento materiale nelle tabelle MKPF (intestazione) e MSEG (item), e collegato nella tabella di storia degli ordini di acquisto EKBE con un tipo di movimento specifico (es. 101). Acquisisci Data di registrazione (BUDAT) dall'intestazione del documento materiale (MKPF) collegata tramite EKBE. Tipo di evento explicit | |||
| Richiesta di acquisto approvata | Rappresenta l'approvazione formale di una richiesta di acquisto da parte di un manager o di un approvatore designato. Ciò si inferisce tipicamente da un cambio di status nel documento di richiesta, a significare che è pronto per la conversione in ordine di acquisto. | ||
| Perché è importante Questa è una milestone critica per tracciare i tempi di ciclo di approvazione e identificare i bottleneck. I ritardi qui influiscono direttamente sulla velocità con cui un ordine di acquisto può essere creato e inviato a un fornitore. Dove trovare Deducibile dai campi di stato di rilascio nella tabella Acquisisci Deducibile dai Tipo di evento inferred | |||
| Richiesta di acquisto creata | Questa attività contrassegna la richiesta formale di beni o servizi, avviando il processo di approvvigionamento. L'event viene acquisito esplicitamente quando un utente salva un nuovo documento di richiesta di acquisto (es. utilizzando la transazione ME51N). | ||
| Perché è importante Questo è il punto di partenza principale per molti cicli di vita degli ordini di acquisto. Analizzare il tempo da questo event alla creazione dell'OA aiuta a identificare i ritardi nel sourcing e nell'elaborazione interna. Dove trovare Registrato nella tabella EBAN (Richiesta di Acquisto). Il timestamp dell'event di creazione si trova nelle tabelle di storia delle modifiche CDHDR e CDPOS per l'oggetto EBAN. Acquisisci
Tipo di evento explicit | |||
| Conferma dei servizi registrata | Questa attività contrassegna la conferma che un servizio specificato in un ordine di acquisto è stato reso. Viene acquisita esplicitamente tramite la creazione di una service entry sheet. | ||
| Perché è importante Per l'approvvigionamento basato sui servizi, questo è l'equivalente di una ricezione merci. È cruciale per il tracciamento delle tempistiche di consegna dei servizi e per consentire pagamenti tempestivi ai fornitori. Dove trovare Registrato tramite la creazione di una service entry sheet, con dati memorizzati nelle tabelle ESSR (intestazione) e ESLL (righe). La data di creazione funge da timestamp. Acquisisci Data di creazione del documento di Scheda di Registrazione Servizi nella tabella Tipo di evento explicit | |||
| Fattura Pagata | Contrassegna la liquidazione finale della fattura del fornitore tramite una sessione di pagamento o un pagamento manuale. Questa è una transazione finanziaria esplicita che crea un documento di compensazione. | ||
| Perché è importante Sebbene tecnicamente parte del processo di pagamento, l'inclusione di questa attività fornisce una visione completa del ciclo procure-to-pay. È fondamentale per analizzare i termini e le prestazioni di pagamento. Dove trovare Il pagamento è registrato come documento di compensazione in BKPF/ACDOCA. La data di compensazione (AUGDT) sulla voce della fattura nella tabella BSEG o ACDOCA indica l'event di pagamento. Acquisisci Data di compensazione ( Tipo di evento explicit | |||
| Merce resa | Indica che le merci precedentemente ricevute sono state rese al fornitore, tipicamente a causa di problemi di qualità, danni o spedizioni errate. Questo viene acquisito come un movimento merci di storno esplicito. | ||
| Perché è importante Questa attività evidenzia rilavorazioni e potenziali problemi con la qualità del fornitore o l'accuratezza dell'ordine. Un'elevata frequenza di resi per un fornitore o materiale specifico segnala un problema. Dove trovare Registrato come documento materiale con un tipo di movimento di reso specifico (es. 122). L'event è registrato in MKPF/MSEG e collegato all'OA nella tabella di storia EKBE. Acquisisci Data di registrazione dal documento materiale con un tipo di movimento di reso in EKBE. Tipo di evento explicit | |||
| Ordine di acquisto cancellato | Rappresenta l'annullamento o la cancellazione logica di una voce dell'ordine di acquisto o dell'intero documento. Questo viene catturato da un utente che imposta un flag di eliminazione sul documento. | ||
| Perché è importante Questa attività è un punto finale alternativo per il processo, indicando un fallimento o una cancellazione. Analizzare il motivo per cui gli OA vengono eliminati può rivelare problemi nella pianificazione della domanda o nella definizione dei requisiti. Dove trovare Acquisito dal Acquisisci Timestamp dai documenti di modifica (CDHDR/CDPOS) quando il flag di eliminazione (LOEKZ) è impostato. Tipo di evento explicit | |||
| Ordine di acquisto inviato al fornitore | Rappresenta il momento in cui l'ordine di acquisto viene comunicato al fornitore, ad esempio, tramite EDI, email o stampa. Questo event è spesso acquisito attraverso i log di gestione dell'output del sistema. | ||
| Perché è importante Questa attività è il vero inizio del lead time del fornitore. È cruciale per misurare accuratamente le prestazioni del fornitore dal momento in cui riceve l'ordine. Dove trovare Acquisito dalla tabella di controllo output Acquisisci Timestamp del primo messaggio di output riuscito per l'OA nella tabella NAST. Tipo di evento inferred | |||
| Ordine di acquisto modificato | Questa attività indica che è stata apportata una modifica all'ordine di acquisto dopo la sua creazione iniziale, come una variazione di quantità, prezzo o data di consegna. Viene acquisita esplicitamente nei log di modifica del sistema. | ||
| Perché è importante Tracciare le modifiche, specialmente dopo l'approvazione, è fondamentale per identificare inefficienze di processo, rilavorazioni e potenziali problemi di conformità. Modifiche frequenti possono indicare scarse specifiche iniziali. Dove trovare Registrato nelle tabelle dei documenti di modifica CDHDR (intestazione) e CDPOS (item) per gli oggetti dell'ordine di acquisto (EINKBELEG). Ogni modifica crea una voce di log dettagliata. Acquisisci
Tipo di evento explicit | |||
Guide all'Estrazione
Fasi
- Prerequisiti e Accesso: Si assicuri di avere un utente con le autorizzazioni appropriate per interrogare le viste
Core Data Services(CDS) nel sistemaSAP S/4HANA. L'accesso può avvenire tramiteSAP HANA Studio,ABAP Development Tools(ADT) perEclipse, o uno strumento di estrazionedatidi terze parti che supporta connessioniSQLaldatabase SAP HANA. - Identificare i Dettagli di Connessione del Sistema: Ottenga i parametri di connessione necessari per il Suo sistema
SAP S/4HANA, inclusi l'host, il numero di istanza e le Sue credenziali di autenticazione. - Connettersi al Database: Utilizzando il Suo
client SQLpreferito, stabilisca una connessione aldatabase SAP S/4HANAdove risiedono le visteCDS. - Preparare la Query SQL: Copi la
query SQLcompleta fornita nella sezionequerydi questo documento nel Suoeditor SQL. Questaqueryè progettata per estrarre tutte le attività e gliattributirichiesti. - Impostare i Parametri di Filtro: Individui i valori segnaposto all'interno della
query. Sostituisca_start_datee_end_datecon l'intervallo di date desiderato per la Sua analisi (es. '20230101' e '20231231'). Modifichi il filtropoh.CompanyCodeper includere i codici società specifici che desidera analizzare. - Eseguire la Query: Esegua la
query SQLmodificata suldatabase S/4HANA. A seconda del volume deidatie dell'intervallo di date specificato, questa esecuzione potrebbe richiedere del tempo. - Rivedere i Risultati Preliminari: Una volta terminata la
query, esegua una rapida revisione dell'output nel Suoclient SQL. Verifichi la presenza di diverse attività, si assicuri che itimestampsiano popolati correttamente e verifichi che l'ID caso(PurchaseOrderNumber) sia coerente. - Esportare i Dati: Esporti il set completo dei risultati dal Suo strumento
SQLin un fileCSV(Comma Separated Values). Si assicuri che il file utilizzi la codificaUTF-8per prevenire problemi di caratteri. - Preparare per l'Upload: Prima di caricare su
ProcessMind, apra il fileCSVe verifichi che le intestazioni delle colonne corrispondano esattamente agliattributidefiniti nei requisiti deidati(PurchaseOrderNumber,ActivityName,EventTime, ecc.). Regoli i nomi delle colonne se il Suo strumento di esportazione li ha modificati. - Caricare su ProcessMind: Carichi il file
CSVfinalizzato nel Suo progettoProcessMind. Mappi le colonne nel Suo file ai campi corrispondenti diID caso,attivitàetimestampdurante il processo di importazione.
Configurazione
- Principali Viste CDS Utilizzate: La logica di estrazione si basa su un insieme di viste
CDSstandard e semanticamente ricche. Le viste principali includono:- I_PurchaseOrderItemAPI01: Per i dati principali degli articoli dell'ordine di acquisto.
- I_PurchaseRequisitionItemAPI01: Per i dettagli delle richieste di acquisto.
- I_MaterialDocumentItem: Per i movimenti merci come ricevimenti e resi.
- I_ServiceEntrySheetAPI01: Per gli eventi di conferma del servizio.
- I_SupplierInvoiceAPI01: Per le informazioni sulle fatture del fornitore.
- I_OperationalAcctgDocItem: Per il collegamento delle fatture ai documenti finanziari per il monitoraggio dei pagamenti.
- I_ChangeDocument: Per l'acquisizione delle modifiche all'ordine di acquisto.
- Filtro per Intervallo di Date: È fondamentale applicare un filtro per intervallo di date per gestire le prestazioni e il volume dei
dati. Laqueryutilizza i segnaposto _start_date e _end_date sulla data di creazione dell'ordine di acquisto (PurchaseOrderDate). Un intervallo iniziale raccomandato è di 3-6 mesi didati. - Filtro Organizzativo: La
querydovrebbe sempre essere filtrata perCompanyCodeper limitare l'ambito dell'estrazione alle unità aziendali pertinenti. Ulteriori filtri suPurchaseOrderTypeoPurchasingOrganizationpossono essere aggiunti all'espressione della tabella comune principalePO_baseper un ulteriore affinamento. - Prerequisiti: L'utente che esegue la
queryrichiede l'autorizzazioneSELECTsu tutte le visteCDSsopra elencate. L'accesso a queste viste è tipicamente concesso tramite specifici ruoli aziendali o analitici inS/4HANA. Senza le dovute autorizzazioni, laqueryfallirà.
a Query di Esempio sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Fasi
- Prerequisiti e Accesso: Si assicuri di avere un utente con le autorizzazioni appropriate per interrogare le viste
Core Data Services(CDS) nel sistemaSAP S/4HANA. L'accesso può avvenire tramiteSAP HANA Studio,ABAP Development Tools(ADT) perEclipse, o uno strumento di estrazionedatidi terze parti che supporta connessioniSQLaldatabase SAP HANA. - Identificare i Dettagli di Connessione del Sistema: Ottenga i parametri di connessione necessari per il Suo sistema
SAP S/4HANA, inclusi l'host, il numero di istanza e le Sue credenziali di autenticazione. - Connettersi al Database: Utilizzando il Suo
client SQLpreferito, stabilisca una connessione aldatabase SAP S/4HANAdove risiedono le visteCDS. - Preparare la Query SQL: Copi la
query SQLcompleta fornita nella sezionequerydi questo documento nel Suoeditor SQL. Questaqueryè progettata per estrarre tutte le attività e gliattributirichiesti. - Impostare i Parametri di Filtro: Individui i valori segnaposto all'interno della
query. Sostituisca_start_datee_end_datecon l'intervallo di date desiderato per la Sua analisi (es. '20230101' e '20231231'). Modifichi il filtropoh.CompanyCodeper includere i codici società specifici che desidera analizzare. - Eseguire la Query: Esegua la
query SQLmodificata suldatabase S/4HANA. A seconda del volume deidatie dell'intervallo di date specificato, questa esecuzione potrebbe richiedere del tempo. - Rivedere i Risultati Preliminari: Una volta terminata la
query, esegua una rapida revisione dell'output nel Suoclient SQL. Verifichi la presenza di diverse attività, si assicuri che itimestampsiano popolati correttamente e verifichi che l'ID caso(PurchaseOrderNumber) sia coerente. - Esportare i Dati: Esporti il set completo dei risultati dal Suo strumento
SQLin un fileCSV(Comma Separated Values). Si assicuri che il file utilizzi la codificaUTF-8per prevenire problemi di caratteri. - Preparare per l'Upload: Prima di caricare su
ProcessMind, apra il fileCSVe verifichi che le intestazioni delle colonne corrispondano esattamente agliattributidefiniti nei requisiti deidati(PurchaseOrderNumber,ActivityName,EventTime, ecc.). Regoli i nomi delle colonne se il Suo strumento di esportazione li ha modificati. - Caricare su ProcessMind: Carichi il file
CSVfinalizzato nel Suo progettoProcessMind. Mappi le colonne nel Suo file ai campi corrispondenti diID caso,attivitàetimestampdurante il processo di importazione.
Configurazione
- Principali Viste CDS Utilizzate: La logica di estrazione si basa su un insieme di viste
CDSstandard e semanticamente ricche. Le viste principali includono:- I_PurchaseOrderItemAPI01: Per i dati principali degli articoli dell'ordine di acquisto.
- I_PurchaseRequisitionItemAPI01: Per i dettagli delle richieste di acquisto.
- I_MaterialDocumentItem: Per i movimenti merci come ricevimenti e resi.
- I_ServiceEntrySheetAPI01: Per gli eventi di conferma del servizio.
- I_SupplierInvoiceAPI01: Per le informazioni sulle fatture del fornitore.
- I_OperationalAcctgDocItem: Per il collegamento delle fatture ai documenti finanziari per il monitoraggio dei pagamenti.
- I_ChangeDocument: Per l'acquisizione delle modifiche all'ordine di acquisto.
- Filtro per Intervallo di Date: È fondamentale applicare un filtro per intervallo di date per gestire le prestazioni e il volume dei
dati. Laqueryutilizza i segnaposto _start_date e _end_date sulla data di creazione dell'ordine di acquisto (PurchaseOrderDate). Un intervallo iniziale raccomandato è di 3-6 mesi didati. - Filtro Organizzativo: La
querydovrebbe sempre essere filtrata perCompanyCodeper limitare l'ambito dell'estrazione alle unità aziendali pertinenti. Ulteriori filtri suPurchaseOrderTypeoPurchasingOrganizationpossono essere aggiunti all'espressione della tabella comune principalePO_baseper un ulteriore affinamento. - Prerequisiti: L'utente che esegue la
queryrichiede l'autorizzazioneSELECTsu tutte le visteCDSsopra elencate. L'accesso a queste viste è tipicamente concesso tramite specifici ruoli aziendali o analitici inS/4HANA. Senza le dovute autorizzazioni, laqueryfallirà.
a Query di Esempio sql
WITH PO_base AS (
SELECT
poh.PurchaseOrder AS PurchaseOrderNumber,
poi.PurchaseOrderItem AS PurchaseOrderItem,
poh.CompanyCode,
poh.PurchaseOrderType AS DocumentType,
poh.Supplier AS VendorId,
poh.PurchaseOrderDate,
poi.PurchaseRequisition AS PurchaseRequisitionNumber,
poi.NetPriceAmount * poi.OrderQuantity AS TotalNetAmount, -- Note: This is item-level net amount
poh.CreationDate AS POCreationDate,
poh.CreationTime AS POCreationTime,
poh.LastChangeDateTime AS POLastChangeDateTime,
poi.IsDeleted,
poi.DeliveryIsCompleted,
poi.FinalInvoiceIsExpected,
poi.GoodsReceiptIsExpected,
poi.LastGoodsReceiptDate,
poi.LastInvoiceReceiptDate
FROM I_PurchaseOrderAPI01 poh
JOIN I_PurchaseOrderItemAPI01 poi
ON poh.PurchaseOrder = poi.PurchaseOrder
WHERE
poh.PurchaseOrderDate BETWEEN '_start_date' AND '_end_date' -- Placeholder: e.g., '20230101' and '20230630'
AND poh.CompanyCode IN ('[YourCompanyCode]') -- Placeholder: e.g., '1010'
)
-- 1. Purchase Requisition Created
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Created' AS ActivityName,
CAST(CONCAT(pr.CreationDate, 'T', pr.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem, -- Placeholder
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
pr.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate, -- Available in PR, add if needed
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
UNION ALL
-- 2. Purchase Requisition Approved
SELECT
po.PurchaseOrderNumber,
'Purchase Requisition Approved' AS ActivityName,
CAST(CONCAT(pr.PurReqnReleaseDate, 'T', '000000') AS TIMESTAMP) AS EventTime, -- Time is not available in this view
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_PurchaseRequisitionItemAPI01 pr
JOIN PO_base po
ON pr.PurchaseRequisition = po.PurchaseRequisitionNumber AND pr.PurchaseRequisitionItem = po.PurchaseOrderItem
WHERE
pr.PurReqnReleaseDate IS NOT NULL
UNION ALL
-- 3. Purchase Order Created
SELECT
po.PurchaseOrderNumber,
'Purchase Order Created' AS ActivityName,
CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
poh.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
UNION ALL
-- 4. Purchase Order Approved
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Approved' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Assuming ReleaseDate reflects final approval
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- Approver info requires complex joins
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 5. Purchase Order Sent to Vendor
SELECT DISTINCT
po.PurchaseOrderNumber,
'Purchase Order Sent to Vendor' AS ActivityName,
CAST(poh.ReleaseDate AS TIMESTAMP) AS EventTime, -- Using ReleaseDate as a proxy for sending time
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
poi.RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
JOIN I_PurchaseOrderAPI01 poh ON po.PurchaseOrderNumber = poh.PurchaseOrder
JOIN I_PurchaseOrderItemAPI01 poi ON po.PurchaseOrderNumber = poi.PurchaseOrder AND po.PurchaseOrderItem = poi.PurchaseOrderItem
WHERE poh.ReleaseDate IS NOT NULL
UNION ALL
-- 6. Purchase Order Changed
SELECT DISTINCT
ch.OBJECTID AS PurchaseOrderNumber,
'Purchase Order Changed' AS ActivityName,
CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
ch.UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ChangeDocument ch
JOIN PO_base po ON ch.OBJECTID = po.PurchaseOrderNumber
WHERE
ch.ObjectClassName = 'EINKBELEG' -- Object Class for Purchase Documents
AND CAST(CONCAT(ch.ChangeDocumentDate, 'T', ch.ChangeDocumentTime) AS TIMESTAMP) > CAST(CONCAT(po.POCreationDate, 'T', po.POCreationTime) AS TIMESTAMP)
UNION ALL
-- 7. Goods Receipt Posted
SELECT
po.PurchaseOrderNumber,
'Goods Receipt Posted' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '101'
UNION ALL
-- 8. Services Confirmation Entered
SELECT
po.PurchaseOrderNumber,
'Services Confirmation Entered' AS ActivityName,
CAST(se.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
se.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_ServiceEntrySheetAPI01 se
JOIN PO_base po
ON se.PurchaseOrder = po.PurchaseOrderNumber AND se.PurchaseOrderItem = po.PurchaseOrderItem
UNION ALL
-- 9. Goods Returned
SELECT
po.PurchaseOrderNumber,
'Goods Returned' AS ActivityName,
CAST(CONCAT(md.PostingDate, 'T', md.CreationTime) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
md.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_MaterialDocumentItem md
JOIN PO_base po
ON md.PurchaseOrder = po.PurchaseOrderNumber AND md.PurchaseOrderItem = po.PurchaseOrderItem
WHERE
md.GoodsMovementType = '122'
UNION ALL
-- 10. Invoice Received
SELECT
po.PurchaseOrderNumber,
'Invoice Received' AS ActivityName,
CAST(inv.PostingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
inv.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
inv.DebitCreditCode = 'H' -- 'H' for Credit (Supplier Invoice)
UNION ALL
-- 11. Invoice Paid
SELECT
po.PurchaseOrderNumber,
'Invoice Paid' AS ActivityName,
CAST(doc.ClearingDate AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
doc.CreatedByUser AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM I_SupplierInvoiceAPI01 inv
JOIN I_OperationalAcctgDocItem doc
ON inv.AccountingDocument = doc.AccountingDocument
JOIN PO_base po
ON inv.PurchaseOrderReference = po.PurchaseOrderNumber
WHERE
doc.IsCleared = 'X' AND doc.ClearingDate IS NOT NULL
UNION ALL
-- 12. Purchase Order Completed
SELECT
po.PurchaseOrderNumber,
'Purchase Order Completed' AS ActivityName,
CAST(GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
'SYSTEM' AS UserName,
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.DeliveryIsCompleted = 'X'
AND (po.FinalInvoiceIsExpected = 'X' OR po.GoodsReceiptIsExpected = '') -- Logic for completion
AND GREATEST(po.LastGoodsReceiptDate, po.LastInvoiceReceiptDate) IS NOT NULL
UNION ALL
-- 13. Purchase Order Deleted
SELECT
po.PurchaseOrderNumber,
'Purchase Order Deleted' AS ActivityName,
CAST(po.POLastChangeDateTime AS TIMESTAMP) AS EventTime,
'[Your S/4HANA System ID]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
po.VendorId,
NULL AS UserName, -- User who set the flag is in change docs
po.TotalNetAmount,
po.PurchaseRequisitionNumber,
NULL AS RequestedDeliveryDate,
po.DocumentType
FROM PO_base po
WHERE
po.IsDeleted = 'X' Fasi
- Specifiche e Progettazione: Definisca la struttura
datifinale per il file dievent log, inclusi tutti gliattributirichiesti e raccomandati. Documenti le tabelleSAPspecifiche (es.EKKO,EKPO,EKBE,CDHDR,CDPOS,BKPF) che saranno utilizzate per reperire idatiper ciascuna delle 13 attività richieste. - Creazione del Programma: In
SAP GUI, navighi all'ABAP Editorutilizzando il codice di transazioneSE38oSE80. Crei un nuovo programma eseguibile, ad esempio,Z_PM_PO_EXTRACT. - Definire la Schermata di Selezione: Codifichi la schermata di selezione per il
report. Questo consente agli utenti di filtrare idatiche desiderano estrarre. Includa i parametri per l'intervallo di date di creazione dell'Ordine di Acquisto (P_AEDAT),Codice Società(P_BUKRS) eTipo Documento di Acquisto(P_BSART). - Dichiarazioni Dati: Definisca le tabelle interne e le strutture
datinecessarie per il programma. Questo include una tabella interna per ilfinal event logche corrisponde alla struttura definita nella fase di specifica. - Implementare la Logica di Selezione dei Dati: Scriva la logica
ABAPprincipale per selezionare idatiper ciascuna delle 13 attività. Ciò implica una serie di istruzioniSELECTcontro le tabelleSAPpertinenti, unite dove necessario. Per glieventibasati su modifiche, leggere dalle tabelle dichange log CDHDReCDPOS. - Trasformare e Mappare i Dati: Per ogni record recuperato, mappare i campi delle tabelle
SAPalle colonne corrispondenti nella Sua tabella interna delevent logfinale. Imposti l'ActivityNamein base all'eventoin fase di elaborazione (es. 'Ordine di Acquisto Creato'). Converta i campi di data e ora in un formatotimestampcoerente perEventTime. - Consolidare i Dati degli Eventi: Dopo aver elaborato tutti i 13 tipi di attività, si assicuri che tutti i
datisiano raccolti in un'unica tabella interna unificata. Questa tabella ora rappresenta ilevent logcompleto per gli ordini di acquisto selezionati. - Implementare l'Output del File: Aggiunga funzionalità per scrivere la tabella interna finale su un file. L'approccio raccomandato è quello di utilizzare il metodo
cl_gui_frontend_services=>gui_downloadper consentire agli utenti di salvare il file comeCSVsulla propria macchina locale, o utilizzareOPEN DATASETper salvarlo sulserverapplicazioniSAPper l'elaborazione inbackground. - Creare Codice di Transazione (Opzionale): Per rendere il programma facilmente accessibile agli utenti aziendali, utilizzi il codice di transazione
SE93per creare un codice di transazione personalizzato (es.ZPM_PO_EXTRACT) che esegua il Suo programmaABAP. - Pianificare Job in Background: Per grandi volumi di
datio estrazioni automatizzate, utilizzi il codice di transazioneSM36per pianificare l'esecuzione del programma come unbackground job. Il file di output verrà scritto nel percorso delserverapplicazioni specificato nella logica del programma.
Configurazione
- Criteri di Selezione: Il programma dovrebbe includere parametri di selezione per filtrare i dati in modo efficace. I filtri chiave includono:
- Intervallo di Date: Un intervallo di date obbligatorio per la data di creazione dell'Ordine di Acquisto (EKKO-AEDAT). Si raccomanda di iniziare con un periodo di 3-6 mesi per gestire il volume dei dati e le prestazioni del report.
- Codice Società (BUKRS): Essenziale per le organizzazioni con più entità legali al fine di restringere l'ambito di estrazione.
- Tipo Documento di Acquisto (BSART): Consente di filtrare tipi specifici di OA, come Ordine standard, Ordine quadro o Ordine di trasferimento stock, per focalizzare l'analisi.
- Lettura del Registro Modifiche: L'estrazione di attività come 'Ordine di Acquisto Approvato' o 'Ordine di Acquisto Modificato' si basa sulla lettura delle tabelle di
change logSAP (CDHDR, CDPOS). Questo può richiedere molte risorse. La logica ABAP dovrebbe essere ottimizzata per selezionare solo le classi di oggetti necessarie (EINKBELEG, BANF) e le combinazioni di tabella/campo. - Autorizzazioni: L'utente o l'account tecnico che esegue questo report richiede ampie autorizzazioni di lettura per le tabelle di più moduli SAP, inclusi Gestione Materiali (MM), Contabilità Finanziaria (FI) e tabelle a livello di sistema. Questo include tabelle come EKKO, EKPO, EBAN, EKBE, BKPF, BSAK, RBKP, NAST, CDHDR e CDPOS.
- Esecuzione in Background: Per estrazioni che coprono più di alcuni mesi di dati o che vengono eseguite in un sistema con un elevato volume di transazioni, eseguire sempre il programma in
backgroundper prevenire itimeoutdei processi di dialogo.
a Query di Esempio abap
REPORT z_pm_po_extract.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_aedat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_bukrs FOR ekko-bukrs.
SELECT-OPTIONS: s_bsart FOR ekko-bsart.
PARAMETERS: p_sysid TYPE string DEFAULT '[Your SAP System ID]'.
SELECTION-SCREEN END OF BLOCK b1.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
purchaseordernumber TYPE ebeln,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE string,
lastdataupdate TYPE timestamp,
vendorid TYPE lifnr,
username TYPE ernam,
totalnetamount TYPE netwr,
purchaserequisitionnumber TYPE banfn,
requesteddeliverydate TYPE eedat,
documenttype TYPE bsart,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lt_ekko TYPE TABLE OF ekko,
lt_ekpo TYPE TABLE OF ekpo.
" ====================================================================
" START OF SELECTION
" ====================================================================
START-OF-SELECTION.
" Get current timestamp for LastDataUpdate
GET TIME STAMP FIELD ls_event_log-lastdataupdate.
ls_event_log-sourcesystem = p_sysid.
" --- Initial Data Selection: Purchase Orders in Scope ---
SELECT * FROM ekko INTO TABLE lt_ekko
WHERE aedat IN s_aedat
AND bukrs IN s_bukrs
AND bsart IN s_bsart.
IF lt_ekko IS INITIAL.
MESSAGE 'No Purchase Orders found for the given criteria.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
SELECT * FROM ekpo INTO TABLE lt_ekpo
FOR ALL ENTRIES IN lt_ekko
WHERE ebeln = lt_ekko-ebeln.
" --- 1. Purchase Requisition Created ---
SELECT ban.banfn, ban.erdat, ban.erzet, ban.ernam,
ekpo.ebeln, ekpo.netwr, ekpo.eindt, ekpo.bsart, ekpo.lifnr, ekko.bukrs
FROM eban AS ban
INNER JOIN ekpo AS ekpo ON ban.banfn = ekpo.banfn AND ban.bnfpo = ekpo.bnfpo
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_created).
LOOP AT lt_pr_created INTO DATA(ls_pr_created).
ls_event_log-purchaseordernumber = ls_pr_created-ebeln.
ls_event_log-activityname = 'Purchase Requisition Created'.
CONVERT DATE ls_pr_created-erdat TIME ls_pr_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_pr_created-lifnr.
ls_event_log-username = ls_pr_created-ernam.
ls_event_log-totalnetamount = ls_pr_created-netwr.
ls_event_log-purchaserequisitionnumber = ls_pr_created-banfn.
ls_event_log-requesteddeliverydate = ls_pr_created-eindt.
ls_event_log-documenttype = ls_pr_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 2. Purchase Requisition Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = ekpo.banfn
INNER JOIN ekko AS ekko ON ekpo.ebeln = ekko.ebeln
WHERE h.objectclas = 'BANF'
AND p.tabname = 'EBAN'
AND p.fname = 'FRGZU'
AND p.value_new = 'X' "Configure based on your system release indicator for 'Approved'
AND ekko.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_pr_approved).
LOOP AT lt_pr_approved INTO DATA(ls_pr_approved).
SELECT SINGLE ebeln FROM ekpo INTO ls_event_log-purchaseordernumber WHERE banfn = ls_pr_approved-objectid.
ls_event_log-activityname = 'Purchase Requisition Approved'.
CONVERT DATE ls_pr_approved-udate TIME ls_pr_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_pr_approved-username.
" Other attributes can be populated with another SELECT if needed.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 3. Purchase Order Created ---
LOOP AT lt_ekko INTO DATA(ls_ekko_created).
ls_event_log-purchaseordernumber = ls_ekko_created-ebeln.
ls_event_log-activityname = 'Purchase Order Created'.
CONVERT DATE ls_ekko_created-aedat TIME ls_ekko_created-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-vendorid = ls_ekko_created-lifnr.
ls_event_log-username = ls_ekko_created-ernam.
ls_event_log-totalnetamount = ls_ekko_created-rlwrt.
ls_event_log-purchaserequisitionnumber = ''. "Can be enriched later if needed
ls_event_log-requesteddeliverydate = ''. "Can be enriched from EKPO
ls_event_log-documenttype = ls_ekko_created-bsart.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 4. Purchase Order Approved (via Change Docs on Release Indicator) ---
SELECT h.objectid, h.udate, h.utime, h.username
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.objectclas = p.objectclas AND h.objectid = p.objectid AND h.changenr = p.changenr
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKKO'
AND p.fname = 'FRGKE'
AND p.value_new = 'R' "R for Released
AND h.objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_approved).
LOOP AT lt_po_approved INTO DATA(ls_po_approved).
ls_event_log-purchaseordernumber = ls_po_approved-objectid.
ls_event_log-activityname = 'Purchase Order Approved'.
CONVERT DATE ls_po_approved-udate TIME ls_po_approved-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_approved-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 5. Purchase Order Sent to Vendor ---
SELECT n.objky, n.vstat, n.datvr, n.uhrvr, e.ernam
FROM nast AS n
INNER JOIN ekko AS e ON n.objky = e.ebeln
WHERE n.kappl = 'EF' "Application for Purchasing
AND n.kschl = '[Your PO Output Type]' "e.g. NEU
AND n.vstat = '1' "Successfully processed
AND n.objky IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_sent).
LOOP AT lt_po_sent INTO DATA(ls_po_sent).
ls_event_log-purchaseordernumber = ls_po_sent-objky.
ls_event_log-activityname = 'Purchase Order Sent to Vendor'.
CONVERT DATE ls_po_sent-datvr TIME ls_po_sent-uhrvr INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_sent-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 6. Purchase Order Changed ---
SELECT objectid, udate, utime, username FROM cdhdr
WHERE objectclas = 'EINKBELEG'
AND tcode IN ('ME22', 'ME22N')
AND objectid IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_changed).
LOOP AT lt_po_changed INTO DATA(ls_po_changed).
ls_event_log-purchaseordernumber = ls_po_changed-objectid.
ls_event_log-activityname = 'Purchase Order Changed'.
CONVERT DATE ls_po_changed-udate TIME ls_po_changed-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_changed-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 7. Goods Receipt Posted & 9. Goods Returned ---
SELECT e.ebeln, m.budat, m.cpudt, m.cputm, m.usnam, b.shkzg, b.bwart
FROM mkpf AS m
INNER JOIN mseg AS s ON m.mblnr = s.mblnr AND m.mjahr = s.mjahr
INNER JOIN t156 AS t ON s.bwart = t.bwart
INNER JOIN ekbe AS e ON s.ebeln = e.ebeln AND s.ebelp = e.ebelp AND s.mblnr = e.belnr AND s.mjahr = e.gjahr
WHERE e.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND e.bwart IN ('101', '102', '122', '123') "GR, GR Reversal, Return
INTO TABLE @DATA(lt_goods_mvmt).
LOOP AT lt_goods_mvmt INTO DATA(ls_goods_mvmt).
ls_event_log-purchaseordernumber = ls_goods_mvmt-ebeln.
IF ls_goods_mvmt-bwart = '101'.
ls_event_log-activityname = 'Goods Receipt Posted'.
ELSE.
ls_event_log-activityname = 'Goods Returned'.
ENDIF.
CONVERT DATE ls_goods_mvmt-cpudt TIME ls_goods_mvmt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_goods_mvmt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 8. Services Confirmation Entered ---
SELECT h.erdat, h.erzeit, h.ernam, l.ebeln
FROM essr AS h
INNER JOIN esll AS l ON h.lblni = l.lblni
WHERE l.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_services).
LOOP AT lt_services INTO DATA(ls_services).
ls_event_log-purchaseordernumber = ls_services-ebeln.
ls_event_log-activityname = 'Services Confirmation Entered'.
CONVERT DATE ls_services-erdat TIME ls_services-erzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_services-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 10. Invoice Received ---
SELECT r.ebeln, r.cpudt, r.cputm, r.usnam
FROM rbkp AS r
WHERE r.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_invoice_rcvd).
LOOP AT lt_invoice_rcvd INTO DATA(ls_invoice_rcvd).
ls_event_log-purchaseordernumber = ls_invoice_rcvd-ebeln.
ls_event_log-activityname = 'Invoice Received'.
CONVERT DATE ls_invoice_rcvd-cpudt TIME ls_invoice_rcvd-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_rcvd-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 11. Invoice Paid ---
SELECT b.ebeln, s.augdt, s.augbl, b.usnam
FROM rbkp AS b
INNER JOIN bseg AS e ON b.belnr = e.belnr AND b.gjahr = e.gjahr
INNER JOIN bsak AS s ON e.bukrs = s.bukrs AND e.belnr = s.belnr AND e.gjahr = s.gjahr AND e.buzei = s.buzei
WHERE b.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
AND s.augdt IS NOT NULL
INTO TABLE @DATA(lt_invoice_paid).
LOOP AT lt_invoice_paid INTO DATA(ls_invoice_paid).
ls_event_log-purchaseordernumber = ls_invoice_paid-ebeln.
ls_event_log-activityname = 'Invoice Paid'.
CONVERT DATE ls_invoice_paid-augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_invoice_paid-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- 12. Purchase Order Completed & 13. Purchase Order Deleted (via Change Docs) ---
SELECT h.objectid, h.udate, h.utime, h.username, p.fname
FROM cdhdr AS h
INNER JOIN cdpos AS p ON h.changenr = p.changenr
INNER JOIN ekpo AS ekpo ON h.objectid = |{ ekpo.ebeln }{ ekpo.ebelp }|
WHERE h.objectclas = 'EINKBELEG'
AND p.tabname = 'EKPO'
AND p.fname IN ('ELIKZ', 'EREKZ', 'LOEKZ')
AND p.value_new = 'X'
AND ekpo.ebeln IN @( VALUE #( FOR ls_ekko IN lt_ekko ( ls_ekko-ebeln ) ) )
INTO TABLE @DATA(lt_po_status_change).
LOOP AT lt_po_status_change INTO DATA(ls_po_status_change).
ls_event_log-purchaseordernumber = substring( val = ls_po_status_change-objectid, off = 0, len = 10 ).
CASE ls_po_status_change-fname.
WHEN 'LOEKZ'.
ls_event_log-activityname = 'Purchase Order Deleted'.
WHEN 'ELIKZ' OR 'EREKZ'.
"This logic may need refinement to check if both are now set.
ls_event_log-activityname = 'Purchase Order Completed'.
ENDCASE.
CONVERT DATE ls_po_status_change-udate TIME ls_po_status_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-username = ls_po_status_change-username.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" --- Final Output to CSV ---
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = 'C:\temp\po_event_log.csv'
filetype = 'ASC'
CHANGING
data_tab = lt_event_log.