Newsgroup: it.comp.appl.access
Titolo: Problema con controllo campi nulli

Sull' evento "prima di aggiornare" di una maschera lancio questa funzione:
Public Function controllaCampi()
Dim ctrl As Control
    For Each ctrl In Forms!libro_mod_ins.Controls
        If ctrl.Tag = "OBBLIGATORIO" Then
              ctrl.BackColor = vbWhite ' oppure colore standard
             If (IsNull(ctrl.Value) Or Trim(ctrl.Value) = "" Or 
IsEmpty(ctrl.Value) Or Len(ctrl.Value & "") = 0) Then
                 ctrl.SetFocus
                 ctrl.BackColor = vbRed
                 MsgBox "Attenzione il controllo " & ctrl.Name & " è 
obbligatorio.."
             End If
        End If
     Next
End Function
Funziona benissimo ma quando resta solo un campo da valorizzare ad 
esempio un campo "titolo" se insisto nel non valorizzarlo, la prima 
volta mi mette il focus, cambia colore e mi avvisa di valorizzare, la 
seconda volta mi da il messaggio ma quando clicco su ok, la maschera mi 
fa inserimento e passa al successivo record da inserire. Stranamente 
tutti i campi "titolo", anche dei record già inseriti, restano rossi.
Sembra che ci sia un problema sul next... potete aiutarmi?

Cekko ha scritto:

