So entdecken Sie dubiose Buchungsstrukturen in SAP

In dem heutigen Blog Beitrag sind wir innerhalb der Finanzbuchhaltung von SAP auf der Suche nach „dubiosen“ Buchungsstrukturen. Ich zeige Ihnen, wie man Buchungsstrukturen in SAP schnell ausfindig machen kann und bei welchen man vielleicht etwas genauer hinsehen sollte, weil sie nicht den üblichen Erwartungen entsprechen!

Was ist eine „dubiose“ Buchungsstruktur?

Okay, ich gebe zu, das Wort „dubios“ ist etwas salopp und zunächst auch ein wenig unscharf, um damit anständig arbeiten zu können. Deshalb erkläre ich Ihnen zunächst die Herangehensweise.

Seit Luca Pacioli ist der Menschheit bekannt, dass eine Buchung in der Finanzbuchhaltung aus Buchungszeilen auf Konten (z.B. im Soll) und Gegenkonten (z.B. im Haben) besteht, wobei die gebuchten Beträge im Soll und im Haben sich immer entsprechen müssen. Aus Sicht der Revision ist dies wohl einer der ersten und vielleicht die wichtigste interne Kontrolle im Bereich des Rechnungswesens.

In aller Regel ist der Revisor mit der Buchhaltung soweit vertraut, dass er sich stets vorstellen kann, was übliche Gegenkonten sind, wenn er ein bestimmtes Finanzbuchhaltungskonto betrachtet für das er sich gerade besonders interessiert. Das heißt für jedes Konto gibt es typische Gegenkonten. Wenn auf ein untypisches Gegenkonto gebucht wurde, dann nennen wir das nachfolgend „dubios“ und soll uns als Anlass dienen tiefer zu bohren.

Es geht hier also letztendlich um eine Gegenkontoanalyse.

Zuerst eine Erwartungshaltung bilden

Wir verdeutlichen die Bildung einer Erwartungshaltung zunächst an zwei konkreten Beispielen.

In unserem Testdatensatz gibt es zwei Konten für die wir uns besonders interessieren:

  • 0000800000 Umsatzerlöse
  • 0000113100 Deutsche Bank

Bei den Umsatzerlösen wird maßgeblich ins Haben gebucht, denn dabei handelt es sich um Erlöse. Als Gegenkonten im Soll müssten wir natürlich Forderungen erwarten, wobei uns vielleicht noch Erlösschmälerungen in die Quere kommen. Gegenkonten mit anderem Charakter würden wir zunächst nicht erwarten.

Bei der Deutschen Bank wollen wir Auszahlungen betrachten, d.h. uns interessieren Buchungen im Haben. Gegenkonten im Soll, die wir erwarten würden, wären demnach z.B. Verbindlichkeiten, vielleicht noch gezahlte Steuern und Umbuchungen von anderen Bankkonten.

Umsatzerlöse untersuchen

Jetzt geht es los!

Nachdem wir uns zwei Konten ausgesucht haben, wollen wir herausfinden, was die Gegenkonten im Soll für die Umsatzerlöse auf Konto „0000800000“ sind. Dafür dient nachfolgendes SQL Query. Um das Query ausführen zu können, nutzen Sie in SAP die Transaktion „DBACOCKPIT“ und navigieren im linken Verzeichnis zu „Diagnose – SQL-Editor“ (auf einer HANA DB getestet):

1SELECT CONTRA.HKONT ACCOUNT, SKAT.TXT50 ACCOUNT_NAME, CONTRA.SHKZG DEBIT_OR_CREDIT, COUNT(DISTINCT CONTRA.BELNR) NUMBER_OF_DOCUMENTS FROM BSEGDie Nummer und Bezeichnung des Gegenkontos, Soll oder Haben Kennzeichen (SHKZG) und die Anzahl der Belege in denen das Gegenkonto vorkommt
JOIN BKPF ON (BSEG.MANDT=BKPF.MANDT AND BSEG.BUKRS=BKPF.BUKRS AND BSEG.GJAHR=BKPF.GJAHR AND BSEG.BELNR=BKPF.BELNR)Join auf den Belegkopf
JOIN BSEG CONTRA ON (BSEG.MANDT=CONTRA.MANDT AND BSEG.BUKRS=CONTRA.BUKRS AND BSEG.GJAHR=CONTRA.GJAHR AND BSEG.BELNR=CONTRA.BELNR AND BSEG.SHKZG!=CONTRA.SHKZG)Join auf die Belegzeilen, die sich gegenüberstehen Wenn Umsatzerlöse im Haben betrachtet werden, dann werden die Gegenpositionen im Soll betrachtet. „!= bedeutet ungleich“
LEFT JOIN T001 ON (T001.MANDT=CONTRA.MANDT AND T001.BUKRS=CONTRA.BUKRS)Join auf die Kontenbezeichungen, um die Namen der Gegenkonten zu erhalten
LEFT JOIN SKAT ON (T001.MANDT=SKAT.MANDT AND T001.KTOPL=SKAT.KTOPL AND SKAT.SAKNR=CONTRA.HKONT AND SKAT.SPRAS='E')
WHERE BSEG.HKONT='0000800000' AND BSEG.SHKZG='H' AND BKPF.STBLG = '' AND BSEG.GJAHR=1997 AND BSEG.BUKRS='1000'Das Konto von Interesse: Umsatzerlöse gebucht im Haben; Nur Belege betrachten, die nicht storniert sind; Buchungskreis und Geschäftsjahr der Wahl einschränken
GROUP BY CONTRA.HKONT, CONTRA.HKONT, CONTRA.SHKZG, SKAT.TXT50;Aggregation der Konten

