我们有一个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来保存当前记录以强制保存。
答案 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 :(得分:1)
我们提出的hack,解决方法是编写一个AutoIt脚本,该脚本可以查看“查找”对话框何时获得焦点并保存记录(如果已更改)。
我们不想单独从数据库分发脚本,因此脚本作为Blob添加到数据库表中。数据库的AutoExec宏运行一些VBA代码,将脚本从Blob表中拉出并启动脚本。
当脚本检测到“查找”对话框具有焦点时,脚本将在数据库中运行VBA宏。宏检查当前记录是否脏。如果脏,宏会强制保存。此外,关闭数据库时将停止AutoIt脚本。
这一切都很尴尬,但它确实有效。
答案 2 :(得分:1)
@ CodeSlave的回答表明了我的可能性:
不是简单地从工具栏/功能区中取出双筒望远镜,而是改变双筒望远镜的功能。也就是说,让它调用保存当前记录的代码,如果它是脏的,然后启动FIND对话框。
现在,需要一些代码来检查表单是否已打开,并且它有一个记录源(如果没有记录源则测试.Dirty属性错误),并且字段具有焦点,但所有那些事情是可行的。通过仅在加载表单时显示工具栏/功能区,或者在表单打开时编辑默认工具栏/功能区,可能会有许多(最后一个除外)处理。
但这比使用进程外解决方案要简单得多,而且您的用户也不会知道任何差异。