MS使用“查找”对话框访问“更新或取消更新”错误

时间:2010-11-19 19:35:56

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

我们有一个MS Access 2007数据库,其中包含一个显示表数据的简单表单。我们使用“查找”对话框(单击“主页”功能区上的双筒望远镜)查找我们想要的记录。这可能会在特定情况下导致错误。

重现问题的步骤:

  1. 打开表单。
  2. 打开查找对话框。
  3. 编辑记录中的某些字段。 该记录现在处于更新模式 (你会看到铅笔的行 “gutter”地区)。
  4. 如果不保存记录,请单击 ALREADY打开查找对话框。
  5. 搜索不能的记录 找到。
  6. 再次点击表格。记录 仍然处于编辑模式(即 铅笔仍显示)。尝试保存 或编辑其他字段。
  7. 将显示此消息框 “没有更新或取消更新 AddNew或Edit。“您可以单击确定或 帮助按钮。
  8. 单击“帮助”按钮显示:

      

    您尝试调用Update或CancelUpdate或尝试更新字段      在没有先调用AddNew或Edit的记录集中。 (错误3020)

         

    在Microsoft Access数据库引擎数据库上,您调用了Update或      CancelUpdate方法但在写入之前没有使用AddNew或Edit方法      数据到记录。

         

    在ODBCDirect数据库上,尝试写入数据时会发生此错误      没有先调用AddNew或Edit。

    的记录

    我们在一个没有VBA代码的新数据库中重现了这一点。所以问题仅在MS Access中,您应该能够轻松地重现它。

    如果在执行查找之前保存记录,则不会发生此问题。不幸的是,我们让用户在记录处于编辑模式时进行查找。

    我们已尝试设置表单级,数据字段级和Access应用程序级事件以及错误处理。没有什么能够发现或抓住这种情况。 VBA中无法检测“查找”对话框是否处于活动状态。

    在查找发生之前,有没有人有任何防止错误的想法或保存记录的方法?我们现在最好的想法是创建一个等待“查找”对话框具有焦点的AutoHotkey或AutoIt脚本。然后我们将发送一个Ctrl + S来保存当前记录以强制保存。

3 个答案:

答案 0 :(得分:1)

我建议您发现MS-Access 2007中引入的错误。但是,我无法在我的副本上复制它。我认为我们的补丁都是最新的,所以也许会有更微妙的事情发生。

如果您想强制保存记录,请使用以下之一 - 而不是CTRL-S

  • if me.dirty then Me.Dirty = false ''(n.b. often the preferred method)

  • Docmd.RunCommand acCmdSaveRecord

  • DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 ''(n.b. deprecated)

我理解的问题是,如果他们在“查找”已经打开后编辑表单然后执行“查找”则会得到错误。

我会尝试以下两种方法之一:

  1. 找到一种方法来关闭内置的查找表单,并在每次使当前记录变脏时执行此操作(On Dirty)
  2. 在表单中添加您自己的“查找”按钮(不打开内置的查找表单),并隐藏功能区上的那个。

答案 1 :(得分:1)

我们提出的hack,解决方法是编写一个AutoIt脚本,该脚本可以查看“查找”对话框何时获得焦点并保存记录(如果已更改)。

我们不想单独从数据库分发脚本,因此脚本作为Blob添加到数据库表中。数据库的AutoExec宏运行一些VBA代码,将脚本从Blob表中拉出并启动脚本。

当脚本检测到“查找”对话框具有焦点时,脚本将在数据库中运行VBA宏。宏检查当前记录是否脏。如果脏,宏会强制保存。此外,关闭数据库时将停止AutoIt脚本。

这一切都很尴尬,但它确实有效。

答案 2 :(得分:1)

@ CodeSlave的回答表明了我的可能性:

不是简单地从工具栏/功能区中取出双筒望远镜,而是改变双筒望远镜的功能。也就是说,让它调用保存当前记录的代码,如果它是脏的,然后启动FIND对话框。

现在,需要一些代码来检查表单是否已打开,并且它有一个记录源(如果没有记录源则测试.Dirty属性错误),并且字段具有焦点,但所有那些事情是可行的。通过仅在加载表单时显示工具栏/功能区,或者在表单打开时编辑默认工具栏/功能区,可能会有许多(最后一个除外)处理。

但这比使用进程外解决方案要简单得多,而且您的用户也不会知道任何差异。