Newsgroup: it.comp.appl.access
Titolo: Funzione If in Vba

Dunque,
Ho una maschera dove registro i corsi di formazione
dei dipendenti dell'azienda
Per evitare che al momento di inserire nuovi record
dimentichi di precisare o il dipendente o il corso effettuato
ho aggiunto la seguente routine alla maschera legata
all'evento Prima di aggiornare:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me![Matricola]) Then
MsgBox ("Hai dimenticato di indicare il dipendente!")
DoCmd.CancelEvent
DoCmd.GoToControl "Matricola"
End If
If IsNull(Me![CodiceCorso]) Then
MsgBox ("Hai dimenticato di precisare il corso!")
DoCmd.CancelEvent
DoCmd.GoToControl "CodiceCorso"
End If
End Sub
Intanto una curiosità: cosa vuol dire quel "Cancel as Integer" inserito
automaticamente quando richiamo l'evento dalla finestra
delle proprietà della maschera?
Ma la vera domanda è questa: questa routine
posso semplificarla e migliorarla in qualche modo?
Grazie infinite per ogni suggerimento
--
Fabrizio Domiziani
dom...@tin.it

 wrote in message 17CHT
2x7$GA....@news1.galactica.it...


posso semplificarla e migliorarla in qualche modo?
primo: indenta il codice.  ad es.:
If IsNull(Me![Matricola]) Then
	MsgBox ("Hai dimenticato di indicare il dipendente!")
	DoCmd.CancelEvent
	DoCmd.GoToControl "Matricola"
End If
poi, usa la funzione nz e verifica che il controllo sia semplicemente
vuoto, non nullo.  potrebbe darsi che l'utente abbia scritto un valore
nel controllo e che l'abbia poi cancellato.  in questo caso il
controllo non e' piu' null ma e' empty.  se poi usi anche trim eviti
il caso di considerare corretto il contenuto di un controllo composto
da soli spazi.  
vedo che giustamente con un gotocontrol rimandi il focus al controllo
che l'utonto ha saltato.  ma in questo caso devi anche uscire dalla
sub altrimenti se anche il secondo controllo non contiene dati il
focus viene passato a quest'ultimo e non al primo.
in sostanza:
If trim(nz(Me![Matricola]), "")) = "" Then
	MsgBox ("Hai dimenticato di indicare il dipendente!")
	DoCmd.CancelEvent ' oppure: cancel=true
	DoCmd.GoToControl "Matricola"
	exit sub
End If
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/


Fermo restando la validità delle risposte di Laura e di lbo, se scrivere VBA
non ti serve a scopo didattico, la cosa più semplice per me è dichiarare la
Proprietà di campo "Richiesto" a SI quando definisci i campi Matricola
CodiceCorso nella tabella cui appartengono.
Roberto

Cancel serve per poter uscire dalla routine.
Vorrei aggiungere che il controllo sulla matricola e sul numero di corso
acquista maggior senso all'interno del concetto di integrità referenziale
(entrambi devono essere il relazione con campi di altre tabelle) . Se tale
integrità è stabilita sarà lo stesso Access ad impedire il salvataggio del
record quando non sono valorizzati in modo corretto.
Ciao Nicola

posso semplificarla e migliorarla in qualche modo?
Se vuoi un sistema alternativo che io utilizzo sopratutto se i controlli da
"controllare"
sono numerosi, e quando devo assegnare una determinata formattazione a dei
controlli
in funzione di determinati eventi,
vado ad inserire nella proprieta' tag del controllo una lettera (es. O) e
poi nel pulsante
che va a salvare il record  faccio eseguire il seguente codice
'-------------------------------------------------
Dim ctr As control
For Each ctr In Me.CONTROLS
If ctr.ControlType = acTextBox Or ctr.ControlType = acComboBox Then
Select Case ctr.Tag
Case "O"
If IsEmpty(ctr) Or IsNull(ctr.Value) Or Trim(ctr.Value) = "" Then
MsgBox "Il campo " & ctr.Name & " è obbligatorio e deve essere completato"
ctr.SetFocus
End
End If
End Select
End If
Next ctr
Naturalmente se non conosci l'utilizzo di
Select Case
For Next
proprieta' Tag
E' l'occasione per andare a vederle  nell'help
tanto  poi ti tornera'  utile in altre occasioni
Carlo Ve

Grazie infinite a tutti quanti!!!