Auszahlungen in SAP sollten im Rechnungswesen streng definierten Prozessen folgen. Ein gutes internes Kontrollsystem kann nur auf einem wohldefinierten Prozess aufbauen. Da abfließende Zahlungen unmittelbar die Vermögenssphäre jeder Firma betreffen, sollte jeder Prüfer und natürlich auch Rechnungswesenleiter großes Interesse an einem guten Zahlprozess haben. In diesem Blog Post zeige ich Ihnen, wie Sie Zahlungen auf Irrwegen in den Daten Ihres SAP-Systems finden können.
In drei Schritten möchte ich Ihnen zeigen, wie Sie Zahlungsvorgänge in Ihren SAP Daten finden können, die nicht dem Standardprozess entsprechen. Dafür müssen zunächst alle Auszahlungen ermittelt werden (Schritt 1). Anschließend wird festgestellt, welche Prozessschritte oder Transaktionen in SAP verwendet wurden, um die Zahlung zu tätigen (Schritt 2). Und zuletzt werden alle Zahlungen je nach verwendeter SAP Transaktion aggregiert, damit man erkennen kann, wie häufig auf welche Art und Weise bezahlt wurde.
Schritt 1: Auszahlungen ermitteln
Um alle Auszahlungen zu ermitteln, müssen Sie zunächst feststellen, welche Rechnungswesenkonten Ihre Bankkonten abbilden. In meinem Testdatensatz sind die folgenden beiden Konten Bankkonten
- 0000113100
- 0000113101
bei der Deutschen Bank.
Wir legen vor der Analyse auch fest, welche Firma (Buchungskreis) untersucht wird und welches Geschäftsjahr. Sie müssen auch den SAP-Mandaten wissen, der analysiert werden soll. Für Testzwecken wählen wir die Firma wie folgt:
- SAP-Mandant (MANDT): 800
- Buchungskreis (BUKRS): 1000
- Geschäftsjahr (GJAHR): 1997
Wir können jetzt alle Auszahlungen feststellen, indem wir alle Buchungen heranziehen, die auf die Konten 0000113100 oder 0000113101 gebucht haben und wo die Summe der Betragspositionen im Haben größer ist als im Soll, denn Bank gebucht im Haben sind Abflüsse von Geld.
Folgendes SQL-Query sucht alle diese Fälle heraus. Wenn Sie das Query in Ihrem SAP-System selbst ausprobieren wollen, nutzen Sie in SAP die Transaktion „DBACOCKPIT“ und navigieren über „Diagnose“ zum „SQL-Editor“.
Teil des Query | Erklärung |
---|---|
SELECT BSEG.MANDT, BSEG.BUKRS, BSEG.GJAHR, BSEG.BELNR, | Selektion der relevanten Felder |
SUM(CASE WHEN SHKZG='S' THEN DMBTR ELSE 0 END) CASH_IN, | Summe der Bankbuchungszeilen im Soll = Geldzuflüsse |
SUM(CASE WHEN SHKZG='H' THEN DMBTR ELSE 0 END ) CASH_OUT, | Summe der Bankbuchungszeilen im Haben = Geldabflüsse |
SUM((CASE WHEN SHKZG='S' THEN DMBTR ELSE 0 END)-(CASE WHEN SHKZG='H' THEN DMBTR ELSE 0 END)) CASH_NET | Zuflüsse-Abflüsse = Nettobetrag |
FROM BSEG | |
WHERE HKONT IN ('0000113100', '0000113101') | Die relevanten Belegzeilen müssen auf ein Bankkonto gebucht haben |
AND BSEG.GJAHR = 1997 AND BSEG.MANDT = 800 AND BSEG.BUKRS = 1000 | Einschränken auf die betrachtete Firma und das relevante Geschäftsjahr |
GROUP BY BSEG.MANDT, BSEG.BUKRS, BSEG.GJAHR, BSEG.BELNR | |
HAVING CASH_NET<0 | Es sollen letztlich nur Geldabflüsse betrachtet werden |
Wenn Sie das Query selbst benutzten, denken Sie daran, Ihre eigenen Bankkonten einzusetzen bei
HKONT IN ('0000113100','0000113101')
Und Ihre eigene Firma zu spezifizieren bei
AND BSEG.GJAHR = 1997 AND BSEG.MANDT = 800 AND BSEG.BUKRS = 1000
In meinem Testdatensatz ergibt sich z.B. folgendes Ergebnis (Auszug):
MANDT | BUKRS | GJAHR | BELNR | CASH_IN | CASH_OUT | CASH_NET |
---|---|---|---|---|---|---|
800 | 1000 | 1997 | 2000000249 | 0 | 8077.39 | -8077.39 |
800 | 1000 | 1997 | 2000000247 | 0 | 3887.48 | -3887.48 |
800 | 1000 | 1997 | 2000000245 | 0 | 6102.70 | -6102.70 |
800 | 1000 | 1997 | 100007610 | 0 | 4371.55 | -4371.55 |
800 | 1000 | 1997 | 100007611 | 0 | 8743.09 | -8743.09 |
… | … | … | … | … | … | … |
Diese Liste ist im Zweifel lang, da Auszahlungen nicht allzu selten sein dürften.
Die Liste taugt auf jeden Fall schon einmal, um die Größenordnung von Auszahlungen festzustellen. Wenn Sie nach Größe sortieren wollen hängen Sie an das Query ein „ORDER BY CASH_NET“ an.
Schritt 2: Prozessschritte ermitteln mit denen Zahlungen veranlasst wurden
In Schritt 1 haben wir alle Auszahlungen ermittelt. Es stellt sich jetzt die Frage, wie man feststellt, inwiefern die Auszahlungen außerhalb des definierten Prozesses geschehen sind.
Welche Zahlungen sind also auf „Irrwegen“?
Wir betrachten hierfür die verwendete SAP Transaktion, die die Zahlung gebucht hat. Ganz üblich sollten wir erwarten, dass Zahlungen normalerweise mit dem Zahllauf (Payment-Run) gebucht werden. Dies dürfte dem normalen Regelprozess entsprechen. Die SAP-Transaktion für den Zahllauf ist F110.
Also, los geht’s, so holen wir und für jede Auszahlungen den Transaktionscode (TCODE):
SELECT BSEG.MANDT, BSEG.BUKRS, BSEG.GJAHR, BSEG.BELNR, SUM(CASE WHEN SHKZG='S' THEN DMBTR ELSE 0 END) CASH_IN, SUM(CASE WHEN SHKZG='H' THEN DMBTR ELSE 0 END) CASH_OUT, SUM( (CASE WHEN SHKZG='S' THEN DMBTR ELSE 0 END)-(CASE WHEN SHKZG='H' THEN DMBTR ELSE 0 END)) CASH_NET, TCODE FROM BSEG LEFT JOIN BKPF ON (BSEG.MANDT = BKPF.MANDT AND BSEG.BUKRS = BKPF.BUKRS AND BSEG.GJAHR = BKPF.GJAHR AND BSEG.BELNR = BKPF.BELNR) WHERE HKONT IN ('0000113100','0000113101') AND BSEG.GJAHR = 1997 AND BSEG.MANDT = 800 AND BSEG.BUKRS = 1000 GROUP BY BSEG.MANDT, BSEG.BUKRS, BSEG.GJAHR, BSEG.BELNR HAVING CASH_NET<0
Das Query ist weitestgehend das gleiche wie im Schritt 1, lediglich die markierten Bestandteile sind dazugekommen. Ein Auszug aus den Ergebnissen meines Testdatensatzes ergibt Folgendes:
MANDT | BUKRS | GJAHR | BELNR | CASH_IN | CASH_OUT | CASH_NET | TCODE |
---|---|---|---|---|---|---|---|
800 | 1000 | 1997 | 2000000249 | 0 | 8077.39 | -8077.39 | F110 |
800 | 1000 | 1997 | 2000000247 | 0 | 3887.48 | -3887.48 | F110 |
800 | 1000 | 1997 | 2000000245 | 0 | 6102.70 | -6102.70 | F110 |
800 | 1000 | 1997 | 100007610 | 0 | 4371.55 | -4371.55 | FB01 |
800 | 1000 | 1997 | 100007611 | 0 | 8743.09 | -8743.09 | FB01 |
… | … | … | … | … | … | … | … |
Unser besonderes Augenmerk fällt hier auf die Spalte TCODE. Wir sehen in dem Auszug, dass viele Zahlungen mit F110 (Zahllauf in SAP) passiert sind. Hier kann man von einem Regelzahlprozess ausgehen, sodass solche Fälle unverdächtig sind.
Einige Belege wurden aber mit FB01 gebucht. Eine kurze google Recherche mit den Stichworten „SAP FB01“ ergibt, dass es sich um die Transaktion „Beleg buchen“ handelt. Buchungen mit dieser schlichten Transaktion kann man gewiss als manuelle Buchungen bezeichnen. Das ist für Zahlvorgänge interessant und deshalb sollte man sich Belege mit FB01 in diesem Fall einmal Stichprobenartig ansehen!
Schritt 3: Problemausmaß erkennen
Im letzten Schritt 3 wollen wir „Kassensturz“ machen und zählen, wie oft welcher Transaktionscode für die Auszahlungen verwendet wurde. Dafür verwenden wir einfach das Query aus Schritt 2 und Gruppieren auf den TCODE und lassen dann alle Belege jeweils durchzählen:
SELECT TCODE ,COUNT(*) FROM (SELECT BSEG.MANDT, BSEG.BUKRS, BSEG.GJAHR, BSEG.BELNR, SUM(CASE WHEN SHKZG='S' THEN DMBTR ELSE 0 END) CASH_IN, SUM(CASE WHEN SHKZG='H' THEN DMBTR ELSE 0 END ) CASH_OUT, SUM( (CASE WHEN SHKZG='S' THEN DMBTR ELSE 0 END)-(CASE WHEN SHKZG='H' THEN DMBTR ELSE 0 END) ) CASH_NET, TCODE FROM BSEG LEFT JOIN BKPF ON (BSEG.MANDT = BKPF.MANDT AND BSEG.BUKRS = BKPF.BUKRS AND BSEG.GJAHR = BKPF.GJAHR AND BSEG.BELNR = BKPF.BELNR) WHERE HKONT IN ('0000113100', '0000113101') AND BSEG.GJAHR=1997 AND BSEG.MANDT=800 AND BSEG.BUKRS=1000 GROUP BY BSEG.MANDT, BSEG.BUKRS, BSEG.GJAHR, BSEG.BELNR) GROUP BY TCODE ORDER BY COUNT(*) DESC;
Lediglich der orange markierte Teil des Queries hat sich zum Query aus Abschnitt 2 verändert und ist hinzu gekommen. Ansonsten besteht das Query aus dem Query in Abschnitt 2.
In meinem Testdatensatz erhalte ich folgendes Ergebnis für die Häufigkeit der Verwendung von Transaktionscodes zur Zahlung:
TCODE | COUNT(*) |
---|---|
F110 | 131 |
FB01 | 29 |
FB08 | 4 |
FBA7 | 1 |
In dem Output sieht man, dass die meisten Fälle mit dem normalen Zahllauf gebucht wurden (F110). Am zweit häufigsten wurde „FB01“ verwendet. Auf die Brisanz, auf solche Art und Weise Zahlungen zu buchen („manuelle Buchung“) habe ich bereits in Schritt 2 hingewiesen.
Man sieht aber, dass auch noch die Transaktionen „FB08“ und „FBA7“ verwendet wurden. Eine kurze google Recherche leistet folgende Erkenntnis:
- FB08 = Beleg stornieren
- FBA7 = Kreditorenanzahlung buchen
FB08 (Beleg stornieren) ist unkritisch, da der Beleg bereits storniert wurde.
FBA7 (Kreditorenanzahlung buchen) wurde nur einmal verwendet. Es handelt sich um eine Transaktion, die spezifisch für Anzahlungen gedacht ist. Aber sicherlich ist es eine Nachfrage in der Buchhaltung wert, warum nicht auch solche Anzahlungen über den normalen Zahllauf (F110) abgewickelt werden, den der normale Zahllauf ist sicherlich im Hinblick auf das interene Kontrollsystem am besten abgesichert.
Zu kompliziert?
Datenbankqueries sind nicht jedermanns Sache. Probieren Sie doch mal zap Audit. Da werden Ihnen alle technischen Einzelheiten abgenommen. zap Audit ist für kleine Buchungskreise kostenfrei!