Es ist mal wieder Zeit für die Fortsetzung unserer Journal Entry Testing (JET) Reihe! Diesmal widmen wir uns dem wohlbekannten Thema der Gegenkontoanalyse in SAP.
Wozu dient eine Gegenkontoanalyse?
Seit Beginn der Buchhaltung werden alle Geschäftsvorfälle im Rahmen der Doppik erfasst. Die Gegenkontoanalyse zeigt, welche Gegenkonten für ein bestimmtes Konto verwendet wurden. Sind es immer dieselben? Welche Varianten gibt es? Gab es exotische Gegenkonten bei denen man mal genauer hingucken sollte? Oder sind auch Gegenkonten dabei, die fachlich zum Konto überhaupt nicht passen? Das alles sind Fragen, bei denen uns die Gegenkontoanalyse helfen soll. Letztlich bedeutet eine Gegenkontoanalyse, dass wir etwas über verwendete „Buchungsstrukturen“ lernen wollen.
Schritt 1: Welcher Beleg hat auf welche Finanzbuchhaltungskonten gebaucht?
Zunächst sollte der Buchungsstoff derart gefiltert werden, dass für alle Belege alle verwendeten Finanzbuchhaltungskonten nur einmal angelistet werden. Sie können das folgende SQL Query ausprobieren, wenn Sie in SAP die Transaktion „DBACOCKPIT“ aufrufen und über „Diagnose“ zum „SQL-Editor“ navigieren:
SELECT DISTINCT
MANDT, BUKRS, GJAHR, BELNR, HKONT, SHKZG
FROM BSEG
WHERE
MANDT='800' AND BUKRS='1000' AND GJAHR=2018
Setzen Sie in der WHERE Bedingung ihren Mandanten (MANDT), Buchungskreis (BUKRS) und das Geschäftsjahr (GJAHR) ein.
Das wird eine Liste, hier ein Ausschnitt für nur einen Beleg:
MANDT | BUKRS | GJAHR | BELNR | HKONT | SHKZG |
---|---|---|---|---|---|
800 | 1000 | 2018 | 100005794 | 140000 | S |
800 | 1000 | 2018 | 100005794 | 230051 | S |
800 | 1000 | 2018 | 100005794 | 175000 | H |
800 | 1000 | 2018 | 100005794 | 800000 | H |
Schritt 2: Soll- und Habenkonten verdichten
Im nächsten Schritt werden alle Zeilen eines Belegs verdichtet, sodass pro Beleg alle Konten für die Sollseite und für die Habenseite in einer einzigen Zeile ersichtlich werden. Dazu umklammern wir das Query aus Schritt 1 wie folgt:
SELECT
MANDT, BUKRS, GJAHR, BELNR, STRING_AGG(CASE WHEN SHKZG='S' THEN HKONT ELSE null END, ', '
ORDER BY HKONT) DEBIT, STRING_AGG(CASE WHEN SHKZG='H' THEN HKONT ELSE null END, ', ' ORDER BY HKONT) CREDIT
FROM
(
SELECT DISTINCT
MANDT, BUKRS, GJAHR, BELNR, HKONT, SHKZG
FROM BSEG
WHERE MANDT='800' AND BUKRS='1000' AND GJAHR=2018
)
GROUP BY MANDT, BUKRS, GJAHR, BELNR
Hier ein Ausschnitt von drei verschiedenen Belegen zur Veranschaulichung der Ergebnismenge:
MANDT | BUKRS | GJAHR | BELNR | DEBIT | CREDIT |
---|---|---|---|---|---|
800 | 1000 | 2018 | 1900002600 | 0000154000, 0000230051, 0000476900 | 160000 |
800 | 1000 | 2018 | 1900002601 | 0000154000, 0000230051, 0000403000 | 160000 |
800 | 1000 | 2018 | 1900002602 | 0000154000, 0000230051, 0000471000 | 160000 |
Schritt 3: Statistik über die Gegenkonten erzeugen
Jetzt klammern wir wiederum das Query aus Schritt 2 (und somit auch aus Schritt 1) und zählen, wie viele Belege die jeweils selbe Struktur in den Gegenkonnten haben.
In dem folgenden Beispiel wird berechnet, welche Gegenkonten verwendet werden, wenn eine Buchung im Haben (CREDIT) auf das Konto 160000 gebucht hat:
SELECT DEBIT,COUNT(*) FROM
(
SELECT
MANDT, BUKRS, GJAHR, BELNR,
STRING_AGG(CASE WHEN SHKZG='S' THEN HKONT ELSE null END, ', ' ORDER BY HKONT) DEBIT,
STRING_AGG(CASE WHEN SHKZG='H' THEN HKONT ELSE null END, ', ' ORDER BY HKONT) CREDIT
FROM
(
SELECT DISTINCT
MANDT, BUKRS, GJAHR, BELNR, HKONT, SHKZG
FROM BSEG
WHERE MANDT='800' AND BUKRS='1000' AND GJAHR=2018
)
GROUP BY MANDT, BUKRS, GJAHR, BELNR
)
WHERE CREDIT LIKE '%160000%'
GROUP BY DEBIT
ORDER BY COUNT(*) DESC
Dies führt z.B. zu folgendem Ergebnis:
DEBIT | COUNT(*) |
---|---|
0000154000; 0000191100 | 279 |
0000154000; 0000476900 | 166 |
0000154000; 0000476100 | 151 |
0000154000; 0000403000 | 149 |
0000154000; 0000471000 | 121 |
0000154000; 0000191100; 0000230051 | 117 |
0000154000; 0000476000 | 93 |
Man sieht also, dass es viele verschiedene Buchungsstrukturen bei den Gegenkonten gibt, die auch durchaus relativ häufig vorkommen. Natürlich muss jetzt der Prüfer ran und würdigen, ob diese Gegenkonten plausibel sind.