Avvii un progetto

Perché il suo report vendite di SAP Business One non quadra: lo sconto di testata in INV1

By Zain Abbas, Kodenova · Updated

Short answerINV1.LineTotal e INV1.GrssProfit sono valori di riga prima dello sconto a livello di documento. Se una fattura ha uno sconto di testata (OINV.DiscPrcnt), sommare le righe gonfia le vendite nette e il margine lordo. Applichi lo sconto per documento, oppure riconcili con DocTotal meno VatSum meno TotalExpns, e sottragga le note di credito (ORIN/RIN1) allo stesso modo.

Perché il mio report vendite di SAP Business One non corrisponde a SAP?

Di solito perché il report somma le righe delle fatture e ignora lo sconto inserito nel piè di pagina della fattura. INV1.LineTotal è al netto dello sconto di riga ma prima dello sconto di testata, che SAP Business One memorizza in OINV come DiscPrcnt e DiscSum. Nel nostro test la somma delle righe era 49.085,44 contro i 49.058,00 di SAP, e la differenza di 27,44 era proprio quello sconto di piè di pagina.

Costruisce un report vendite, una dashboard o un modello Power BI a partire da SAP Business One. Il totale è vicino al dato di SAP, ma non identico. La contabilità non si fida della dashboard, e ha ragione.

Ci siamo imbattuti nel problema testando la dashboard SAP B1 di Kodenova su una società reale. La prima versione sommava le righe delle fatture e restituiva 49.085,44. Il dato di SAP per lo stesso periodo era 49.058,00. La differenza di 27,44 aveva un’unica causa: uno sconto inserito nel piè di pagina della fattura.

Perché la somma di INV1.LineTotal sovrastima le vendite?

SAP Business One memorizza una fattura clienti su due livelli. INV1 contiene le righe, con LineTotal al netto dello sconto di riga. OINV contiene la testata, compresi DiscPrcnt e DiscSum per lo sconto di documento. Lo sconto di piè di pagina si applica all’intero documento e non viene riportato su ogni riga, quindi la somma delle righe è ancora prima di quello sconto.

Una fattura clienti memorizza i valori su due livelli:

  • INV1 (righe): LineTotal, GrssProfit, Quantity. LineTotal è al netto dello sconto di riga.
  • OINV (testata): DiscPrcnt e DiscSum per lo sconto di documento, oltre a DocTotal, VatSum e TotalExpns. Veda i campi e i join della tabella OINV.

Lo sconto di piè di pagina viene applicato all’intero documento, non riportato su ogni riga. Quando esegue SUM(T1."LineTotal"), quindi, somma valori che sono ancora prima di quello sconto. La maggior parte delle fatture non ha sconto di piè di pagina, ed è per questo che l’errore è piccolo e facile da non notare.

Come si applica lo sconto di testata in SQL?

Colleghi ogni riga di INV1 alla sua testata OINV, raggruppi per documento e porti con sé DiscPrcnt. Il netto dopo lo sconto è allora Net meno Net × DiscPrcnt / 100, e il margine lordo dopo lo sconto è GP meno lo stesso importo. Esegua la stessa query su ORIN e RIN1 per le note di credito, le tratti come valori negativi ed escluda le fatture annullate.

Porti lo sconto di testata nella query sulle righe e lo applichi per documento:

SELECT T0."DocEntry", T0."DocDate", T0."CardCode", T0."DiscPrcnt",
       T1."ItemCode",
       SUM(T1."LineTotal")  AS "Net",
       SUM(T1."GrssProfit") AS "GP"
FROM OINV T0
INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"
WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101'
GROUP BY T0."DocEntry", T0."DocDate", T0."CardCode", T0."DiscPrcnt", T1."ItemCode"

Poi, per ogni riga:

  • netto dopo lo sconto = Net − Net × DiscPrcnt / 100
  • margine lordo dopo lo sconto = GP − Net × DiscPrcnt / 100

Esegua la stessa query su ORIN e RIN1 per le note di credito e tratti quei valori come negativi.

