在Access VBA中编辑基础记录时“数据已更改”错误

时间:2014-02-06 08:00:53

标签: forms vba ms-access-2007 access-vba

我在Access中有一个表单,其中有2个未绑定的多选列表框,其中有一些代码可以在它们之间移动项目。

列表框中显示的表中的每个字段都是布尔值 - 如果值为true,则该字段的名称显示在lstSelected中,如果false显示在lstUnselected中}。

列表框的RowSourceType为Value List,值列表是以编程方式生成的,方法是查看底层记录并构造一个字符串名称的字符串,其中布尔值为lstSelected为真,{{{{{ 1}}。

在表单上,​​我有两个按钮,lstUnselectedcmdMoveToSelected。当我单击cmdMoveToUnselected时,它会通过执行SQL字符串将cmdMoveToSelected列表框中任何选定项的基础字段的布尔值从false更改为true,然后重建两个列表框的值列表。

我把所有这些工作都很好。如果我执行了lstUnselectedme.lstUnwanted.requery,那么一切都会正确显示,并且正确编辑了基础字段,但是当我点击表单上的任何其他内容时,我会收到错误:

  

数据已更改。

     

在您尝试保存更改之前,另一位用户编辑了此记录并保存了更改。

     

重新编辑记录。

现在我找到了解决方法(me.lstwanted.requery是正在处理的记录的主键):

jobDetailsID

这会重新查询表单,然后移回当前记录,这就消除了错误,但是它会导致延迟并且表单在第一个记录打开时闪烁,更改回正确记录并重新填充列表框。

有没有办法可以解决这个错误,或者让它以编程方式触发,以便通过vba关闭警告来捕获它?

提前致谢。

4 个答案:

答案 0 :(得分:1)

也许有助于不将表单绑定到cmdMoveToSelected所更改的表,而是绑定到不包含所有布尔字段的查询。如果cmdMoveToSelected更改一个或多个布尔字段,则记录将更改,但查询结果不会更改。不确定它是否合理。

它听起来有点像设计问题而不是表单问题,将选项存储在布尔字段中而不是存储在相关表中。

答案 1 :(得分:0)

可能最好的解决方案是直接更新表格中的当前记录,而表格是脏的。相反,当项目从一个列表框移动到另一个列表框时,更新表单本身(Me!FieldName)中字段的值,并让表单照常将这些值写回表中。

答案 2 :(得分:0)

我似乎修好了它,虽然修复对我来说没有多大意义。

我在Me.Refresh添加了按钮点击代码,在我重新获得两个列表框之后,它似乎已经停止了消息的出现。 然而这只适用于我在表单上显示JobDetailsID文本框的情况(虽然我希望这是任意的,并且任何字段链接的文本框都可以使用)。

有人可以向我解释为什么会这样吗?我想完全理解何时使用requery,刷新等

答案 3 :(得分:0)

当我将控件转换为未绑定的文本框等后,将表单RowSource查询挂起,我发生了这种事情。一般的Form rowsource查询(引入所有字段我可能最终使用)为我提供了与表字段名相同的查询列表,使得根据需要选择控件名称变得简单。工作正常,但您必须在所有名称匹配后删除表单行源查询。 (之后DLookup和BeforeUpdate用于获取和存储值和更改。)