【问题标题】:Prompt for User to Save a Form提示用户保存表单
【发布时间】:2017-11-27 05:32:45
【问题描述】:

我有一个关于我的班级数据库的最后一个问题。对于用户可以查看数据的某些表单,我希望他们能够关闭表单,并且如果他们没有进行任何更改,则不会收到提示。但是,如果他们选择更改表单中的某些数据,比如编辑记录,那么我希望他们得到一个弹出框,提示用户是否要保存更改。如果他们选择“是”,则旧记录将被覆盖并将更改保存到记录中,但如果他们选择“否”,则根本不会更改记录并关闭表单。

我该怎么做?我正在使用 Access 2016,到目前为止我尝试过的方法都会导致错误。以下是我在 VBA 中的 BeforeUpdate 事件表单中尝试过的两种方法。

方法一:

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 控件通信时出现问题。”

方法二:

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

错误 - 同上。

非常感谢任何帮助!

谢谢!

【问题讨论】:

    标签: ms-access ms-access-2016


    【解决方案1】:

    由于非 unicode 程序的语言设置在创建它的计算机和运行它的计算机上不同,或者由于语言设置的更改,可能会出现此问题。

    评论this Microsoft support page

    如果这没有帮助,您也可以查看this answer。虽然它非常彻底并且某些步骤可能不适用于您,但反编译 + 重新编译和重建都可能会修复此错误。

    另请注意:您的代码并没有按照您的想法执行。要保存当前记录,请使用DoCmd.RunCommand acCmdSaveRecordDoCmd.Save 保存对表单对象所做的任何更改,而不是记录。但是,您不需要将记录保存在BeforeUpdateevent 中,因为只要Cancel = False,它将在该事件结束时保存

    【讨论】:

    • 谢谢。我可以看到我将不得不在 Access 上学习更多。
    【解决方案2】:

    您的 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
    

    【讨论】:

    • 感谢 Rene,我在网上找到了这些代码示例,所以我不知道它没有任何意义。至于您的示例,我将在哪里插入该代码?在更新前或 OnDirty 上?它在更新前没有任何作用。
    【解决方案3】:
    1. 对于用户可以查看数据的某些表单,我希望他们能够关闭表单,并且如果他们没有进行任何更改,则不会收到提示。 ** 这是 Access 标准行为 - 无需执行任何操作

    2. 但是,如果他们选择更改表单中的某些数据,比如编辑记录,我希望他们得到一个弹出框,提示用户是否要保存更改。 ** 这不是标准的,通常不是推荐的概念,因为它所做的只是增加开销。必须确定此触发器和具有许多字段的屏幕/表单的正确时间点 - 它只能在关闭或记录更改时完成 - 在这种情况下,如果脏了会触发一个消息框(您可以查找这些术语)

    3. 如果他们选择“是”,则旧记录将被覆盖并将更改保存到记录中,但如果他们选择“否”,则根本不会更改记录并关闭表单。 ** 查找 UnDo 方法

    ** 但总的来说,该产品的标准设计是所有内容都在没有任何提示的情况下随时保存。这是应该的方式。保存提示并没有真正的价值,因为用户在数据输入期间出错的概率与在保存提示时出错的概率是相同的。

    【讨论】:

      【解决方案4】:

      在 Microsoft 的网站上找到此代码,它按预期工作,出现 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
      

      【讨论】:

        【解决方案5】:
         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
        

        【讨论】:

        • 不鼓励仅使用代码的答案。请添加一些解释,说明这如何解决问题,或者这与现有答案有何不同。 From Review
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多