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

dmr*_*dmr 6 ms-access vba clone recordset

我是VBA的新手,试图了解别人的代码.

设置rstClone = Me.RecordsetClone
rstClone.MoveFirst

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

Fio*_*ala 7

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


Dav*_*ton 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
Run Code Online (Sandbox Code Playgroud)

使用设置记录集变量的替代方法如下所示:

  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
Run Code Online (Sandbox Code Playgroud)

另请注意,自Access 2000以来,除了RecordsetClone之外,表单还有一个Recordset对象.该对象使您可以访问表单的实际编辑缓冲区,并通过它导航更改表单本身的记录指针.但是,我会避免使用它,因为使用一个单独的相同对象作为同一数据的动态集的间接看起来似乎是一个有用的保护层,不应该做任何事情.


Alb*_*lal 5

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

例如:

\n\n
Set rstClone  = me.recordset\nrstClone.movenext\n
Run Code Online (Sandbox Code Playgroud)\n\n

在上面,表格将移至下一条记录。

\n\n

典型的情况是当您\xe2\x80\x99 使用子表单时。如果您想要合计或遍历该子表单中的 10 条记录,您可以这样做,而不会影响或导致子表单当前指向的当前显示记录发生更改。可以说,它可以让您在幕后做一些事情。

\n\n

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

\n\n

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

\n\n
DoCmd.GoToRecord acActiveDataObject, , acNext\n
Run Code Online (Sandbox Code Playgroud)\n\n

而且,如果您想查看放置在表单中的代码中的值,则不需要 recordset 或 recordsetClone,您可以直接执行以下操作:

\n\n
me!nameOfCollumFromTable\n
Run Code Online (Sandbox Code Playgroud)\n