Sincronizzare due maschere correlate con una macro di Access
Impariamo come sincronizzare due maschere correlate mediante l'uso di una macro di Access.
Nel tutorial precedente, abbiamo imparato come si apre una maschera secondaria da una maschera principale sulla base di valori corrispondenti indue campi correlati delle due maschere.
Abbiamo anche visto che i dati nella maschera secondaria non variano quando ci si sposta tra i dati della maschera principale.
In questo tutorial creeremo una macro che sincronizza i dati nella due maschere.
(Per "sincronizzazione" intendiamo che ad ogni cambiamento del record dellamaschera principale debba scattare automaticamente l'aggiornamento del record nella maschera secondaria o "sincronizzata")
Creare la macro 'SincrMaschereOreLavorateOperaiConOperai'
Nella finestra Database, fare clic sulla scheda Macro, e poi clic sul pulsante Nuovo. Una volta aperta la finestra Macro, ingrandirla in modo da riempire tutto lo schermo.
Leazioni e i commenti che si creeranno per questa macro sono illustrati nella figura che segue:
Creeremo questa macro con lo stesso metodo basilare con il quale abbiamo creato la macro ApriFormOperai.
Selezioneremo le azioni dalla colonna Azione e scriveremo i commenti relativi nella colonna Commento.
Leimpostazioni per le azioni sono illustrate nellatabella che si trova al centro di questa pagina.
(L’azioneImpostaValore è spiegata nel tutorial Convalidare dati e preimpostare valori , nel paragrafo “Passare informazioni di stato tra maschere collegate”)
Alcuniesempi di codice e di espressioni in questo tutorial sono troppo lunghi per stare in una sola riga di stampa.
Una riga che finisce col simbolo Carriage Return (Ritorno a capo) significa che il codice che segue nella riga successiva deve in realtà essere immesso sulla stessa riga.
Questamacro ha un paio di condizioni che determinano quali parti della macro vanno eseguite.
La prima condizione , in italiano, stabilisce: “Se la maschera OPERAI al momento non è caricata, esegui la prima azione”.
Questa condizione utilizza la funzione IsLoaded, che è inserita nel modulo modUtility del database GestioneColture.mdb.
Questa funzione verifica se una maschera (il cui nome abbiamo fornito alla funzione) è attualmente aperta. (La maschera può essere anche nascosta).
La sintassi della funzione è IsLoaded(”<nomemaschera>”), in cui nomemaschera è il nome della maschera in questione.
Bisogna racchiudere il nome della maschera tra virgolette doppie perché la funzione operi.
Il Not davanti all’espressione della funzione dice ad Access di valutare l’inverso del valore logico
Vero/Falso restituito dalla funzione.
Perciò questacondizione sarà vera soltanto se la maschera non (not) è aperta.
Se la maschera complementare non è aperta, non c’è niente da fare, e viene quindi eseguita l’azione di questa riga, cioèArrestaMacro e la macro termina.
Le impostazioni per le azioni nella macro SincrMaschereOreLavorateOperaiConOperai:
Condizione
Azione
Argomento
Impostazioni
Not IsLoaded("OPERAI")
ArrestaMacro
IsNull(Forms!
[OreLavorateOperai]!COD_OP) ImpostaValore
Elemento
Forms![OPERAI].Visible
Espressione
Falso
ArrestaMacro
ApriMaschera
NomeMaschera
OPERAI
Visualizza
Maschera
Condizione Where
[COD_OP]=[Forms]!
[OreLavorateOperai]!
[COD_OP]
Modalità immissione dati
Sola lettura
Modalità finestra
Normale
ImpostaValore
Elemento
[Forms]![OPERAI]![AddFlag]
SelezionaOggetto
Tipo oggetto
Maschera
Nome oggetto
OreLavorateOperai
Da finestra database
No
Per visualizzare le informazioni appropriate sull' operaio si potrebbe usare un’azione ApplicaFiltro per filtrare di nuovo la maschera aperta OPERAI, ma ApplicaFiltro funziona soltanto per la maschera che ha attualmente il focus.
Un’azione SelezionaOggetto risolverebbe questo problema, ma perché usare due azioni macro quando una potrebbe bastare?
In effetti, si può eseguire di nuovo ApriMaschera con la stessa condizione Where usata prima nella macro ApriFormOperai per visualizzare la riga corrispondente che desideriamo.
Se la maschera è già aperta,ApriMaschera mette il focus su quella maschera (e la rivela se è nascosta) e applica la condizione Where che abbiamo specificato.
Tuttavia non è bene far riferimento a unvalore “vuoto” in una condizione Where.
In effetti, in alcuni casi si riceverà un messaggio di errore. Quando ci si sposta oltre l’ultima riga nella maschera OreLavorateOperai o si sceglie Vai a dal menu Modifica e poi si seleziona Nuovo record dal sottomenu, ci si troverà in una nuovariga vuota, dove il campo COD_OP non ha alcun valore.
In questo caso, ApriMaschera mostrerà una riga vuota nella maschera OPERAI.
Probabilmente è più ragionevole controllare se il valore è “vuoto” o Null enascondere la maschera complementare se si è in unariga nuova della maschera OreLavorateOperai.
La seconda riga in questa macro utilizza lafunzione incorporata IsNull per verificare questa condizione.
Se COD_OP è Null, la macro nasconde la maschera OPERAI impostando la suaproprietà Visibile su Falso, e poi la macro finisce.
Si osservi che la maschera è ancora aperta, anche se non si può vederla. Se ci si sposta indietro su una riga che contiene dati, questa macro si esegue di nuovo e rende visibile la maschera quando viene eseguita l’azione ApriMaschera.
Per finire, l’azione ApriMaschera in questa macro è proprio come quella che abbiamo visto prima nella macro ApriFormOperai.
Di fatto, qui si potrebbe anche utilizzare un’azioneEseguiMacro per eseguire di nuovo quella macro per aprire la maschera (o per focalizzarla se è già aperta) e applicare il filtro specificato nell’argomento della condizione Where.
Il comando SelezionaOggetto assicura che la maschera abbia il focus dopo l’impostazione delvalore del controllo AddFlag.
Ora che abbiamo la macro di sincronizzazione che ci serve, l’ultimo passo consiste nell’associarla all’evento Su corrente della maschera OreLavorateOperai.
Facciamo clic sulla scheda Maschere della finestra Database e apriamo la maschera OreLavorateOperai in visualizzazione Struttura.
Una volta in visualizzazione Struttura, facciamo clic sul pulsante della barra degli strumenti Proprietà per aprire la finestra della proprietà di questa maschera, e poi facciamo clic nella casella della proprietà 'Su corrente' (che si trova nellascheda 'Evento').
Useremo l’elenco a discesa per selezionare lamacro 'SincrMaschereOreLavorateOperaiConOperai'.
Lo schermo dovrebbe presentarsi come la figura qui sotto.
Fatto questo, si salva e si chiude la maschera.
Collaudiamo la macro spostandoci lungo i record nella maschera OreLavorateOperai.
Quando si passa da un record all’altro, i dati nella maschera OPERAI dovrebbero cambiare in modo da rispecchiare l'operaiovisualizzato nel record corrente della maschera OreLavorateOperai.
Se ci portiamo sul record vuoto infondo al recordset, la maschera OPERAI. Torniamo su una riga che contiene dei dati, e la maschera riappare.
L’uso di una macro per sincronizzare due maschere che contengono dati correlati è una tecnica che funziona bene per quasi tutti gli insiemi di maschere e può essere utilizzata in numerose situazioni.
Nel prossimo tutorial impareremo come si crea una macro più complessa, nota come gruppo di macro.
I gruppi di macro sfruttano l’idea di raggruppare le macro in base alle attività, il che, come presto vedremo, è alquanto utile.
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 e preimpostare valori
Preimpostare i valori
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:
