Forms Access 2013:如何控制保存哪些表单更改以及取消哪些表单更改

Forms Access 2013:如何控制保存哪些表单更改以及取消哪些表单更改,forms,ms-access-2013,Forms,Ms Access 2013,我有一个带有3个按钮的表单: 保存-用于保存表单 NewReport-只有在保存当前表单后才可见,并且应该清除表单并允许用户输入另一种形式的数据 关闭-应在不保存未完成表单的情况下关闭应用程序 我似乎不知道如何使用更新前事件过程来控制这些函数 我不明白的一点是,Save命令实际上并没有将数据写入表中,直到我以某种方式更改了表单的焦点。因此,如果我的用户正在输入数据并点击Save按钮,则在Save命令完成时,表尚未保存数据。它只在焦点改变后出现在表中;就像一次询问 以下是我当前版本的代码: Opt

我有一个带有3个按钮的表单:

保存-用于保存表单

NewReport-只有在保存当前表单后才可见,并且应该清除表单并允许用户输入另一种形式的数据

关闭-应在不保存未完成表单的情况下关闭应用程序

我似乎不知道如何使用更新前事件过程来控制这些函数

我不明白的一点是,Save命令实际上并没有将数据写入表中,直到我以某种方式更改了表单的焦点。因此,如果我的用户正在输入数据并点击Save按钮,则在Save命令完成时,表尚未保存数据。它只在焦点改变后出现在表中;就像一次询问

以下是我当前版本的代码:

Option Compare Database
Option Explicit

Private Cause As Variant

Private Sub btnClose_Click()

    Cause = "CloseButton"
    DoCmd.Close acForm, "frmReports", acSaveNo

End Sub

Private Sub btnNewReport_Click()

    Cause = "NewReport"
    Me.Requery
    Me.RepStatus = ""

End Sub

Private Sub cmdSave_Click()

    Dim outl As Outlook.Application
    Dim mi As Outlook.MailItem

    'blnGood = True
    Cause = "SaveButton"

    'Save the Record
    DoCmd.Save acForm, "frmReports"

'    If Me.DateOfVisit <> "" Then
        Me.RepStatus = "Report Saved!"
'        Set outl = New Outlook.Application
'        Set mi = outl.CreateItem(olMailItem)
'            mi.Body = "A new report was just recorded."
'            mi.Subject = Application.CurrentUser & " Just Logged a Report."
'            mi.To = "rich.temen@cox.net"
'            mi.Send
'
'        Set mi = Nothing
'        Set outl = Nothing
'    End If

End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim strMsg As String

    Select Case Cause
        Case "SaveButton"
            Me.btnNewReport.Visible = True
            'do nothing

        Case "NewReport"
            'di this

        Case "CloseButton"
            Me.Undo

    End Select

    'If Not blnGood Then
     '   strMsg = "Please use the Save button to save your Report," & _
    '             vbNewLine & "or Escape to reset the form."
    '    Call MsgBox(Prompt:=strMsg, Title:="Before Update")
    'End If
End Sub

Private Sub Form_Load()

    Me.btnNewReport.Visible = False
    Cause = ""

End Sub
选项比较数据库
选项显式
作为变体的私人原因
专用子btnClose_Click()
原因=“关闭按钮”
文档关闭acForm,“frmReports”,acSaveNo
端接头
专用子btnNewReport_Click()
Cause=“NewReport”
我,再询问
Me.RepStatus=“”
端接头
私有子cmdSave_Click()
将outl设置为Outlook.Application
将mi设置为Outlook.MailItem
“blnGood=True
原因=“保存按钮”
“保存记录
DoCmd.Save acForm,“frmReports”
“如果我是DateOfVisite”,则
Me.RepStatus=“报告已保存!”
'Set-outl=新建Outlook.Application
'Set mi=outl.CreateItem(olMailItem)
'mi.Body=“刚刚录制了一份新报告。”
“mi.Subject=Application.CurrentUser&”刚刚记录了一份报告。“
“米·托·里奇。temen@cox.net"
“小姐,派人来
'
'设置mi=无
“出发=什么都没有
"完"
端接头
更新前的私有子表单(取消为整数)
作为字符串的Dim strMsg
选择案例原因
案例“保存按钮”
Me.btnNewReport.Visible=True
“什么也不做
案例“新报告”
“这是什么
案例“关闭按钮”
我,解开
结束选择
“如果不是布林戈德,那么
'strMsg=“请使用保存按钮保存您的报告,”_
“vbNewLine&”或Escape以重置窗体。”
'调用MsgBox(提示:=strMsg,标题:=“更新前”)
"完"
端接头
专用子表单_加载()
Me.btnNewReport.Visible=False
原因=“”
端接头
谢谢你在这方面的帮助,我已经兜了几个小时的圈子了


Rich

您需要知道的是
DoCmd.Save acForm,“frmReports”
不会保存表单的数据(记录);它保存对窗体设计的更改。实际需要保存当前记录的是
DoCmd.RunCommand acCmdSaveRecord
。类似地,
DoCmd.Close acForm,“frmReports”,acSaveNo
告诉Access在关闭表单时不要保存对表单设计的更改。它不是说“不要保存记录”。如果有任何操作正在进行,则是BeforeUpdate事件代码中的
Me.Undo
。谢谢,Skippy。我没有意识到这一点。这帮了大忙,不用担心!如果我之前的评论有用的话,请随时投赞成票。谢谢