0

以下代码(以 ADP 形式)有问题吗?

Private Sub cmbSearchCode_AfterUpdate()
  Me.Recordset.Find "usr_cde = '" & ctl & "'"`
  ctl = null
end sub

它的行为不规律:第一次打开表单后,它可以工作,然后突然它似乎不再做任何事情了。

我用这个似乎没有问题的代码替换了它:

With Me.RecordsetClone
    .Find "usr_cde = '" & ctl & "'"
    Me.Bookmark = .Bookmark
End With
ctl = Null

有什么解释吗?客户端是A2003,服务器是SS 2000(我知道它很旧,我无能为力!)

4

1 回答 1

0

Form.Recordset 属性是对访问的一个相当新的补充,帮助文本中有几位,我认为它们是如何组合的,这会导致您的问题。

例如,如果表单基于查询,则引用 Recordset 属性相当于使用相同查询克隆 Recordset 对象。但是,与使用 RecordsetClone 属性不同,更改表单的 Recordset 属性返回的记录集中的当前记录也会设置表单的当前记录。

因此,虽然它一开始看起来不像,但它确实克隆了记录集并创建了它的新副本。只是它保持同步。

所以你有一个新的Recordset 对象,问题就在这里:

当您打开一个新的 Recordset 对象时,它会自动添加到 Recordsets 集合中,并在您关闭它时自动删除。

第一次,您克隆了在 usr_cde 上找到的记录集,表格神奇地设置了当前记录以匹配。

第二轮,您克隆了在 usr_cde 上找到的记录集,但神奇的记录同步仍然停留在已保存在 Recordsets 集合中的记录集的第一个副本上。

所以你只需要关闭记录集,但要确保你不只是创建另一个副本并关闭它,请执行以下操作:

'untested
Private Sub cmbSearchCode_AfterUpdate() 
  Dim rs as adodb.Recordset

  Set rs = Me.Recordset
  rs.Find "usr_cde = '" & ctl & "'"`
  rs.Close

  ctl = null
end sub

我没有机会对此进行测试,但您已经有了使用 .Bookmark 的有效解决方案。我希望这可以解释意外的行为。

于 2011-12-10T13:48:39.850 回答