在Microsoft Access窗体中,每当当前记录更改时,绑定控件中的任何更改都会以静默方式保存到数据库表中。这很好,但我不希望在用户关闭表单时发生这种情况,因为它与许多人期望的完全相反。
最好的示例是当您尝试使用未保存的更改关闭excel文件时,它会询问是否应该丢弃更改。这正是我想在Access中实现的,但是找不到任何方法来在VBA中捕获关闭按钮的事件。
表单的Unload事件是当有人单击关闭按钮时触发的第一个事件,但到那时更改已经写入数据库。
这完全可能,还是我必须创建自己的关闭按钮?我很乐意为这样的微不足道的事情编写大量的代码,但我讨厌弄乱GUI。
答案 0 :(得分:5)
您必须使用Form_BeforeUpdate
事件。以下是一个例子;但它确实会创建一个典型的警告消息:“此时您无法保存此记录.Microsoft Access在尝试保存记录时可能遇到错误。...” - 取决于您的数据库设置。您可以使用下面的简单解决方法来避免显示该消息。
Private Sub Form_BeforeUpdate(Cancel As Integer)
Cancel = True
'Or even better you can check certain fields here (If Then...)
End Sub
Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2169 Then
Response = True
End If
End Sub
答案 1 :(得分:4)
肖恩给出了一个几乎正确的答案,但它留下了空白。
一般来说,FORM BeforeUpdate
是最重要的形式事件。它是你的最后一道防线,总是在保存记录之前运行,无论是什么提示保存(表格关闭,新记录,你自己的保存按钮,点击子表格等),虽然我偶尔会使用控件&#39 ; s BeforeUpdate
事件只是让用户更快收到错误消息,我编写的大部分验证代码都在Form_BeforeUpdate
事件中运行。如果您想确保某些控件不为空,则必须使用此事件。没有控制级事件可以在所有情况下可靠地执行此操作。主要是因为如果控件永远不会聚焦,那么控制级别事件就不会发生。 Form_BeforeUpdate
也是您在验证涉及多个字段时使用的事件。如果您正在使用任何其他控件或事件级别事件,那么您就是在浪费时间。总是远离你的"陷阱"而你的表几乎肯定包含无效数据。
关于OP的问题。如果你想迫使人们使用你自己的保存按钮并提示他们,如果他们没有,那么你需要一个表格级变量,如肖恩的建议所暗示的那样。唯一的区别是,您需要将其设置为False,格式为“当前事件”而不是“打开”事件。您希望为每条新记录重置标志,而不仅仅是在表单打开时。然后,在强制使用DoCmd.RunCommand acCmdSaveRecord
保存记录之前,在保存按钮单击事件中将其设置为True。
最后,在Form_BeforeUpdate
事件中,检查变量的值。
If bClose = False Then
If MsgBox("Do you want to save the changes?", vbYesNo) = vbNo Then
Cancel = True
If MsgBox("Do you want to discard the Changes?", vbYesNo) = vbYes Then
Me.Undo
End If
Exit Sub
End If
End If
答案 2 :(得分:2)
这是我检查表单是否正在关闭或保存的代码。
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Not UsingSaveButton Then
If MsgBox("Abandon Data?", vbInformation + vbYesNo) = vbNo Then
Cancel = True
Else
DoCmd.RunCommand acCmdUndo
End If
End If
End Sub
我有一个布尔标志,在加载时设置为False,然后当我使用我的保存按钮时,我将其设置为true以允许更新运行。
如果没有设置标志,那么他们将离开记录(通过转到另一个记录,或关闭表单),所以我问他们是否确实要保存更改。
如果进行了任何更改,Cancel = True
将中止表单的退出或移动到其他记录
DoCmd.RunCommand acCmdUndo
撤消任何更改,因此不会保存。
答案 3 :(得分:0)
实际上,你无法捕捉到这一点,Access直接在桌子上工作,当场地通过移动到另一个场,记录或按钮而失去焦点时,每个变化都已被保存。
实际上,与Excel相比,这是一个很大的优势
如果你真的想要一个类似于Excel的行为,你需要处理该表的副本和一些用于更新的代码。
答案 4 :(得分:0)
在“On Unload”事件的表单中添加以下代码。
DoCmd.RunCommand acCmdUndo
DoCmd.Quit
当用户以任何方式关闭表单时,不再保存记录。