Il Suo Template Dati per il Ciclo Ordine-Incasso - Fatturazione
Il Suo Template Dati per il Ciclo Ordine-Incasso - Fatturazione
- Attributi consigliati per un'analisi completa
- Passaggi chiave del processo e `punti salienti` da tracciare
- Guida pratica all'estrazione dati per SAP ECC
Attributi Order to Cash - Fatturazione e Contabilizzazione
| Nome | Descrizione | ||
|---|---|---|---|
| Activity ActivityName | Il nome dell'`event` o del passaggio aziendale che si è verificato all'interno del ciclo di vita della fattura. | ||
| Descrizione Questo La sequenza di queste attività forma il Perché è importante Definisce i passaggi nella Dove trovare Questo è un Esempi Fattura generataFattura RegistrataSollecito di Pagamento EmessoFattura Compensata | |||
| Numero fattura InvoiceNumber | L'identificatore univoco per il documento di fatturazione, che funge da `Case ID` primario per il processo di contabilizzazione. | ||
| Descrizione Il Numero di Fattura, noto come Numero Documento di Fatturazione in SAP, identifica in modo univoco ogni fattura. Nel L'analisi dei processi per Numero di Fattura consente una visione completa del ciclo di vita di ogni transazione di fatturazione, dalla sua nascita al suo saldo finale. Ciò è cruciale per il calcolo di Perché è importante È la chiave essenziale per tracciare l'intero percorso di una fattura, consentendo l'analisi dei tempi di ciclo, dei Dove trovare Tabella SAP ECC: VBRK, Campo: VBELN Esempi 90001234900012359000123690001237 | |||
| Ora di Inizio EventTime | Il timestamp che indica quando una specifica attività o un evento si è verificato. | ||
| Descrizione L' Questo Perché è importante Questo Dove trovare Costruito da vari campi di data e ora su più tabelle, come BKPF (BUDAT, CPUTM), VBRK (ERDAT, ERZET) e tabelle di Esempi 2023-04-15T10:30:00Z2023-04-16T11:00:00Z2023-05-20T09:00:00Z | |||
| Codice Società CompanyCode | L'identificatore per l'entità legale che ha emesso la fattura. | ||
| Descrizione Il Codice Società rappresenta un'unità legale e contabile indipendente in SAP. Tutte le transazioni finanziarie, incluse le fatture, sono registrate su uno specifico codice società. Questo è un Nel contesto del Perché è importante Consente di filtrare e confrontare i processi tra diverse entità legali, il che è fondamentale per l'analisi finanziaria e il Dove trovare Tabella SAP ECC: VBRK, Campo: BUKRS Esempi 10002000US01DE01 | |||
| Importo Totale Fattura TotalInvoiceAmount | Il valore netto totale del documento di fatturazione. | ||
| Descrizione Questo Viene utilizzato in varie analisi, come la segmentazione delle fatture in categorie ad alto e basso valore per vedere se i loro Perché è importante Fornisce un contesto finanziario essenziale, consentendo analisi basate sul valore della fattura, come identificare se le fatture di alto valore seguono un processo diverso o impiegano più tempo per essere compensate. Dove trovare Tabella SAP ECC: VBRK, Campo: NETWR Esempi 1500.7525000.00500.0012345.67 | |||
| Nome Utente UserName | L'ID dell'utente che ha eseguito l'attività o creato il documento. | ||
| Descrizione Questo Con questi Perché è importante Consente l'analisi delle prestazioni degli utenti, la distribuzione del carico di lavoro e aiuta a distinguere tra attività manuali e automatizzate, supportando iniziative di automazione ed efficienza. Dove trovare Tabella SAP ECC: VBRK, Campo: ERNAM (Creato da) o BKPF, Campo: USNAM (Nome utente) o CDHDR, Campo: USERNAME (Utente). Esempi JSMITHBW_BATCHLROSSIMKUMAR | |||
| Numero cliente CustomerNumber | Un numero unico che identifica il cliente a cui è emessa la fattura. | ||
| Descrizione Il Numero Cliente collega una fattura a un cliente o Gli analisti possono utilizzare questo campo per confrontare i Perché è importante Consente un'analisi orientata al cliente, aiutando a identificare i comportamenti di pagamento, valutare il DSO per cliente e personalizzare le strategie di riscossione. Dove trovare Tabella SAP ECC: VBRK, Campo: KUNRG (Pagatore) o KUNAG (Venduto a). Esempi 100023200541CUST-A487910345 | |||
| Tipo di Documento di Fatturazione BillingDocumentType | Un codice che categorizza il tipo di documento di fatturazione, come una fattura, una nota di credito o una nota di debito. | ||
| Descrizione Il Tipo di Documento di Fatturazione classifica le transazioni in categorie distinte in base al loro scopo aziendale. Ad esempio, 'F2' è una fattura cliente standard, mentre 'G2' rappresenta una nota di credito. Questa classificazione è configurata in SAP per controllare come vengono elaborati i diversi documenti di fatturazione. Per il Perché è importante Consente la segmentazione e l'analisi di diversi processi di fatturazione, come le fatture standard rispetto alle note di credito, che spesso hanno flussi di processo molto diversi. Dove trovare Tabella SAP ECC: VBRK, Campo: FKART Esempi F2G2L2IV | |||
| Codice transazione TransactionCode | Il codice di transazione SAP utilizzato per eseguire un'attività. | ||
| Descrizione Il Codice di Transazione, o Queste informazioni sono estremamente preziose per l'analisi delle cause profonde. Ad esempio, se gli errori sono comuni, gli analisti possono verificare se viene utilizzato un codice di transazione non standard. Aiuta anche a derivare il nome dell'attività e a comprendere quali funzionalità del sistema sono impiegate nel processo. Perché è importante Fornisce un contesto tecnico su come un'attività è stata eseguita, consentendo l'analisi delle cause profonde delle deviazioni di processo e aiutando a identificare azioni utente non standard. Dove trovare Tabella SAP ECC: CDHDR, Campo: TCODE Esempi VF01VF02FB01F-28 | |||
| Data di Compensazione ClearingDate | La data in cui il pagamento è stato ricevuto e la fattura è stata compensata dai crediti commerciali. | ||
| Descrizione La Data di Compensazione è la data in cui una voce aperta, come una fattura, viene contrassegnata come pagata o 'compensata' nel sistema finanziario. Questa data rappresenta di fatto quando il contante è considerato riscosso e riconciliato. Questa è una delle date più importanti nel ciclo Perché è importante Segna il passaggio finale del ciclo di vita della fattura, fungendo da data di fine per il calcolo del Dove trovare Tabella SAP ECC: BSAD, Campo: AUGDT Esempi 2023-05-142023-06-012023-06-25 | |||
| Data di Registrazione PostingDate | La data in cui il documento viene registrato nei libri contabili. | ||
| Descrizione La Data di Registrazione determina il periodo fiscale in cui la transazione viene registrata nel Da un punto di vista del Perché è importante Contrassegna una Dove trovare Tabella SAP ECC: BKPF, Campo: BUDAT Esempi 2023-04-152023-04-172023-05-21 | |||
| Data Documento DocumentDate | La data sul documento originale, fornita dal fornitore o dal creatore. | ||
| Descrizione La Data Documento è la data di emissione del documento originale. Per la fatturazione, questa è tipicamente la data in cui la fattura è stata creata ed è spesso utilizzata come base per il calcolo della data di scadenza del pagamento. Questa data è cruciale per il Perché è importante Serve come base per il calcolo dell'età delle fatture e del Dove trovare Tabella SAP ECC: VBRK, Campo: FKDAT (Data Fatturazione) Esempi 2023-04-152023-04-162023-05-20 | |||
| Data Scadenza Fattura InvoiceDueDate | La data entro la quale il cliente è tenuto a effettuare il pagamento. | ||
| Descrizione La Data di Scadenza Fattura è la scadenza per il pagamento come specificato dai termini di pagamento. Questa data è fondamentale per la gestione dei crediti e l'avvio delle attività di riscossione. Questo Perché è importante Questo è il Dove trovare Calcolato in base alla data di riferimento (BSEG-ZFBDT) e alle condizioni di pagamento (BSEG-ZTERM). Non è sempre memorizzato in un campo diretto. Esempi 2023-05-152023-05-302023-06-20 | |||
| È Automatizzato IsAutomated | Un flag che indica se un'attività è stata eseguita da un utente di sistema o tramite automazione. | ||
| Descrizione Questo Questo Perché è importante Supporta direttamente il calcolo del tasso di fatturazione automatizzata, contribuendo a misurare l'efficienza del processo e a tracciare l'impatto dei progetti di automazione. Dove trovare Derivato dall' Esempi truefalse | |||
| È una Rilavorazione IsRework | Un flag che indica se un'attività è un passaggio di rilavorazione o correzione. | ||
| Descrizione Questo Nel Perché è importante Aiuta a quantificare le inefficienze di processo e i problemi di qualità evidenziando quanto sforzo è dedicato alla correzione degli errori, supportando direttamente i Dove trovare Derivato dal nome dell'attività o dal codice transazione. Ad esempio, SE ActivityName = 'Fattura Corretta' O TransactionCode = 'VF11' ALLORA Esempi truefalse | |||
| Numero Documento di Vendita SalesDocumentNumber | L'identificatore dell'ordine di vendita originale che ha portato alla fattura. | ||
| Descrizione Questo Collegando il processo di fatturazione con il processo precedente dell'ordine di vendita, le organizzazioni possono analizzare il tempo di ciclo totale dall'ordine del cliente alla ricezione del contante. Aiuta a identificare se i ritardi nella fatturazione sono causati da problemi nelle vendite, nell'evasione o nel reparto di fatturazione stesso, fornendo una visione più olistica del processo. Perché è importante Collega il processo di fatturazione all'ordine di vendita, consentendo un'analisi Dove trovare Tabella SAP ECC: VBRP, Campo: VGBEL Esempi 100000451000004610000047 | |||
| Organizzazione di vendita SalesOrganization | L'unità organizzativa responsabile della vendita di prodotti o servizi. | ||
| Descrizione L'Organizzazione di Vendita è un'unità organizzativa in SAP responsabile della distribuzione di beni e servizi e della negoziazione delle condizioni di vendita. È un campo chiave per strutturare le operazioni di vendita e distribuzione. Nel Perché è importante Consente il Dove trovare Tabella SAP ECC: VBRK, Campo: VKORG Esempi 1000NA01EU01AP01 | |||
| Sistema di Origine SourceSystem | Identifica il sistema sorgente da cui sono stati estratti i `dati`. | ||
| Descrizione Questo Per il Perché è importante Fornisce contesto sull'origine dei Dove trovare Questo è tipicamente un valore statico aggiunto durante il processo di estrazione, trasformazione e caricamento ( Esempi SAP_ECC_PRODECC_EU_100SAP_US_FIN | |||
| Termini di Pagamento PaymentTerms | Le condizioni alle quali un venditore completerà una vendita, inclusi i termini di pagamento. | ||
| Descrizione I Termini di Pagamento definiscono le regole per la scadenza di un pagamento, come 'Netto 30' o 'Netto 60'. Questi termini sono concordati con il cliente e sono un fattore chiave per determinare il flusso di cassa. Analizzare il processo in base ai termini di pagamento può rivelare se determinati termini sono associati a cicli di pagamento più lunghi o a tassi più elevati di ritardo nei pagamenti. Questa Perché è importante Aiuta ad analizzare il comportamento di pagamento dei clienti e l'impatto sul flusso di cassa in base ai termini negoziati, fornendo Dove trovare Tabella SAP ECC: VBRK, Campo: ZTERM Esempi Z030Z060Z001 | |||
| Ultimo `Data Update` LastDataUpdate | Il timestamp del più recente data refresh o estrazione dal sistema sorgente. | ||
| Descrizione Questo Nelle Perché è importante Informa gli utenti sulla tempestività dei Dove trovare Generato e memorizzato durante il processo di estrazione, trasformazione e caricamento ( Esempi 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| Valuta Currency | Il codice valuta per gli importi specificati nella fattura. | ||
| Descrizione Questo Quando si analizzano Perché è importante Fornisce il contesto necessario per tutti i valori monetari, garantendo un'analisi finanziaria accurata, specialmente in un ambiente Dove trovare Tabella SAP ECC: VBRK, Campo: WAERK Esempi USDEURGBPJPY | |||
Attività Order to Cash - Fatturazione e Contabilizzazione
| Activity | Descrizione | ||
|---|---|---|---|
| Fattura Compensata | Lo stato finale di una fattura pagata con successo, indicando che la voce aperta è stata chiusa da un pagamento o una nota di credito corrispondente. La fattura è considerata completamente saldata. | ||
| Perché è importante Contrassegna il completamento con successo del ciclo Dove trovare Si verifica quando i campi del documento di compensazione (AUGBL) e della data di compensazione (AUGDT) vengono popolati per la voce di fattura nella tabella BSEG. Acquisisci L' Tipo di evento explicit | |||
| Fattura generata | Segna la creazione del documento di fatturazione nel sistema. Questo `event` viene acquisito quando viene creata una nuova voce nella tabella di intestazione del documento contabile (BKPF) con un tipo di documento specifico per le fatture. | ||
| Perché è importante Questo è il punto di partenza per l'intero processo di contabilizzazione. L'analisi del tempo da questo Dove trovare Registrato nella tabella BKPF. La data (CPUDT) e l'ora (CPUTM) di creazione per un numero di documento specifico (BELNR) segnano questo Acquisisci Dallo Tipo di evento explicit | |||
| Fattura inviata al cliente | Indica che la fattura è stata spedita al cliente tramite un canale di `output` definito come stampa, e-mail o EDI. Questo viene tipicamente acquisito dai `log` del sistema di gestione dell'`output`. | ||
| Perché è importante Questo Dove trovare Può essere dedotto dalla data e ora di elaborazione nella tabella dello stato dei messaggi (NAST) per il tipo di Acquisisci Inferito dalla voce della tabella NAST con stato di elaborazione '1' (elaborato con successo). Tipo di evento inferred | |||
| Fattura Registrata | La fattura è formalmente registrata nel `sub-ledger` dei crediti e nel `libro mastro generale`. Questo `event` rende la fattura legalmente vincolante e riflette il debito dovuto dal cliente. | ||
| Perché è importante Questa è una Dove trovare Registrato nella tabella BKPF. La data di registrazione (BUDAT) per il numero di documento (BELNR) segna questo Acquisisci Dalla data di registrazione (BUDAT) nella tabella BKPF per il documento di fattura. Tipo di evento explicit | |||
| Pagamento cliente ricevuto | Un pagamento è stato ricevuto dal cliente e registrato nel sistema come incasso o deposito bancario. Questo crea un documento di pagamento separato che non è ancora stato applicato alla fattura specifica. | ||
| Perché è importante Questa è una Dove trovare Registrato come nuovo documento in BKPF e BSEG, tipicamente con un tipo di documento che indica il pagamento del cliente, come 'DZ'. La data di registrazione (BUDAT) segna l' Acquisisci Dalla data di registrazione del documento di pagamento del cliente in BKPF. Tipo di evento explicit | |||
| Caso di Contestazione Creato | Una controversia formale è stata registrata contro la fattura, tipicamente a causa di reclami del cliente. Questo viene registrato nel sistema SAP `Dispute Management`. | ||
| Perché è importante Identifica le fatture a rischio di ritardo nel pagamento e mette in evidenza i problemi sottostanti che causano insoddisfazione del cliente. Segna l'inizio di un importante processo di gestione delle eccezioni. Dove trovare Catturato dalla creazione di un Acquisisci Registrato quando un utente crea una pratica di contestazione tramite la transazione UDM_DISPUTE. Tipo di evento explicit | |||
| Data di Scadenza Fattura Raggiunta | Un `event` calcolato che segna il giorno in cui il pagamento della fattura è ufficialmente dovuto secondo le condizioni di pagamento. Non è un'attività eseguita da un utente o un sistema, ma un punto temporale critico. | ||
| Perché è importante Essenziale per analizzare il comportamento di pagamento e la Dove trovare Derivato confrontando la data corrente con la data di scadenza netta. La data di scadenza si trova nel campo BSEG-ZFBDT o è calcolata dalla data di riferimento e dalle condizioni di pagamento. Acquisisci Confronta la data di sistema con il campo della data di scadenza netta nella voce di riga della fattura (BSEG). Tipo di evento calculated | |||
| Fattura Approvata | Rappresenta l'approvazione formale della fattura, consentendone la registrazione o l'invio al cliente. Questo viene spesso inferito quando un documento parcheggiato viene convertito in un documento registrato. | ||
| Perché è importante Traccia il Dove trovare Può essere dedotto dalla transizione di un documento dallo stato parcheggiato (in VBKPF) allo stato registrato (in BKPF). In alternativa, se viene utilizzato un sistema di Acquisisci Confronta la data di creazione del doc. parcheggiato (VBKPF) con la data di registrazione del doc. finale (BKPF). Tipo di evento inferred | |||
| Fattura Corretta | Rappresenta un'attività di rilavorazione in cui una fattura iniziale è stata ritenuta errata e successivamente stornata. Questo viene acquisito identificando i documenti di storno collegati alla fattura originale. | ||
| Perché è importante Evidenzia inefficienze di processo e problemi di qualità. Un'alta frequenza di correzioni segnala problemi nei Dove trovare Identificato trovando un documento di storno in cui BKPF-STBLG punta al documento originale. La creazione di questo documento di storno è l' Acquisisci Registrato quando viene creato un documento di storno (ad es. tramite FB08). Tipo di evento explicit | |||
| Fattura Parcheggiata | Il documento di fattura è stato salvato in uno stato preliminare senza essere registrato nel `libro mastro generale`. Questo viene spesso utilizzato quando le informazioni sono incomplete o richiedono una revisione prima della registrazione finale. | ||
| Perché è importante Traccia i passaggi di pre-registrazione e i potenziali ritardi. Una lunga durata nello stato parcheggiato può indicare problemi di qualità dei Dove trovare I documenti parcheggiati sono memorizzati nella tabella VBKPF. La creazione di un documento qui, che viene successivamente registrato, indica questa attività. Acquisisci Registrato al salvataggio di un documento parcheggiato utilizzando una transazione come FV70. Tipo di evento explicit | |||
| Fattura Stornata | Uno stato finale alternativo in cui la fattura è considerata inesigibile e l'importo residuo viene compensato con un conto crediti inesigibili. Questo chiude la fattura senza un pagamento da parte del cliente. | ||
| Perché è importante Rappresenta un esito negativo del processo e una perdita di entrate. Tracciare questi Dove trovare Inferito analizzando la transazione di compensazione per la fattura. Se il documento di compensazione viene contabilizzato su uno specifico conto spese per crediti inesigibili ( Acquisisci Inferito quando la transazione di compensazione implica una registrazione su un conto del Tipo di evento inferred | |||
| Pagamento applicato alla fattura | Il pagamento del cliente ricevuto è stato abbinato e applicato alla specifica fattura aperta, contrassegnando la voce per la compensazione. Questo è il passaggio di riconciliazione che collega il pagamento al debito. | ||
| Perché è importante Questa attività è cruciale per misurare il Dove trovare Inferito dalla transazione di compensazione, ad esempio F-32, che popola i campi di compensazione nella voce di fattura. Il Acquisisci Inferito dalla data di compensazione (AUGDT) popolata nella tabella delle voci di fattura (BSEG). Tipo di evento inferred | |||
| Sollecito di Pagamento Emesso | Il sistema ha generato e inviato un avviso di sollecito o un promemoria di pagamento al cliente per una fattura scaduta. Questo viene acquisito dai `log` della cronologia dei solleciti. | ||
| Perché è importante Aiuta a valutare l'efficacia della strategia di recupero crediti. L'analisi del tempo che intercorre tra il sollecito e la ricezione del pagamento è fondamentale per il Dove trovare Registrato nelle tabelle Acquisisci Registrato all'esecuzione di una procedura di sollecito (F150) per l'elemento scaduto. Tipo di evento explicit | |||
Guide all'Estrazione
Fasi
- Accesso all'Editor ABAP: Acceda al Suo sistema SAP ECC. Navighi all'Editor ABAP utilizzando il codice transazione
SE38. - Creazione Programma: Inserisca un nome per il Suo nuovo programma nel campo Programma, ad esempio
Z_PM_O2C_INVOICE_EXTRACT, e clicchi il pulsante Crea. Fornisca un titolo descrittivo e imposti il Tipo di programma su 'Programma eseguibile'. - Definizione Schermata di Selezione: Nel codice sorgente del programma, definisca i parametri della schermata di selezione. Ciò consente agli utenti di filtrare i
dataper l'estrazione. I parametri chiave includono l'intervallo di date di creazione del documento (S_ERDAT), il Codice Società (S_BUKRS) e il Tipo di Documento di Fatturazione (S_VBTYP). - Definizione Strutture
data: Dichiarare una struttura di tabella interna che conterrà idatafinali dell'event log. Questa struttura deve includere i campi perInvoiceNumber,ActivityName,EventTimee gliattributiraccomandati comeUserName,BillingDocumentType,CustomerNumber,CompanyCodeeTotalInvoiceAmount. - Implementazione della Logica di Selezione
data: Scriva la logica ABAP principale per selezionare idata. Per prima cosa, selezioni i documenti di fatturazione primari dalle tabelleVBRKeBKPFin base agli input della schermata di selezione dell'utente. Memorizzi questi in una tabella interna temporanea. - Estrazione Attività: Scorra l'elenco iniziale dei documenti di fatturazione. Per ogni documento, esegua selezioni successive da varie tabelle per identificare le 13 attività richieste. Ad esempio, interroghi la tabella
NASTper glievent'Fattura Inviata al Cliente',BSEGper le informazioni di compensazione ('Fattura Compensata', 'Pagamento Applicato') eMHNKper idatadi sollecito ('Sollecito di Pagamento Emesso'). - Costruzione della Tabella
Event Log: Per ogni attività trovata nel passaggio precedente, popoli un nuovo record nella Sua tabella interna dell'event logfinale. Si assicuri cheInvoiceNumber,ActivityName,EventTimee altriattributisiano correttamente mappati dalle tabelle di origine. - Scrittura sul Server Applicativo: Una volta completato il ciclo e popolata completamente la tabella dell'
event logfinale, utilizzi le istruzioniOPEN DATASET,LOOP AT... TRANSFEReCLOSE DATASETper scrivere il contenuto della tabella interna in un file piatto sul server applicativo SAP. Specifichi un percorsofilelogico accessibile. - Recupero del File: Utilizzi il codice transazione
AL11per navigare nelle directory del server applicativo e individuare ilfilegenerato. Si coordini con il Suo team SAP Basis per scaricare ilfiledal server al Suo computer locale o a una posizione di rete condivisa. - Formattazione Finale: Apra il
filescaricato e confermi che sia unfiledi valori separati da virgola (CSV) con una riga di intestazione. Si assicuri che ilfilesia salvato con codifica UTF-8 per essere compatibile con ProcessMind per l'upload.
Configurazione
- Prerequisiti: Accesso per creare ed eseguire programmi ABAP (transazione SE38). Autorizzazione per leggere dalle tabelle FI e SD, incluse
VBRK,VBRP,BKPF,BSEG,NAST,MHNKeUDM_CASE_ATTR00(per la gestione delle controversie). - Selezione Intervallo di Date: Il programma dovrebbe avere un parametro obbligatorio per l'intervallo di date, tipicamente basato sulla data di creazione del documento (
ERDATin VBRK/BKPF). Per l'estrazione iniziale, si raccomanda un intervallo di 3-6 mesi per mantenere ildatasetgestibile. - Filtri Chiave: Filtrare sempre per
CompanyCode(BUKRS) per limitare l'ambito dell'estrazione. Si raccomanda vivamente di filtrare anche per Tipo di Documento di Fatturazione (VBTYPda VBRK) o Tipo di Documento Contabile (BLARTda BKPF) per includere solo i tipi di fattura pertinenti, ad esempio, 'RV' per le fatture contabili standard, ed escludere le note di credito o altri documenti. - Considerazioni sulle Prestazioni: Per
datasetdi grandi dimensioni che coprono più di pochi mesi, il programma dovrebbe essere eseguito comejobinbackgroundper evitaretimeoutdi sessione. La logica ABAP dovrebbe essere ottimizzata per utilizzare letture di tabelle indicizzate ed evitare cicli annidati con selezioni di database al loro interno. L'approccio preferito è selezionare idatain tabelle interne e poi elaborarli. - Configurazione del File di Output: Il codice ABAP deve specificare il percorso del file di output sul server applicativo e il delimitatore per il file CSV, tipicamente una virgola o un punto e virgola. Assicurarsi che il percorso sia una directory configurata globalmente e accessibile.
a Query di Esempio abap
REPORT Z_PM_O2C_INVOICE_EXTRACT.
*&---------------------------------------------------------------------*
*& Tables
*&---------------------------------------------------------------------*
TABLES: VBRK, BKPF.
*&---------------------------------------------------------------------*
*& Type Definitions for Event Log Output
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
invoicenumber TYPE vbrk-vbeln,
activityname TYPE string,
eventtime TYPE timestamp,
username TYPE xubname,
billingdocumenttype TYPE vbrk-vbtyp,
customernumber TYPE vbrk-kunnr,
companycode TYPE vbrk-bukrs,
totalinvoiceamount TYPE vbrk-netwr,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: gt_event_log TYPE TABLE OF ty_event_log,
gs_event_log TYPE ty_event_log.
DATA: BEGIN OF gs_invoice,
vbeln TYPE vbrk-vbeln, " SD Doc (Invoice)
awkey TYPE bkpf-awkey, " Accounting Doc Reference Key
bukrs TYPE vbrk-bukrs, " Company Code
kunnr TYPE vbrk-kunnr, " Customer
vbtyp TYPE vbrk-vbtyp, " SD Doc Type
netwr TYPE vbrk-netwr, " Net Value
waerk TYPE vbrk-waerk, " Currency
fkdat TYPE vbrk-fkdat, " Billing Date
erdat TYPE vbrk-erdat, " Creation Date
erzet TYPE vbrk-erzet, " Creation Time
ernam TYPE vbrk-ernam, " Creator
belnr TYPE bkpf-belnr, " Acct Doc
gjahr TYPE bkpf-gjahr, " Fiscal Year
cpudt TYPE bkpf-cpudt, " Acct Doc Entry Date
cputm TYPE bkpf-cputm, " Acct Doc Entry Time
usnam TYPE bkpf-usnam, " Acct Doc User
stblg TYPE bkpf-stblg, " Reversal Doc
END OF gs_invoice.
DATA: gt_invoices LIKE TABLE OF gs_invoice.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbrk-erdat OBLIGATORY,
s_bukrs FOR vbrk-bukrs OBLIGATORY,
s_vbtyp FOR vbrk-vbtyp.
PARAMETERS: p_path TYPE string DEFAULT '/usr/sap/trans/tmp/invoice_extract.csv' OBLIGATORY.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
" 1. Select base set of invoices
SELECT vbrk~vbeln, vbrk~bukrs, vbrk~kunnr, vbrk~vbtyp, vbrk~netwr, vbrk~waerk,
vbrk~fkdat, vbrk~erdat, vbrk~erzet, vbrk~ernam,
bkpf~belnr, bkpf~gjahr, bkpf~cpudt, bkpf~cputm, bkpf~usnam, bkpf~stblg, bkpf~awkey
INTO CORRESPONDING FIELDS OF TABLE gt_invoices
FROM vbrk
INNER JOIN bkpf ON bkpf~awkey = vbrk~vbeln AND bkpf~awtyp = 'VBRK'
WHERE vbrk~erdat IN s_erdat
AND vbrk~bukrs IN s_bukrs
AND vbrk~vbtyp IN s_vbtyp.
IF gt_invoices IS INITIAL.
MESSAGE 'No invoices found for the selected criteria.' TYPE 'I'.
RETURN.
ENDIF.
LOOP AT gt_invoices INTO gs_invoice.
CLEAR gs_event_log.
gs_event_log-invoicenumber = gs_invoice-vbeln.
gs_event_log-billingdocumenttype = gs_invoice-vbtyp.
gs_event_log-customernumber = gs_invoice-kunnr.
gs_event_log-companycode = gs_invoice-bukrs.
gs_event_log-totalinvoiceamount = gs_invoice-netwr.
" Activity: Invoice Generated (using accounting doc creation)
gs_event_log-activityname = 'Invoice Generated'.
gs_event_log-username = gs_invoice-usnam.
CONCATENATE gs_invoice-cpudt gs_invoice-cputm INTO DATA(lv_ts_gen).
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Posted (same as generated for non-parked docs)
gs_event_log-activityname = 'Invoice Posted'.
gs_event_log-username = gs_invoice-usnam.
CONVERT DATE gs_invoice-cpudt TIME gs_invoice-cputm INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Approved (inferred by posting)
gs_event_log-activityname = 'Invoice Approved'.
APPEND gs_event_log TO gt_event_log.
" Activity: Invoice Sent To Customer
SELECT SINGLE addat, aduhr FROM nast
INTO (DATA(lv_nast_date), DATA(lv_nast_time))
WHERE kappl = 'V3' AND objky = gs_invoice-vbeln AND vszst > '0'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Sent To Customer'.
gs_event_log-username = sy-uname.
CONVERT DATE lv_nast_date TIME lv_nast_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Corrected / Reversed
IF gs_invoice-stblg IS NOT INITIAL.
SELECT SINGLE cpudt, cputm, usnam FROM bkpf
INTO (DATA(lv_rev_date), DATA(lv_rev_time), DATA(lv_rev_user))
WHERE belnr = gs_invoice-stblg AND gjahr = gs_invoice-gjahr.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Corrected'.
gs_event_log-username = lv_rev_user.
CONVERT DATE lv_rev_date TIME lv_rev_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
" Activity: Payment Applied, Cleared, Due Date, Written Off (from BSEG)
SELECT SINGLE augdt, augbl, zfBDT, hkont FROM bseg
INTO (DATA(lv_augdt), DATA(lv_augbl), DATA(lv_zfbdt), DATA(lv_hkont))
WHERE bukrs = gs_invoice-bukrs
AND belnr = gs_invoice-belnr
AND gjahr = gs_invoice-gjahr
AND koart = 'D'. " Customer line
IF sy-subrc = 0.
" Due Date Reached (Calculated event)
IF lv_zfbdt IS NOT INITIAL.
gs_event_log-activityname = 'Invoice Due Date Reached'.
gs_event_log-username = 'System'.
CONVERT DATE lv_zfbdt INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Cleared, Applied, Write-Off
IF lv_augdt IS NOT INITIAL.
SELECT SINGLE usnam, cpudt, cputm, blart FROM bkpf
INTO (DATA(lv_clear_user), DATA(lv_clear_date), DATA(lv_clear_time), DATA(lv_clear_type))
WHERE belnr = lv_augbl AND bukrs = gs_invoice-bukrs.
IF sy-subrc = 0.
gs_event_log-username = lv_clear_user.
CONVERT DATE lv_clear_date TIME lv_clear_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
IF lv_clear_type = 'DZ'. " Standard Customer Payment
gs_event_log-activityname = 'Customer Payment Received'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Payment Applied To Invoice'. APPEND gs_event_log TO gt_event_log.
gs_event_log-activityname = 'Invoice Cleared'. APPEND gs_event_log TO gt_event_log.
ELSE. " Assuming other clearing doc types could be write-offs
gs_event_log-activityname = 'Invoice Written Off'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
" Activity: Payment Reminder Issued (Dunning)
SELECT COUNT(*) FROM mhnk WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
IF sy-subrc = 0 AND sy-dbcnt > 0.
SELECT SINGLE lafdn FROM mhnk
INTO DATA(lv_dunning_date)
WHERE kunnr = gs_invoice-kunnr AND bukrs = gs_invoice-bukrs AND lafdn > gs_invoice-cpudt.
gs_event_log-activityname = 'Payment Reminder Issued'.
gs_event_log-username = 'System'.
CONVERT DATE lv_dunning_date INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Invoice Parked (Example from VBKPF, may require system specific logic)
SELECT SINGLE cpudt, cputm, usnam FROM vbkpf
INTO (DATA(lv_park_date), DATA(lv_park_time), DATA(lv_park_user))
WHERE awkey = gs_invoice-vbeln AND awsys = 'LOG' AND bstat = 'V'.
IF sy-subrc = 0.
gs_event_log-activityname = 'Invoice Parked'.
gs_event_log-username = lv_park_user.
CONVERT DATE lv_park_date TIME lv_park_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
" Activity: Dispute Case Created (Requires Dispute Management module)
SELECT SINGLE create_date, create_time, create_user FROM udm_case_attr00
INTO (DATA(lv_disp_date), DATA(lv_disp_time), DATA(lv_disp_user))
WHERE [Your logic to link invoice to dispute case, e.g., via a custom field or object link].
IF sy-subrc = 0.
gs_event_log-activityname = 'Dispute Case Created'.
gs_event_log-username = lv_disp_user.
CONVERT DATE lv_disp_date TIME lv_disp_time INTO TIME STAMP gs_event_log-eventtime TIME ZONE sy-zonlo.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Write data to file
*&---------------------------------------------------------------------*
OPEN DATASET p_path FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
ENDIF.
" Header
DATA(lv_header) = 'InvoiceNumber,ActivityName,EventTime,UserName,BillingDocumentType,CustomerNumber,CompanyCode,TotalInvoiceAmount'.
TRANSFER lv_header TO p_path.
LOOP AT gt_event_log INTO gs_event_log.
DATA(lv_line) = |
{ gs_event_log-invoicenumber }|
,{ gs_event_log-activityname }|
,{ gs_event_log-eventtime }|
,{ gs_event_log-username }|
,{ gs_event_log-billingdocumenttype }|
,{ gs_event_log-customernumber }|
,{ gs_event_log-companycode }|
,{ gs_event_log-totalinvoiceamount }|.
TRANSFER lv_line TO p_path.
ENDLOOP.
CLOSE DATASET p_path.
WRITE: 'Extraction complete. File created at:', p_path. Fasi
- Prerequisiti e Accesso: Si assicuri di disporre di un utente database con accesso di sola lettura alle tabelle SAP ECC necessarie, incluse VBRK, BKPF, BSAD, NAST, CDHDR, CDPOS, SCASE, e altre specificate nella query. Questo livello di accesso è tipicamente concesso solo agli amministratori di sistema o a
teamspecifici di analisidata. - Connessione al Database: Utilizzi uno strumento
clientSQL standard, come DBeaver, Oracle SQL Developer o Microsoft SQL Server Management Studio, per stabilire una connessione al database SAP ECC. - Preparazione della Query SQL: Copi la query SQL completa fornita nella sezione 'query' nell'editor del Suo
clientSQL. - Personalizzazione dei Segnaposto: La query contiene diversi segnaposto che deve sostituire con valori specifici per il Suo ambiente. Questi includono:
'YYYYMMDD': Sostituisca tutte le istanze con le date di inizio e fine per il periodo di analisi desiderato. È cruciale filtrare idataper un intervallo di tempo gestibile.'XXXX': Sostituisca con il/i Codice/i Società specifico/i che desidera analizzare.[Your Invoice Output Type]: Specifichi il codice del tipo di output utilizzato per l'invio delle fatture ai clienti, ad esempio, 'RD00'.[Your Bad Debt G/L Account]: Inserisca il numero di conto del Conto Generale utilizzato per la svalutazione delle fatture inesigibili.[Your Dispute Case Invoice Attribute]: Specifichi il nome dell'attributoutilizzato per memorizzare il numero di fattura nella Sua configurazione diDispute Management, ad esempio, 'INVOICE_ID'.
- Revisione delle Funzioni
Timestamp: La query utilizza una sintassi genericaCAST(CONCAT(date_field, time_field) AS TIMESTAMP). Potrebbe essere necessario adattarla per corrispondere al Suo sistema di database specifico, ad esempio, usandoTO_TIMESTAMPper Oracle oDATETIMEFROMPARTSper SQL Server. - Esecuzione della Query: Esegua la query modificata. L'esecuzione potrebbe richiedere una quantità significativa di tempo a seconda delle dimensioni delle Sue tabelle SAP e dell'intervallo di date selezionato.
- Ispezione dei Risultati: Una volta completata la query, riveda l'output per assicurarsi che contenga le colonne attese:
InvoiceNumber,ActivityName,EventTimee gliattributiraccomandati. Verifichi eventuali errori o risultati vuoti. - Esportazione in CSV: Esporti il
setdi risultati completo dal SuoclientSQL in unfileCSV. Si assicuri che ilfileutilizzi la codifica UTF-8 per prevenire problemi con i caratteri speciali. - Preparazione per l'Upload: Prima di caricare su uno strumento di
Process Mining, confermi che le intestazioni delle colonne CSV corrispondano esattamente ai nomi degliattributirichiesti, ad esempio,InvoiceNumber,ActivityName,EventTime,UserName.
Configurazione
- Connessione al Database: È richiesta una connessione SQL diretta e di sola lettura al database SAP ECC sottostante. Questo metodo bypassa completamente il livello applicativo di SAP.
- Autorizzazione: L'utente del database deve disporre dei permessi di
SELECTsu tutte le tabelle utilizzate nella query, che comprendono i moduli FI, SD e, potenzialmente, FSCM. - Intervallo di Date: È fondamentale filtrare la query per un intervallo di date specifico per garantire prestazioni e volume di dati ragionevoli. Si consiglia di iniziare con un periodo da 3 a 6 mesi. I segnaposto del filtro data
'YYYYMMDD'devono essere impostati in più parti della query. - Filtro per Codice Società: La query è progettata per essere filtrata per Codice Società (
BUKRS). L'analisi di uno o pochi codici società alla volta è una pratica standard. - Configurazione del Tipo di Documento: La logica per identificare
eventcome correzioni di fatture, storni o documenti inviati dipende dalle configurazioni SAP standard. Potrebbe essere necessario adattare la query se la Sua organizzazione utilizza tipi di documento personalizzati (BLART), tipi di output (KSCHL) o conti C/G per questi processi. - Considerazioni sulle Prestazioni: L'esecuzione di questa query su un sistema SAP in produzione può consumare risorse significative e potrebbe influire sulle prestazioni operative. Si raccomanda vivamente di eseguire estrazioni di grandi dimensioni durante le ore di minor traffico o su una replica dedicata del database per la reportistica.
a Query di Esempio sql
WITH InvoiceBase AS (
SELECT
VBRK.VBELN AS InvoiceNumber,
VBRK.FKART AS BillingDocumentType,
VBRK.KUNRG AS CustomerNumber,
VBRK.BUKRS AS CompanyCode,
VBRK.NETWR AS TotalInvoiceAmount,
VBRK.ERNAM AS CreatorName,
VBRK.ERDAT AS CreationDate,
VBRK.ERZET AS CreationTime
FROM VBRK
WHERE VBRK.ERDAT BETWEEN '20230101' AND '20231231' -- Filter by Invoice Creation Date
AND VBRK.BUKRS IN ('1000') -- Filter by Company Code
AND VBRK.FKART NOT IN ('S1', 'S2') -- Exclude cancelled invoices
)
-- 1. Invoice Generated
SELECT
ib.InvoiceNumber,
'Invoice Generated' AS ActivityName,
CAST(CONCAT(ib.CreationDate, ib.CreationTime) AS TIMESTAMP) AS EventTime,
ib.CreatorName AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM InvoiceBase ib
UNION ALL
-- 2. Invoice Parked
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Parked' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = 'V' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 3. Invoice Posted
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Posted' AS ActivityName,
CAST(CONCAT(b.CPUDT, b.CPUTM) AS TIMESTAMP) AS EventTime,
b.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF b
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND b.BSTAT = '' AND b.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 4. Invoice Approved (from Parked to Posted)
SELECT
SUBSTRING(h.OBJECTID, 4, 10) AS InvoiceNumber,
'Invoice Approved' as ActivityName,
CAST(CONCAT(h.UDATE, h.UTIME) AS TIMESTAMP) AS EventTime,
h.USERNAME AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM CDHDR h
JOIN CDPOS p ON h.MANDANT = p.MANDANT AND h.OBJECTCLAS = p.OBJECTCLAS AND h.OBJECTID = p.OBJECTID AND h.CHANGENR = p.CHANGENR
JOIN InvoiceBase ib ON SUBSTRING(h.OBJECTID, 4, 10) = ib.InvoiceNumber
WHERE h.OBJECTCLAS = 'BELEGV'
AND p.TABNAME = 'BKPF'
AND p.FNAME = 'BSTAT'
AND p.VALUE_OLD = 'V'
AND p.VALUE_NEW = ' '
AND h.UDATE BETWEEN '20230101' AND '20231231'
UNION ALL
-- 5. Invoice Sent To Customer
SELECT
n.OBJKY AS InvoiceNumber,
'Invoice Sent To Customer' AS ActivityName,
CAST(CONCAT(n.DATVR, n.UHRVR) AS TIMESTAMP) AS EventTime,
n.VSTAT AS UserName, -- User who processed is not directly available, using processing status as a proxy
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM NAST n
JOIN InvoiceBase ib ON n.OBJKY = ib.InvoiceNumber
WHERE n.KSCHL = '[Your Invoice Output Type]' -- E.g., 'RD00'
AND n.VSTAT = '1' -- Processed successfully
AND n.DATVR BETWEEN '20230101' AND '20231231'
UNION ALL
-- 6. Invoice Corrected (Reversed)
SELECT
SUBSTRING(orig_doc.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Corrected' AS ActivityName,
CAST(CONCAT(rev_doc.CPUDT, rev_doc.CPUTM) AS TIMESTAMP) AS EventTime,
rev_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
rev_doc.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BKPF orig_doc
JOIN BKPF rev_doc ON orig_doc.STBLG = rev_doc.BELNR AND orig_doc.BUKRS = rev_doc.BUKRS AND orig_doc.GJAHR = rev_doc.STJAH
JOIN InvoiceBase ib ON SUBSTRING(orig_doc.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE orig_doc.AWTYP = 'VBRK' AND orig_doc.STBLG IS NOT NULL AND rev_doc.CPUDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 7. Invoice Due Date Reached
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Invoice Due Date Reached' AS ActivityName,
CAST(CONCAT(bs.ZFBDT, '000000') AS TIMESTAMP) AS EventTime,
'System' AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
b.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSEG bs
JOIN BKPF b ON bs.MANDT = b.MANDT AND bs.BUKRS = b.BUKRS AND bs.BELNR = b.BELNR AND bs.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE b.AWTYP = 'VBRK' AND bs.KOART = 'D' AND bs.ZFBDT BETWEEN '20230101' AND '20231231'
UNION ALL
-- 8. Payment Reminder Issued
SELECT
SUBSTRING(b.AWKEY, 1, 10) AS InvoiceNumber,
'Payment Reminder Issued' AS ActivityName,
CAST(CONCAT(h.LAUFD, '000000') AS TIMESTAMP) AS EventTime,
h.LAUFI AS UserName, -- Dunning Run ID
ib.BillingDocumentType,
ib.CustomerNumber,
d.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM MHND d
JOIN MHNK h ON d.MANDT = h.MANDT AND d.LAUFD = h.LAUFD AND d.LAUFI = h.LAUFI
JOIN BKPF b ON d.MANDT = b.MANDT AND d.BUKRS = b.BUKRS AND d.BELNR = b.BELNR AND d.GJAHR = b.GJAHR
JOIN InvoiceBase ib ON SUBSTRING(b.AWKEY, 1, 10) = ib.InvoiceNumber
WHERE h.LAUFD BETWEEN '20230101' AND '20231231'
UNION ALL
-- 9. Dispute Case Created
SELECT
attr.ATTR_VALUE AS InvoiceNumber,
'Dispute Case Created' AS ActivityName,
sc.CREATE_TIME AS EventTime,
sc.CREATED_BY AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
ib.CompanyCode,
ib.TotalInvoiceAmount
FROM SCMG_T_CASE_ATTR attr
JOIN SCASE sc ON attr.CASE_GUID = sc.CASE_GUID
JOIN InvoiceBase ib ON attr.ATTR_VALUE = ib.InvoiceNumber
WHERE attr.ATTR_NAME = '[Your Dispute Case Invoice Attribute]' -- e.g., 'INVOICE_ID'
AND CAST(sc.CREATE_TIME AS DATE) BETWEEN '20230101' AND '20231231'
UNION ALL
-- 10, 11, 12. Clearing Events (Payment, Clearing, Write-Off)
SELECT
InvoiceNumber,
ActivityName,
EventTime,
UserName,
BillingDocumentType,
CustomerNumber,
CompanyCode,
TotalInvoiceAmount
FROM (
SELECT
bsad.XBLNR AS InvoiceNumber,
CASE
WHEN clearing_item.HKONT = '[Your Bad Debt G/L Account]' THEN 'Invoice Written Off'
ELSE 'Customer Payment Received'
END AS ActivityName,
CAST(CONCAT(clearing_doc.CPUDT, clearing_doc.CPUTM) AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
LEFT JOIN BSEG clearing_item ON clearing_doc.MANDT = clearing_item.MANDT AND clearing_doc.BUKRS = clearing_item.BUKRS AND clearing_doc.BELNR = clearing_item.BELNR AND clearing_doc.GJAHR = clearing_item.GJAHR AND clearing_item.HKONT = '[Your Bad Debt G/L Account]' -- e.g. '148000'
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Payment Applied To Invoice' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '000000') AS TIMESTAMP) AS EventTime,
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
UNION ALL
SELECT
bsad.XBLNR AS InvoiceNumber,
'Invoice Cleared' AS ActivityName,
CAST(CONCAT(bsad.AUGDT, '235959') AS TIMESTAMP) AS EventTime, -- Add time to separate from 'Payment Applied'
clearing_doc.USNAM AS UserName,
ib.BillingDocumentType,
ib.CustomerNumber,
bsad.BUKRS AS CompanyCode,
ib.TotalInvoiceAmount
FROM BSAD bsad
JOIN InvoiceBase ib ON bsad.XBLNR = ib.InvoiceNumber
JOIN BKPF clearing_doc ON bsad.MANDT = clearing_doc.MANDT AND bsad.BUKRS = clearing_doc.BUKRS AND bsad.AUGBL = clearing_doc.BELNR AND bsad.AUGGJ = clearing_doc.GJAHR
WHERE bsad.AUGDT BETWEEN '20230101' AND '20231231' AND bsad.UMSKZ = ''
) AS ClearingEvents Fasi
- Prerequisiti: Si assicuri di disporre di uno strumento ETL con licenza e un connettore SAP certificato (ad es. Informatica PowerCenter con SAP
Connector,Talendcon SAPConnector, ecc.). Verifichi di avere le credenziali utente SAP con le autorizzazioni necessarie per leggere dalle tabelle finanziarie, di vendita e di sistema richieste (BKPF, BSEG, VBRK, NAST, MHNK, UDM_CASE_ATTR00, CDHDR, CDPOS). - Stabilire la Connessione SAP: Nel Suo strumento ETL, crei una nuova connessione al Suo sistema SAP ECC. Configuri i dettagli della connessione, inclusi
application server, numero di sistema,client, utente epassword. Testi la connessione per assicurarsi che abbia successo. - Definire le Sorgenti dei
data: Per ogni attività da estrarre, definisca la/e corrispondente/i tabella/e SAP come sorgentedatanel SuojobETL. Ad esempio, aggiunga VBRK per la generazione di fatture, BKPF per glieventdi registrazione e NAST per la comunicazione con il cliente. - Costruire la Logica di Estrazione per Ogni Attività: Crei un flusso di
datao una trasformazione separata per ciascuna delle 13 attività richieste. In ogni flusso, applichi dei filtri per selezionare i record pertinenti. Per istanza, filtri per Codice Società (BUKRS), tipo di documento (BLART), e un intervallo di date specifico (ad es. data di creazione ERDAT). - Mappare i Campi e Trasformare i
data: In ogni flusso didata, mappi i campi della tabella SAP di origine alla struttura dell'event logdi destinazione:InvoiceNumber,ActivityName,EventTime,UserName, e altriattributiraccomandati. Utilizzi la logica di trasformazione per codificare in modo rigido l'ActivityNameper ogni flusso e per formattare correttamente date etimestamp. - Gestire Attività Complesse: Per gli
eventcalcolati come 'Data di Scadenza Fattura Raggiunta', utilizzi la Data di Pagamento Base (ZFBDT) e la logica delle condizioni di pagamento per calcolare la data di scadenza, o semplicemente estragga la Data di Scadenza Netta (NETDT) da BSEG. Per glieventderivati dailogdi modifica come 'Fattura Approvata', potrebbe essere necessario unire tabelle come BKPF e CDHDR/CDPOS in base al numero e alla data del documento. - Combinare i
datadelle Attività: Utilizzi una trasformazione 'Union' o 'Merge' nel Suo strumento ETL per combinare glioutputdi tutti i 13 flussi didataindividuali in un unicodataset. Si assicuri che i nomi delle colonne e i tipi didatasiano coerenti tra tutti i flussi prima dell'unione. - Configurare la Destinazione Target: Definisca la destinazione di
outputfinale per il Suoevent log. Questa potrebbe essere unfilepiatto (CSV), una tabella di database o una connessione diretta a un'area distaging. - Impostare la Pianificazione dell'Estrazione: Configuri i parametri dell'intervallo di date per l'estrazione. Per il caricamento iniziale, Lei potrebbe estrarre 6-12 mesi di
data. Per i successivi caricamentidelta, configuri iljobper estrarredatadall'ultima data di esecuzione. - Eseguire ed Esportare: Esegua il
jobETL. Una volta completato, ispezioni ilfiledioutputper assicurarsi che soddisfi il formato richiesto. L'outputfinale dovrebbe essere un singolofileCSV con ogni riga che rappresenta uneventunico, pronto per l'uploadin ProcessMind.
Configurazione
- Connessione SAP: È richiesta una connessione al server applicativo al sistema SAP ECC di destinazione. L'utente SAP necessita dell'accesso RFC e delle autorizzazioni per tabelle come VBRK, BKPF, BSEG, NAST e altre specificate nella query.
- Licenza Strumento ETL: È obbligatoria una licenza valida per lo strumento ETL commerciale e il suo connettore SAP specifico.
- Intervallo di Date: Si raccomanda di estrarre
dataper un periodo da 3 a 6 mesi per garantire un campione rappresentativo per l'analisi senza causare un carico eccessivo sul sistema. Utilizzare un parametro configurabile per le date di inizio e fine. - Filtri Chiave: Filtrare sempre per Codice Società (BUKRS) per limitare l'ambito dell'estrazione. È inoltre fondamentale filtrare i Tipi di Documento di Fatturazione (VBRK-FKART) e i Tipi di Documento Contabile (BKPF-BLART) pertinenti per includere solo le fatture standard ed escludere altri tipi di documento come note di credito o documenti interni.
- Prestazioni: L'estrazione da tabelle di grandi dimensioni come BSEG può essere lenta. Utilizzare filtri selettivi, evitare di estrarre campi non necessari e programmare l'estrazione durante le ore di minor attività per ridurre al minimo l'impatto sulle prestazioni del sistema SAP di origine.
a Query di Esempio config
// ETL Data Extraction Logic for SAP Order-to-Cash Invoicing
// This represents the configuration logic within a graphical ETL tool.
// == Global Parameters ==
// $StartDate: '[Start Date]' (e.g., '2023-01-01')
// $EndDate: '[End Date]' (e.g., '2023-06-30')
// $CompanyCodes: '[Company Code(s)]' (e.g., '1000', '2000')
// $BillingDocTypes: '[Billing Document Type(s)]' (e.g., 'F1', 'F2')
// == Source 1: Invoice Generated ==
// Tables: VBRK
DATA_SOURCE generated_invoices FROM VBRK WHERE
ERDAT >= $StartDate AND ERDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND FKART IN ($BillingDocTypes)
MAP {
InvoiceNumber: VBELN,
ActivityName: 'Invoice Generated',
EventTime: ERDAT + ERZET, // Combine date and time
UserName: ERNAM,
BillingDocumentType: FKART,
CustomerNumber: KUNAG,
CompanyCode: BUKRS,
TotalInvoiceAmount: NETWR
}
// == Source 2: Invoice Posted ==
// Tables: BKPF joined with VBRK
DATA_SOURCE posted_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Posted',
EventTime: A.BUDAT + A.CPUTM, // Posting date and entry time
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 3: Invoice Parked ==
// Tables: BKPF joined with VBRK
DATA_SOURCE parked_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.CPUDT >= $StartDate AND A.CPUDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = 'V'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Parked',
EventTime: A.CPUDT + A.CPUTM,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 4: Invoice Approved (Transition from Parked to Posted) ==
// Tables: BKPF joined with VBRK
DATA_SOURCE approved_invoices FROM BKPF as A
INNER JOIN VBRK as B ON (A.AWKEY = B.VBELN AND A.AWTYP = 'VBRK')
WHERE A.BUDAT >= $StartDate AND A.BUDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.BSTAT = ' '
AND EXISTS (SELECT 1 FROM VBELEGV C WHERE C.BELNR = A.BELNR) // Check if it was ever parked
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Approved',
EventTime: A.BUDAT + A.CPUTM, // Use posting date as approval date
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 5: Invoice Sent To Customer ==
// Tables: NAST joined with VBRK
DATA_SOURCE sent_invoices FROM NAST as A
INNER JOIN VBRK as B ON (A.OBJKY = B.VBELN)
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND B.BUKRS IN ($CompanyCodes)
AND A.VSTAT = '1' // Successfully processed
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Sent To Customer',
EventTime: A.ERDAT + A.ERUHR,
UserName: A.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: B.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 6: Invoice Corrected (Reversed) ==
// Tables: VBRK (for the reversal document)
DATA_SOURCE corrected_invoices FROM VBRK as A
WHERE A.ERDAT >= $StartDate AND A.ERDAT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.SFAKN <> '' // SFAKN is the original cancelled invoice
MAP {
InvoiceNumber: A.SFAKN, // Case ID is the original invoice
ActivityName: 'Invoice Corrected',
EventTime: A.ERDAT + A.ERZET,
UserName: A.ERNAM,
BillingDocumentType: A.FKART,
CustomerNumber: A.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: NULL // Amount belongs to the reversal doc, not original
}
// == Source 7: Invoice Due Date Reached ==
// Tables: BSEG joined with VBRK
DATA_SOURCE due_invoices FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.NETDT >= $StartDate AND A.NETDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.KOART = 'D' // Customer line item
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Due Date Reached',
EventTime: A.NETDT, // Net due date
UserName: 'System',
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 8: Payment Reminder Issued ==
// Tables: MHNK, MHND, VBRK
DATA_SOURCE reminders FROM MHNK as A
INNER JOIN MHND as D ON (A.LAUFD = D.LAUFD AND A.LAUFI = D.LAUFI)
INNER JOIN VBRK as B ON (SUBSTRING(D.XBLNR, 1, 10) = B.VBELN) // XBLNR may need parsing
WHERE A.LAUFD >= $StartDate AND A.LAUFD <= $EndDate
AND D.BUKRS IN ($CompanyCodes)
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Reminder Issued',
EventTime: A.LAUFD, // Dunning date
UserName: A.IDAPS,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: D.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 9: Dispute Case Created ==
// Tables: UDM_CASE_ATTR00
DATA_SOURCE disputes FROM UDM_CASE_ATTR00 as A
WHERE A.CREATE_TIMESTAMP >= $StartDate // Timestamp format may vary
AND A.FIN_COMP_CODE IN ($CompanyCodes)
AND A.PROCESS = 'FIN_FSCM_DIS'
MAP {
InvoiceNumber: A.BILL_DOC_ID,
ActivityName: 'Dispute Case Created',
EventTime: A.CREATE_TIMESTAMP,
UserName: A.CREATE_USER,
BillingDocumentType: NULL,
CustomerNumber: A.BP_NUMBER,
CompanyCode: A.FIN_COMP_CODE,
TotalInvoiceAmount: A.DISPUTED_AMOUNT
}
// == Source 10: Customer Payment Received ==
// Tables: BKPF
DATA_SOURCE payments FROM BKPF
WHERE BUDAT >= $StartDate AND BUDAT <= $EndDate
AND BUKRS IN ($CompanyCodes)
AND BLART = 'DZ' // Example for Customer Payment
MAP {
InvoiceNumber: NULL, // Invoice not yet known
ActivityName: 'Customer Payment Received',
EventTime: BUDAT + CPUTM,
UserName: USNAM,
BillingDocumentType: NULL,
CustomerNumber: NULL, // Requires join to BSEG to get customer
CompanyCode: BUKRS,
TotalInvoiceAmount: NULL
}
// == Source 11 & 12: Payment Applied To Invoice & Invoice Cleared ==
// Tables: BSEG joined with VBRK
DATA_SOURCE cleared_items FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND A.AUGBL <> ''
// Generate two records from this source
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Payment Applied To Invoice',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM, // User from header of original invoice doc
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
UNION WITH {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Cleared',
EventTime: A.AUGDT, // Clearing Date
UserName: H.USNAM,
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Source 13: Invoice Written Off ==
// Tables: BSEG (for the invoice line) and BKPF (for clearing doc type)
DATA_SOURCE written_off FROM BSEG as A
INNER JOIN BKPF as H ON (A.BUKRS = H.BUKRS AND A.BELNR = H.BELNR AND A.GJAHR = H.GJAHR)
INNER JOIN VBRK as B ON (H.AWKEY = B.VBELN AND H.AWTYP = 'VBRK')
INNER JOIN BKPF as C ON (A.AUGBL = C.BELNR AND A.BUKRS = C.BUKRS AND A.AUGGJ = C.GJAHR)
WHERE A.AUGDT >= $StartDate AND A.AUGDT <= $EndDate
AND A.BUKRS IN ($CompanyCodes)
AND C.BLART = '[Your Write-Off Document Type]' // e.g., 'AB'
MAP {
InvoiceNumber: B.VBELN,
ActivityName: 'Invoice Written Off',
EventTime: A.AUGDT,
UserName: C.USNAM, // User who posted the write-off
BillingDocumentType: B.FKART,
CustomerNumber: B.KUNAG,
CompanyCode: A.BUKRS,
TotalInvoiceAmount: B.NETWR
}
// == Final Union of all sources ==
OUTPUT generated_invoices
UNION ALL posted_invoices
UNION ALL parked_invoices
UNION ALL approved_invoices
UNION ALL sent_invoices
UNION ALL corrected_invoices
UNION ALL due_invoices
UNION ALL reminders
UNION ALL disputes
UNION ALL payments
UNION ALL cleared_items
UNION ALL written_off