zio Ken ha scritto:
Ciao Alex, suggerimento superlativo come sempre!
Però in fase di chiusura della maschera, nel caso in cui vengono apportate modifiche, mi chiede 2 volte se voglio salvare le modifiche. Stessa cosa se voglio passare da un record all'altro (maschera continua). Poichè l'evento legge tutte le possibili modifiche nella form, è possibile lanciare la verifica di salvataggio solo in fase di chiusura maschera?
Da me chiede SOLO 1 Volta... quindi devi aver introdotto qualche cosa di conflittuale.
Se sei in maschera continua NON CHIEDE nulla se non fai modifiche, se invece fai modifiche ovviamente si... ad ogni Record in quanto attiva giustamente il BeforeUpdate.
Detto questo, così come è ora non puoi delegare alla Chiusura alcun controllo.
Lo stesso metodo che avevi accennato inizialmente ti avrebbe fatto la domanda di Conferma modifiche anche in caso NESSUNA modifica fosse stata apportata... cosa assurda ovviamente.
Per capire come mai dovresti analizzare la sequenza Eventi...!
In sostanza, se premi [X] di chiusura dovrebbe accadere questo:
BeforeUpdate (form) --->
AfterUpdate (form) ---->
Unload(Form) ---->
Deactivate(Form) ---->
Close(Form)
Il BeforeUpdate si scatena se Dirty=True, ma appena l'evento viene confermato, Dirty=False, di conseguenza non hai più modo di sapere se sono state fatte modifiche...
Per fare quello che vuoi quindi devi impedire la chiusura non gestita, quindi DISABILITARE/RIMUOVERE il Comando [X] di chiusura standard e mettere nella Form un Button preposto alla chiusura.
Questo gestirà sia la verifica di Dirty(ed eventuale Question) che la Chiusura di conseguenza...
Purtroppo devi arginare anche ALT+F4 che ti chiuderebbe tutto... sicchè devi implementare sempre una gestione dell'Evento UNLOAD...
Option Compare Database
Option Explicit
Private DoNotClose As Boolean
Private Sub cmdClose_Click()
If Me.Dirty = True Then
If MsgBox("Salvare le modifiche?", vbQuestion + vbYesNo, "Prova chiusura form") = vbNo Then
Me.Undo
Else
DoNotClose = False
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close acForm, Me.Name
End If
End If
End Sub
Private Sub Form_Current()
DoNotClose = False
End Sub
Private Sub Form_Dirty(Cancel As Integer)
DoNotClose = True
End Sub
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Select Case DataErr
Case Is = ERR_SAVINGFAILURE: Response = acDataErrContinue
Case Else: Response = acDataErrDisplay
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
Cancel = DoNotClose
End Sub