Warum Ihr SAP-Business-One-Umsatzbericht nicht stimmt: der Belegrabatt in INV1

Von Zain Abbas, Kodenova · Aktualisiert am

Kurz gesagtINV1.LineTotal und INV1.GrssProfit sind Positionswerte vor dem Rabatt auf Belegebene. Hat eine Rechnung einen Rabatt im Belegkopf (OINV.DiscPrcnt), weist die Summe der Positionen einen zu hohen Nettoumsatz und Rohertrag aus. Wenden Sie den Rabatt pro Beleg an oder stimmen Sie gegen DocTotal minus VatSum minus TotalExpns ab, und ziehen Sie Gutschriften (ORIN/RIN1) auf dieselbe Weise ab.

Das Symptom

Sie bauen einen Umsatzbericht, ein Dashboard oder ein Power-BI-Modell auf Basis von SAP Business One. Die Summe liegt nah an der Zahl aus SAP, ist aber nicht gleich. Die Buchhaltung traut dem Dashboard nicht, und das zu Recht.

Wir sind darauf gestoßen, als wir das Kodenova SAP-B1-Dashboard in einem Live-Mandanten getestet haben. Die erste Version summierte die Rechnungspositionen und lieferte 49.085,44. Die Zahl aus SAP für denselben Zeitraum lautete 49.058,00. Die Differenz von 27,44 hatte eine einzige Ursache: einen Rabatt, der im Belegfuß der Rechnung eingetragen war.

Warum das passiert

Eine Ausgangsrechnung speichert Werte auf zwei Ebenen:

  • INV1 (Positionen): LineTotal, GrssProfit, Quantity. LineTotal ist der Wert nach dem Positionsrabatt.
  • OINV (Kopf): DiscPrcnt und DiscSum für den Belegrabatt, außerdem DocTotal, VatSum und TotalExpns.

Der Rabatt im Belegfuß gilt für den gesamten Beleg und wird nicht in die einzelnen Positionen zurückgeschrieben. Wenn Sie also SUM(T1."LineTotal") bilden, addieren Sie Werte, die noch vor diesem Rabatt liegen. Die meisten Rechnungen haben keinen Rabatt im Belegfuß, deshalb ist der Fehler klein und leicht zu übersehen.

Die Korrektur in SQL

Holen Sie den Belegrabatt in die Positionsabfrage und wenden Sie ihn pro Beleg an:

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"

Anschließend gilt für jede Zeile:

  • Netto nach Rabatt = Net − Net × DiscPrcnt / 100
  • Rohertrag nach Rabatt = GP − Net × DiscPrcnt / 100

Führen Sie dieselbe Abfrage für Gutschriften auf ORIN und RIN1 aus und behandeln Sie diese Werte als negativ.

Wir wenden den Prozentsatz im Code statt im SQL an, weil manche Umgebungen, etwa SQLQueries im Service Layer mit einer eingeschränkten Positivliste, Ausdrücke in der Select-Liste ablehnen. Erlaubt Ihre Umgebung Berechnungen, können Sie das direkt im SQL erledigen.

So prüfen Sie Ihre Zahl gegen SAP

Bevor Sie einem Bericht vertrauen, stimmen Sie ihn einmal mit einer Abfrage auf Kopfebene ab. Der Nettoumsatz ohne Umsatzsteuer und Fracht lautet:

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')

Verwenden Sie auf SAP HANA IFNULL statt ISNULL. In unserem Test lieferte die Abfrage 49.058,00, genau den Wert der korrigierten Positionsabfrage.

Kleine Abweichungen können trotzdem auftreten, wenn Belege Rundungen oder Anzahlungen enthalten, denn auch diese stehen im Belegkopf. Bleibt eine Lücke, prüfen Sie als Nächstes diese Felder.

Checkliste für jeden SAP-B1-Umsatzbericht

  1. Filtern Sie auf CANCELED = 'N'.
  2. Ziehen Sie Gutschriften ab (ORIN/RIN1).
  3. Wenden Sie den Belegrabatt sowohl auf den Nettoumsatz als auch auf den Rohertrag an.
  4. Verwenden Sie durchgängig ein Währungsfeld (LineTotal für die Hauswährung).
  5. Stimmen Sie vor dem Produktivstart einmal gegen DocTotal − VatSum − TotalExpns ab.

Fertige Abfragen, die diese Korrektur bereits enthalten, entweder über die Summen im Belegkopf oder über den Rabattfaktor auf den Positionen: Umsatz pro Kunde für einen Zeitraum, Top 20 der meistverkauften Artikel, Umsatz pro Vertriebsmitarbeiter und Monatliche Umsatzentwicklung.

Wo das besonders wichtig ist

Jedes Werkzeug, das Positionen statt Belegköpfe liest, ist betroffen: Excel-Exporte, Crystal Reports, Power-BI-Modelle und individuelle Dashboards. Das Kodenova SAP-B1-Dashboard wendet den Belegrabatt über seinen lokalen Konnektor automatisch an, deshalb stimmen seine Summen mit den oben genannten SAP-Zahlen überein.

Wenn Ihre Berichte und SAP nicht übereinstimmen und Sie die Ursache nicht finden, schicken Sie uns die Abfrage. Eine solche Abweichung finden wir meist in einer einzigen Sitzung.

Quellen

Passende Leistungen

FAQ

Häufige Fragen

Ist INV1.LineTotal vor oder nach dem Belegrabatt?

Davor. LineTotal ist die Positionssumme nach dem Positionsrabatt, aber vor dem Rabatt, der im Belegfuß erfasst wird. Dieser Rabatt aus dem Belegfuß wird im Kopf als DiscPrcnt (Prozentsatz) und DiscSum (Betrag) gespeichert.

Enthält GrssProfit den Belegrabatt?

GrssProfit wird pro Zeile berechnet, eine Summe auf Positionsebene sieht den Rabatt aus dem Belegfuß also nicht. Wir ziehen den Rabattbetrag sowohl vom Rohertrag als auch vom Nettoumsatz ab. Zur Kontrolle mit Ihren eigenen Daten vergleichen Sie bei einer rabattierten Rechnung mit dem Kopffeld OINV.GrosProfit.

Sollten Gutschriften abgezogen werden?

Ja. Ein Umsatzbericht, der ORIN und RIN1 ignoriert, weist zu viel Umsatz aus. Behandeln Sie Gutschriftspositionen als negative Werte und wenden Sie deren eigenen Belegrabatt auf dieselbe Weise an.

Sollten stornierte Rechnungen einbezogen werden?

Nein. Filtern Sie auf CANCELED = 'N'. Eine stornierte Rechnung und ihr Stornobeleg tragen beide ein CANCELED-Kennzeichen ('Y' und 'C'), und jede der beiden verfälscht die Summen.

Ist das Ergebnis in Hauswährung?

LineTotal ist in Hauswährung. TotalFrgn enthält den Wert in Fremdwährung. Verwenden Sie durchgängig eines der beiden Felder und kennzeichnen Sie den Bericht mit der Währung.

Bereit für den Start?

Sagen Sie uns, was Sie brauchen. Sie erhalten eine klare technische Antwort, einen festen Leistungsumfang und einen Preis, in der Regel innerhalb von 24 Stunden.