Tipps "n" Tricks
Anwender-Software - Access

Last Update: 24. Dezember 2001/Webmaster

Benutzerdefinierte Funktion zum kaufmännischen Runden
Thema: Access 97, 2000, 2001
  Das kaufmännische Runden zählt eigentlich zu den Allerweltsfunktionen im finanzmathematischen Bereich. Da wundert es, dass Access keine eigene Rundungsfunktion besitzt. Um Werte dennoch gerundet auszugeben, müssen Sie eine eigene, benutzerdefinierte Funktion schreiben, die Sie dann zum Beispiel in Abfragen oder in VBA-Prozeduren einsetzen können.

Um gleich eventuellen Einwänden vorzubeugen: Es stimmt, dass in Access 2000 die VBA-Funktion "Round" eingeführt wurde. Doch die liefert zum Teil merkwürdige Resultate, weshalb sie für eine sinnvolle Rundung ausscheidet. Probieren Sie es aus, indem Sie den Visual Basic-Editor mit Alt+F11 aus Access heraus starten. Lassen Sie sich dann über das Menü Ansicht das Direktfenster anzeigen. Darin geben Sie folgendes ein:

?Round(3.5)

Nach einem Druck auf die Return-Taste erhalten Sie das auf eine ganze Zahl gerundete Ergebnis "4". Das ist korrekt. Versuchen Sie es dann aber noch einmal mit

?Round(4.5)

Wieder ist das Ergebnis "4", was offensichtlich nicht der kaufmännischen Rundung entspricht. Wenn Sie auf ganze Zahlen (ohne Nachkommastellen) runden, liefert "Round" immer nur gerade Zahlen.

Ebenfalls unbrauchbar für die Rundung ist der Einsatz eines Zahlenformats mit der entsprechenden Anzahl an Nachkommastellen, wie es beispielsweise im Währungsformat umgesetzt wird. Dabei kann es zu Diskrepanzen zwischen Anzeigegenauigkeit und Rechengenauigkeit kommen, denn intern rechnet Access immer mit den tatsächlich vorhandenen Werten. Es führt also kein Weg an einer benutzerdefinierten Funktion vorbei. Die im Anschluss vorgestellte Funktion erlaubt sogar die Angabe der Stellen, auf die gerundet werden soll, wobei als Standardwert "0" vorgegeben wird.

Am besten beginnen Sie mit einem neuen, leeren Modul, das Sie auf dem Datenbankregister "Module" anlegen. Im Codefenster geben Sie folgende Zeilen ein:

Public Function funcRunden(Wert, Optional Stellen = 0) _
As Double
  funcRunden = Sgn(Wert) * Int(Abs(Wert) * _
  (10 ^ Stellen) + 0.5) / (10 ^ Stellen)
End Function

Die Funktion sieht komplexer aus als sie ist. Im Prinzip verschiebt sie das Komma im zu rundenden Wert nur um die vorgegebene Anzahl an Stellen, wandelt das Resultat in eine ganze Zahl um und setzt das Komma zum Schluss wieder an die ursprüngliche Stelle.

Um keine Probleme mit negativen Zahlen zu bekommen, wird nur mit absoluten Zahlen gerechnet und das Vorzeichen durch die Multiplikation mit "Sgn(Wert)" gesetzt. Merkwürdig sieht auf den ersten Blick auch die Addition von "0,5" aus. Das ist nötig, da die Funktion "Int", mit der Sie die Umwandlung in eine ganze Zahl vornehmen, nicht rundet. Sie schneidet einfach nur die Nachkommastellen ab, weshalb Sie vorher "0,5" addieren müssen.

Nachdem Sie das Modul gespeichert haben, steht die Funktion in der gesamten Datenbank - also zum Beispiel auch in Abfragen - zur Verfügung. Sie könnten auf diese Weise ein berechnetes Abfragefeld anlegen, das bei einer Bestelltabelle mit den Feldern "Einzelpreis" und "Anzahl" wie folgt aussieht:

RundeSumme: funcRunden([Einzelpreis]*[Anzahl];2)

Das Produkt aus Einzelpreis und Anzahl wird damit auf zwei Nachkommastellen gerundet, und zwar so, dass Access auch intern anschliessend nur noch mit dieser Genauigkeit rechnet.

 

Tipps "n" Tricks
Anwender-Software - Access