Il Suo Template Dati per la Gestione dell'Inventario
Il Suo Template Dati per la Gestione dell'Inventario
- Attributi consigliati da raccogliere
- Attività chiave da tracciare per la scoperta dei processi
- Guida all'estrazione su misura per SAP S/4HANA
Attributi di Gestione dell'Inventario
| Nome | Descrizione | ||
|---|---|---|---|
| Lotto di Inventario InventoryBatchLot | L'identificatore univoco per una quantità specifica di un prodotto, che funge da ID `case` per tracciare il suo ciclo di vita. | ||
| Descrizione Il numero di Lotto di Inventario è l'identificatore di Nell'analisi dei processi, questo Perché è importante Questo è l'identificatore centrale che collega tutti gli Dove trovare Questo è tipicamente il Numero di Lotto, trovato nelle tabelle SAP come MCHA (Anagrafica Lotto) o MCH1 (Lotti) nel campo CHARG. Esempi B001-A452023L202405-XYZ789456123BATCH-05-24 | |||
| Timestamp Evento EventTime | La data e l'ora precise in cui l'attività di inventario è stata registrata nel sistema. | ||
| Descrizione Ora Evento ( L'accuratezza dell'Ora Evento è critica per il calcolo di indicatori chiave di prestazione come tempi di ciclo, Perché è importante Questo Dove trovare Questa è tipicamente una combinazione della data di registrazione (MKPF-BUDAT) e dell'ora di inserimento (MKPF-CPUTM) dalla tabella dell'intestazione del documento materiale MKPF. Esempi 2023-10-26T09:00:00Z2023-11-15T14:35:10Z2024-01-05T23:15:00Z | |||
| Activity ActivityName | Il nome dell'`event` commerciale che si è verificato in un punto specifico del processo di gestione dell'inventario. | ||
| Descrizione L' L'analisi delle attività è il fondamento del Perché è importante Definisce le fasi del processo, consentendo la visualizzazione e l'analisi del ciclo di vita dell'inventario. Dove trovare Questo è un Esempi Ricevimento merce registratoTrasferimento di Posizionamento RegistratoRegistrazione Uscita Merci per Consegna EffettuataScorte Scartate | |||
| Codice Motivo Movimento MovementReasonCode | Un codice che specifica la ragione di un movimento di inventario. | ||
| Descrizione Il codice Motivo del Movimento fornisce un contesto aggiuntivo sul motivo per cui è stato eseguito un movimento merci. Viene spesso utilizzato per spiegare movimenti non pianificati, come adeguamenti di inventario, resi o scarti. Questo Perché è importante Spiega il 'perché' dietro i movimenti di inventario non pianificati, consentendo un'analisi mirata delle cause radice. Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo GRUND (Motivo del Movimento). Esempi 00010005102 | |||
| Nome Utente UserName | L'ID utente della persona che ha eseguito la transazione in SAP. | ||
| Descrizione Questo L'analisi per utente è essenziale per comprendere le prestazioni, la Conformità e le esigenze di formazione. Ad esempio, la Perché è importante Offre responsabilità e aiuta a identificare comportamenti specifici degli utenti, esigenze di formazione o problemi di Conformità. Dove trovare Trovato nella tabella di intestazione del documento materiale MKPF, campo USNAM (Nome Utente). Esempi JSMITHMBROWNWAREHOUSE_OPS | |||
| Numero materiale MaterialNumber | L'identificatore univoco per il prodotto o materiale gestito. | ||
| Descrizione Il Numero Materiale, spesso chiamato SKU (Stock Keeping Unit), è il codice univoco assegnato a un prodotto specifico. È un elemento fondamentale dei Nel Perché è importante Permette di segmentare l'analisi per prodotto, rivelando schemi e problemi specifici di determinati articoli. Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo MATNR. I dati Esempi RM-1001FG-2050-B100-400-A | |||
| Quantità Quantity | La quantità di materiale coinvolta nel movimento di inventario. | ||
| Descrizione Questo L'analisi della quantità è cruciale per comprendere la scala e l'impatto dei processi di inventario. Consente la creazione di Perché è importante Quantifica il volume di materiale in ogni attività, consentendo l'analisi della produttività, del volume di scarto e dell'impatto degli aggiustamenti. Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo MENGE (Quantità). Esempi 10012.55000-10 | |||
| Stabilimento Plant | L'unità organizzativa che rappresenta una struttura in cui si trova l'inventario, come una fabbrica o un centro di distribuzione. | ||
| Descrizione Uno Stabilimento ( L'analisi per Stabilimento è fondamentale per confrontare le prestazioni dei processi tra diverse ubicazioni fisiche. Aiuta a rispondere a domande come: 'Quale stabilimento ha il tempo di ciclo di stoccaggio più lungo?' o 'Il tasso di discrepanza dell'inventario è più alto nello Stabilimento A che nello Stabilimento B?'. Questa segmentazione geografica o organizzativa è fondamentale per identificare problemi specifici della località e condividere le migliori pratiche in tutta l'organizzazione. Perché è importante Consente il confronto dei processi e delle prestazioni di inventario tra diverse sedi aziendali. Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo WERKS (Stabilimento). Esempi 10001710DE01US01 | |||
| Tipo di `Movimento` MovementType | Una chiave a tre cifre in SAP che controlla come viene registrato un movimento merci. | ||
| Descrizione Il Tipo di Movimento è una chiave di controllo critica nella Gestione dell'Inventario SAP che determina le caratteristiche di un movimento di materiale. Specifica quali conti vengono aggiornati, come appare il Questo Perché è importante Fornisce una classificazione precisa e tecnica di ogni Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo BWART (Tipo di Movimento). Esempi 101311261551601 | |||
| Ubicazione di Magazzino StorageLocation | Un'ubicazione specifica all'interno di uno Stabilimento (`Plant`) dove lo `stock` è fisicamente immagazzinato. | ||
| Descrizione Un'Ubicazione di Magazzino ( Questo Perché è importante Offre una vista granulare dell'ubicazione delle scorte all'interno di uno stabilimento, aiutando ad analizzare i movimenti interni e l'efficienza di stoccaggio. Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo LGORT (Ubicazione di Magazzino). Esempi 0001RM01FG01QI01 | |||
| Data di Scadenza ExpirationDate | La data in cui il lotto di materiale scade e non è più utilizzabile. | ||
| Descrizione La Data di Scadenza (SLED) è un elemento fondamentale dei Questo Perché è importante Consente l'analisi delle scorte obsolete e scadute, contribuendo a minimizzare sprechi e perdite finanziarie. Dove trovare Trovato nella tabella anagrafica lotti MCH1 o MCHA, campo VFDAT (Data di Scadenza). Esempi 2024-12-312025-06-302024-09-01 | |||
| Numero Documento Materiale MaterialDocumentNumber | Il numero univoco che identifica il documento materiale che registra il movimento merci. | ||
| Descrizione Quando un movimento merce viene registrato in SAP, il sistema genera un documento materiale come prova del movimento. Questo attributo è l'identificatore univoco per quel documento. Un singolo documento materiale può contenere più articoli o attività. Nel process mining, il Numero Documento Materiale è un identificatore transazionale chiave che può essere utilizzato per raggruppare eventi correlati registrati insieme. È anche essenziale per l'audit e per approfondire dall'analisi di processo nel sistema sorgente per investigare transazioni specifiche. Perché è importante Serve come chiave transazionale per l'audit e consente di raggruppare le attività eseguite insieme. Dove trovare Trovato nelle tabelle MKPF (intestazione) e MSEG (voce), campo MBLNR (Numero Documento Materiale). Esempi 490000123450000056784900002345 | |||
| Sistema di Origine SourceSystem | Identifica il sistema sorgente da cui sono stati estratti i `dati`. | ||
| Descrizione Questo Sebbene possa sembrare statico in un'analisi a sistema singolo, diventa vitale quando si uniscono Perché è importante Fornisce contesto sull'origine dei Dove trovare Questo è tipicamente un valore Esempi S4H_PROD_100SAP_S4_FINANCES4HANA_GLOBAL | |||
| Tempo di Ciclo dell'Ispezione di Qualità QualityInspectionCycleTime | La durata che un lotto trascorre nell'ispezione di qualità prima di essere rilasciato. | ||
| Descrizione Questa metrica calcolata misura il tempo trascorso tra l'attività 'Scorte Registrate per Ispezione Qualità' e l'attività 'Scorte in Ispezione Qualità Rilasciate' per un dato lotto di inventario. Rappresenta il tempo in cui le merci sono non disponibili per l'uso a causa dei processi di controllo qualità. Questo Perché è importante Quantifica i ritardi causati dal controllo qualità, evidenziando le opportunità per aumentare la disponibilità delle scorte e la velocità dei processi. Dove trovare Questo è un campo calcolato, derivato trovando la differenza di tempo tra i Esempi 2880086400172800 | |||
| Tempo di Ciclo di Evasione Ordini OrderFulfillmentCycleTime | La durata `end-to-end` da quando inizia il prelievo a quando le merci vengono emesse per la consegna. | ||
| Descrizione Questa è una metrica calcolata che misura il tempo totale dall'attività 'Prelievo Avviato' all'attività 'Emissione Merci per Consegna Registrata'. Rappresenta il tempo totale impiegato dal magazzino per preparare e spedire un ordine cliente una volta che il processo ha inizio. Questo Perché è importante Misura la velocità e l'efficienza del processo di uscita dal magazzino, un fattore chiave per la soddisfazione del cliente. Dove trovare Questo è un Esempi 7200144003600 | |||
| Tipo di Scorta StockType | Indica lo stato dell'inventario, come libero, in ispezione qualità o bloccato. | ||
| Descrizione Il Tipo di Scorta classifica l'inventario in base alla sua usabilità. I tipi principali sono scorte a utilizzo libero (liberamente disponibili), scorte in ispezione qualità (in attesa di controlli qualità) e scorte bloccate (non disponibili per l'uso). I movimenti di merci spesso implicano la modifica del tipo di scorta. Il tracciamento dei cambiamenti nel tipo di scorta è fondamentale per comprendere il processo di disponibilità dell'inventario. Supporta direttamente attività come 'Scorte Registrate per Ispezione Qualità' e 'Stato Scorte Modificato in Bloccato'. L'analisi del tempo trascorso in ogni tipo di scorta, specialmente nell'ispezione qualità, è cruciale per identificare i ritardi che influiscono sulla disponibilità delle merci per la vendita o la produzione. Perché è importante Traccia lo stato di usabilità dell'inventario, che è cruciale per analizzare i ritardi nell'ispezione di qualità e la disponibilità delle scorte. Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo INSMK (Tipo di Esempi A libera disponibilitàIspezione di QualitàStock Bloccato | |||
| Ubicazione di Stoccaggio StorageBin | L'unità di stoccaggio più granulare in un magazzino dove i materiali sono fisicamente collocati. | ||
| Descrizione Un'Ubicazione di Stoccaggio ( Per la Perché è importante Fornisce i Dove trovare Se si utilizza WM, questo può essere trovato nelle tabelle degli ordini di trasferimento come LTAK/LTAP. Per i documenti di inventario, potrebbe essere in MSEG-LGPBE. Consulti la documentazione SAP S/4HANA. Esempi A-01-01-AB-05-10-CRCV-AREA-01 | |||
| Ultimo `Data Update` LastDataUpdate | Il timestamp che indica l'ultimo aggiornamento dei dati per questo record dal sistema sorgente. | ||
| Descrizione Questo In qualsiasi analisi, conoscere la tempestività dei Perché è importante Informa gli utenti sull'aggiornamento dei Dove trovare Questo timestamp viene generato e aggiunto durante il processo di estrazione, trasformazione e caricamento (ETL). Esempi 2024-05-21T08:00:00Z2024-05-20T08:00:00Z | |||
| Unità Di Misura UnitOfMeasure | L'unità in cui viene misurata la quantità del materiale (ad esempio, pezzi, chilogrammi). | ||
| Descrizione L'Unità di Misura specifica l'unità per l' Sebbene spesso utilizzato come semplice descrittore, questo Perché è importante Fornisce contesto essenziale all' Dove trovare Trovato nella tabella delle voci del documento materiale MSEG, campo MEINS (Unità di Misura Base). Esempi PCKGEAM | |||
Attività di Gestione dell'Inventario
| Activity | Descrizione | ||
|---|---|---|---|
| Adeguamento Inventario Registrato | Registra una variazione nella quantità di scorte derivante da un conteggio fisico di inventario o altra discrepanza. Questo `event` adegua esplicitamente l'inventario contabile per corrispondere al conteggio fisico. | ||
| Perché è importante Questi adeguamenti sono critici per mantenere l'accuratezza dell'inventario. Un'alta frequenza di adeguamenti indica problemi sottostanti nella gestione delle scorte, nella sicurezza o nell'inserimento dei Dove trovare Registrato nella tabella MATDOC. Identificato dai Tipi di Movimento di inventario fisico (BWART), come 701 (guadagno di inventario) o 702 (perdita di inventario). Acquisisci Catturato dai documenti materiali in MATDOC con tipi di movimento di rettifica inventario fisico (ad es., 701, 702). Tipo di evento explicit | |||
| Registrazione Uscita Merci per Consegna Effettuata | Registra il passaggio finale del processo in uscita, dove la proprietà del lotto viene trasferita a un cliente o a un vettore. Questa è una transazione esplicita che riduce l'inventario e registra la contabilità. | ||
| Perché è importante Questo è un Dove trovare Registrato nella tabella MATDOC. Identificato dal Tipo di Movimento (BWART) per l'emissione merci a una consegna di ordine di vendita, tipicamente 601. Acquisisci Catturato dai documenti materiali in MATDOC con tipo di movimento 601. Tipo di evento explicit | |||
| Registrazione Uscita Merci per Produzione Effettuata | Rappresenta il consumo di un lotto di inventario da parte di un ordine di produzione o di processo. Questa transazione riduce l'inventario e alloca il costo del materiale all'ordine di fabbricazione. | ||
| Perché è importante Questo è un Dove trovare Registrato nella tabella MATDOC. Identificato dai Tipi di Movimento (BWART) per l'emissione merci a un ordine, come 261. Acquisisci Catturato dai documenti materiali in MATDOC con tipo di movimento 261. Tipo di evento explicit | |||
| Ricevimento merce registrato | Contrassegna l'ingresso iniziale di un lotto di inventario nel magazzino, tipicamente da un fornitore o dalla produzione. Questo `event` è esplicitamente catturato in SAP S/4HANA con la creazione di un documento materiale al ricevimento della merce. | ||
| Perché è importante Questo è l' Dove trovare Registrato nella tabella MATDOC. Identificato da Tipi di Movimento specifici (BWART), come 101 per i ricevimenti Ordine di Acquisto o 103 per la GR in scorte bloccate. Acquisisci Catturato dai documenti materiali in MATDOC con i corrispondenti tipi di movimento di entrata merci. Tipo di evento explicit | |||
| Scorte in Ispezione Qualità Rilasciate | Indica che un lotto ha superato l'ispezione di qualità ed è ora disponibile per l'uso o lo stoccaggio (`put-away`). Questo viene registrato come una registrazione di trasferimento esplicita dallo `stock` di qualità a un altro tipo di `stock`, come l'uso illimitato. | ||
| Perché è importante Questa Dove trovare Registrato nella tabella MATDOC come trasferimento. Tipicamente identificato dal Tipo di Movimento (BWART) 321, spostando le scorte da 'Ispezione Qualità' a 'Utilizzo Libero'. Acquisisci Catturato dai documenti materiali in MATDOC con tipo di movimento 321. Tipo di evento explicit | |||
| Scorte Scartate | Contrassegna lo smaltimento finale di un lotto di inventario, rimuovendolo permanentemente dai registri di inventario. Ciò avviene tipicamente per scorte scadute, danneggiate o obsolete. | ||
| Perché è importante Questo è un Dove trovare Registrato nella tabella MATDOC. Identificato dai Tipi di Movimento (BWART) per lo scarto, come 551 (da utilizzo libero), 553 (da QI) o 555 (da bloccato). Acquisisci Catturato dai documenti materiali in MATDOC con tipi di movimento di scarto (ad es., 551). Tipo di evento explicit | |||
| Trasferimento di Posizionamento Registrato | Rappresenta il movimento fisico del lotto da un'area di ricevimento o di `staging` alla sua ubicazione o `bin` di stoccaggio finale. Questo viene registrato come un documento materiale di trasferimento in SAP. | ||
| Perché è importante Completa il processo di ricezione in entrata. Il tempo impiegato per completare questa attività, noto come tempo di stoccaggio ( Dove trovare Registrato nella tabella MATDOC come trasferimento, spesso tra ubicazioni di stoccaggio (ad esempio, Tipo di Movimento 311). Il movimento specifico può variare in base alla struttura del magazzino. Acquisisci Identificato dai documenti di trasferimento in MATDOC che spostano lo Tipo di evento explicit | |||
| Movimento Interno Scorte Registrato | Cattura il movimento di un lotto di inventario tra diverse ubicazioni di magazzino o scomparti all'interno dello stesso stabilimento. Questa è una transazione esplicita che crea un documento materiale. | ||
| Perché è importante Monitorare i trasferimenti interni aiuta ad analizzare l'efficienza operativa del magazzino, a identificare i movimenti superflui e a misurare i tempi di consegna per il riapprovvigionamento delle scorte tra le diverse sedi. Dove trovare Registrato nella tabella MATDOC. Comunemente identificato dai Tipi di Movimento (BWART) 311 per i trasferimenti da ubicazione a ubicazione. Acquisisci Catturato dai documenti materiali in MATDOC con tipi di movimento per spostamenti interni di Tipo di evento explicit | |||
| Prelievo avviato | Contrassegna l'inizio del processo di evasione dell'ordine, dove viene creata un'attività di magazzino per prelevare un lotto dalla sua ubicazione di stoccaggio. Ciò viene spesso catturato quando viene creato un Ordine di Trasferimento o un'Attività di Magazzino. | ||
| Perché è importante Questa attività è il Dove trovare Questo di solito non è presente in MATDOC. Nei sistemi con Warehouse Management (WM/EWM), è dedotto dal Acquisisci Inferito dal record di creazione di un Ordine di Trasferimento (in WM) o Attività di Magazzino (in EWM) collegato al lotto di materiale. Tipo di evento inferred | |||
| Reso Vendite Ricevuto | Cattura il reso di un lotto precedentemente emesso da un cliente al magazzino. Questa è una transazione esplicita che aumenta l'inventario. | ||
| Perché è importante Il monitoraggio dei resi è essenziale per comprendere i problemi di qualità dei prodotti e l'insoddisfazione dei clienti. Anche il processo di gestione e smaltimento dei resi può essere una fonte di inefficienza. Dove trovare Registrato nella tabella MATDOC. Identificato dai Tipi di Movimento (BWART) per i resi di vendita, come 651 (a utilizzo libero) o 653 (a ispezione qualità). Acquisisci Catturato dai documenti materiali in MATDOC con tipi di movimento di reso vendite (ad es., 651, 653). Tipo di evento explicit | |||
| Scorte Registrate per Ispezione Qualità | Rappresenta il movimento di un lotto ricevuto in uno stato di attesa di ispezione di qualità, rendendolo non disponibile per l'uso fino al rilascio. Questa è una transazione esplicita in SAP, che modifica il tipo di scorte del lotto. | ||
| Perché è importante Questa attività avvia il processo di ispezione qualità. La durata tra questa e il rilascio da QI è una metrica chiave per comprendere i ritardi legati alla qualità. Dove trovare Registrato nella tabella MATDOC. Questo può essere un movimento di ricevimento merci (ad esempio, 101) con il Tipo di Scorta (INSMK) impostato su 'Q' (Ispezione di Qualità) o un trasferimento (ad esempio, 322). Acquisisci Identificato dai documenti materiali in MATDOC che collocano l'inventario nel tipo di Tipo di evento explicit | |||
| Stato del Lotto Modificato | Riflette un cambiamento nel record anagrafico del lotto, come la modifica del suo stato da 'Utilizzo Libero' a 'Ristretto'. Questo non è un movimento di materiale ma una modifica ai `master data`, che viene registrata. | ||
| Perché è importante Le modifiche nello stato del lotto influiscono direttamente sulla sua utilizzabilità in vendita o produzione. L'analisi di queste modifiche può rivelare problemi con Dove trovare Inferito dai Acquisisci Derivato dai documenti di modifica in CDHDR/CDPOS per il campo stato nel record anagrafico del lotto (MCH1-ZUSTD). Tipo di evento inferred | |||
| Stato Scorte Modificato in Bloccato | Rappresenta una modifica dello stato del lotto, rendendolo non disponibile per l'emissione, spesso a causa di danni, richieste di blocco o altri motivi. Questa è una registrazione di trasferimento esplicita in SAP. | ||
| Perché è importante Evidenzia interruzioni nella disponibilità dell'inventario. Un'elevata frequenza di Dove trovare Registrato nella tabella MATDOC come trasferimento. Utilizza comunemente il Tipo di Movimento (BWART) 344 per spostare le scorte da 'Bloccato' a 'Utilizzo Libero', e 343 per spostare da 'Utilizzo Libero' a 'Bloccato'. Questa attività è per 343. Acquisisci Identificato dai documenti materiali in MATDOC con tipo di movimento 343. Tipo di evento explicit | |||
| Stato Scorte Modificato in Utilizzo Libero | Rappresenta una modifica dello stato del lotto, rilasciandolo da un blocco o da un'attesa di qualità e rendendolo disponibile per l'uso. Questo viene registrato come una registrazione di trasferimento esplicita. | ||
| Perché è importante Questa attività segna la risoluzione di un blocco di inventario. Il tempo che le scorte trascorrono in uno stato bloccato può essere analizzato per migliorare i processi di risoluzione. Dove trovare Registrato nella tabella MATDOC come trasferimento. Il Tipo di Movimento (BWART) 344 sposta le scorte da 'Bloccato' a 'Utilizzo Libero'. Acquisisci Identificato dai documenti materiali in MATDOC con tipo di movimento 344. Tipo di evento explicit | |||
Guide all'Estrazione
Fasi
- Stabilire l'Accesso al Sistema: Si assicuri di avere un utente con le autorizzazioni necessarie per interrogare le viste
Core Data Services(CDS) nel sistema SAP S/4HANA. Ciò richiede tipicamente l'accesso concesso da un amministratore di sistema. - Scegliere un
ClientSQL: Selezioni uno strumentoclientSQL in grado di connettersi al database SAP HANA. Le scelte comuni includono SAP HANA Studio, SAP HANA Database Explorer o strumenti di terze parti come DBeaver. - Configurare la Connessione al Database: Utilizzando il Suo
clientSQL, crei una nuova connessione al database. Le occorreranno il nomehostdel database HANA, il numero di porta (tipicamente 315) e le Sue credenziali utente del database. - Preparare la
QuerySQL: Copi laquerySQL completa fornita nella sezione 'query' di questo documento nell'editor del SuoclientSQL. - Impostare i Parametri della
Query: Individui i valoriplaceholderall'interno dellaquery. Deve sostituireI_MaterialDocumentItem.PostingDate BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'con l'intervallo di date desiderato, ad esempio,BETWEEN '20230101' AND '20230630'. Inoltre, aggiorni eventuali filtri specifici per società o stabilimento comeMaterialDocumentItem.Plant IN ('Plant1', 'Plant2')per corrispondere alla Sua struttura organizzativa. - Eseguire la
Query: Esegua laquerySQL modificata sul database S/4HANA. Il tempo di esecuzione varierà a seconda dell'intervallo di date e del volume dei dati di inventario nel Suo sistema. - Rivedere i Dati: Una volta terminata la
query, riveda i risultati nel SuoclientSQL per assicurarsi che appaiano corretti e completi. Verifichi la presenza di diverse attività e la popolazione degliattributichiave. - Esportare il
Event Log: Esporti l'intero set di risultati dal SuoclientSQL in un file CSV. Si assicuri che le impostazioni di esportazione utilizzino la codifica UTF-8 per prevenire problemi di caratteri. - Preparare per il Caricamento: Denomini le colonne nel file CSV esattamente come
aliasatenellaquery, ad esempio,InventoryBatchLot,ActivityName,EventTimee così via. Questo file è ora pronto per essere caricato in uno strumento diprocess mining.
Configurazione
- Autorizzazioni: L'utente che esegue la query necessita dei permessi di
SELECTsulle seguenti viste CDS:I_MaterialDocumentItem,I_BatchChangeDocumenteI_WarehouseTask. È richiesto anche l'accesso allo schema del database sottostante in cui risiedono queste viste. - Filtro Intervallo di Date: È fondamentale applicare un filtro per intervallo di date ai campi
PostingDate,ChangeDocumentCreationDateoWarehouseTaskCreationDate. Un intervallo tipico per l'analisi va da 3 a 12 mesi. L'interrogazione di più anni può causare significativi problemi di prestazioni. - Filtri Organizzativi: Per migliorare le prestazioni e ottenere un'analisi mirata, aggiunga clausole
WHEREper filtrare per Stabilimento (Plant) o Società (CompanyCode). Questo riduce il volume dei dati e focalizza l'estrazione sulle parti rilevanti del business. - Volume di Dati: Tenga presente che i sistemi di gestione dell'inventario generano un elevato volume di dati. Un ampio intervallo di date può tradursi in milioni di righe, potenzialmente influenzando sia il sistema di origine durante l'estrazione sia le prestazioni del Suo strumento client.
- Extended Warehouse Management (EWM): L'attività 'Picking Avviato' si basa sulla vista CDS
I_WarehouseTask, che viene popolata solo se utilizza SAP Extended Warehouse Management. Se la Sua organizzazione utilizza il modulo più datato Warehouse Management (WM) o solo Inventory Management (IM), questa specifica attività non verrà estratta.
a Query di Esempio sql
SELECT
mat_doc.Batch AS "InventoryBatchLot",
CASE
WHEN mat_doc.MovementType = '101' AND mat_doc.InventoryStockType = '2' THEN 'Stock Posted to Quality Inspection'
WHEN mat_doc.MovementType = '101' THEN 'Goods Receipt Posted'
WHEN mat_doc.MovementType = '321' THEN 'Quality Inspection Stock Released'
WHEN mat_doc.MovementType = '311' THEN 'Internal Stock Transfer Posted'
WHEN mat_doc.MovementType = '344' THEN 'Stock Status Changed to Blocked'
WHEN mat_doc.MovementType IN ('343', '322') THEN 'Stock Status Changed to Unrestricted'
WHEN mat_doc.MovementType IN ('701', '702') THEN 'Inventory Adjustment Posted'
WHEN mat_doc.MovementType = '601' THEN 'Goods Issue for Delivery Posted'
WHEN mat_doc.MovementType = '261' THEN 'Goods Issue for Production Posted'
WHEN mat_doc.MovementType IN ('651', '653') THEN 'Sales Return Received'
WHEN mat_doc.MovementType = '551' THEN 'Stock Scrapped'
WHEN mat_doc.MovementType = '313' THEN 'Put-Away Transfer Posted' -- Example for two-step transfers
ELSE 'Unknown Material Movement'
END AS "ActivityName",
TO_TIMESTAMP(mat_doc.PostingDate || LPAD(mat_doc.CreationTime, 6, '0'), 'YYYYMMDDHH24MISS') AS "EventTime",
mat_doc.Material AS "MaterialNumber",
mat_doc.CreatedByUser AS "UserName",
mat_doc.MovementType AS "MovementType",
mat_doc.Plant AS "Plant",
mat_doc.StorageLocation AS "StorageLocation",
mat_doc.QuantityInEntryUnit AS "Quantity",
mat_doc.ReasonForMovement AS "MovementReasonCode"
FROM
I_MaterialDocumentItem AS mat_doc
WHERE
mat_doc.Batch IS NOT NULL AND mat_doc.Batch <> ''
AND mat_doc.PostingDate BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
-- AND mat_doc.Plant IN ('Plant1', 'Plant2') -- Placeholder: Add filters for relevant plants
UNION ALL
SELECT
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 3) AS "InventoryBatchLot",
'Batch Status Changed' AS "ActivityName",
change_doc.ChangeDocumentCreationDateTime AS "EventTime",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 1) AS "MaterialNumber",
change_doc.ChangedByUser AS "UserName",
NULL AS "MovementType",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 2) AS "Plant",
NULL AS "StorageLocation",
NULL AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_BatchChangeDocument AS change_doc
WHERE
change_doc.ChangeDocumentTable = 'MCHA' AND change_doc.ChangeDocumentTableFieldName = 'ZUSTD'
AND TO_VARCHAR(change_doc.ChangeDocumentCreationDate) BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
UNION ALL
SELECT
wh_task.Batch AS "InventoryBatchLot",
'Picking Initiated' AS "ActivityName",
wh_task.WarehouseTaskCreationDateTime AS "EventTime",
wh_task.Product AS "MaterialNumber",
wh_task.CreatedByUser AS "UserName",
NULL AS "MovementType",
wh_task.Plant AS "Plant",
wh_task.SourceStorageLocation AS "StorageLocation",
wh_task.TargetQuantity AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_WarehouseTask AS wh_task
WHERE
wh_task.Batch IS NOT NULL AND wh_task.Batch <> ''
AND wh_task.WarehouseProcessType IN ('P210', 'P220') -- Placeholder: Adjust process types based on your picking configuration
AND TO_VARCHAR(wh_task.WarehouseTaskCreationDate) BETWEEN '20230101' AND '20231231'; -- Placeholder: Set your date range Fasi
- Stabilire l'Accesso al Sistema: Si assicuri di avere un utente con le autorizzazioni necessarie per interrogare le viste
Core Data Services(CDS) nel sistema SAP S/4HANA. Ciò richiede tipicamente l'accesso concesso da un amministratore di sistema. - Scegliere un
ClientSQL: Selezioni uno strumentoclientSQL in grado di connettersi al database SAP HANA. Le scelte comuni includono SAP HANA Studio, SAP HANA Database Explorer o strumenti di terze parti come DBeaver. - Configurare la Connessione al Database: Utilizzando il Suo
clientSQL, crei una nuova connessione al database. Le occorreranno il nomehostdel database HANA, il numero di porta (tipicamente 315) e le Sue credenziali utente del database. - Preparare la
QuerySQL: Copi laquerySQL completa fornita nella sezione 'query' di questo documento nell'editor del SuoclientSQL. - Impostare i Parametri della
Query: Individui i valoriplaceholderall'interno dellaquery. Deve sostituireI_MaterialDocumentItem.PostingDate BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'con l'intervallo di date desiderato, ad esempio,BETWEEN '20230101' AND '20230630'. Inoltre, aggiorni eventuali filtri specifici per società o stabilimento comeMaterialDocumentItem.Plant IN ('Plant1', 'Plant2')per corrispondere alla Sua struttura organizzativa. - Eseguire la
Query: Esegua laquerySQL modificata sul database S/4HANA. Il tempo di esecuzione varierà a seconda dell'intervallo di date e del volume dei dati di inventario nel Suo sistema. - Rivedere i Dati: Una volta terminata la
query, riveda i risultati nel SuoclientSQL per assicurarsi che appaiano corretti e completi. Verifichi la presenza di diverse attività e la popolazione degliattributichiave. - Esportare il
Event Log: Esporti l'intero set di risultati dal SuoclientSQL in un file CSV. Si assicuri che le impostazioni di esportazione utilizzino la codifica UTF-8 per prevenire problemi di caratteri. - Preparare per il Caricamento: Denomini le colonne nel file CSV esattamente come
aliasatenellaquery, ad esempio,InventoryBatchLot,ActivityName,EventTimee così via. Questo file è ora pronto per essere caricato in uno strumento diprocess mining.
Configurazione
- Autorizzazioni: L'utente che esegue la query necessita dei permessi di
SELECTsulle seguenti viste CDS:I_MaterialDocumentItem,I_BatchChangeDocumenteI_WarehouseTask. È richiesto anche l'accesso allo schema del database sottostante in cui risiedono queste viste. - Filtro Intervallo di Date: È fondamentale applicare un filtro per intervallo di date ai campi
PostingDate,ChangeDocumentCreationDateoWarehouseTaskCreationDate. Un intervallo tipico per l'analisi va da 3 a 12 mesi. L'interrogazione di più anni può causare significativi problemi di prestazioni. - Filtri Organizzativi: Per migliorare le prestazioni e ottenere un'analisi mirata, aggiunga clausole
WHEREper filtrare per Stabilimento (Plant) o Società (CompanyCode). Questo riduce il volume dei dati e focalizza l'estrazione sulle parti rilevanti del business. - Volume di Dati: Tenga presente che i sistemi di gestione dell'inventario generano un elevato volume di dati. Un ampio intervallo di date può tradursi in milioni di righe, potenzialmente influenzando sia il sistema di origine durante l'estrazione sia le prestazioni del Suo strumento client.
- Extended Warehouse Management (EWM): L'attività 'Picking Avviato' si basa sulla vista CDS
I_WarehouseTask, che viene popolata solo se utilizza SAP Extended Warehouse Management. Se la Sua organizzazione utilizza il modulo più datato Warehouse Management (WM) o solo Inventory Management (IM), questa specifica attività non verrà estratta.
a Query di Esempio sql
SELECT
mat_doc.Batch AS "InventoryBatchLot",
CASE
WHEN mat_doc.MovementType = '101' AND mat_doc.InventoryStockType = '2' THEN 'Stock Posted to Quality Inspection'
WHEN mat_doc.MovementType = '101' THEN 'Goods Receipt Posted'
WHEN mat_doc.MovementType = '321' THEN 'Quality Inspection Stock Released'
WHEN mat_doc.MovementType = '311' THEN 'Internal Stock Transfer Posted'
WHEN mat_doc.MovementType = '344' THEN 'Stock Status Changed to Blocked'
WHEN mat_doc.MovementType IN ('343', '322') THEN 'Stock Status Changed to Unrestricted'
WHEN mat_doc.MovementType IN ('701', '702') THEN 'Inventory Adjustment Posted'
WHEN mat_doc.MovementType = '601' THEN 'Goods Issue for Delivery Posted'
WHEN mat_doc.MovementType = '261' THEN 'Goods Issue for Production Posted'
WHEN mat_doc.MovementType IN ('651', '653') THEN 'Sales Return Received'
WHEN mat_doc.MovementType = '551' THEN 'Stock Scrapped'
WHEN mat_doc.MovementType = '313' THEN 'Put-Away Transfer Posted' -- Example for two-step transfers
ELSE 'Unknown Material Movement'
END AS "ActivityName",
TO_TIMESTAMP(mat_doc.PostingDate || LPAD(mat_doc.CreationTime, 6, '0'), 'YYYYMMDDHH24MISS') AS "EventTime",
mat_doc.Material AS "MaterialNumber",
mat_doc.CreatedByUser AS "UserName",
mat_doc.MovementType AS "MovementType",
mat_doc.Plant AS "Plant",
mat_doc.StorageLocation AS "StorageLocation",
mat_doc.QuantityInEntryUnit AS "Quantity",
mat_doc.ReasonForMovement AS "MovementReasonCode"
FROM
I_MaterialDocumentItem AS mat_doc
WHERE
mat_doc.Batch IS NOT NULL AND mat_doc.Batch <> ''
AND mat_doc.PostingDate BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
-- AND mat_doc.Plant IN ('Plant1', 'Plant2') -- Placeholder: Add filters for relevant plants
UNION ALL
SELECT
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 3) AS "InventoryBatchLot",
'Batch Status Changed' AS "ActivityName",
change_doc.ChangeDocumentCreationDateTime AS "EventTime",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 1) AS "MaterialNumber",
change_doc.ChangedByUser AS "UserName",
NULL AS "MovementType",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 2) AS "Plant",
NULL AS "StorageLocation",
NULL AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_BatchChangeDocument AS change_doc
WHERE
change_doc.ChangeDocumentTable = 'MCHA' AND change_doc.ChangeDocumentTableFieldName = 'ZUSTD'
AND TO_VARCHAR(change_doc.ChangeDocumentCreationDate) BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
UNION ALL
SELECT
wh_task.Batch AS "InventoryBatchLot",
'Picking Initiated' AS "ActivityName",
wh_task.WarehouseTaskCreationDateTime AS "EventTime",
wh_task.Product AS "MaterialNumber",
wh_task.CreatedByUser AS "UserName",
NULL AS "MovementType",
wh_task.Plant AS "Plant",
wh_task.SourceStorageLocation AS "StorageLocation",
wh_task.TargetQuantity AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_WarehouseTask AS wh_task
WHERE
wh_task.Batch IS NOT NULL AND wh_task.Batch <> ''
AND wh_task.WarehouseProcessType IN ('P210', 'P220') -- Placeholder: Adjust process types based on your picking configuration
AND TO_VARCHAR(wh_task.WarehouseTaskCreationDate) BETWEEN '20230101' AND '20231231'; -- Placeholder: Set your date range Fasi
- Accedere all'Editor ABAP: Acceda al Suo sistema SAP S/4HANA. Apra l'Editor ABAP utilizzando il codice di transazione
SE38. - Creare un Nuovo Programma: Inserisca un nome per il nuovo programma nel campo 'Program', ad esempio,
Z_PM_INVENTORY_EXTRACT, e clicchi sul pulsante 'Crea'. Fornisca un titolo descrittivo, imposti il 'Tipo' su 'Programma Eseguibile' e lo salvi in un pacchetto. - Definire i Parametri del Programma: Nell'editor del programma, definisca la schermata di selezione che servirà da interfaccia utente per l'estrazione. Ciò consente agli utenti di specificare parametri come l'intervallo di date e lo stabilimento per l'estrazione dei dati.
- Implementare la Logica di Estrazione: Copi il codice ABAP completo fornito nella sezione 'Query' e lo incolli nell'Editor ABAP. Questo codice è progettato per selezionare i dati per tutte le 14 attività di inventario richieste da varie tabelle SAP.
- Comprendere la Logica Core: Il programma funziona selezionando i dati per ogni distinta attività di inventario dalle sue tabelle di origine, come
MKPFeMSEGper i movimenti materiali oCDHDReCDPOSper i cambiamenti dei dati anagrafici. Ogni selezione viene quindi combinata utilizzandoUNION ALLin una singola tabella interna che rappresenta illog eventi. - Configurare l'Output del File: La parte finale del codice gestisce la scrittura dei dati consolidati dalla tabella interna a un file. Utilizza l'istruzione
OPEN DATASETper creare un file sulserverapplicativo SAP. Deve specificare un percorsoservervalido dove l'utente di sistema SAP abbia i permessi di scrittura. - Eseguire il Programma: Salvi e attivi il programma ABAP (Ctrl+F3). Lo esegua premendo F8. Nella schermata di selezione, inserisca l'intervallo di date desiderato e qualsiasi altro filtro rilevante, come Stabilimento (
Plant) o Codice Società (Company Code). - Eseguire come
JobinBackground: Per grandi volumi di dati, è fondamentale eseguire il programma comejobinbackgroundper evitaretimeoutdi sessione. Dalla schermata di esecuzione (F8), vada al menuProgram -> Execute in Background. Pianifichi iljobper l'esecuzione durante le ore non di punta. - Recuperare il File di Output: Una volta completato il
job, individui il file di output sulserverapplicativo SAP. Utilizzi il codice di transazioneAL11per sfogliare ledirectorydelservere trovare il Suo file. Utilizzi la transazioneCG3Yper scaricare il file dalserverapplicativo al Suocomputerlocale. - Preparare per il Caricamento: Apra il file scaricato in un
editordi testo o unsoftware spreadsheet. Si assicuri che sia formattato come file CSV con una riga di intestazione, utilizzando la virgola come delimitatore e le doppie virgolette come qualificatore di testo. Verifichi che i nomi delle colonne corrispondano ai requisiti prima di caricarlo nello strumento diprocess mining.
Configurazione
- Intervallo di Date di Registrazione: Questo è il parametro più critico. Le consigliamo di estrarre i dati in lotti gestibili, ad esempio da 3 a 6 mesi alla volta, per garantire buone prestazioni ed evitare timeout del sistema.
- Filtro per Stabilimento: È altamente consigliabile filtrare per uno o più Stabilimenti (
WERKS) specifici. L'esecuzione dell'estrazione per tutti gli stabilimenti contemporaneamente può essere estremamente intensiva in termini di risorse. - Filtro per Codice Società: Può aggiungere un filtro opzionale per il Codice Società (
BUKRS) per limitare ulteriormente l'ambito dei dati se la Sua organizzazione opera con più codici società all'interno dello stesso sistema. - Percorso File Server Applicativo: Il programma ABAP richiede un percorso di directory predefinito e valido sul server applicativo SAP. Si assicuri che l'utente di sistema SAP (
SY-UNAME) abbia le autorizzazioni a livello di sistema operativo necessarie per scrivere file in questa directory. - Autorizzazioni: L'utente che esegue questa estrazione richiede autorizzazioni per la transazione
SE38(per creare ed eseguire il programma), accesso in visualizzazione alle tabelleMKPF,MSEG,MCH1,CDHDR,CDPOS,LTAKeLTAP, e la capacità di pianificarejobinbackground(SM36/SM37).
a Query di Esempio abap
REPORT Z_PM_INVENTORY_EXTRACT.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECT-OPTIONS: s_budat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_werks FOR mseg-werks.
PARAMETERS: p_fpath TYPE string DEFAULT '/usr/sap/trans/tmp/inventory_log.csv' OBLIGATORY.
" ====================================================================
" DATA STRUCTURES
" ====================================================================
TYPES: BEGIN OF ty_event_log,
InventoryBatchLot TYPE charg,
ActivityName TYPE string,
EventTime TYPE string,
MaterialNumber TYPE matnr,
UserName TYPE xubname,
MovementType TYPE bwart,
Plant TYPE werks_d,
StorageLocation TYPE lgort_d,
Quantity TYPE menge_d,
MovementReasonCode TYPE grund,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log.
" ====================================================================
" DATA SELECTION
" ====================================================================
START-OF-SELECTION.
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Receipt Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('101', '103', '105', '501', '521', '561')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~shkzg
WHEN 'H' THEN 'Stock Posted to Quality Inspection'
WHEN 'S' THEN 'Quality Inspection Stock Released'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '321' " For QI to Unrestricted
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Put-Away Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '311' AND mseg~shkzg = 'H' " Assume put-away is the credit side
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Internal Stock Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('301', '311', '313', '315')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~bwart
WHEN '343' THEN 'Stock Status Changed to Blocked'
WHEN '344' THEN 'Stock Status Changed to Unrestricted'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('343', '344')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Inventory Adjustment Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('701', '702', '711', '712')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Delivery Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '601'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Production Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '261'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Sales Return Received' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('651', '653')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Stock Scrapped' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '551'
UNION ALL
SELECT
ltap~charg AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CONCAT( ltak~bdatu, ltak~bzeit ) AS EventTime,
ltap~matnr AS MaterialNumber,
ltak~bname AS UserName,
ltak~bwart AS MovementType,
ltap~werks AS Plant,
ltap~lgort AS StorageLocation,
ltap~nista AS Quantity,
'' AS MovementReasonCode
FROM ltap
JOIN ltak ON ltak~tanum = ltap~tanum
WHERE ltak~bdatu IN s_budat
AND ltap~werks IN s_werks
AND ltap~charg IS NOT NULL AND ltap~charg <> ''
UNION ALL
SELECT
SUBSTRING( cdhdr~objectid, 5, 18 ) AS InventoryBatchLot, " Object ID for BATCH is MATNR+WERKS+CHARG
'Batch Status Changed' AS ActivityName,
CONCAT( cdhdr~udate, cdhdr~utime ) AS EventTime,
SUBSTRING( cdhdr~objectid, 1, 4 ) AS MaterialNumber,
cdhdr~username AS UserName,
'' AS MovementType,
'' AS Plant,
'' AS StorageLocation,
0 AS Quantity,
'' AS MovementReasonCode
FROM cdhdr
JOIN cdpos ON cdpos~objectclas = cdhdr~objectclas
AND cdpos~objectid = cdhdr~objectid
AND cdpos~changenr = cdhdr~changenr
WHERE cdhdr~udate IN s_budat
AND cdhdr~objectclas = 'BATCH'
AND cdpos~tabname = 'MCH1'
AND cdpos~fname = 'ZUSTD'
INTO TABLE @lt_event_log.
" ====================================================================
" WRITE OUTPUT FILE
" ====================================================================
DATA: lv_string TYPE string.
DATA: lo_conv TYPE REF TO cl_abap_conv_out_ce.
lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'InventoryBatchLot,ActivityName,EventTime,MaterialNumber,UserName,MovementType,Plant,StorageLocation,Quantity,MovementReasonCode'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT lt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
CONCATENATE
<fs_log>-InventoryBatchLot
<fs_log>-ActivityName
<fs_log>-EventTime
<fs_log>-MaterialNumber
<fs_log>-UserName
<fs_log>-MovementType
<fs_log>-Plant
<fs_log>-StorageLocation
<fs_log>-Quantity
<fs_log>-MovementReasonCode
INTO lv_string
SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: 'Extraction complete. File written to:', p_fpath.