Intern: Ermittlung Fehlverrechnungen in Gebührenjournalen per SQL
Gilt für
- BIBLIOTHECAplus
Antwort
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
Weitere Informationen
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):
- Unter Oracle: NVL
- Unter MSSQL: ISNULL
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;
- anhand der "kasse" sehe ich, ob es gebühren (F) oder zahlungen sind (T und E)
- anhand von "ausgleich" sehe ich den verrechnungsstatus, (0 - Buchung unverrechnet, 10 verrechnet; 1 Storno unverrechnet, 11 Storno verrechnet; 2 Erlass unverrechnet, 12 Erlass verrechnet)
- anhand der "mediennr" sehe ich, welche exemplarbezogenen Gebühren zusammen gehören, was bspw. bei Verzugs- oder Mahngebühren sehr hilfreich
(Achtung: das Feld heißt missverständlicherweise intern "Mediennr", obwohl eine Exemplarnr drin steht, bitte nicht verwirren lassen!) - anhand von "betrag" die Nachkommastellen prüfen - wenn es mehr als 2 Nachkommastellen gibt UND das Buchungsdatum vor dem Jahr 2002 liegt, kann das auf ggf. vorliegende Rundungsdifferenzen aus der Voreurozeit hinweisen (wenn ein Euroscript einmal eingespielt worden ist, stehen normalerweise dann auch Eurobuchungen vom 1.1.2002 im Gebührenjournalen)