(Weiter unten können Sie die Query aus der Analyse des Deutsche Bank Kontos einfach kopieren)

Wenn Sie das bei sich ausprobieren wollen, dann müssen Sie natürlich Ihr Finanzbuchhaltungskonto und Ihre Buchungsseite (S=Soll bzw. H=Haben) entsprechend in der „WHERE“ Bedingung einsetzen:

WHERE BSEG.HKONT='0000113100' AND BSEG.SHKZG='H'

Zusätzlich müssen sowohl Ihr Buchungskreis, als auch das zu betrachtende Geschäftsjahr angepasst werden:

BSEG.GJAHR=1997 AND BSEG.BUKRS='1000'

In unserem Testdatensatz kommen folgende Gegenkonten für die Umsatzerlöse heraus:

ACCOUNTACCOUNT_NAMEDEBIT_OR_
CREDIT
NUMBER_OF_
DOCUMENTS
889000Other sales deductionsS1
230051Gain/loss Euro conversion / document differenceS133
140000Trade Receivables – domesticS273
888000Sales deductions – domesticS3

Bei der Durchsicht der Ergebnisse entdecken wir die zuvor zu erwartenden Forderungen und Erlösschmälerungen. Außerdem finden wir noch ein paar Währungsgewinne bzw. Verluste, die wir bei unserer Erwartungsbildung nicht dabei hatten, aber nicht überraschend sind. Das Ganze scheint demnach nicht wirklich auffällig, weshalb wir die Analyse dieses Kontos nicht weiter vertiefen wollen.

Untersuchung des Bankkontos

Nachdem wir bei den Umsatzerlösen keine Auffälligkeiten feststellen konnten, werfen wir jetzt einen Blick auf die Auszahlungen hinsichtlich der Deutschen Bank. Dafür können wir das gleiche SQL Query verwenden und tauschen in der WHERE Bedingung lediglich das Konto der Umsatzerlöse „0000800000“ gegen das Konto der Deutschen Bank „0000113100 “ aus (auf einer HANA DB getestet):

2SELECT CONTRA.HKONT ACCOUNT ,SKAT.TXT50 ACCOUNT_NAME, CONTRA.SHKZG DEBIT_OR_CREDIT,COUNT(DISTINCT CONTRA.BELNR) NUMBER_OF_DOCUMENTS FROM BSEG
JOIN BKPF ON (BSEG.MANDT=BKPF.MANDT AND BSEG.BUKRS=BKPF.BUKRS AND BSEG.GJAHR=BKPF.GJAHR AND BSEG.BELNR=BKPF.BELNR)
JOIN BSEG CONTRA ON (BSEG.MANDT=CONTRA.MANDT AND BSEG.BUKRS=CONTRA.BUKRS AND BSEG.GJAHR=CONTRA.GJAHR AND BSEG.BELNR=CONTRA.BELNR AND BSEG.SHKZG!=CONTRA.SHKZG )
LEFT JOIN T001 ON (T001.MANDT=CONTRA.MANDT AND T001.BUKRS=CONTRA.BUKRS)
LEFT JOIN SKAT ON (T001.MANDT=SKAT.MANDT AND T001.KTOPL=SKAT.KTOPL AND SKAT.SAKNR=CONTRA.HKONT AND SKAT.SPRAS='E')
WHERE BSEG.HKONT='0000113100' AND BSEG.SHKZG='H' AND BKPF.STBLG IS NULL AND BSEG.GJAHR=1997 AND BSEG.BUKRS='1000'
GROUP BY CONTRA.HKONT,CONTRA.HKONT,CONTRA.SHKZG,SKAT.TXT50;

