Kapitel 6: DAO-Programmierung
Welche internen Funktionen müssen realisiert werden?
Auswahl der betreffenden Datensätze (eine SELECT-Klausel)
Ein-/Auslesen von Datensätzen (ohne Bound Control müssen wir diese Aufgabe selbst übernehmen)
Syntax- und Wertebereichsüberprüfung (gern vernachlässigt, aber unumgänglich)
Sicherheitsabfragen (Löschen, Sichern, Verlassen)
Multiuser-Unterstützung
Suchen mit Hilfe der Datenbankobjekte
Programmierung
Wir gehen davon aus, dass sich die zu editierende Tabelle in der aktuellen Datenbank befindet. Sollte das
nicht der Fall sein, genügt es, wenn Sie bei der Initialisierung des Database-Objekts die Funktion Open-
Database aufrufen (anstatt CurrentDB).
Variablen (Modulebene)
Option Explicit
Private db As Database
Private tb As Recordset
Private timeOut As Long
Private cTimeOut As Long
Über die Variable
cTimeOut
bestimmen Sie, wann ein Anwender daran erinnert werden soll, einen geöffneten
Datensatz wieder zu schließen. Da wir mit Pessimistic-Locking arbeiten, sollte die Zeit zwischen Öffnen und
Schließen des Datensatzes möglichst kurz sein, andere Benutzer haben in dieser Zeit keine Möglichkeit, den
Datensatz zu editieren.
Startaktivitäten
Mit dem Laden des Fensters sperren wir zuerst alle Textfelder für die Bearbeitung. Auf diese Weise ist der An-
wender gezwungen, die »Editieren«-Schaltfläche anzuklicken, wenn er Änderungen an den Daten durch-
führen möchte.
Private Sub Form_Load()
Dim i As Integer, c As Control
Me.TimerInterval = 0
timeOut = 0
cTimeOut = 3 ' nach 3 Sekunden TimeOut !!!
Set db = CurrentDb()
Set tb = db.OpenRecordset("Städte und Telefonvorwahl", _
DB_OPEN_TABLE)
For i = 0 To Me.Controls.Count - 1
Set c = Me.Controls(i)
If TypeOf c Is TextBox Then
c.Locked = True ' schreibgeschützt
c.Value = ""
End If
352
If TypeOf c Is CheckBox Then c.Enabled = False
Next
Call anzeigen
End Sub
Allgemeine Prozeduren/Funktionen
Die Prozedur
anzeigen
ist dafür verantwortlich, den aktuellen Datensatz in die Maske einzulesen. Ist kein
aktueller Datensatz vorhanden, sind die Feldinhalte der Maske zu löschen.
Sub anzeigen()
feld0.Value = auslesen("Ort")
feld1.Value = auslesen("Vorwahl")
End Sub
Das Aussehen der obigen Prozedur ist von Feldanzahl und Datentyp abhängig. Schreibgeschützte Felder
(Counter) können Sie in Bezeichnungsfeldern anzeigen, Typumwandlungen werden automatisch vorgenom-
men. Die Funktion
auslesen
übernimmt die undankbare Aufgabe, Fehler, die im Zusammenhang mit dem
Auftreten von NULL-Values ausgelöst werden, zu umgehen. Von zentraler Bedeutung ist in diesem Zusam-
menhang die Verwendung einer
Variant
-Variablen:
Function auslesen(feldname As String) As Variant
On Error GoTo fehler3
Dim v As Variant
v = tb.Fields("[" & feldname & "]")
If (VarType(v) = vbNull) Or (VarType(v) = vbEmpty) Then auslesen = "": Exit Function
If (VarType(v) = vbCurrency) Then auslesen = Format$(v, "#0.00"): Exit Function
If (VarType(v) = vbBoolean) Then
If v Then auslesen = 1 Else auslesen = 0
Exit Function
End If
auslesen = CStr(v)
Exit Function
fehler3:
If tb.Fields("[" & feldname & "]").Type = dbBoolean Then
auslesen = 0
Else
auslesen = ""
End If
Exit Function
Resume Next
End Function
Die Fehlerbehandlungsroutine wird angesprungen, wenn kein Datensatz vorhanden ist. In diesem Fall wird je
nach Datentyp ein Leerstring bzw. ein
False
zurückgegeben. Damit ist die Maske gefüllt, und wir können uns
dem Hinzufügen von Datensätzen zuwenden.
Neuer Datensatz
Nach dem Klick auf die Schaltfläche »Neu« läuft folgende Routine ab:
Private Sub Neu_Click()
On Error GoTo fehler4
Dim i%, c As Control
353
Komplexbeispiel: Telefonverzeichnis
Kapitel 6: DAO-Programmierung
Ist die Tabelle/Abfrage nicht editierbar, weisen wir an dieser Stelle den Versuch ab (Ursache: Es handelt sich
z.B. bei der Abfrage um einen Join).
If Not dy.Updatable Then
MsgBox "Datensätze können nicht bearbeitet werden!", 16, "Problem"
Exit Sub
End If
Ist das Recordset editierbar, rufen wir die folgende Methode auf:
dy.AddNew
Nachfolgend werden alle Eingabe-Steuerelemente zurückgesetzt. Eventuell könnten Sie an dieser Stelle Er-
weiterungen vornehmen (z.B. Datumsfelder mit aktuellem Datum initialisieren). Der Schreibschutz wird
ebenfalls aufgehoben.
For i = 0 To Me.Controls.Count - 1
Set c = Me.Controls(i)
If TypeOf c Is TextBox Then
c.Locked = False : c.Value = ""
End If
If TypeOf c Is CheckBox Then
c.Enabled = True : c.Value = 0
End If
If TypeOf c Is Label Then
If c.BorderStyle = 1 Then c.Caption = ""
End If
Next
feld0.SetFocus
Call tastenAktivieren
Exit Sub
fehler4:
MsgBox Error, 16, "Problem"
Exit Sub
Resume Next
End Sub
Mit der Prozedur
tastenAktivieren
werden alle Schaltflächen gesperrt (
Enabled = False
), die für das Anfügen
nicht unbedingt erforderlich sind. Freigegeben sind lediglich die Schaltflächen »Sichern« und »Abbruch«, die
sich hinter den Schaltflächen »Editieren« und »Neu« befinden:
Sub tastenAktivieren()
Neu.Visible = Not Neu.Visible
Edit.Visible = Not Edit.Visible
ende.Enabled = Not ende.Enabled
tRefresh.Enabled = Not tRefresh.Enabled
Löschen.Enabled = Not Löschen.Enabled
tprevious.Enabled = Not tprevious.Enabled
tNext.Enabled = Not tNext.Enabled
tfirst.Enabled = Not tfirst.Enabled
tlast.Enabled = Not tlast.Enabled
End Sub
Auf diese Weise vermeiden wir Fehlfunktionen durch falsche Bedienung. Es kann nur gesichert oder verwor-
fen werden, andere Möglichkeiten bestehen nicht.
354

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.