使用“查找”对话框的MS Access“ Update或CancelUpdate”错误

Dea*_*ill 5 ms-access vba ms-access-2007 access-vba

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

重现此问题的步骤:

  1. 打开表格。
  2. 打开查找对话框。
  3. 编辑记录中的某些字段。记录现在处于更新模式(您将在行的“装订线”区域中看到铅笔)。
  4. 在不保存记录的情况下,单击“已经打开的查找”对话框。
  5. 搜索找不到的记录。
  6. 再次单击该表单。记录仍处于编辑模式(即铅笔仍显示)。尝试保存或编辑其他字段。
  7. 此消息框将显示“没有AddNew或Edit的Update或CancelUpdate”。您可以单击确定或帮助按钮。

单击“帮助”按钮将显示:

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

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

在ODBCDirect数据库上,当您尝试将数据写入记录而不先调用AddNew或Edit时,就会发生此错误。

我们已经在没有VBA代码的新数据库中复制了此代码。因此,问题完全在MS Access中,您应该能够轻松重现。

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

我们尝试设置表单级别,数据字段级别以及Access应用程序级别的事件和错误处理。没有任何东西可以检测或捕获这种情况。VBA中无法检测“查找”对话框是否处于活动状态。

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

Dea*_*ill 1

我们提出的解决方法是编写一个AutoIt脚本,该脚本可以监视“查找”对话框何时获得焦点,并在记录发生更改时保存记录。

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

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

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

  • 太可怕了。在我考虑任何如此糟糕的事情之前,我会设计自己的 FIND 并从工具栏/功能区中删除双筒望远镜。 (4认同)