阻止关闭按钮保存MS Access中的记录

时间:2012-10-18 11:50:39

标签: vba ms-access-2007

在Microsoft Access窗体中,每当当前记录更改时,绑定控件中的任何更改都会以静默方式保存到数据库表中。这很好,但我不希望在用户关闭表单时发生这种情况,因为它与许多人期望的完全相反。

最好的示例是当您尝试使用未保存的更改关闭excel文件时,它会询问是否应该丢弃更改。这正是我想在Access中实现的,但是找不到任何方法来在VBA中捕获关闭按钮的事件。

表单的Unload事件是当有人单击关闭按钮时触发的第一个事件,但到那时更改已经写入数据库。

这完全可能,还是我必须创建自己的关闭按钮?我很乐意为这样的微不足道的事情编写大量的代码,但我讨厌弄乱GUI。

5 个答案:

答案 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

当用户以任何方式关闭表单时,不再保存记录。