Wie Sie den Umsatzfrisör entdecken

Das Frisieren von Umsatzerlösen hilft Geschäftsführern und Vertriebsführungskräften, wenn deren Zielvorgaben in die Ferne rücken. Wir schauen uns ein bestimmtes Muster für Umsatzmanipulationen an und wie Sie dieses Muster in Ihren SAP Daten erkennen.

Der erfolgsneutrale Umsatzfrisör

Das Betrugsmuster, welches ich hier diesmal vorstelle, habe ich „erfolgsneutrale Umsatzmanipulation“ genannt. Dabei werden Buchungen vorgenommen, die zu höheren Umsätzen führen, die jedoch als Ausgleich anders geartete Aufwendungen buchen, d.h. es handelt sich um „Verschiebungen“ innerhalb der Gewinn- und Verlustrechnung (GuV). Insgesamt bleibt dadurch der Jahresüberschuss gleich, es finden lediglich Umlagerungen innerhalb der GuV statt. Ein Beispiel wäre eine Buchung der folgenden Art:

Per Personalaufwendungen (Soll) 1.000 € an Umsatzerlöse (Haben) 1.000 €

Im Folgenden geht es nun darum, herauszufinden, ob es solche Buchungen im SAP-System gibt.

Kriterien zur Datenabgrenzung

Es stellt sich die Frage, welche Kriterien man aufstellen sollte, um die Daten der Finanzbuchhaltung dahingehend abzufragen. Dies kann man so formulieren:

  1. Alle Buchungen, die im Soll und im Haben ausschließlich nur in die GuV gebucht haben (Erfolgsneutralität).
  2. Im Soll und im Haben wurden unterschiedliche Finanzbuchhaltungskonten verwendet.

Um die geschilderten SQL Queries in Ihrem SAP-System auszuprobieren, verwenden Sie wie gewohnt die Transaktion „DBACOCKPIT“ und navigieren über „Diagnose“ zu „SQL-Editor“.

Das folgende Query listet alle relevanten Belege:

1SELECT DISTINCT BKPF.MANDT||'-'||BKPF.GJAHR||'-'||BKPF.BUKRS||'-'||BKPF.BELNR DOCID FROM BKPF
JOIN BSEG ON (BKPF.MANDT=BSEG.MANDT AND BKPF.BUKRS=BSEG.BUKRS AND BKPF.GJAHR=BSEG.GJAHR AND BKPF.BELNR=BSEG.BELNR)
WHERE
BSEG.SHKZG='H' AND (BSEG.XBILK IS NULL OR BSEG.XBILK='')
AND (BKPF.STBLG IS NULL OR BKPF.STBLG='')
AND EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.HKONT!=BSEG.HKONT AND (B.XBILK IS NULL OR B.XBILK='') )
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.HKONT=BSEG.HKONT)
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.XBILK='X')
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='H' AND B.XBILK='X')

Dies ist jedoch „nur“ eine Belegliste. Hierzu ein paar kleine Anmerkungen zur Verständlichkeit des Queries. Die rot markierten Stellen werden in der nachfolgenden Spalte erläutert:

1aSELECT DISTINCT BKPF.MANDT||'-'||BKPF.GJAHR||'-'||BKPF.BUKRS||'-'||BKPF.BELNR DOCID FROM BKPF
Entfernen von doppelten Belegen
1bJOIN BSEG ON (BKPF.MANDT=BSEG.MANDT AND BKPF.BUKRS=BSEG.BUKRS AND BKPF.GJAHR=BSEG.GJAHR AND BKPF.BELNR=BSEG.BELNR) Klassischer „Join“ der BKPF mit der BSEG
1cWHERE 
BSEG.SHKZG=’H‘ AND (BSEG.XBILK IS NULL OR BSEG.XBILK=“) 
Auf Positionen beschränken, die in der GuV im „Haben“ gebucht wurden…
1dAND (BKPF.STBLG IS NULL OR BKPF.STBLG=“) … und kein Storno sind…
1eAND EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG=’S‘ AND B.HKONT!=BSEG.HKONT AND (B.XBILK IS NULL OR B.XBILK=“) ) … zu der es eine Position im „Soll“ in dem Beleg gibt, die auf ein anderes Konto gebucht wurde und zur GuV gehört…
1fAND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG=’S‘ AND B.HKONT=BSEG.HKONT)  … und es keine Position im „Soll“ gibt, welche auf das gleiche GuV Konto, wie im „Haben“ gebucht wurde…
1gAND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG=’S‘ AND B.XBILK=’X‘)  … und es keine Position im „Soll“ gibt, welche in die Bilanz gebucht wurde…
1hAND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG=’H‘ AND B.XBILK=’X‘)…, aber auch keine Position im „Haben“, welche in die Bilanz gebucht wurde. 

