Newsgroup: it.comp.appl.access
Titolo: Docmd.cancelevent se i campi obbligatori non sono tutti compilati

Buongiorno a tutti.
Ho un quesito che mi tiene impegnata da ieri sera (non sono molto
svelta a capire il codice, si nota?).
Mi ritrovo a dover salvare un record, per fare questo ho un apposito
pulsante (non c'è la barra di salvataggio a sx), ma ovviamente mi
ritorna errore se il campo non è compilato.
Ho googlato e ho visto sul sito comune il codice della sezione 3.95,
ma non riesco ad implementarlo.
Questo è il codice che sto usando ora:
============
Private Sub Aggiorna_Click()
If Me.NewRecord = True Then 'se il record è ancora vuoto
DoCmd.CancelEvent
Else
Dim iSaveCode As Integer
iSaveCode = Me.Contatore
    'DoCmd.Echo False
    If Me.FilterOn = False Then
    Me.Requery
    With Me.RecordsetClone
        .FindFirst "Contatore=" & iSaveCode
        Me.Bookmark = .Bookmark
        End With
    Else
    Me.FilterOn = False
    Me.Requery
    With Me.RecordsetClone
        .FindFirst "Contatore=" & iSaveCode
        Me.Bookmark = .Bookmark
    Me.FilterOn = True
    End With
    End If
    'DoCmd.Echo True
    End If
    End Sub
===========
Come posso fare ad integrare il controllo dei campi obbligatori con
questo codice?
Grazie
Erika

 Questo è il codice che sto usando ora:
[CUT]
Ho visto il codice (cuttato). Anche tu agisci con il contatore?
Scusami ma questa mania del contatore proprio non la capisco.
Se il valore che devi controllare e' il contatore il codice puo' andare 
bene. Se il valore/valori non sono il contatore dovrebbe essere 
leggermente modificato poiche' non e' sufficiente agire solo sui records 
nuovi (if newrecord).
Il controllo dei tuoi valori divresti farlo BeforeUpdate di form
Sub BeforeUpdate
if isnull(controllo1--->n) then
	msgbox "orrore mi mancano i dati
	docmd.cancelevent
end if
Oltre a questo ti dovresti inoltre preoccupare che il fruitore, quello 
che i talebani dell'informatica chiamano "utonto", abbia la possibilita' 
comunque di uscire. A tale scopo dovrebbe essere prevista una opzione di 
"undo"
Questa cosa e' ovviamente un canovaccio di lavoro se puoi essere piu' 
precisa vedremo di porre rimedio
--
ac

precisa vedremo di porre rimedio
Ok. Ma non capisco perché qualsiasi codice io metta in
"Form_BeforeUpdate" mi dia sempre errore.
Adesso riprovo ancora a mettere il codice su before_update.
Grazie ancora
Erika

 "Form_BeforeUpdate" mi dia sempre errore.
Se non e' troppo "incasinato" puoi provare a postarlo
--
ac

Se non e' troppo "incasinato" puoi provare a postarlo
ok, 
Su before update ho messo il codice di Alex Baraldi dal sito comune:
===================
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
For Each ctl In Me.Controls
       If ctl.Tag = "OBBLIGATORIO" Then
            With ctl
                  If .Visible And (.ControlType = acTextBox) Then
                        .BackColor = 12632256
                           If IsNull(.Value) Or .Value = "" Then
                                 .BackColor = 255
                                 MsgBox "Inserire i dati mancanti nel
campo", vbExclamation, "AVVISO"
                                 .SetFocus
                                 Set ctl = Nothing
                                 Cancel = True
                                 Exit Sub
                           End If
                  End If
            End With
      End If
Next
Set ctl = Nothing
End Sub
========================
Ma è come se usando il mio pulsante "aggiorna",  la parte Before
update della form venisse bypassata, non so se mi spiego. Non si
colora niente di rosso e non compare nessun messaggio, tranne quelli
standard di access.
Ciao e grazie ancora
Erika

 Erika
uhmmmm...nome preoccupante (ovviamente e' una facezia) ;<)
--
ac

uhmmmm...nome preoccupante (ovviamente e' una facezia) ;<)
Why?? @_@ Sono buonissima :) 
(beh, la maggior parte delle volte ehehe)
Ciao e thanks!
Erika


[cut]
non capisco a cosa ti serva tutto quel codice io mi sarei limitato a:
Private Sub Aggiorna_Click()
......controllo di tutti i valori (il codice tratto dal Baraldi,tranne 
il contatore quello lo da access in automatico) e valorizzazione di uno 
status (ckOK anche tipo boolean)
.....e poi
if ckOK  then
   docmd.runcommand accmdsaverecord
else
   msgbox completare i dati
end if
a fronte della runcommand ti scattera' l'evento di beforeupdate
Per evitare che access faccia aggiornamenti non voluti dovresti usare 
una variabile (a livello di form o pubblica) od un controllo di form che 
gestisci nell'evento di aggiorna_click
Sull'evento di beforeupdate se quel controllo e' nello stato di ok non 
fai nulla e access procede all'aggiornamento (i controlli li hai gia' 
fatti prima), altrimenti avvisi (msgbox "usa il bottone aggiorna") e 
cancelli l'evento
Immagino che tu abbia anche un bottone di "uscita" in quel caso io farei:
Uscita_click
if dirty then
   if msgbox ("in campana il record risulta modificato" & vbcrlf & 
"confermi l'uscita?", vbyesno+vbexclamation) = vbyes then
	undo
	docmd.close
   end if
else
   docmd.close
end if
end sub
--
ac

end sub
Il bottone di uscita c'č e si comporta semplicemente cosě:
Private Sub ChiudiMaschera_Click()
'Chiudi la maschera corrente
On Error GoTo Err_ChiudiMaschera_Click
DoCmd.Close
Exit_ChiudiMaschera_Click:
    Exit Sub
Err_ChiudiMaschera_Click:
    MsgBox Err.Description
    Resume Exit_ChiudiMaschera_Click
    End Sub
Ciao
Erika

     End Sub
vabbe' l'unica cosa seria e' "docmd.close".
Immaginavo che fosse cosi'. Il mio codice serve proprio per controllare 
che tutto sia ok,  che non ci siano modifiche ancora non consolidate. 
Tali modifiche  potrebbero essere non volute e possono generare gli 
errori access di campo obbligatorio  se il record e' stato "sporcato" 
(dirty).
--
ac

(dirty).
Mmh, capito!
Adesso faccio una bella prova e poi ti dico!
Grazie ancora
Erika

Adesso faccio una bella prova e poi ti dico!
Adesso il codice in uscita dalla maschera è
CHIUDI MASCHERA:
======
Private Sub ChiudiMaschera2_Click() 'Chiudi la maschera corrente
On Error GoTo Err_ChiudiMaschera2_Click
'Chiudi la maschera corrente
If Me.NewRecord Then
Select Case MsgBox("Attenzione! Non hai salvato il record!!" & vbCrLf
& _
"Se vuoi salvarlo devi prima compilare tutti i campi. Vuoi chiudere
comunque?", vbYesNo)
    Case vbYes
        Me.Undo
        DoCmd.Close
    Case vbNo
    End Select
    Else
If Me.dirty=True then
    Select Case MsgBox("Attenzione! Non hai salvato il record!! Salvo
prima di chiudere?", vbYesNoCancel)
    Case vbYes
        Me.Dirty = False
        DoCmd.Close
    Case vbNo
        Me.Undo
        DoCmd.Close
    Case vbCancel
    End Select
Exit_ChiudiMaschera2_Click:
    Exit Sub
Err_ChiudiMaschera2_Click:
    MsgBox Err.Description
    Resume Exit_ChiudiMaschera2_Click
    End If
End if
    End Sub
==========
Alla fine l'evento before update della form mi conviene non usarlo
(anche se a questo punto sono effettivamente riuscita a far funzionare
il codice), perché mi creerebbe problemi con altri pulsanti (crea
nuovo record, elimina e copia/incolla), ma già così va benissimo.
Mettendo la condizione sul NewRecord, bypasso tutti gli errori che
avevo prima.
Ho solo un unico dubbio:
Quando vado a chiudere la form, anche se ho salvato mezzo secondo
prima, pure se imposto come condizione Me.dirty=true... mi esce il
messaggio se voglio salvare o meno.
Dov'è l'errore?
Grazie
Erika

Dov'è l'errore?
Ho risolto da sola: ho impostato le tre condizioni:
Me.newrecord
Me.Dirty = True
Me.dirty = false
===================
Private Sub ChiudiMaschera_Click()
'Chiudi la maschera corrente
On Error GoTo Err_ChiudiMaschera_Click
If Me.NewRecord Then
Select Case MsgBox("Attenzione! Non hai salvato il record!!" & vbCrLf
& _
"Se vuoi salvarlo devi prima compilare tutti i campi. Vuoi chiudere
comunque?", vbYesNo)
   Case vbYes
      Me.Undo
      DoCmd.Close
      Case vbNo
     End Select
     Else
     If Me.Dirty = True Then
     Select Case MsgBox("Attenzione! Non hai salvato il record!! Salvo
prima di chiudere?", vbYesNoCancel)
     Case vbYes
         Me.Dirty = False
        DoCmd.Close
     Case vbNo
         Me.Undo
         DoCmd.Close
     Case vbCancel
    End Select
    Else
    If Me.Dirty = False Then
    DoCmd.Close
Exit_ChiudiMaschera_Click:
    Exit Sub
Err_ChiudiMaschera_Click:
    MsgBox Err.Description
    Resume Exit_ChiudiMaschera_Click
   End If
   End If
   End If
 
    End Sub
===========
Grazie ancora per l'aiuto!!
Erika