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:
- Alle Buchungen, die im Soll und im Haben ausschließlich nur in die GuV gebucht haben (Erfolgsneutralität).
- 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 |
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 |
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 |
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.