Convalidare dati immessi dall'utente con una macro di Access
Impariamo come utilizzare le macro di Access per convalidare dati immessi dall'utente.
Due attività che di solito si automatizzano nelle applicazioni sono la convalida dei dati che un utente immette in un campo e l’impostazione di valori per campi specifici.
In questo paragrafo creeremo un gruppo di macro che contiene le macro che effettueranno queste attività.
Assoceremo queste macro sia con la maschera OreLavorateOperai sia con lamaschera OPERAI.
Fra i problemi che si incontrano spesso quando si creano applicazioni database c’è quello di come assicurarsi che i dati immessi dall’utente siano validi.
Sono tre i tipi di dati non validi: le voci sconosciute, le voci mal scritte e le varianti ripetute di una stessa voce.
• Voci sconosciute: Un esempio chiaro di questo errore è rappresentato da una voce AX in un campo Stato. Negli USA non c’è una sigla di Stato AX, ma un utente che volesse immettere AZ (Arizona) potrebbe battere accidentalmente il tasto X invece del tasto Z.
• Voci mal scritte: Questo tipo di errore è molto frequente fra gli utenti non molto abili come dattiografi o, al contrario, troppo veloci oppure un po’ incerti nell’ortografia. In questo caso si può trovare Settie, Seatle o Saettle invece di Seattle.
• Varianti ripetute: Questi errori si trovano spesso nei database mal progettati e in quelli condivisi da molti utenti. Si potranno vedere voci come ABC Company, Inc.; ABC Company, Incorporated; ABC Co., Inc.; oppure A B C Company Inc.
Si possono usare macro per convalidare i dati e per contribuire aridurre gli errori.
In questo tutorial creeremo unamacro per la maschera OreLavorateOperai che convalida l'operaio che l’utente immette nel campo COD_OP (Codice operaio): si avverte che si tratta di un controllo casella combinata quindi Access è in grado di risalire automaticamente dal Nome al Codice.
Se il nome (codice) dell'operaio non esiste nella tabella OPERAI la macro eseguirà i seguenti passi:
1 Visualizza un messaggio per indicare che il nome dell'operaio non è elencato e perchiedere se l’utente vuole aggiungere un nuovo record allatabella OPERAI.
2 Se l’utente vuole creare un nuovo record per la tabella OPERAI, viene eseguita un’altra macro che apre la maschera OPERAI nellamodalità immissione dati e copia il nome dell'operaio appena battuto dall’utente.
3 Se l’utente salva con successo una nuova riga (record), unamacro nell’evento 'Dopo inserimento' della maschera OPERAI imposta unflag nella maschera OreLavorateOperai.
4 Tornando alla maschera OreLavorateOperai, il nome del nuovo operaio viene nuovamente convalidato e, se la voce è nuova, una macro attivata da Dopo aggiornamento del codice operaio (campo: COD_OP) accerta che il nuovo nome appaia nellacasella combinata.
Quando ilnome dell'operaio è convalidato, questa macro calcola automaticamente anche il valore del campo COSTO_OP (Costo dell'operazione) in base al valore di COSTO_ORA (il costo orario) dell'operaio caricato nella maschera OPERAI e al valore di ORE_LAV (Ore lavorate) presente invece sulla tabella OREOPER (la tabella 'sottostante' allamaschera OreLavorateOperai)
Creare il gruppo di macro 'ConvalidaOperaioImpostaCostoOrario'.
Nella finestra Database, facciamo clic sulla scheda Macro e creiamo una macro nuova.
Accertiamoci che siano visualizzate lecolonne Nome macro e Condizione.
La prima macro e le azioni che le sono associate si possono vedere nella figura che segue:
Dopo aver battuto le prime tre righe di commento, scriviamo TestOperaio nella colonnaNome macro: TestOperaio sarà il nome della prima macro nel gruppo di macro, poi selezioniamo le azioni elencate nella tabella qui sotto e impostiamo gli argomenti come indicato.
Fatto questo, introduciamo i commenti appropriati per ciascuna azione, che si vedono nella figura sopra. Per ora non ci preoccuperemo delle condizioni.
Azioni e argomenti dellamacro TestOperaio:
Azione
Casella argomenti
Impostazioni
AnnullaEvento
EseguiMacro
NomeMacro
ConvalidaOperaioImpostaCostoOrario.ChiediNuovo
Diamo ora un’occhiata alla condizione che convalida il nome dell'operaio ed esegue queste azioni, se il nome dell'operaio non esiste nella tabella OPERAI.
Facciamo clic nella casella della colonna Condizione a sinistra dell’azione AnnullaEvento, e poi apriamo la casella Zoom usando il menu di scelta rapida col pulsante destro del mouse.
Introduciamo l’espressione che si vede nella figura seguente:
Questa condizione utilizza due funzioni incorporate:IsNull e DLookup. La funzioneDLookup cerca il nome dell'operaio nella tabella OPERAI.
La funzione IsNull verifica ilvalore restituito dalla funzione DLookup. Se questa non trova il nome dell'operaio, restituisce un valore Null.
Questo, a sua volta, fa sì che la funzione IsNull restituisca un valore logico Vero perché, infatti, il valore restituito dalla funzione DLookup è Null.
Perciò, se non c’è una riga nella tabella OPERAI che corrisponde al nome dell'operaio attuale nella maschera OreLavorateOperai,Access esegue l’azione associata a questa condizione perché la condizione è stata valutata Vero.
In questo caso, un’azione della macro AnnullaEvento dice ad Access di non memorizzare il nuovo valore nel campo NomeOperaio.
Inserendo un segno di ellissi (. . .) cioè i 3 puntini, nella colonna Condizione della seconda azione, si chiede ad Access di eseguire questa azione soltanto se la condizione precedente è vera.
(Quando si utilizza una ellissi, bisognaimmettere la condizione soltanto una volta e Access effettua la valutazione una volta sola.)
Così se l'operaio non esiste nella tabella OPERAI, l’azione macro EseguiMacro, nella seconda riga, chiama la macro ChiediNuovo, che esamineremo tra poco.
D’altro canto, se la funzioneDLookup trova il nome dell'operaio, lo restituisce alla funzione IsNull. Questa allora restituisce un valore logico Falso, dal momento che il valore restituito dalla funzioneDLookup non è Null.
Access ignora l’azione associata a questa condizione. Dal momento che abbiamo incluso una ellissi nella seconda condizione, la valutazione Falso vale anche in questo caso, così infine la macro termina senza eseguire ulteriori azioni.
Quando non si annulla unevento PrimaDiAggiornare in un controllo, Access accetta i cambiamenti e offre l’opportunità di vedere il risultato nell’evento DopoAggiornamento.
Come vedremo un po più avanti, questa applicazione utilizza DopoAggiornamento in questo controllo per inserirvi il valore del costo orario dell'operaio e calcolare il costo dell'operazione in OreLavorateOperai.
In conclusione, che cosa succede se l'utente immette un nome di operaio che non è ancora nel database?
Viene eseguita la macro ChiedeNuovo, e la prima cosa che questa fa è valutare un’altra condizione.
Come vedremo nei tutorials successivi, questa specie diverifica logica Se.. .allora. ..Se è molto più facile da fare in VBA.
Con le macro, bisogna fare la prima verifica in una macro, e poi, se questa è vera, si deve chiamare un’altra macro annidata per effettuare un’ulteriore verifica.
La condizione nella prima riga della macro ChiedeNuovo è come segue:
6<>MsgBox("il nome selezionato non è in elenco. Vuoi aggiungere un nuovo record alla tabella OPERAI ?", 36)
Abbiamo già visto prima l’azione FinestraMessaggio (MsgBox). Questa condizione utilizza una funzione incorporata chiamata MsgBox, che è molto più potente.
La funzione MsgBox non consente soltanto di visualizzare un messaggio, ma permette anche di specificare quale icona vogliamo visualizzare e offre diverse opzioni per i pulsanti da visualizzare nella finestra di messaggio.
Questeopzioni si impostano sommando i numeri delle selezioni e fornendo ilrisultato come secondo argomento a MsgBox.
In questo caso, 36 è la somma di 32, che chiede un’icona punto interrogativo, e 4, che richiede i pulsanti Sì e No (intuitivo, vero?).
Si possono trovare tutte le impostazioni delle opzioni esaminando Costanti MsgBox nella Guida in linea di Access. Inoltre la funzione restituisce un numero intero a seconda del pulsante su cui l’utente fa clic nella finestra messaggio.
Esaminando l’argomento MsgBox nella Guida, troveremo che, quando l’utente fa clic su Sì,MsgBox restituisce un 6.
Perciò se l’utente non fa clic su Sì, laprima riga di questa macro (una azione ArrestaOgniMacro) si esegue e la macro termina.
Se l’utente fa clic su Sì, il resto della macro si esegue. Le azioni e gli argomenti sono elencati nella tabella qui sotto.
Questa macro contiene diverse azioni che Access esegue se l’utente immette i dati di un nuovo operaio.
Per prima cosa, Access apre la maschera OPERAI e copia il nome dell'operaio dalla maschera OreLavorateOperai nel campo Nome della maschera OPERAI.
Lo fa per due motivi: per la comodità dell’utente e per accertare che l’utente cominci con il nome appena immesso.
Dopo che la macro ha copiato il nome dell'operaio nel campo Nome, Access sposta il cursore nel campo COSTO_ORA (Costo orario) della maschera OreLavorateOperai.
Infine, lamacro imposta il valore di una casella di testo nascosta nella maschera OPERAI (che si chiama AddFlag), per indicare che l’utente è nella modalità immissione dati.
La macro collegata all’evento Dopolnserimento controlla questo flag per stabilire se deve avvisare l’evento DopoAggiornamento del controllo NomeOperaio sulla maschera OreLavorateOperai di aggiornare il suo elenco.
Le azioni e gli argomenti nella macro ChiediNuovo
Azione
Casella argomenti
Impostazioni
ApriMaschera
NomeMaschera
OPERAI
Visualizza
Maschera
Modalità dati
Aggiungi
Modalità finestra
Normale
Imposta valore
Elemento
[Forms]![OPERAI]!Nome
Espressione
[Forms]![OreLavorateOperai]!NomeOperaio
VaiAControllo
Nome controllo
COSTO_ORA
ImpostaValore
Elemento [Forms]![OPERAI]![AddFlag]
Valore
Vero
Passare informazioni di stato tra maschere collegate
Come abbiamo appena visto, la macro ChiediNuovo imposta uno speciale controllo nascosto nella maschera OPERAI per dire alla macro dell’evento Dopo lnserimento che la maschera OreLavorateOperai ha bisogno di sapere se è stata aggiunta con successo una riga nuova.
Analogamente, quando viene aggiunta una riga nuova alla maschera OPERAI, la macro che viene eseguita in risposta a un evento Dopolnserimento (l’evento che Access utilizza per farci sapere quando è stata aggiunta una nuova riga tramite una maschera) deve controllare ilflag epassare un indicatore alla maschera OreLavorateOperai.
Nei tutorials relativi ai moduli e al VBA scopriremo che si può effettuare questa specie di passaggio di “indicatore di stato” molto più facilmente utffizzando le variabili di quanto non si possa fare nascondendo controlli nella maschere aperte.
La figura seguente illustra la macro di cui abbiamo bisogno per rispondere all’evento Dopolnserimento della maschera OPERAI.
Nella prima riga c’è una condizione che effettua una verifica per accertare che l’utente abbia chiesto di aggiungere una nuova riga.
La condizione è la seguente:
Not[Forms]![OPERAI]![AddFlag]