Wir wollen nun feststellen, welche Finanzbuchhaltungskonten im Soll (Debit) und im Haben (Credit) für jeden dieser Belege verwendet wurde. Dazu wird das obige Query wieder verwendet und in einer WHERE Bedingung benutzt:

2SELECT BSEG.MANDT,BSEG.BUKRS,BSEG.GJAHR,BSEG.BELNR,STRING_AGG(CASE WHEN BSEG.SHKZG='S' THEN SKAT.TXT50 ELSE null END,', ') DEBIT, STRING_AGG(CASE WHEN BSEG.SHKZG='H' THEN SKAT.TXT50 ELSE null END,', ') CREDIT
FROM (SELECT DISTINCT MANDT,BUKRS,GJAHR,BELNR,HKONT,SHKZG,XBILK FROM BSEG) BSEG
LEFT JOIN T001 ON (T001.MANDT=BSEG.MANDT AND T001.BUKRS=BSEG.BUKRS)
LEFT JOIN SKAT ON (SKAT.MANDT=BSEG.MANDT AND SKAT.KTOPL=T001.KTOPL AND SKAT.SAKNR=BSEG.HKONT AND SKAT.SPRAS='D')
WHERE
BSEG.MANDT||'-'||BSEG.GJAHR||'-'||BSEG.BUKRS||'-'||BSEG.BELNR IN
(
SELECT DISTINCT BKPF.MANDT||'-'||BKPF.GJAHR||'-'||BKPF.BUKRS||'-'||BKPF.BELNR DOCID FROM BKPF
JOIN BSEG ON (BKPF.MANDT=BSEG.MANDT AND BKPF.BUKRS=BSEG.BUKRS AND BKPF.GJAHR=BSEG.GJAHR AND BKPF.BELNR=BSEG.BELNR)
WHERE
BSEG.SHKZG='H' AND (BSEG.XBILK IS NULL OR BSEG.XBILK='')
AND (BKPF.STBLG IS NULL OR BKPF.STBLG='')
AND EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.HKONT!=BSEG.HKONT AND (B.XBILK IS NULL OR B.XBILK=''))
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.HKONT=BSEG.HKONT)
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.XBILK='X')
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='H' AND B.XBILK='X')
)
GROUP BY BSEG.MANDT,BSEG.BUKRS,BSEG.GJAHR,BSEG.BELNR

Das Ergebnis dieses Queries zeigt, welche Belege welche Konten verwendet haben.

Wir wollen jetzt zusammenfassend herausfinden, wie oft die verschiedenen Kontierungen in Belegen der Buchhaltung vorkommen, dazu aggregieren wir das Query von gerade eben, um entsprechend zu zählen:

