Sonstige

Wie Sie den Umsatzfrisör entdecken

9 min. Lesezeit
Bild von Prof. Dr. Nick Gehrke

Verfasst von

Prof. Dr. Nick Gehrke

Young handsome barber making haircut of attractive bearded man in barbershop

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:

 

1

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

 

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:

 

1a

SELECT DISTINCT BKPF.MANDT||'-'||BKPF.GJAHR||'-'||BKPF.BUKRS||'-'||BKPF.BELNR DOCID FROM BKPF

Entfernen von doppelten Belegen

1b

JOIN 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

1c

WHERE 
BSEG.SHKZG='H' AND (BSEG.XBILK IS NULL OR BSEG.XBILK='') 

Auf Positionen beschränken, die in der GuV im "Haben" gebucht wurden...

1d

AND (BKPF.STBLG IS NULL OR BKPF.STBLG='') 

... und kein Storno sind...

1e

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

... zu der es eine Position im "Soll" in dem Beleg gibt, die auf ein anderes Konto gebucht wurde und zur GuV gehört...
1f

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) 

 ... und es keine Position im "Soll" gibt, welche auf das gleiche GuV Konto, wie im "Haben" gebucht wurde...
1g

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

 ... und es keine Position im "Soll" gibt, welche in die Bilanz gebucht wurde...
1h

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

..., 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:

 

2

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

 

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:

 

3

SELECT 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:

 

Debit Credit AMOUNT_BELNR
Kalkulatorische Abschreibungen Verrechnung kalkulatorische AfA auf Sachanlagen 837
RE Ertrag aus Betriebskostenpauschale, RE Erlösschmälerung Vermietung (Fremd-/Eig.)  RE Ertrag aus Betriebskostenpauschale, RE Ertrag Miete Fremdnutzung 161
RE Erlösschmälerung Vermietung (Fremd-/Eig.)  Raumkosten, RE Ertrag Miete Eigennutzung 119
Steuerrechtliche Abschreibungen  Verrechnung kalkulatorische AfA auf Sachanlagen 105
Personalaufwendungen Umsatzerlöse 102

 

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:

 

zum Kontakt