Preventing close buttons from saving records in MS Access

后端 未结 6 1194
小蘑菇
小蘑菇 2021-02-10 11:42

In a Microsoft Access form, whenever the current record changes, any changes in bound controls are silently saved to the database tables. This is fine, but I don\'t want it to h

6条回答
  •  误落风尘
    2021-02-10 12:15

    Sean gave an almost correct answer but it leaves gaps.

    In general, the FORM's BeforeUpdate is the most important form event. It is your LAST line of defense and ALWAYS runs prior to a record being saved regardless of what prompted the save (form close, new record, your own save button, clicking into a subform, etc.) Although I occasionally use the control's BeforeUpdate event just so the user gets the error message sooner, the bulk of the validation code I write runs in the Form_BeforeUpdate event. This is the event you MUST use if you want to ensure that certain controls are not empty. No control level event will do this reliably for all situations. Primarily because if the control never gets focus, no control level event ever fires. Form_BeforeUpdate is also the event you would use if your validation involves multiple fields. If you are using any other control or event level event, you are wasting your time. There is always away around your "trap" and your table almost certainly contains invalid data.

    Regarding the OP's question. If you want to force people to use your own save button and prompt them if they don't then you need a form level variable as Sean's suggestion implied. The only difference, is that you need to set it to False, in the form's Current event NOT the Open event. You want the flag to be reset for EVERY new record, not just when the form opens. Then you set it to True in your save button click event, just before you force the record to save with DoCmd.RunCommand acCmdSaveRecord.

    Then finally, in the Form_BeforeUpdate event, you check the value of the variable.

    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
    

提交回复
热议问题