Applichiamo la percentuale nel codice anziché in SQL perché alcuni ambienti, come SQLQueries del Service Layer con un’allow-list ristretta, rifiutano le espressioni nell’elenco di selezione. Se il suo ambiente consente l’aritmetica, può farlo direttamente in SQL.

Come verificare il suo dato rispetto a SAP

Prima di fidarsi di qualsiasi report, lo riconcili una volta con una query a livello di testata. Le vendite nette al netto di IVA e spese di trasporto sono:

SELECT
 (SELECT SUM(T0."DocTotal" - T0."VatSum" - T0."TotalExpns")
    FROM OINV T0 WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101')
 -
 (SELECT ISNULL(SUM(T0."DocTotal" - T0."VatSum" - T0."TotalExpns"), 0)
    FROM ORIN T0 WHERE T0."CANCELED" = 'N' AND T0."DocDate" >= '20250101')

Su SAP HANA usi IFNULL invece di ISNULL. Nel nostro test questa query ha restituito 49.058,00, esattamente il valore della query sulle righe corretta.

Piccole differenze possono comunque comparire se i documenti usano arrotondamenti o acconti, perché anche questi si trovano in testata. Se vede uno scarto, controlli questi campi come passo successivo.

Lista di controllo per qualsiasi report vendite di SAP B1

  1. Filtri CANCELED = 'N'.
  2. Sottragga le note di credito (ORIN/RIN1).
  3. Applichi lo sconto di testata sia alle vendite nette sia al margine lordo.
  4. Usi un solo campo valuta in modo coerente (LineTotal per la valuta locale).
  5. Riconcili una volta con DocTotal − VatSum − TotalExpns prima della messa in produzione.

Query pronte che applicano questa correzione, leggendo i totali di testata o applicando il fattore di sconto alle righe: Vendite per cliente in un intervallo di date, I 20 articoli più venduti, Vendite per addetto alle vendite e Andamento mensile delle vendite.

Dove conta di più

Qualsiasi strumento che legge le righe invece delle testate è esposto al problema: esportazioni Excel, Crystal Reports, modelli Power BI e dashboard su misura. La dashboard SAP B1 di Kodenova applica automaticamente lo sconto di testata tramite il suo connettore locale, quindi i suoi totali corrispondono ai dati di SAP indicati sopra.

Se i suoi report e SAP non coincidono e non riesce a capire perché, ci invii la query. Di solito una discrepanza di questo tipo si individua in una sola sessione.

Sources

Related services

FAQ

Frequently asked questions

INV1.LineTotal è prima o dopo lo sconto di documento?

Prima. LineTotal è il totale della riga dopo lo sconto di riga ma prima dello sconto inserito nel piè di pagina del documento. Lo sconto di piè di pagina è memorizzato in testata come DiscPrcnt (percentuale) e DiscSum (importo).

GrssProfit include lo sconto di testata?

GrssProfit è calcolato per riga, quindi una somma a livello di riga non vede lo sconto di piè di pagina. Noi sottraiamo l'importo dello sconto sia dal margine lordo sia dalle vendite nette. Per verificarlo sui suoi dati, confronti con il campo di testata OINV.GrosProfit di una fattura scontata.

Bisogna sottrarre le note di credito?

Sì. Un report vendite che ignora ORIN e RIN1 sovrastima il fatturato. Tratti le righe delle note di credito come valori negativi e applichi il loro sconto di testata allo stesso modo.

Vanno incluse le fatture annullate?

No. Filtri su CANCELED = 'N'. Una fattura annullata e il relativo documento di annullamento hanno entrambi un flag CANCELED ('Y' e 'C'), e includere l'uno o l'altro falsa i totali.

Il risultato è in valuta locale?

LineTotal è in valuta locale. TotalFrgn contiene il valore in valuta estera. Ne usi sempre uno solo in modo coerente e indichi la valuta nel report.

Iniziamo?

Ci descriva di cosa ha bisogno. Riceverà una risposta tecnica chiara, un perimetro definito e un prezzo, di norma entro 24 ore.