2010-03-02 127 views
6

我是VBA的新手,試圖理解別人的代碼。爲什麼克隆MS-Access記錄集?

設置rstClone = Me.RecordsetClone
rstClone.MoveFirst

爲什麼記錄已經被克隆?爲什麼代碼不能是Me.Recordset.MoveFirst?

+2

請注意.recordsetClone僅適用於DAO記錄集。在帶有ADODB記錄集的表單上調用該屬性將導致運行時出現錯誤(儘管在編譯時未檢測到) – 2010-03-08 07:16:47

回答

7

您可能希望使用記錄集,因爲你不希望影響到形式,me.recordset.movefirst會做顯示的記錄。

7

首先,記錄集是而不是克隆 - 只要有記錄源,表單的Recordsetclone就存在,即使它不包含任何記錄。

二,記錄集是一個獨立的記錄,你可以瀏覽,而不是對形式的編輯緩衝區,其中有一組獨立的記三分球(即,書籤)的效果。

這就是說,它是相當無意義到記錄變量設置爲記錄集。相反,只要使用一個帶座:

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 

使用設置一個記錄集變量替代看起來是這樣的:

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 

還要注意的是,因爲Access 2000中,形式也有除了Recordset對象RecordsetClone。該對象使您可以訪問表單的實際編輯緩衝區,並且通過它進行導航可更改表單本身中的記錄指針。儘管如此,我會避免使用它,因爲使用一個獨立的相同對象的間接方式是相同數據的動態集合,似乎是一個有用的保護層,不應該做一件不應該做的事情。

4

請記住,記錄集有稱爲克隆方法。這與表單記錄集克隆不同。

在您的示例和問題中,我們討論了表單基於的基礎數據。

如果你要玩,並通過使用該表格是基於代碼的記錄移動,但你不想形式顯示或圖形界面跟着你一起或跳來跳去那麼你的例子是正確和首選的方法來完成這一點。

因此,記錄集克隆是表單數據的副本。它允許您移動或遍歷該記錄集中的記錄,但表單(用戶界面)不會跟蹤您在記錄中的移動。

請記住,在某些情況下,如果你是想要的形式移動到下一條記錄,那麼你就不會使用克隆設置記錄,但是使用實際的記錄集。

如:

Set rstClone = me.recordset 
rstClone.movenext 

在上面,形式會再移動到下一個記錄。

一個典型的情況是當你使用子表單。如果您想要總計或遍歷該子表單中的10條記錄,則可以這樣做,而不會影響或導致子表單當前指向的當前顯示記錄發生更改。它可以讓你在幕後做事情。

但是,如果您只是想移到表單下一條記錄,那麼您不需要reocrdset或記錄集克隆,只需執行將表單移動到下一條記錄的命令即可。

您可以使用下面的典型命令:

DoCmd.GoToRecord acActiveDataObject, , acNext 

而且,你不需要記錄或記錄集,如果你想看看放在一個形式碼值,你可以去:

me!nameOfCollumFromTable 
0

使用recordset屬性可能會導致意外的行爲。特別是(在Access 2010中),如果引用me.recordset,它可能會意外地導致表單的編輯緩衝區被保存。

例:

debug.print me.recordset.recordcount 

將導致保存在窗體的記錄。使用recordsetClone不會出現這種[mis]行爲。