Donnerstag, 16. September 2010

Query Module: Prüfen ob Rechnungsnummern lückenlos sind

Ein Kunde hat uns angesprochen, da er sicherstellen möchte, dass seine vergebenen Rechnungsnummern lückenlos aufsteigend (mathematisch: streng monoton aufsteigend) sind.

Mit dem QueryModule ist so eine Prüfung natürlich kein Problem, es gibt jedoch mehrere Ansätze:

Der Ansatz des Informatikers
Um zu prüfen ob die Rechnungsnummern zwischen X und Y lückenlos vergeben sind, addiert man einfach alle Rechnungsnummern auf und prüft ob dies der Summe aller Zahlen zwischen X und Y entspricht. (Dies reicht als Beweis aus, da die Datenbank selbst prüft, das keine Nummer doppelt vergeben wird).


Das folgende SQL berechnet die Summe:

SELECT SUM(rechnungsnummer) FROM rechnungen 
WHERE rechnungsnummer >= X AND rechnungsnummer <= Y 

Um die Summe der Zahlen zwischen X und Y aufzurechnen, bedient man sich der Gauss-Formel:
$\sum_{n=X}^{Y} (n) = \left ( \frac{Y*(Y+1)}{2} \right ) - \left ( \frac{X*(X-1)}{2} \right )$

Leider zeigt dieser Ansatz nicht an, welche Nummern genau fehlen (wo Lücken wären).

Der Ansatz des Pragmatigers
Es ist zu prüfen, ob es für jede Nummer N (zwischen X und Y-1) auch eine Nummer X+1 gibt. Alle Lücken kann man somit mit einem "self-join" wie folgt ausgeben:

SELECT ro.rechnungsnummer + 1 FROM rechnungen ro
WHERE ro.rechnungsnummer >= X 
AND ro.rechnungsnummer <= Y 
AND NOT EXISTS(
    SELECT * FROM rechnungen ri 
    WHERE ri.rechnungsnummer = ro.rechnungsnummer-1
) 

Mit der QueryModule-Option "Keine leeren eMails versenden" kann man sich so einen geplanten Task einrichten, der die Prüfung regelmäßig ausführt und nur dann eine eMail schickt, wenn eine Rechnungsnummer fehlt.

Keine Kommentare:

Kommentar veröffentlichen