Newsgroup: it.comp.appl.access
Titolo: verificare campi vuoti in una maschera basata su una sola tabella

buona sera a tutti
c'è un modo per verificare se in una maschera ci sono dei campi vuoti o non compilati?
io avrei la necessità di fare una verifica di tutti i campi di una maschera sull'evento click del pulsante di uscita dalla stessa, in modo che prima che l'utente esca dalla maschera gli venga ricordato che non ha compilato tutti i campi.
se ne devo controllare solo uno la istruzione sarebbe la seguente:
if isnull (me.data1) then msgbox "compila data1" 
 
al quale poi farei fare il focus sul campo data1 da compilare uscendo dalla routine senza chiudere la maschera, e fin qui ce la posso fare
 
ma e volessi fare un check di tutti i campi di quella maschera? che è basata solo su una tabella... ?? e contestualmente dire all'utente che mancano i campi "data1", data2 ecc ecc?
 
aiuto...
grazie.
Luca


routine ripresa pari pari da una risposta (assai) precedente del NG,
la uso nell'evento BeforeUpdate della Form
 
For Each contr In Me.Controls
            If contr.Tag = "obb" And IsNull(contr.Value) Then
                MsgBox "Valore obbligato mancante", vbExclamation, ""
                contr.SetFocus
                Cancel = True ' NON registra, annulla BeforeUpdate
                Exit Sub 'ESCE da BeforeUpdate
            End If
Next
 
Quindi per lo scopo occorre valorizzare la proprietà tag dei controlli,
e poi verificare che con le versioni più attuali di Access 
NON ci siano controlli SENZA la proprietà tag
(che manderebbero in errore il ciclo For ...)


ciao! grazie. si l'avevo vita anche io, ma secondo te la posso mettere su un evento di un click di un pulsante?


però non riesco a farla funzionare. ho messo i TAG come da istruzione...

 però non riesco a farla funzionare. ho messo i TAG come da istruzione...
 
allora
dò una risposta di massima
a fine mattinata riporto quello che per me è un adattamnto necessario per le istruzioni e il riferimento alla nota questione che "Access NON registra"
 
di per sè questa routine può dare errore runtime quando fra i controlli ce ne sono di quelli che NON hanno la proprietà value
considerando che TUTTI abbiano la proprietà tag
 
per cui in questi casi si hanno due strade: 
 
1) si previene l'errore 
test sul tipo di controllo: IF controlType=...
 
2) si accetta l'errore e lo si neutralizza
quindi si fa correre il ciclo e con una msgbox si rileva il numero dell'errore
per poi inserire la IF che "para" l'errore
 
Per me la routine trova la sua collocazione "ideale" nell'evento BeforeUpdate
della form
(il "sistema" controlla appena prima di registrare)
si può mettere anche in un pulsante forzando così la registrazione
(può rivelarsi scomodo per l'utente,
ma può essere il mezzo per ovviare al fatto che, nelle form "semplici",
Access NON registra in caso di abbandono della form) 
 
PS: io adopero SOLO subform (con controlli associati) per le registrazioni:
in pratica ho una form principale che fa da "quadro" (cornice)
e dentro ad essa inserisco la (le) form(s) con i controlli associati
(che quindi, di fatto, sono TUTTE subform):
mi sembra proprio che così ogni "abbandono" della form attivi l'evento BeforeUpdate, e quindi la registrazione 
 

 > però non riesco a farla funzionare. ho messo i TAG come da istruzione...
 
questo è il link:
http://allenbrowne.com/bug-01.html
 
 
che fa proprio pensare che nelle form A COLONNE ("semplici") con controlli associati si abbia la situazione che l'evento BeforeUpdate NON SI ATTIVA 
 
Da qui il mio modo di sistemare (vedi sopra) le form e di tenere TUTTE le form di registrazione dati (TUTTE con controlli associati) come SUBFORM
Posso affermare che così si attiva "SEMPRE" l'effetto BeforeUpdate (ma lo dico io ...)
 
Quindi l'istruzione di cui si parla è inserita nell'evento BeforeUpdate delle varie forms
 
Private Sub Form_BeforeUpdate(Cancel As Integer)
 
For Each contr In Me.Controls
    Select Case contr.ControlType
        Case acComboBox, acTextBox
            If contr.Tag = "obb" And IsNull(contr.Value) Then
                MsgBox "Valore obbligato mancante", vbExclamation, ""
                contr.SetFocus
                Cancel = True
                Exit Sub
            End If
        Case Else
           'non fa nulla
    End Select
