Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Button mit RecordsetClone

Begonnen von WhiteCrow, Heute um 12:16:06

⏪ vorheriges - nächstes ⏩

WhiteCrow

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

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Bitsqueezer

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

Knobbi38

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