Dea*_*ill 5 ms-access vba ms-access-2007 access-vba
我们有一个具有简单表格显示表格数据的MS Access 2007数据库。我们使用“查找”对话框(单击“首页”功能区上的双筒望远镜)找到所需的记录。在特定情况下,这可能会导致错误。
重现此问题的步骤:
单击“帮助”按钮将显示:
您试图调用Update或CancelUpdate或试图更新记录集中的字段,而没有先调用AddNew或Edit。(错误3020)
在Microsoft Access数据库引擎数据库上,您调用了Update或CancelUpdate方法,但是在将数据写入记录之前未使用AddNew或Edit方法。
在ODBCDirect数据库上,当您尝试将数据写入记录而不先调用AddNew或Edit时,就会发生此错误。
我们已经在没有VBA代码的新数据库中复制了此代码。因此,问题完全在MS Access中,您应该能够轻松重现。
如果在查找之前保存记录,则不会发生此问题。不幸的是,当记录仍处于编辑模式时,我们有用户在查找。
我们尝试设置表单级别,数据字段级别以及Access应用程序级别的事件和错误处理。没有任何东西可以检测或捕获这种情况。VBA中无法检测“查找”对话框是否处于活动状态。
在发现发生之前,是否有人有任何防止错误的想法或保存记录的方法?现在,我们最好的想法是创建一个AutoHotkey或AutoIt脚本,等待“查找”对话框具有焦点。然后,我们将发送Ctrl + S来保存当前记录以强制保存。
我们提出的解决方法是编写一个AutoIt脚本,该脚本可以监视“查找”对话框何时获得焦点,并在记录发生更改时保存记录。
我们不想将脚本与数据库分开分发,因此脚本作为 Blob 添加到数据库表中。数据库的 AutoExec 宏运行一些 VBA 代码,将脚本从 Blob 表中拉出并启动脚本。
当脚本检测到“查找”对话框具有焦点时,脚本会在数据库中运行 VBA 宏。该宏检查当前记录是否脏。如果脏了,宏会强制保存。此外,当数据库关闭时,AutoIt 脚本也会停止。
这一切都很尴尬,但很有效。