Suchen eines Datensatzes in MS-Access
DeMa
- datenbank
0 Rouven
Hallo zusammen,
vielleicht kann mir jemand helfen. Ich versuche in einem an einer Tabelle gebundenen Formular anhand einer ID ein Daensatz zu suchen und bei erfolgreicher Suche dort hin zu springen.
Ich weiß, daß ich dazu die Methoden Bookmark und Clone benutzen muß, aber ich hab den Dreh irgenwie nicht hinbekommen. Hier ein kleiner Ansatz:
Private Sub Befehl4_Click()
Dim R As Recordset
Set Db = CurrentDb
Set R = Db.OpenRecordset("Beispieltabelle", dbOpenDynaset)
Kriterium = "[ID]=3" 'z.B.Sprung zum DS mit der ID=3
R.FindFirst Kriterium
MsgBox R!Name 'Gibt mir den Namen des DS aus
R.Bookmark = R!ID '???? Hier will ich zum DS springen
End Sub
Über eine schnelle Hilfe würde ich mich sehr freuen.
Gruss Manfred
Hi,
also so wie ich das sehe kommt es auf die Anwendung an ob sich das klonen lohnt oder nicht.
Generell: Wenn du FindFirst aufrufst, so wie du es oben vorgemacht hast, können zwei Dinge passieren:
Fall (2) erkennst du indem du nach der Suche die .NoMatch-Eigenschaft (true|false) ausliest. Was die mit dem Clonen lediglich machen ist dafür zu sorgen, dass eine Maske ihren aktuellen Datensatz nicht verliert nur weil im "Hintergrund" eine Suche läuft. Dazu gibts mindestens mal die folgenden Lösungen:
Dim rst As Recordset
Set rst = R.RecordSetClone
rst.FindFirst "[LastName] = 'Smith'"
If rst.NoMatch Then
Msgbox "The person was not found"
Else
''' Use the bookmark property to set the form's current record to the one found.
R.Bookmark = rst.Bookmark
End If
Der Spatz dürfte erlegt sein - na ja, vielleicht etwas übertrieben. Man erstellt vom aktuellen Recordset einen Klon, sucht auf dem Klon, und sollte man tatsächlich was finden, dann nimmt man das Bookmark zur Hilfe: Aus dem Klon liest man per Bookmark ein Lesezeichen aus (=aktueller Datensatz) und setzt es als aktuellen Datensatz für das ursprüngliche Recordset.
Vorteil dieser Variante ist, dass selbst wenn die Maske direkt auf dem Recordset R arbeitet und damit auf jegliche Bewegungen innerhalb der Datensätze reagiert, sie hier nur dann eine Veränderung vornimmt um tatsächlich den Treffer anzuzeigen
Die Kurzform von (1), Bookmarken können wir selber!
Dim aktuellerSatz As String
aktuellerSatz = R.Bookmark
R.FindFirst "[LastName] = 'Smith'"
If R.NoMatch Then
Msgbox "The person was not found"
R.Bookmark = aktuellerSatz
End If
-> Beachte die umgekehrte Logik: Findet die Suche einen Treffer ist alles OK, R steht automatisch darauf (damit ggf. auch die Anzeigemaske). Bei KEINEM Treffer macht R allerdings was falsche, es wechselt nämlich weg vom aktuellen Satz, ganz an den Anfang (und nimmt evtl. die Anzeigemaske mit). Daher müssen wir für diesen Fall auf den vorherigen aktuellen Satz zurück.
MfG
Rouven