我的班级数据库目前还有最后一个问题。对于用户可以查看数据的某些表单,我希望他们能够关闭表单,如果他们没有进行任何更改则不会提示。但是,如果他们选择更改表单中的某些数据,比如编辑记录,我就会希望他们弹出一个提示用户是否要保存更改的弹出框。如果他们选择是,那么旧记录将被覆盖并且更改将保存到记录中,但如果他们选择否,则记录根本不会更改,表单将关闭。
我该怎么做?我使用的是Access 2016,到目前为止我尝试过的操作会导致错误。以下是我在VBA中的BeforeUpdate事件中尝试过的两种方法。
方法1:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim strMsg As String
Dim iResponse As Integer
' Specify the message to display.
strMsg = "Do you wish to save the changes?" & Chr(10)
strMsg = strMsg & "Click Yes to Save or No to Discard changes."
' Display the message box.
iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "Save Record?")
' Check the user's response.
If iResponse = vbNo Then
' Undo the change.
DoCmd.RunCommand acCmdUndo
' Cancel the update.
Cancel = True
End If
End Sub
错误 - "作为事件属性设置输入的更新前表达式产生了以下错误:Microsoft Access与OLE服务器或ActiveX控件通信时出现问题。"
方法2:
Private Sub Form_BeforeUpdate(Cancel As Integer)
'Provide the user with the option to save/undo
'changes made to the record in the form
If MsgBox("Changes have been made to this record." _
& vbCrLf & vbCrLf & "Do you want to save these changes?" _
, vbYesNo, "Changes Made...") = vbYes Then
DoCmd.Save
Else
DoCmd.RunCommand acCmdUndo
End If
End Sub
错误 - 与上述相同。
非常感谢任何帮助!
谢谢!
答案 0 :(得分:0)
由于非unicode程序的语言设置在其创建的计算机上以及在其运行的计算机上或由于语言设置的更改而不同,因此可能会出现此问题。
如果这没有帮助,您还可以查看this answer。虽然它非常彻底并且某些步骤可能不适用于您,但反编译和重新编译以及重建都可能会修复此错误。
另请注意:您的代码没有按照您的想法执行。要保存当前记录,请使用DoCmd.RunCommand acCmdSaveRecord
。 DoCmd.Save
保存对表单对象所做的任何更改,而不是对记录的更改。但是,您不需要在BeforeUpdate
事件中保存记录,因为只要Cancel = False
答案 1 :(得分:0)
你的DoCmd方法根本没有任何意义。 另外,您只需要检查答复是否为否。 试试这个:
If Me.Dirty Then 'has existing data been changed?
If MsgBox("Changes have been made to this record." _
& vbCrLf & vbCrLf & "Do you want to save these changes?", _
vbYesNo, "Changes Made...") = vbNo Then
Cancel = True
Me.Undo
End If
End If
答案 2 :(得分:0)
对于用户可以查看数据的某些表单,我希望他们能够关闭表单,如果他们没有进行任何更改则不会提示。 **这是Access标准行为 - 无需任何操作
但是,如果他们选择更改表单中的某些数据,比如编辑记录,我就会希望他们弹出一个提示用户是否要保存更改的弹出框。 **这不是标准的,通常不是推荐的概念,因为它只是增加了开销。必须确定此触发器和具有许多字段的屏幕/表单的正确时间点 - 它只能在关闭或记录更改时完成 - 在这种情况下,如果脏了则会触发消息框(您可以查找这些术语) )
如果他们选择“是”,则会覆盖旧记录,并将更改保存到记录中,但如果他们选择“否”,则记录根本不会更改,表单将关闭。 **查找UnDo方法
**但一般而言,产品的标准设计是在没有任何提示的情况下保存所有内容。这是应该的方式。 “保存提示”没有真正的附加值,因为用户在数据输入期间发生错误的概率与“保存提示”相同。
答案 3 :(得分:0)
在微软的网站上找到此代码,它按预期工作,有0个错误。
Private Sub Form_BeforeUpdate(Cancel As Integer)
' This procedure checks to see if the data on the form has
' changed. If the data has changed, the procedure prompts the
' user to continue with the save operation or to cancel it. Then
' the action that triggered the BeforeUpdate event is completed.
Dim ctl As Control
On Error GoTo Err_BeforeUpdate
' The Dirty property is True if the record has been changed.
If Me.Dirty Then
' Prompt to confirm the save operation.
If MsgBox("Do you want to save?", vbYesNo + vbQuestion, _
"Save Record") = vbNo Then
Me.Undo
End If
End If
Exit_BeforeUpdate:
Exit Sub
Err_BeforeUpdate:
MsgBox Err.Number & " " & Err.Description
Resume Exit_BeforeUpdate
End Sub
答案 4 :(得分:0)
On Error GoTo Err_BeforeUpdate
' The Dirty property is True if the record has been changed.
If Me.Dirty Then
' Prompt to confirm the save operation.
If MsgBox("Do you want to save changes?", vbYesNo + vbQuestion, _
"Save Record") = vbNo Then
Me.Undo
End If
End If
Exit_BeforeUpdate:
Exit Sub
Err_BeforeUpdate:
MsgBox Err.Number & " " & Err.Description
Resume Exit_BeforeUpdate