发现.ADP形式的表现不一致

时间:2011-11-23 09:35:59

标签: ms-access adp

以下代码是否有问题(以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(我知道它已经老了,我无能为力!)

1 个答案:

答案 0 :(得分:0)

Form.Recordset Property是一个相当新的访问权限,帮助文件中有几个位,它们是我们认为导致你的问题的结合方式。

  

如果表单基于查询,例如,请参阅   Recordset属性相当于克隆Recordset对象   使用相同的查询。但是,与使用RecordsetClone不同   属性,更改返回的记录集中的当前记录   通过表单的Recordset属性也设置了当前的记录   形式。

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

所以你有了一个新的Recordset Object,这就是摩擦:

  

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

第一次,你在usr_cde上克隆记录集find,并且表单神奇地设置当前记录以匹配。

第二次,你在usr_cde上克隆了记录集find,但是魔法记录同步仍然停留在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的工作解决方案。我希望这可以解释意外行为。