Next
.....
.....
End Sub
 
con l'aggiunta del test sul tipo di controllo
 
PS: adopero solo A2000 e A2003, con A2007 Runtime nei posti di lavoro
 


ciao
ho trovato la soluzione, meglio togliere la parte 
contr.tag = "obb"
 
quindi diventa:
 
For Each contr In Me.Controls
Select Case contr.ControlType
Case acComboBox, acTextBox
If IsNull(contr.Value) Then
MsgBox "Valore obbligato mancante", vbExclamation, ""
contr.SetFocus
Cancel = True
Exit Sub
End If
Case Else 'non fa nulla
End Select
Next
 
cosi funziona anche sul click di un pulsante di uscita per effettuare il controllo che l'utente abbia inserito tutti i valori.
 
comunque grazie mi sei stato di aiuto!!!!! gentilissimo!!
alla prossima!
Luca


Ciao
se l'utente "sgamato" chiude il form con ctrl-f4 o in altro modo i tuoi controlli vengono saltati a piedi pari.
Mat.


interessante
come posso fare per evitare tutto ciò?
grande!!
Luca


Ciao
il codice che ti ha suggerito Giorgio era per l'evento Before_Update del form che si verifica prima del salvataggio del record.
Mat.


si
ho solo adattato la routine per usarla sul click di un pulsante
ma come posso evitare a questo punto che, come dici tu, un utente sgamato possa chiudere la maschera con i tasti altf4 o ctrlf4?
grazie


forse cosi?
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim intAltDown As Integer
intAltDown = (Shift And acAltMask) > 0
 
Select Case KeyCode
  Case vbKeyF4
    If intAltDown Then
      KeyCode = 0
      MsgBox "Alt+F4 has beed Disabled.", vbExclamation + vbOKOnly, " Disabled Key"
    End If
End Select
End Sub


potrebbe essere questo?



E se l'utente chiude Access con il pulsante di chiusura sulla finestra principale?
Lascia perdere i tentativi di intercettare la chiusura (a mio avviso).
Devi effettuare il controllo su Form_Before_Update in modo che in qualsiasi caso, prima che il record venga salvato, hai la possibilità di impedire il salvataggio (ed eventualmente la chiusura del form) con Cancel=True.
 
Ciao
Mat.


ok!!!
alla fine non hai tutti i torti.
finchè ci sono, approfitto della tua cortesia e preparazione, potresti dirmi che tipo di eventi sono questi
 
Set the "Key Preview" property of the form to Yes.
 
Now use the Form's "On Key Down" event to do what you ask
 
aiuto!!!


Perche' usi solo quelli?
 
 

La proprietà key_preview (anteprima_tasti nelle versioni in italiano) dei form serve per consentire alla maschera di intercettare gli eventi di testiera (key_down ecc) prima dei singoli controlli che li hanno generati. In questo modo è possibile "centralizzare" la gestione degli eventi di testiera che interessano tutto il form.
Suppongo che il testo in inglese che hai riportato sia il risultato di una tua ricerca nel tentativo di scrivere una procedura per intercettare la pressione dei tasti ctrl-f4 e simili. In quel caso sarebbe stato effettivamente necessario impostare Key_previw=true.
Ciao
Mat.
 


ciao Mat.
si... stavo cercando qualcosa per impedire alcune pressioni di tasti come dici tu...
in realtà dovrei mettere Anteprima tasti = si
poi sull'evento di tastiera fare girare la routine
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
Dim intAltDown As Integer 
intAltDown = (Shift And acAltMask) > 0 
 
Select Case KeyCode 
  Case vbKeyF4 
    If intAltDown Then 
      KeyCode = 0 
      MsgBox "Alt+F4 has beed Disabled.", vbExclamation + vbOKOnly, " Disabled Key" 
    End If 
End Select 
End Sub 
 
 
però... mi sa che hai ragione tu... forse meglio lasciar perdere..
in ogni caso grazie!!
ciao.
alla prossima
luca

L'idea di intercettare i tasti non è sbagliata in se ma, nella tua situazione specifica, lascia comunque dei casi scoperti, quindi ti troveresti a doverti inventare ancora qualcosa per gestirli.
Ciao
alla prossima. 
Mat.