Fehlverrechnungen (durch früheres Löschen bereits verrechneter Buchungsposten, i.e. Gebühr mit Zahlung) werden datenbankübergreifend durch eine Auswertung per SQL-Befehl festgestellt. Hierfür wird pro Benutzernr die Summe von BETRAG (Gebühren, Zahlungen) der Summe der Beträge aus der Spalte OFFEN gegenübergestellt.
Um herauszufinden, ob viele aktuell aktive Leser betroffen sind und auch, um diese bevorzugt zu bereinigen, wird zusätzlich noch das Datum der letzte Ausleihe aus dem Benutzerdatensatz BIBLBENUTZER sowie das Datum der letzten Buchung aus dem Gebührenjournal BENUTZERKONTEN geholt und sortiert angezeigt.
Oracle
select bb.benutzernr,bb.ausweisnr,TO_CHAR(bb.letzteausleihe, 'dd.mm.yyyy') as letzteausl, TO_CHAR(MAX(bk.buchungsdatum), 'dd.mm.yyyy') as letztebuchung, sum(bk.betrag) as kontosaldo,sum(NVL(bk.offen,betrag)) AS summeoffen from biblbenutzer bb, benutzerkonten bk where bb.benutzernr=bk.benutzernr group by bb.benutzernr,bb.ausweisnr,bb.letzteausleihe having sum(bk.betrag)<>sum(NVL(bk.offen,betrag)) order by letzteausleihe desc, letztebuchung desc;
MSSQL
select bb.benutzernr,bb.ausweisnr,CONVERT(nvarchar, bb.letzteausleihe, 104) as letzteausl,CONVERT(nvarchar, MAX(bk.buchungsdatum), 104) as letztebuchung, REPLACE(CAST(sum(bk.betrag) AS varchar(18)), '.', ',') as kontosaldo, REPLACE(CAST(sum(ISNULL(bk.offen,betrag)) AS varchar(18)), '.', ',') as summeoffen from biblbenutzer bb, benutzerkonten bk where bb.benutzernr=bk.benutzernr group by bb.benutzernr,bb.ausweisnr,bb.letzteausleihe having sum(bk.betrag)<>sum(ISNULL(bk.offen,betrag)) order by letzteausleihe desc, letztebuchung desc
Leer vs. Null vs. 0,00
Da eine Summe der Beträge aus der Spalte "offen" gebildet wird und sich Nullwerte (Feld ist leer) nicht summieren lassen und BTP bei leerem OFFEN-Feld dort den Wert aus dem Feld BETRAG im Gebührenjournal einblendet, müssen leere offen-Felder speziell behandelt werden (einen Wert erhält OFFEN bei neuen Buchungen erst, wenn der Tagesabschluss gelaufen oder sie bezahlt werden):
Wie kann man sich das Benutzerkonto auf Datenbankebene (ohne Programmoberfläche) anschauen?
Der Befehl ist datenbanksystem-unabhängig; statt 0124567 wird eine Benutzernr aus der ersten Treffermenge mit den fehlverrechneten Konten verwendet:
select nr, buchungsdatum, buchungszeit, buchung, betrag, offen, kasse, ausgleich, login_name, zweigstelle, buchungsbez, mediennr from benutzerkonten where benutzernr='0124567' order by buchungsdatum desc, buchungszeit, nr;