Normalerweise spricht man bei Ausreißern von extremen Werten, die sich stark von anderen Beobachtungen unterscheiden. Die Ursachen können vielfältig sein und reichen von Schwankungen während der Messung, Versuchsfehlern bis hin zu neuartigen Phänomenen. Im nachfolgenden Fall handelt es sich allerdings eher um fehlende Kenntnis, Versäumnis oder schlichte Faulheit bei der Durchführung von Geschäftsprozessen. Die Rede ist deshalb hier von Belegen mit bzw. ohne Bestellbezug wider Erwarten.
Die Voraussetzungen für Belege mit oder ohne Bestellbezug
Bevor wir auch nur ansatzweise irgendwelche Ausreißer analysieren können, müssen wir uns zunächst um eine Datengrundlage kümmern. Daher drängt sich zunächst die Frage auf, wie ein Bestellbezug in SAP überhaupt hergestellt wird. Die Antwort darauf ist schnell gefunden. Mit einem Blick in die charakteristischen FI Tabellen in SAP (BKPF und BSEG) findet sich in den Belegsegmenten der Buchhaltung (BSEG) das Feld:
EBELN – Belegnummer des Einkaufsbelegs
Damit hätten wir zunächst den Verweis auf eine Bestellung sichergestellt. Jetzt macht es natürlich wenig Sinn einfach diejenigen Belege zu nehmen, die keinen Bestellbezug aufweisen und damit in die Fachabteilung zu rennen, weil es viele Szenarien gibt, wo Rechnungen ohne Verweis auf eine Bestellung bezahlt werden, z.B. bei wiederkehrenden Beträgen, wie Mieten oder Handyverträgen. Aus diesem Grund betrachten wir in diesem Artikel auch beide Seiten. Belege mit und Belege ohne Bestellbezug wider Erwarten.
An dieser Stelle scheiden sich allerdings die Geister und wir müssen uns überlegen, in welche Richtung wir näher untersuchen wollen. Zum einen wäre eine Analyse hinsichtlich der Belegarten denkbar, weil z.B. die Belegart WE im MM für Wareneingänge zu Bestellungen oder auch zu Aufträgen in aller Regel eine Bestellung voraussetzt. Zum anderen bietet sich auch die Möglichkeit die Lieferanten / Kreditoren auszuwerten. Möglicherweise offenbart sich dabei allerdings das gleiche Problem, wie bereits beschrieben: Wenn das Unternehmen Mobilfunkverträge bei der Telekom abschließt, aber gleichzeitig alle 2 Jahre neue Handys aus Verlängerungen bekommt, dann gibt es in wenigen Fällen einen Bestellbezug, sodass False Positives vorprogrammiert sind, weil verhältnismäßig oft eine Mobilfunkrechnung beglichen wird, aber in seltenen Fällen (Handyerneuerung) ein Bestellbezug vorhanden ist.
Jedes Vorgehen bietet Vor- und Nachteile, sodass es kein falsch oder richtig in diesem Zusammenhang gibt. Wir entscheiden uns in diesem Fall für die Verwendung der Belegarten. Diese finden sich allerdings nicht in der SAP Tabelle „BSEG“, sondern in der „BKPF“.
Die Analyse von Bestellbezügen in SAP
Nachdem wir die Voraussetzungen und das Vorgehen definiert haben können wir ins Detail gehen. Wir verwenden dafür den SQL-Editor von SAP, der über die Transaktion „DBACOCKPIT“ und die Navigation über Diagnose und SQL-Editor zu erreichen ist. Zunächst müssen wir ein paar Kerninformationen mit aufnehmen, damit wir die Daten aus den verschiedenen Buchungskreisen und Mandanten nicht versehentlich durcheinanderbringen. Mit der jeweiligen Anzahl an Belegarten wäre das SQL Query:
SELECT COUNT(BELNR) AS COUNT_BELNR, BLART, MANDT, BUKRS, GJAHR
FROM BKPF
WHERE GJAHR='1998' AND BUKRS='1000' AND MANDT='800'
GROUP BY BLART, MANDT, BUKRS, GJAHR
ORDER BY COUNT(BELNR) DESC
Ich habe zusätzlich den Buchungskreis, den Mandanten und das Geschäftsjahr eingeschränkt, um eine übersichtliche Ergebnismenge zu erhalten. Auf diese Weise können Sie jeden Buchungskreis / Mandanten / Geschäftsjahr einzeln und ausführlich analysieren:
COUNT_BELNR | BLART | MANDT | BUKRS | GJAHR |
---|---|---|---|---|
1.620 | AF | 800 | 1000 | 1998 |
1.421 | KR | 800 | 1000 | 1998 |
514 | WE | 800 | 1000 | 1998 |
425 | WA | 800 | 1000 | 1998 |
… | … | … | … | … |
So erhalten wir einen einfachen Überblick der Belegarten und die jeweilige Anzahl von Belegen pro Belegart. Um den Verbund der beiden Tabellen BSEG und BKPF zu gewährleisten, müssen wir einen Tabellenjoin (blau dargestellt) der beiden SAP Tabellen über die gemeinsamen Primärschlüssel (grün dargestellt) definieren und die zusätzlichen Felder für die Selektion (lila dargestellt) mit aufnehmen:
SELECT COUNT(DISTINCT K.BELNR) AS COUNT_BELNR, COUNT(DISTINCT CASE WHEN B.EBELN NOT LIKE '' THEN B.BELNR ELSE null END) AS COUNT_EBELN, K.BLART, K.MANDT, K.BUKRS, K.GJAHR
FROM BKPF AS K
LEFT JOIN BSEG AS B ON K.MANDT=B.MANDT AND K.BUKRS = B.BUKRS AND K.BELNR = B.BELNR AND K.GJAHR = B.GJAHR
WHERE K.GJAHR='1998' AND K.BUKRS='1000' AND K.MANDT='800'
GROUP BY K.BLART, K.MANDT, K.BUKRS, K.GJAHR
ORDER BY COUNT_BELNR DESC
Der lila gekennzeichnete Bereich besagt, dass ein Beleg nur dann gezählt werden soll, wenn er eine Referenz auf einen Einkaufsbeleg hat, oder anders ausgedrückt das Feld „EBELN“ nicht leer ist (NOT LIKE “).
COUNT_BELNR | COUNT_EBELN | BLART | MANDT | BUKRS | GJAHR |
---|---|---|---|---|---|
1.620 | 0 | AF | 800 | 1000 | 1998 |
1.421 | 0 | KR | 800 | 1000 | 1998 |
514 | 397 | WE | 800 | 1000 | 1998 |
425 | 0 | WA | 800 | 1000 | 1998 |
411 | 2 | RV | 800 | 1000 | 1998 |
346 | 345 | RE | 800 | 1000 | 1998 |
… | … | … | … | … | … |
Die Ergebnistabelle zeigt jetzt sowohl Belege mit Bestellbezug wider Erwarten, als auch Belege ohne Bestellbezug wider Erwarten. Nehmen wir zum Beispiel die Belegart RV. Bei 2 von 411 Belegen (~0,5%) aus dem SD ist ein Bestellbezug vorhanden, wobei die restlichen knapp 99,5% keinen Bestellbezug aufweisen. Oder nehmen wir einmal die Belegart RE. Dabei weisen 345 von 346 Belegen (~99,7%) einen Bestellbezug auf. Lediglich ein einziger hat keinen. Durchaus auffällig!
Um welche Belege es sich genau handelt wäre vermutlich ihre nächste Frage, die ich mit einem schnellen SQL Query beantworten möchte, bevor es einmal mehr an Ihnen liegt das Beste aus dieser Analyse zu machen (zu ändernde Stellen sind grün markiert):
SELECT DISTINCT K.BELNR, K.BLART, K.MANDT, K.BUKRS, K.GJAHR FROM BKPF AS K
WHERE EXISTS (SELECT * FROM BSEG AS B WHERE K.MANDT=B.MANDT AND K.BUKRS = B.BUKRS AND K.BELNR = B.BELNR AND K.GJAHR = B.GJAHR AND B.EBELN NOT LIKE '')
AND K.BUKRS='1000' AND K.GJAHR='1998' AND K.BLART='RV'
Oder für die Belegart RE:
SELECT DISTINCT K.BELNR, K.BLART, K.MANDT, K.BUKRS, K.GJAHR FROM BKPF AS K
WHERE NOT EXISTS (SELECT * FROM BSEG AS B WHERE K.MANDT=B.MANDT AND K.BUKRS = B.BUKRS AND K.BELNR = B.BELNR AND K.GJAHR = B.GJAHR AND B.EBELN NOT LIKE '')
AND K.BUKRS='1000' AND K.GJAHR='1998' AND K.BLART='RE'
Natürlich verraten wir an dieser Stelle nicht jede Einzelheit zur effiziente Reduzierung von False Positives, denn ich will Ihnen nicht jede Überraschung beim Einsatz von zap Audit nehmen. Wenn Sie Fragen zum Einsatz von zap Audit in Ihrem Unternehmen haben, dann scheuen Sie sich nicht uns zu kontaktieren.