BEISPIEL
HINWEIS
Direction
In welcher Richtung (adSearchForward, adSearchBackward) soll gesucht werden?
Bookmark
Lesezeichen für den Datensatz, wo die Suche starten soll.
Es werden die Angaben zu allen Personen, die
Müller, Müllermann
,
Mühlmann
oder ähnlich heißen, im
Direktfenster ausgedruckt:
Dim rs As New Recordset
rs.Open "SELECT * FROM Personen", conn, adOpenStatic
Do Until rs.EOF
rs.Find "Nachname LIKE 'Mü%'"
If Not rs.EOF Then ' notwendig, weil erfolglose Sucherei bei EOF endet!
Debug.Print rs!Anrede, rs!Vorname, rs!Nachname, rs!Gehalt
rs.MoveNext
End If
Loop
Ereignisse auswerten
Sowohl Connection- als auch Recordset-Objekte verfügen über Ereignisse. Diese treten meist paarweise auf
(vor und nach dem Auslösen einer Recordset-Operation), z.B. als WillChangeRecord und RecordChange-
Complete oder WillMove und MoveComplete. Eine Zusammenstellung aller Ereignisse finden Sie im Über-
sichtsteil des Kapitels (Seite 395) bzw. in der Online-Dokumentation.
Will man Ereignisse auswerten, so ist eine Deklaration des entsprechenden Objekts mit dem WithEvents-
Schlüsselwort unumgänglich.
Innerhalb der Ereignisprozeduren kann eine ganze Reihe von Parametern ausgewertet werden, von denen
die wichtigsten in der folgenden Tabelle zusammengestellt sind.
Parameter Bedeutung
adReason Liefert den Grund, weshalb das Ereignis ausgelöst wurde (z.B. adRsnAddNew, adRsnUpdate, adRsnMoveNext,
adRsnFirstChange ...)
adStatus Liefert den Status der Operation (z.B. adStatusOK, adStatusCancel, adStatusErrorsOccured in einer ...Complete-Event-
prozedur)
pRecordset Liefert eine Referenz auf das aktuelle Recordset-Objekt
pError Enthält einen Verweis auf Error-Objekt (adStatus = adStatusErrorsOccured)
Tabelle 7.8 Parameter, wie sie von einem Recordset-Event übergeben werden
Stellvertretend für weitere ausschweifende Auslassungen über die Besonderheiten der zahlreichen Ereignis-
se und ihrer Mutanten sollen die folgenden zwei sinnvollen Anwendungen Licht in die Dunkelheit bringen.
389
Weitere Operationen mit Recordsets
BEISPIEL
BEISPIEL
Kapitel 7: ADO-Programmierung
Die
WillChangeRecord
-Ereignisprozedur eines
Recordset
-Objekts aus der
Personen
-Tabelle überprüft, ob bei
der Gehaltseingabe die Grenze von 5.000
überschritten wird. Wenn ja, wird die Update-Operation abge-
brochen. Gleichzeitig lernen Sie eine weitere Einsatzmöglichkeit für die
EditMode
-Eigenschaft kennen.
Private WithEvents rs As Recordset
...
Private Sub rs_WillChangeRecord(ByVal adReason As EventReasonEnum, _
ByVal cRecords As Long, adStatus As EventStatusEnum, ByVal pRecordset As Recordset)
Dim bCancel As Boolean ' Anfangswert = False
If rs.EditMode = adEditDelete Then Exit Sub ' nach Löschoperation keine Überprüfung
If adReason = adRsnUpdate Then
If pRecordset!Gehalt > 5000 Then
bCancel = True : Beep
End If
End If
If bCancel Then adStatus = adStatusCancel ' Operation wird abgebrochen
End Sub
In der Beispieldatenbank
Personal.accdb
ist jedem Datensatz der
Personen
-Tabelle genau ein Datensatz der
Tabelle
Raeume
zugeordnet (Master-Detail-Beziehung). Dazu verweist der Fremdschlüssel
RaumNr
der
Tabelle
Personen
auf den Primärschlüssel
Nr
der Tabelle
Raeume
. Beim Bewegen durch das Recordset
rsRaum
soll das Recordset
rsPerson
stets aufs Neue mit den Personen gefüllt werden, die dem aktuellen Raum zuge-
ordnet sind. Die Neubildung von
rsPerson
erfolgt durch Aufruf einer parametrierten Abfrage eines
Command
-Objekts innerhalb der
MoveComplete
-Ereignisprozedur von
rsRaum
.
Dim cmd As New Command
Dim rsPerson As New Recordset
Dim WithEvents rsRaum As Recordset ' wegen MoveComplete
Das
Command
-Objekt speichert die parametrierte Abfrage:
cmd.CommandText = "SELECT * FROM Personen WHERE RaumNr = ? ORDER BY Nachname"
cmd.CommandType = adCmdText
Set cmd.ActiveConnection = conn
Das
Recordset
-Objekt für die Räume wird erzeugt:
Set rsRaum = New Recordset
rsRaum.CursorLocation = adUseClient
rsRaum.Open "SELECT * FROM Raeume ORDER BY Raum", conPers, adOpenKeyset, adLockOptimistic
Bewegt man den Datensatzzeiger weiter, ...
rsRaum.MoveNext
... wird das
MoveComplete
-Event von
rsRaum
ausgelöst. Innerhalb dieses Ereignisses erfolgt dasllen von
rsPerson
mit den Datensätzen, die die parametrierte Abfrage erfüllen:
Private Sub rsRaum_MoveComplete(ByVal adReason As EventReasonEnum, _
ByVal pError As Error, adStatus As EventStatusEnum, ByVal pRecordset As Recordset)
Set rsPerson = cmd.Execute(Parameters:=pRecordset!Nr)
End Sub
390

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.