Se il flag non è impostato, laprima azione chiude la maschera, e l’azione ArrestaOgniMacro termina la macro.
Se il flag è impostato, l’azione Imposta Valore imposta il flag nellamaschera OreLavorateOperai (per farle sapere che deve aggiornare l’elenco nella casella combinata NomeOperaio alla primissima occasione) e poi chiude la maschera OPERAI.
Si noti che potrebbe essere stato attivato l’evento Dopolnserimento in conseguenza del fatto che l’utente ha introdotto nuovi dati e poi ha fatto clic sul pulsante Chiudi della maschera.
Access è tanto gentile da non generare alcun errore dall’una o dall’altra di queste azioni Chiudi, se si dà questo caso.
Se l’utente attiva l’evento Dopolnserimento spostandosi su un’altra riga, è ragionevole chiudere la maschera dopo aver aggiunto quella riga che ci serve.
Se l’utente chiude la maschera senza immettere nuovi dati, l’evento Dopolnserimento non avrà luogo.
L’utente si troverà di nuovo nella maschera OreLavorateOperai con i dati dell' operaio scompagnato ancora scritti nellacasella combinata NomeOperaio.
Come tocco finale, aggiungere un’azione Imposta valore alla macro 'SincrMaschereOreLavorate-
OperaiConOperai' che abbiamo visto prima per reimpostare il flag quando ci si sposta su una nuova riga nella maschera OreLavorateOperai.
Una volta passati a una nuova riga, è chiaro che non interessa più aggiungere una nuova riga alla tabella OPERAI.
Aggiungere anche un’azione SelezionaOggetto per riportare il focus sullamaschera dopo l’aggiornamento del flag.
Creazione di una macro semplice
Gruppi di macro
Espressioni condizionali
Fare riferimento a oggetti maschere e report
Aprire una maschera secondaria
Sincronizzare due maschere correlate
Convalidare dati immessi dall'utente
Preimpostare i valori nei controlli
Collegamenti ad altri tutorial su Microsoft Access:
Le Relazioni tra le tabelle di Access
Costruire una tabella con Access
Esempi di Macro con Microsoft Access
Tutorials su Microsoft Access
Dr.Maurizio Cucchiara
autore del corso:
"Corso Base di Microsoft Access"
disponibile on line su questo sito
MC2 E-Learning S.a r.l.
Formazione per il Web
http://www.mc2.it/html/access.html
Cerca sul web con Google:
