Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Mathe / NZ

Null-Werte de-problemisieren

Einleitung

Bei der Datenbank-Programmierung trifft man sehr häufig auf Null-Felder, also Felder, die absolut leer sind. VB kennt für diesen Zustand die Konstante Null, welche nur selten für sinnvolle Operationen benutzt werden kann, im Gegensatz zu Empty, das sich wie ein neutrales Element (bzgl. Addition) verhält.

So ergibt z.B. Null + 5 einfach nur Null. Eine Zuweisung von Null an einen nicht-Variant erzeugt sogar einen Fehler.

Microsoft Access kennt die sogenannte NZ-Funktion, welche ein Null ggf. in einen unkritischen Wert (default: Empty) übersetzt. So können in Access leicht die obigen Probleme vermieden werden.

In dem unten gezeigten Quelltext einer NZ-Funktion wird genau dies realisiert, so dass auch in "purem" Visual Basic komfortabel mit Null-Werten umgegangen werden kann.

Beispiele

Die NZ-Funktion kann sowohl mit Strings als auch mit Zahlen umgehen:

Dim s As String
s = NZ("XYZ")          'ergibt "XYZ"
s = "ABC" & NZ(Null)   'ergibt "ABC"
s = NZ(Null)           'ergibt "" (Leerstring)
s = NZ(Null, "(leer)") 'ergibt "(leer)"
s = Null               'erzeugt Error!
Dim n As Long
s = NZ(7)        'ergibt 7
n = 4 + NZ(Null) 'ergibt 4
n = NZ(Null)     'ergibt 0
n = NZ(Null, -1) 'ergibt -1
n = Null         'erzeugt Error!

Alternativen

Verwendung von IIf

Die NZ-Funktion könnte ggf. auch durch Verwendung der IIf-Funktion ersetzt werden (sieht man oft als Empfehlung):

y = NZ(x)
y = IIf(IsNull(x), Empty, x)

Beide Zeilen machen das gleiche, allerdings ist die NZ-Funktion im (voll optimiert) kompilierten Programm etwa doppelt so schnell und zudem deutlich besser lesbar.

Verwendung von String-Konkatenation

Für Strings kann durch Anhängen eines Leerstrings ein potenzielles Null in ein Leerstring umgewandelt werden:

y = NZ(x)
y = x & ""

Beide Zeilen machen wieder das gleiche, diese Methode ist sogar etwa doppelt so schnell wie der Aufruf der NZ-Funktion. Allerdings: Selbstdokumentierend würde ich diese Methode nicht nennen, und sie funktioniert nur für Strings!

Code / Quelltext

Der Algorithmus ist sehr einfach, insbesondere da der Default-Ersatzwert auf Empty gesetzt wurde, welches ja gerade als neutrales Element interpretiert wird. So können umständliche Prüfungen auf den Datentyp entfallen (für Zahlen ist das neutrale Element eine 0, für Strings dagegen ein Leerstring ""):

Public Function NZ( _
    ByVal Value As Variant, _
    Optional ByVal ValueIfNull As Variant = Empty _
  ) As Variant
  
  If IsNull(Value) Then
    NZ = ValueIfNull
  Else
    NZ = Value
  End If
End Function

© Jost Schwider, 23.11.2001-23.11.2001 - http://vb-tec.de/nz.htm