Nach dem Ausführen des Queries zeigt sich in unserem Testdatensatz folgendes Ergebnis:

ACCOUNTACCOUNT_NAMEDEBIT_OR_
CREDIT
NUMBER_OF_
DOCUMENTS
113102Deutsche Bank – domestic bank tranfersS1
154000Input taxS13
400010Raw materials consumedS1
417000Purchased servicesS13
230051Gain/loss Euro conversion / document differenceS3
400000Consumption, raw materialS6
410000Usage: trading goodsS1
113101Deutsche Bank – checks payableS1

Auch hier sehen wir uns wieder Konten durch. Auffällig ist, dass wir überhaupt keine Verbindlichkeiten auf einem Gegenkonto finden können.

Seltsam!

Offenbar werden von diesem Bankkonto keine Lieferanten bezahlt. Die bezahlten Umsatzsteuern sind als Gegenkonto nicht überraschend. Dafür ist es aber sicherlich merkwürdig, dass die Aufwandskonten „Raw Material consumed“ gebucht wurden und das direkt gegen Cash! Und offenbar wurden auch Dienstleistungen direkt gegen Bank gebucht („Purchased services“). Normalerweise dürfte es für solche Dienstleistungen zunächst eine Verbindlichkeit geben, die anschließend bezahlt wird. Das war hier wohl nicht der Fall und ist dann auch noch in 13 verschiedenen Belegen aufgetreten. Das entspricht nicht wirklich unserer Erwartungshaltung und daher sollte im nächsten Schritt näher untersucht werden, welche einzelnen Belege dahinterstehen. Wir wollen das einmal exemplarisch für die betreffenden Belege bzgl. des Gegenkontos „Purchased services“ machen.

Und so einfach geht’s:

3SELECT DISTINCT BSEG.BELNR FROM BSEGDoppelte Belegnummern werden unterdrückt
JOIN BKPF ON (BSEG.MANDT=BKPF.MANDT AND BSEG.BUKRS=BKPF.BUKRS AND BSEG.GJAHR=BKPF.GJAHR AND BSEG.BELNR=BKPF.BELNR)Join auf den Belegkopf
WHERE BSEG.SHKZG='H' AND BSEG.HKONT='0000113100' AND EXISTSKonto von Interesse war Deutsche Bank im Haben (also lediglich die Zahlungsausgänge)
(SELECT * FROM BSEG CONTRA WHERE BSEG.MANDT=CONTRA.MANDT AND BSEG.BUKRS=CONTRA.BUKRS AND BSEG.GJAHR=CONTRA.GJAHR AND BSEG.BELNR=CONTRA.BELNR AND BSEG.SHKZG!=CONTRA.SHKZG AND CONTRA.HKONT='0000417000')Von Interesse sind aber nur die Belege wo auch das Gegenkonto ‚0000417000‘ = ‚Purchased services‘ angesprochen wurde
AND BKPF.STBLG = '';Und stornierte Belege sollen aus der Analyse ausgeschlossen werden

Wenn man das Query ausführt, dann kommt man zu den betreffenden Belegnummern, z.B.:

BELNR
100007425100007426100007427
100007428100007605100007606
100007607100007608100007609
100007342100007343100007610
100007424

Diese Belege sollte man sich doch nun einmal exemplarisch genauer ansehen, um dieser „dubiosen“ Buchungsstruktur auf die Schliche zu kommen.

Und jetzt?

Datenanalysen sind mächtig. Wohl dem, der die richtige Analyse durchführen kann, wenn er sie gerade braucht und in der Lage ist, die Daten entsprechend zu hinterfragen!

SQL ist nicht jedermanns Sache und Kollegen in der Revision, die sowohl fit in kaufmännischen Fragestellungen als auch in Data Science sind sucht man in aller Regel heute noch vergeblich.

Daher unser Angebot: Testen Sie zapliance und überlassen die Data Science Aufgaben komplett der Software. Für kleine Buchungskreise sogar komplett kostenfrei. Inklusive der mehr als 150 automatisierten Prüfungsfragen / Datenindikatoren, dem integriertem Process Mining und ohne funktionale Einschränkungen. So ist mit Sicherheit die eine oder andere Datenanalyse für Sie dabei. Vereinbaren Sie ganz unverbindlich einen kostenlosen Termin und wir zeigen Ihnen die fortschrittliche Audit und Datenanalyse-Software in einem Schnelldurchgang.

Artikel teilen

Facebook
Twitter
XING
LinkedIn