Il "problema" e' sull'evento di "current" (cioe' quando cambi record),
Se non ripristini il valore del colore quello rimane talqual.
Lo stesso ciclo sui controls lo devi fare per l'evento di current
i.e.
Public Function ripristinaCampi()
  Dim ctrl As Control
     For Each ctrl In Forms!libro_mod_ins.Controls
         If ctrl.Tag = "OBBLIGATORIO" Then
               ctrl.BackColor = vbcolorebase
         End If
      Next
End Function
--
ac

Alessandro Cara ha scritto:

Alessandro, se matto l'evento su current, il controllo parte già quando 
apro la maschera...... come faccio?

Cekko ha scritto:

Pe "matto" lo sono e manco poco. L'evento di current scatta anche sulla 
open. Sempre che tu abbia forms associati.
--
ac

 ac

Alessandro Cara ha scritto:

In effetti crea problemi perchè l'utente ancora prima di vedere la 
maschera deve rispondere ad una serie di "il tal campo è 
obbligatorio..." e comunque una volta aperta la maschera, su current 
cicla all'infinito senza la possibilità di inserire nulla...

Alessandro Cara ha scritto:

In effetti crea problemi perchè l'utente ancora prima di vedere la
maschera deve rispondere ad una serie di "il tal campo è
obbligatorio..." e comunque una volta aperta la maschera, su current
cicla all'infinito senza la possibilità di inserire nulla...
Comunque la cosa principale è che non riesco ad impedire (lato maschera) 
l'insert del campo vuoto. Il comportamento è il seguente: supponiamo di 
controllare solo il campo "autore". Inserisco una descrizione nel campo 
"descrizione" e mi si attiva il pulsante classico della maschera per 
fare insert (>). Lo premo e giustamente mi compare il messaggio che il 
campo Autore è obbligatorio. premo ok, lo lascio vuoto, rispingo (>). 
Questa volta l'insert viene fatto e mi compare il messaggio che Autore è 
obbligatorio, ma mi ritrovo già sul secondo record. Come posso impedire 
che la maschera faccia l'insert, se non dopo aver valorizzato "autore"?
Sia su Corrente che su primadiaggiornare, non cambia nulla, almeno con 
le righe di codice che ho postato...

Cekko ha scritto:

Non credo che tu abbia scritto sull'evento di current la routine che ti 
avevo suggerito.
Recitava una vecchia "canzona" -ma cosa hai messo nel caffe'....-
i.e.
cosa hai messo sull'evento di current? Codice ...please
--
ac

Alessandro Cara ha scritto:

Ale, ho messo il tuo codice su "corrente", è vero che ora i campi 
tornano bianchi, ma ciò non toglie che quando resta solo un campo nullo, 
la prima volta viene fermato l'insert con il msgbox, la seconda volta 
viene fatto insert col campo nullo, ..... non sò perchè...

Alessandro Cara ha scritto:

Ok, il tuo codice rende i background bianchi ma...
Comunque la cosa principale è che non riesco ad impedire (lato maschera)
l'insert del campo vuoto. Il comportamento è il seguente: supponiamo di
controllare solo il campo "autore". Inserisco una descrizione nel campo
"descrizione" e mi si attiva il pulsante classico della maschera per
fare insert (>). Lo premo e giustamente mi compare il messaggio che il
campo Autore è obbligatorio. premo ok sulla msgbox, lo lascio vuoto, 
rispingo (>), ricompare la msgbox, premo ok e.....
questa volta l'insert viene fatto e mi compare il messaggio che Autore è


Cekko ha scritto:

Cancel= ControllaCampi.
Ti devi far tornare dalla funzione "ControllaCampi" un valore boolean 
(true/false)
False se vuoi che l'evento prosegua, e quindi passi a nuovo record
True se vuoi che l'evento venga cancellato
L'evento "BeforeUpdate" e di tipo "cancellabile" fra i parametri c'e' 
appunto il "Cancel" che serve a questa bisogna.
--
ac


Quello che citi e' un altro problema a cui non avevo nemmeno buttalo 
l'occhio, ho risposto,ora, il altro ramo 3d. Problemi separati 
dovrebbero avere post separati. Non e' detto che chi risponde sia in 
grado di risolvere tutto ed a quel punto magari lascia perdere. Tanto il 
problema e' dell'OP mica il suo.
--
ac

Alessandro Cara ha scritto:

Ale.... scusa, siccome sono un novizio... non credo di avere capito....


Nell'evento di BeforeUpdate quando chiami la funzione controlla campi 
devi modificarla cosi'
Cancel=ControllaCampi()
e poi devi modificare la controlla campi in questo modo:
Public Function controllaCampi() as boolean
Dim ctrl As Control
    For Each ctrl In Forms!libro_mod_ins.Controls
        If ctrl.Tag = "OBBLIGATORIO" Then
              ctrl.BackColor = vbWhite ' oppure colore standard
             If (IsNull(ctrl.Value) Or Trim(ctrl.Value) = "" Or 
IsEmpty(ctrl.Value) Or Len(ctrl.Value & "") = 0) Then
                 ctrl.SetFocus
                 ctrl.BackColor = vbRed
                 MsgBox "Attenzione il controllo " & ctrl.Name & " è 
obbligatorio.."
		ControllaCampi=true
             End If
        End If
     Next
End Function
--
ac


Ale, funziona, sei un grande... ma sinceramente non ho capito il perchè 
heheheh!!
Grazie.
Andrea


Ale, funziona, sei un grande... ma sinceramente non ho capito il perchè
heheheh!!
Grazie.
Ora volevo fare lo stesso tipo di controllo anche per una sottomaschera 
che contiene una comboBox. Si chiama menuAutore.
Chiaramente con la
For Each ctrl In Forms!libro_mod_ins.Controls
non localizzo questo controllo.
Ho provato con
For Each ctrl In Forms!libro_mod_ins.Form!subMenuAutore.Controls
e ho riscritto una funzione:
Public Function controllaCampiSub()
Dim ctrl As Control
    For Each ctrl In Forms!libro_mod_ins.Form!subMenuAutore.Controls
        If ctrl.Tag = "OBBLIGATORIO" Then
              ctrl.BackColor = vbWhite ' oppure colore standard
             If (IsNull(ctrl.Value) Or Trim(ctrl.Value) = "" Or 
IsEmpty(ctrl.Value) Or Len(ctrl.Value & "") = 0) Then
                 ctrl.SetFocus
                 ctrl.BackColor = vbRed
                 MsgBox "Attenzione il controllo " & ctrl.Name & " è 
obbligatorio.."
             controllaCampiSub = True
             End If
        End If
     Next
End Function
ma... mi sono perso... come faccio a fare eseguire anche questa... e poi 
il mio ragionamento fila?
Andrea


Ale, funziona, sei un grande... ma sinceramente non ho capito il perchè
heheheh!!
Grazie.
Naturalmente ora mi sono incasinato di nuovo...
Volevo estendere lo stesso tipo di controllo ad una sottomaschera 
"subMenuAutore". Ho scritto:
Public Function controllaCampi()
Dim ctrl As Control
Dim ctrlsub As Control
    For Each ctrl In Forms!libro_mod_ins.Controls
        If ctrl.Tag = "OBBLIGATORIO" Then
              ctrl.BackColor = vbWhite ' oppure colore standard
             If (IsNull(ctrl.Value) Or Trim(ctrl.Value) = "" Or 
IsEmpty(ctrl.Value) Or Len(ctrl.Value & "") = 0) Then
                 ctrl.SetFocus
                 ctrl.BackColor = vbRed
                 MsgBox "Attenzione il controllo " & ctrl.Name & " è 
obbligatorio.."
             controllaCampi = True
             End If
        End If
     Next
For Each ctrlsub In Forms!libro_mod_ins.Form!subMenuAutore.Controls
        If ctrlsub.Tag = "OBBLIGATORIO" Then
              ctrlsub.BackColor = vbWhite ' oppure colore standard
             If (IsNull(ctrlsub.Value) Or Trim(ctrlsub.Value) = "" Or 
IsEmpty(ctrlsub.Value) Or Len(ctrlsub.Value & "") = 0) Then
                 ctrlsub.SetFocus
                 ctrlsub.BackColor = vbRed
                 MsgBox "Attenzione il controllo " & ctrlsub.Name & " è 
obbligatorio.."
             controllaCampi = True
             End If
        End If
     Next
End Function
Il problema è che quando clicco sulla comboBox contenuta nella 
sottomaschera, mi parte un "beforeupdate" della "parent" e continua a 
dirmi che quella combo va valorizzata, ma non mi ci mette neppure il 
fuoco, anche se diventa rossa... help!!
Andrea

Cekko ha scritto:
[cut]

Mo vado a fa la spesa e poi vado a vede "a Maggica".
Quindi per oggi, almeno io, closed.
Comunque se hai un quesito diverso fai un post diverso cosi' qualche 
curioso ci mette il naso.
Questa e' la prassi comune.
--
ac