为什么要克隆MS-Access记录集?

时间:2010-03-02 20:04:34

标签: ms-access vba clone recordset

我是VBA的新手并试图了解其他人的代码。

  

设置rstClone = Me.RecordsetClone
  rstClone.MoveFirst

为什么必须克隆记录集?为什么代码不能是Me.Recordset.MoveFirst?

4 个答案:

答案 0 :(得分:7)

您可能希望使用recordsetclone,因为您不希望影响表单中显示的记录,而me.recordset.movefirst会这样做。

答案 1 :(得分:7)

首先,记录集克隆 - 只要有记录源,表单的Recordsetclone就会存在,即使它没有记录。

其次,recordsetclone是一个独立的记录集,你可以导航它而不会影响表单的编辑缓冲区,它有一组独立的记录指针(即书签)。

也就是说,将recordset变量设置为recordsetclone是没有意义的。相反,只需使用WITH块:

  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以来,除了RecordsetClone之外,表单还有一个Recordset对象。该对象使您可以访问表单的实际编辑缓冲区,并通过它导航更改表单本身的记录指针。但是,我会避免使用它,因为使用一个单独的相同对象作为相同数据的动态集的间接似乎是一个有用的保护层,不应该做一个不应该做的事情。

答案 2 :(得分:4)

请记住,记录集具有称为克隆方法的记录集。这与表单记录集克隆不同。

在您的示例和问题中,我们讨论了表单所基于的基础数据。

如果您打算玩,并使用表单所基于的代码移动记录,但您不希望表单显示或图形界面跟随您或跳转,那么您的示例是正确和首选的方法来实现这一目标。

因此,记录集克隆是表单数据的副本。它允许您移动或遍历该记录集中的记录,但表单(用户界面)不会跟踪您在记录中的移动。

请记住,在某些情况下,如果您确实希望表单移动到下一条记录,那么您将不会使用记录集克隆,而是使用实际记录集。

例如:

Set rstClone  = me.recordset
rstClone.movenext

在上面,表单将移动到下一条记录。

典型情况是您使用子表单时。如果要总计或遍历该子表单中的10条记录,则可以在不影响或导致子表单当前指向更改的当前显示记录的情况下执行此操作。它可以让你在幕后做事情可以这么说。

但是,如果您只想移动到窗体下一条记录,那么您不需要reocrdset或记录集克隆,只需执行一个命令即可将表单移动到下一条记录。

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

DoCmd.GoToRecord acActiveDataObject, , acNext

而且,如果你想查看表单中放置的代码中的值,你不需要recordset或recordsetClone,你可以去:

me!nameOfCollumFromTable

答案 3 :(得分:0)

使用recordset属性可能会导致意外行为。具体来说(在Access 2010中),如果您引用me.recordset,它可能会意外地导致保存表单的编辑缓冲区。

例:

debug.print me.recordset.recordcount

将导致保存表单记录。使用recordsetClone不会表现出这种[mis]行为。