3SELECT DEBIT,CREDIT,COUNT(DISTINCT BELNR) AMOUNT_BELNR FROM
(
SELECT BSEG.MANDT,BSEG.BUKRS,BSEG.GJAHR,BSEG.BELNR,STRING_AGG(CASE WHEN BSEG.SHKZG='S' THEN SKAT.TXT50 ELSE null END,', ') DEBIT, STRING_AGG(CASE WHEN BSEG.SHKZG='H' THEN SKAT.TXT50 ELSE null END,', ') CREDIT
FROM (SELECT DISTINCT MANDT,BUKRS,GJAHR,BELNR,HKONT,SHKZG,XBILK FROM BSEG) BSEG
LEFT JOIN T001 ON (T001.MANDT=BSEG.MANDT AND T001.BUKRS=BSEG.BUKRS)
LEFT JOIN SKAT ON (SKAT.MANDT=BSEG.MANDT AND SKAT.KTOPL=T001.KTOPL AND SKAT.SAKNR=BSEG.HKONT AND SKAT.SPRAS='D')
WHERE
BSEG.MANDT||'-'||BSEG.GJAHR||'-'||BSEG.BUKRS||'-'||BSEG.BELNR IN
(
SELECT DISTINCT BKPF.MANDT||'-'||BKPF.GJAHR||'-'||BKPF.BUKRS||'-'||BKPF.BELNR DOCID FROM BKPF
JOIN BSEG ON (BKPF.MANDT=BSEG.MANDT AND BKPF.BUKRS=BSEG.BUKRS AND BKPF.GJAHR=BSEG.GJAHR AND BKPF.BELNR=BSEG.BELNR)
WHERE
BSEG.SHKZG='H' AND (BSEG.XBILK IS NULL OR BSEG.XBILK='')
AND (BKPF.STBLG IS NULL OR BKPF.STBLG='')
AND EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.HKONT!=BSEG.HKONT AND (B.XBILK IS NULL OR B.XBILK=''))
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.HKONT=BSEG.HKONT)
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='S' AND B.XBILK='X')
AND NOT EXISTS (SELECT * FROM BSEG B WHERE B.MANDT=BSEG.MANDT AND B.BUKRS=BSEG.BUKRS AND B.GJAHR=BSEG.GJAHR AND B.BELNR=BSEG.BELNR AND B.SHKZG='H' AND B.XBILK='X')
)
GROUP BY BSEG.MANDT,BSEG.BUKRS,BSEG.GJAHR,BSEG.BELNR
) DOCS
GROUP BY DEBIT,CREDIT
ORDER BY COUNT(BELNR) DESC

Die Kontierungen, die am meisten verwendet werden, stehen ganz oben. Beispielhaft kann ein Ergebnis wie folgt aussehen:

DebitCreditAMOUNT_BELNR
Kalkulatorische AbschreibungenVerrechnung kalkulatorische AfA auf Sachanlagen837
RE Ertrag aus Betriebskostenpauschale, RE Erlösschmälerung Vermietung (Fremd-/Eig.) RE Ertrag aus Betriebskostenpauschale, RE Ertrag Miete Fremdnutzung161
RE Erlösschmälerung Vermietung (Fremd-/Eig.) Raumkosten, RE Ertrag Miete Eigennutzung119
Steuerrechtliche Abschreibungen Verrechnung kalkulatorische AfA auf Sachanlagen105
PersonalaufwendungenUmsatzerlöse102

Nicht alle Ergebniszeilen sind automatisch kritisch. Es können unverdächtige Kontierungen dabei sein, wo einfach nur Aufwendungen umgebucht wurden.

Sie als Revisor müssen nun alle Zeilen durchgehen und überlegen, ob der „Umsatzfrisör“ am Werk war. Dazu halten Sie Ausschau nach Kontierungen auf Erlöskonten im Haben (CREDIT). Wenn es solche Zeilen gibt, schauen Sie das Gegenkonto im Soll an und hinterfragen kritisch, wie solche Buchungen zustande kommen konnten.

Zu kompliziert?

Ist Ihnen das auch alles zu technisch? Dann haben wir mit zap Audit die passende Lösung für Sie entwickelt. Mit zap Audit wird die Datenanalyse unkompliziert und Sie können sich auf die Würdigung der Feststellungen konzentrieren. Melden Sie sich dazu gern bei uns.

Artikel teilen

Facebook
Twitter
XING
LinkedIn

Auch interessant