BEISPIEL
Kapitel 6: DAO-Programmierung
Datensätze anzeigen
Diese Aufgabe bezieht sich auf eine der wesentlichsten Änderungen gegenüber der Access-typischen Pro-
grammierung mit gebundenen Steuerelementen (Bound Controls). Für die Anzeige der Feldinhalte muss
der DAO-Programmierer nun selbst sorgen. Welche Möglichkeiten bestehen und welche Besonderheiten
dabei beachtet werden müssen, soll dieser Abschnitt zeigen.
Grundsätzlich können Sie den Feldinhalt über die Value-Eigenschaft ermitteln. Da die Schreibweise aller-
dings recht umständlich ist, haben die Access-Entwickler einige Vereinfachungen getroffen, wobei mehrere
Möglichkeiten bestehen.
Das erste Feld des aktuellen Datensatzes einer Tabelle mit den Feldern
Nachname
,
Vorname
,
Gehalt
auslesen:
X = Recordset!Nachname
oder:
X = Recordset!Nachname.Value
oder:
X = Recordset(0)
' oder:
X = Recordset(0).Value
Wir möchten allerdings von der Praxis der beiden letzten Codezeilen abraten, da sich die Position von
Feldern in einer Tabelle/Abfrage ändern kann. Sicherer ist das Vorgehen im ersten Beispiel bzw. die folgen-
de Möglichkeit, um das Feld mit dem Namen Gehalt auszulesen:
X = Recordset("Gehalt").Value
oder:
X = Recordset("Gehalt")
Das Setzen der Feldinhalte geschieht analog:
Recordset!Gehalt = X
oder:
Recordset("Gehalt") = X
Beachten Sie allerdings, dass Tabellenfelder auch NULL-Werte enthalten können. Die direkte Zuweisung
führt dann zu einem Laufzeitfehler:
s$ = dy!Gehalt
Zwei verschiedene Lösungsmöglichkeiten bieten sich an:
1. Sie realisieren eine Fehlerbehandlung (z. B. On Error GoTo):
On Error Resume Next
Dim dy As Recordset
316
HINWEIS
BEISPIEL
HINWEIS
Dim s As String
...
s = dy!Gehalt
Ein Nachteil dieser Variante soll nicht verschwiegen werden: Ist die Variable schon mit einem älteren Wert
belegt, bleibt dieser erhalten, der Inhalt der Variablen entspricht nicht mehr den realen Daten!
2. Sie lesen die Werte in eine Variant-Variable ein:
Dim s As String, v
...
v = dy!Gehalt
If IsNull(v) Then s = "" Else s = v
Kürzer, aber nicht ganz so übersichtlich, ist die folgende Notation:
Dim s$, v
...
s = IIf(IsNull(dy!Gehalt), "0,00", dy!Gehalt)
Mit der Option weisen Sie einfach einen Standardwert zu (z.B. 0,00 Euro), wenn es sich um einen NULL-
Wert handelt.
Eine weiteres Problem der direkten Programmierung sollte ebenfalls nicht verschwiegen werden: Die
Darstellung von Grafiken bzw. OLE-Objekten aus einer Datenbank ist derzeit nicht bzw. nur sehr umständ-
lich möglich.
Zum Thema »Daten auslesen«: Wollen Sie ein Basic-Array mit Werten füllen, können Sie sich das Auslesen der
einzelnen Zellen sparen. Mit der Methode GetRows lässt sich ein Variant-Array mit einer einzigen Anweisung füllen.
GetRows
-Methode:
Dim db As Database
Dim rs As Recordset
Dim v As Variant
Dim zeile As Long, spalte As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT nachname, vorname FROM Personen")
Füllen des Arrays (20 Zeilen):
v = rs.GetRows(20)
GetRows verschiebt den Satzzeiger um die angegebene Anzahl von Zeilen!
Die Array-Grenzen ermitteln Sie mit der UBound-Funktion. Geben Sie als zweiten Parameter die jeweils ge-
wünschte Arraydimension an:
317
Arbeiten mit Recordsets
BEISPIEL
HINWEIS
BEISPIEL
HINWEIS
Kapitel 6: DAO-Programmierung
x0,y0
x2,y3x1,y3x0,y3
x2,y2x1,y2x0,y2
x2,y1x1,y1x0,y1
x2,y0x1,y0
Dimension 1
Dimension
2
Abbildung 6.4 Zweidimensionales Feld
Die Umsetzung im Listing sieht folgendermaßen aus:
For zeile = 0 To UBound(v, 2)
For spalte = 0 To UBound(v, 1)
Debug.Print v(spalten, zeilen) & ", "
Next spalte
Debug.Print
Next zeile
Die etwas umständlichere Lösung des Problems:
Dim db As Database
Dim rs As Recordset
Dim a(1, 20) As String
Dim zeile As Long, spalte As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT nachname, vorname FROM Personen")
For zeile = 1 To 20
For spalte = 0 To 1
a(spalte, zeile) = rs(spalte)
Next spalte
rs.MoveNext
Next zeile
...
Beachten Sie, dass auch genügend Datensätze vorhanden sind. Im obigen Beispiel würde ein Laufzeitfehler
auftreten, wenn es weniger als 20 sind.
Zum Auslesen der gesamten Datenmenge wird gern eine
While
-Schleife verwendet:
While Not dy.EOF
n = dy!nr
s = dy!nachname
g = dy!vorname
dy.MoveNext
Wend
Vergessen Sie die MoveNext-Methode, haben Sie die ideale Endlosschleife programmiert, also aufgepasst!
318

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.