Newsgroup: it.comp.appl.access
Titolo: Cancellare la chiusura di una form dialog in seguito alla mancata convalida dei dati inseriti o modificati, con bottone X abilitato

Ragazzi, in questo post vorrei semplicemente eternare, per chiunque
dovesse trovarsi ad avere il mio stesso problema, la soluzione che
faticosamente ho prodotto dopo una notte intera di tentativi e
ricerche su internet!
Il mio caso: ho una form associata ad una tabella, in modalità
dialog.
Voglio:
1) un pulsante SAVE AND CLOSE
2) un pulsante CANCEL AND CLOSE
3) il pulsante X di chiusura nella barrra dei titoli della finestra
abilitato, che abbia la stessa funzione del pulsante SAVE AND CLOSE.
A) Quandi si preme il tasto SAVE AND CLOSE o il tasto X, deve essere
chiesto se si vogliono salvare le modifiche al record, nel caso ci
siano.
B) Se si decide di salvare le modifiche, devo poter convalidare i dati
fino a quel momento inserti: se alcuni dati NON sono corretti e/o
completi, allora la finestra NON SI DEVE CHIUDERE, permettendo
all'utente di completare l'inserimento/modifica.
C) Se si preme CANCEL AND CLOSE, qualsiai modifica fatta viene rimossa
e la finestra si deve chiudere silenziosamente.
Se vi ci siete già scontrati, sapete che bisogna giocarsela sugli
eventi form_unload e form_beforeupdate.
Il problema, che non tutti riportano, e' che si devono usare ENTRAMBI
gli eventi: i due devono "comunicare" tra di loro (perché il
beforeupdate deve semplicemente NON fare l'update al record, e poi
deve dire all'unload "ok, NON chiudere la finestra").
L'altro meno banale problema è che, a seconda del pulsante che si
decide di utilizzare (il SAVE AND CLOSE o la X), Access emette DUE
diversi messaggi di errore "Impossibile salvare il record in questo
momento" per lo STESSO codice di errore 2169: uno dei due (quello sul
tasto X) lo si deve intercettare tramite l'evento form_error, l'altro
(quello sul tasto SAVE AND CLOSE) lo si deve intercettare tramite una
on error all'interno dell'evento onclick sul pulsante!
Probabilmente qualcuno di voi ha già risolto il rebus in quattro e
quattr'otto, ma in tutti i mille newsgroup e siti italiani ed inglesi
che ho girato non si trova una soluzione che sia una che risolva tutti
i punti. Spessissimo si dice "disabilita il tasto X", oppure ci si
limita a dire "se il dato non è convalidato, NON salvare" (ma la
finestra si chiude comunque!), oppure non si parla di dialog, oppure
si dice "chissenefrega delle messagebox di sistema, sono comunque
utili!" (si', col cavolo).
Invece no, io volevo A) avere il pulsante X abilitato B) Avere la
richiesta "vuoi salvare i dati?", in caso di dati modificati C) se i
dati non sono convalidati, non chiudere la maledetta finestra D) non
avere messagebox "di Access", di sistema. E) non avere nessuna
messagebox non gestita da me.
Ecco qui sotto lo scheletro di quel che serve. L'ho abbondantemente
commentato, nel caso non fosse chiaro qualcosa chiedete pure, sono
troppo contento per aver finalmente risolto questo antipaticissimo
problema.
La variabile globale che uso per far comunicare tra di loro
beforeupdate e unload e' bUnvalidData. Deve essere inizializzata a
false, e diventa TRUE nell'evento beforeupdate nel caso in cui i dati
NON siano convalidati.
Non ho riportato qui sotto la funzione myValidateData(), che deve
ritornare true o false a seconda del fatto che i dati inseriti nella
finestra siano validi o meno, ed e' l'unica che necessita di una
personalizzazione.
Affinché possiate usare il codice sottostante in una vostra form, è
sufficiente creare due pulsanti "SAVE AND CLOSE" di nome btnClose e
"CANCEL" con nome btnCancel. Poi basta un copia&incolla.
Ciao!
Angelo.-
'
==========================================================================
' INIZIO
'
==========================================================================
Option Compare Database
' ecco la variabile globale
Dim bUnvalidData As Boolean
' ************************************************************
' ONCLICK sul tasto CANCEL
' ************************************************************
Private Sub btnCancel_Click()
Me.Undo
    DoCmd.Close
End Sub
' ************************************************************
' ONCLICK sul tasto CLOSE AND SAVE
' ************************************************************
Private Sub btnClose_Click()
    On Error GoTo TrapError
    DoCmd.Close
    Exit Sub
TrapError:
' trap sul messaggio "Errore di runtime 2169 - Impossibile salvare il
record in questo momento"
    If Err.Number = 2169 Then
        Resume Next
    End If
    MsgBox Err.Number & " - " & Err.Description
    Resume Next
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
' ************************************************************
' Evento BEFOREUPDATE sulla form
' ************************************************************
    If MsgBox("Vuoi salvare?", vbYesNo) = vbYes Then
        ' sì, voglio salvare: controlliamo la validità...
        If (not myValidateData()) Then
            ' i dati sono invalidi
            MsgBox "Dati invalidi!", vbOKOnly
            bUnvalidData = True
            Cancel = True
        End If
    Else
        ' no, non voglio salvare: annullo le modifiche e lascio
chiudere la form
        Me.Undo
    End If
End Sub
Private Sub Form_Current()
' ************************************************************
' Evento CURRENT sulla Form
' ************************************************************
    ' si inizializza la variabile globale a False
    bUnvalidData = False
End Sub
Private Sub Form_Error(DataErr As Integer, Response As Integer)
' ************************************************************
' Evento ERROR sulla Form
' ************************************************************
    ' trap sul messaggio "Impossibile salvare il record in questo
momento"
    If DataErr = 2169 Then
        Response = acDataErrContinue
        bUnvalidData = True
    End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
' ************************************************************
' Evento UNLOAD sulla Form
' ************************************************************
    If bUnvalidData = True Then
        ' non devo chiudere la finestra!
        Cancel = True
        ' ...reinizializzo la bUnvalidData, per l'utilizzo futuro
        bUnvalidData = False
    End If
End Sub
'
==========================================================================
' FINE
'
==========================================================================

 ha scritto nel messaggio
news:1189074281....@k79g2000hse.googlegroups.com...







Hai scritto anche qui? Perchè io uso questo sistema già da un pezzo.
Frequento questo NG da circa un anno e non mi sembra di aver letto post in
questo senso.
.
Comunque con la tua determinazione, comunque sei riuscito a creare qualcosa 
di funzionante BRAVO.
-- 
Ciao
Access

 di funzionante BRAVO.
No, no, non avevo mai chiesto. Quando parlavo di ricerca nei newsgroup
intendevo proprio ricerca nello storico dei messaggi già scritti, non
ho mai posto la domanda precisa a nessuno. In passato anche qui dentro
si era affrontato l'argomento, ma nessuna delle risposte date era
completa (ad esempio, non ho mai visto nessuno accennare al fatto che
quell'errore 2169 va intercettato due volte). E in effetti, cercando
nei vari NG dedicati ad Access, si vede menzionato il caso piuttosto
spesso, ma una soluzione completa (asino pure io nel far le ricerche
forse, eh:-) non l''ho mai trovata.
Ciao!
A.-