gMorgen liebe Gemeinde
ich habe auf einem Endlosformular, rechts am Ende von jeden Datensatz einem Button,
welche ein anderes Formular (hfrm_InventurAltGefiltert) öffnet, mit davor ausgesuchten Datensatz im Unterformular (ufrm_Inventar).
Dafür verwende ich diesen Code:
Private Sub btn_Oeffnen_Click()
'Hauptformular öffnen und auf die Inventur filtern
DoCmd.OpenForm _
"hfrm_InventurAltGefiltert", , , _
"ID_Inventur = " & Me.ID_Inventur
'Im Unterformular den passenden Inventar-Datensatz suchen
With Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form
[b]With .RecordsetClone[/b]
.FindFirst "ID_Inventar = " & Me.ID_Inventar
If Not .NoMatch Then
Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form.Bookmark = .Bookmark
End If
End With
End With
End Sub
Jetzt frage ich mich wofür steht das: With .RecordsetClone
ist das so richtig oder notwendig?
Die Ki spuckt leider nur technisches-Zeug der nur wirre macht.
Könnte mit das jemand kurz erklären?
Ich bedanke mich im Voraus und mit LG *crow
Das ist eine Kopie des .Form.Recordsets, in dem du dich bewegen
kannst ohne den DS-Zeiger in .Form.Recordset zu ändern.
Die Synchronisation der beiden RS erfolgt dann über die Zuweisung
des .Bookmarks vom Clone auf .Form.Recordset.
M.E. kannst du hier auch ohne den Clone zum Ziel kommen
With Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form.Recordset
.FindFirst "ID_Inventar = " & Me.ID_Inventar
If .NoMatch Then
MsgBox "Kein Inventar gefunden!"
'weiteres Vorgehen
End If
End With
gruss ekkehard
Hallo,
mit "With" stellst Du den Objektkontext ein. Ansonsten müßtest Du schreiben:
Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form.RecordsetClone.FindFirst "ID_Inventar = " & Me.ID_Inventar
Und das gleiche für ".NoMatch". Der führende Punkt sagt VBA dann, daß er sich im Objektkontext von "Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form.RecordsetClone" befindet und man kann das dann weglassen, bis zum End With. Da es hier verschachtelt ist, ist nach dem ersten End With der Objektkontext auf "Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form" zurückgestellt.
Daher muß man das manuell wieder verwenden wenn man auf den übergeordneten Objektkontext springen will:
Forms!hfrm_InventurAltGefiltert!ufrm_Inventar.Form.Bookmark = .Bookmark
Denn es gibt immer nur einen, den man mit "." beginnend verwenden kann. Somit muß man hier die komplette Objektreferenz wieder schreiben, weil man zu dem Zeitpunkt im Kontext des RecordsetClone-Objektes ist. Und ".Bookmark" verwendet dagegen den vom RecordsetClone.
Also: Formular-Bookmark auf Bookmark des RecordsetClone stellen, wenn etwas gefunden wurde.
Ich nehme auch i.d.R. die von Beaker vorgeschlagene Variante, wenn ich ein Feld direkt suchen und positionieren will. Die Bookmark-Methode ist dagegen besser, wenn man nur nach einem Datensatz suchen will, während man im Formular auf dem aktuellen stehenbleiben will (z.B. weil er noch nicht gespeichert ist und man etwa nachsehen will, ob es einen Wert im Recordset schon gibt). Dann würde man allerdings auch den Formular-Bookmark nicht auf den gefundenen setzen, sondern den gefundenen Wert zurückliefern (in einer Function).
Ansonsten hilft die Methode, wenn man bei nicht gefundenem Wert sicherstellen will, daß der aktuelle Datensatz dann nicht verschoben wird.
Gruß
Christian
Warum so kompliziert und nicht einfach die dafür vorgesehen Möglichkeit mit dem Verknüpfen von Hauptformular und Unterformular verwenden? Dann kann der komplette Code entfallen.
Knobbi38