2010-03-02 7 views
6

Ich bin ein Neuling bei VBA und versuche den Code von jemand anderem zu verstehen.Warum ein MS-Access-Recordset klonen?

Sets rstClone = Me.RecordsetClone
rstClone.MoveFirst

Warum der Re-Cord hat geklont werden? Warum kann der Code nicht Me.Recordset.MoveFirst sein?

+2

Bitte beachten Sie, dass .recordsetClone nur mit DAO-Recordsets verfügbar ist. Der Aufruf dieser Eigenschaft in einem Formular mit einem ADODB-Recordset führt zur Laufzeit zu einem Fehler (obwohl dies bei der Kompilierung nicht erkannt wurde) –

Antwort

7

Vielleicht möchten Sie den Recordsetclone verwenden, weil Sie die im Formular angezeigten Datensätze nicht beeinflussen wollen, die me.recordset.move zuerst tun würde.

7

Zunächst ist das Recordset nicht geklont - der Recordsetclone des Formulars existiert, solange es eine Recordsource gibt, auch wenn es keine Datensätze enthält. Der Recordsetclone ist ein unabhängiges Recordset, das Sie navigieren können und keinen Effekt auf den Editierpuffer des Formulars haben, der einen unabhängigen Satz von Datensatzzeigern (d. H. Lesezeichen) aufweist.

Das heißt, es ist ziemlich sinnlos, eine Recordset-Variable auf den Recordsetclone zu setzen. Stattdessen nur ein MIT-Block verwenden:

With Me.RecordsetClone 
    .FindFirst "[MyPK]=" & Me!cmbFindByPK 
    If Not .NoMatch Then 
     If Me.Dirty Then 
      Me.Dirty = False 
     End If 
     Me.Bookmark = .Bookmark 
    End If 
    End With 

Die Alternative eine Datensatz Variable Einstellung wie folgt aussieht:

Dim rs As DAO.Recordset 

    Set rs = Me.RecordsetClone 
    rs.FindFirst "[MyPK]=" & Me!cmbFindByPK 
    If Not rs.NoMatch Then 
    If Me.Dirty Then 
     Me.Dirty = False 
    End If 
    Me.Bookmark = rs.Bookmark 
    End If 
    Set rs = Nothing 

Beachten Sie auch, dass seit Access 2000, hat das Formular auch ein Recordset-Objekt zusätzlich zu der RecordsetClone. Dieses Objekt gibt Ihnen Zugriff auf den tatsächlichen Bearbeitungspuffer des Formulars, und die Navigation durch es ändert den Datensatzzeiger im Formular selbst. Ich würde es jedoch vermeiden, es zu verwenden, da die Indirektion, ein separates identisches Objekt zu verwenden, das ein Dynaset der gleichen Daten ist, eine hilfreiche Schicht des Schutzes vor Dingen zu sein scheint, die man nicht tun sollte.

4

Denken Sie daran, dass Datensätze, die eine Klon-Methode aufgerufen haben. Dies ist anders als der Datensatzsatz klon.

In Ihrem Beispiel und Ihrer Frage sprechen wir über die zugrunde liegenden Daten, auf denen das Formular basiert.

Wenn Sie mit Datensätzen, die Code verwenden, auf denen ein Formular basiert, spielen und sich durch diese bewegen möchten, aber nicht möchten, dass die Formularanzeige oder grafische Benutzeroberfläche Ihnen folgt oder springt, dann ist Ihr Beispiel der richtige und bevorzugte Weg, dies zu erreichen.

Also Datensatzsatz Klon ist eine Kopie der Formulardaten. Es ermöglicht Ihnen, Datensätze in diesem Datensatz zu verschieben oder zu durchlaufen, aber das Formular (die Benutzeroberfläche) folgt nicht dem Durchlaufen der Datensätze.

Denken Sie daran, in einigen Fällen, wenn Sie tatsächlich möchten, dass das Formular zum nächsten Datensatz wechselt, dann würden Sie keine Datensätze verwenden, die den Klon festlegen, sondern den tatsächlichen Datensatz verwenden.

ZB:

Set rstClone = me.recordset 
rstClone.movenext 

In der oben würde die Form dann zum nächsten Datensatz wechseln.

Eine typische Situation ist, wenn Sie Unterformulare verwenden.Wenn Sie die 10 Datensätze in diesem Unterformular zusammenfassen oder durchqueren möchten, können Sie dies tun, ohne den aktuellen Anzeigedatensatz zu beeinflussen oder zu verursachen, auf den das Unterformular gerade zeigt. Sie können so Dinge hinter den Kulissen tun.

Wenn Sie jedoch nur zum nächsten Datensatz der Formulare wechseln möchten, dann brauchen Sie weder reocrdset noch recordset clone. Sie könnten einfach einen Befehl ausführen, der das Formular in den nächsten Datensatz verschiebt.

Sie können den folgenden typischen Befehl verwenden:

DoCmd.GoToRecord acActiveDataObject, , acNext 

Und Sie nicht-Cord benötigen, oder RecordsetClone, wenn Sie bei Werten in Code in einem Formular suchen wollen, können Sie einfach gehen:

me!nameOfCollumFromTable 
0

Die Verwendung der Recordset-Eigenschaft kann zu unbeabsichtigtem Verhalten führen. Wenn Sie (in Access 2010) auf me.recordset verweisen, kann es unerwartet dazu führen, dass der Bearbeitungspuffer des Formulars gespeichert wird.

Bsp .:

debug.print me.recordset.recordcount 

bewirkt, dass der Datensatz des Formulars gespeichert werden. Die Verwendung von recordsetClone zeigt dieses [Fehl-] Verhalten nicht.