Newsgroup: it.comp.lang.delphi
Titolo: Verifica campi vuoti

Solitamente uso del TComboBox per le selezioni da DB, poi con Invio 
accetto la scelta ed in seguito valorizzo il campo.
 
ComboBox1.Text := <valore del campo>.AsString;
 
Capita pero' che verificare se il ComboBox sia vuoto
 
if(Trim(<nomecampo>.Text) = '') then FlgCampo := False;
 
non sempre sia affidabile, (valorizzo il ComboBox, lo vuoto, lo 
rivalorizzo, e ancora svuotato (ComboBox1.Text := '')
 
possa risultare non vuoto, con tutti i rischi del caso
(impedire la registrazione se uno o piu' campi sono vuoti)
 
Sarebbe forse piu' sicuro verificare il campo del db ?
 
FlgCampo := True;
if SQLQuery1.FieldByname(<campo>.IsNull then FlgCampo := False;
 
if (not FlgCampo) or
    (not FlgCampo1) or
    (not FlgCampo2) then
  Registra
else
  errore

Ciao,
credo dovresti fare attenzione (se controlli il valore nel DB) di non confondere la stringa vuota '' con il valore null.
 
Io non uso quasi mai la combobox per le selezioni, tranne nei casi in cui i valori all'interno della combo non siano di numero inferiore a 10 elementi.
Nel caso di una tabella collegata potresti dover popolare centinaia/migliaia di valori nella stringlist
 
Mi sono costruito un componente (ma puoi utilizzare anche un semplice edit) dove digitare il valore e poi con una sequenza tasti (nel mio caso il tasto CTRL sulla tastiera o il doppio click del mouse) accedo tramite una finestra di ricerca alla tabella collegata
 
 
Per il ciclo di controllo, personalmente preferisco delle procedure del tipo:
 
CanClose := True;
 
if CanClose and (test_valore_nullo)
  then CanClose := False;
 
if CanClose and (test_valore_vuoto)
  then CanClose := False;
 
if CanClose and (test_valore_...)
  then CanClose := False;
 
...
 
if CanClose
  then Registra
  else Visualizza_Errore
 
In questo modo non rischio di avere una lettura/stesura complicata dei test con OR in sequenza e mi diventa molto più leggibile a posteriori. Anche l'aggiunta di un nuovo test è semplificata
 
Non solo, quasi sempre sposto il messaggio di errore all'interno del singolo test e non in coda della procedura.
Questo mi da modo di inserire dei test "forzabili" dopo un opportuno messaggio e richiesta all'operatore
 

Ancora una piccola aggiunta.
 
Se utilizzi componenti collegati direttamente al DB, il valore nel componente non viene trascritto nel DB fino a che il focus resta nel controllo.
 
Per ovviare a questo problema, prima di eseguire la procedura di test, sposto forzatamente il focus in un controllo che so esserci nella finestra e che è sicuramente attivo (nel mio caso il button btnExit) e subito dopo lo riporto al controllo iniziale.
 
In questo modo ho la certezza che il valore nel DB è stato aggiornato

Correzione... il valore finisce nel DB quando registro.
Mi riferivo al valore nel dataset

Ciao Alessandra,
  come anticipato da Alessandro devi fare attenzione tra stringa vuota e 
null.
Questo perche' non tutti i db associano il campo null, in questo caso alla 
stringa, al vuoto.
 
Personalmente preferisco svincolarmi da tutti i componenti dbaware e opto 
per una gestione "manuale di tutto".
In questo caso PRIMA di salvare controlli il valore dei campi e se uno non 
ti soddisfa fermi la procedura.
 
Evidentemente tanti piu' campi hai .... tanti piu' controlli devi fare !!!!
Il pericolo dei componenti dataware e' che se inavvertitamente cambi 
controllo o cambi procedura se sei in edit .... il motore salva tutto quello 
che e' "attivo" in quel momento.
 
Da qui la mia, opinabile, decisione.
 
Ciao
Daniele