logo MC2 E-Learning S.a r.l.
Logo Einstein grigio sfumato
e = m x c al quadrato





Come inserire dati correlati nelle maschere di Access con il VBA

Impariamo ad utilizzare il VBA Visual Basic For Application per inserire dinamicamente dei dati correlati sulle maschere di Access







Molto si può fare per garantire che l’utente di un’applicazione immetta correttamente i dati: impostare valori predefiniti, definire maschere di input e regole di convalida.

Ma che cosa si può fare se i valori predefiniti vengono da una tabella correlata?

Che cosa si può fare se la maschera di input deve cambiare in base al valori di un campo correlato?

Come possiamo assistere un utente a immettere un valore che non si trova nelle righe di origine di una casellacombinata?

La tabella tblContracts del database Entertainment scheduling ha alcuni campi che duplicano i dati “correnti” dal record correlato di tblGroups quando nasce un contratto.

Analogamente, la tabella tblOrdini nel database Libri ha informazioni sul nome e l’indirizzo del cliente che vengono usate come dati “predefiniti” per i campi delle spedizioni.

Quando si lavora con uno di questi due database e si crea un nuovo contratto o un nuovo ordine, non dovrebbe essere necessario immettere manualmente da una tabella a un’altra queste informazioni “predefinite”.

Sfortunatamente, la proprietà ValorePredefinito non può riferirsi a un campo in un’altra tabella. È facile, però, scrivere nelle maschere di immissione dei dati un codice di programma che se ne faccia carico.

Esaminiamo la maschera Contracts nel databaseEntertainment Schedule.

Si cominci coll’aprire il database, consentendo all’applicazione di avviarsi. Fare clic sul pulsante Contracts nel pannello comandi principale e poi ancora clic su Edit All nella finestra Select Contracts per aprire la maschera.

Fare clic sul pulsante Add New per avviare un record completamente vuoto per un nuovo contratto, come si vede nella figura 1.

Quando si sceglie unnuovo gruppo in questa maschera, farebbe comodo poter copiare dal record del gruppo selezionato tutti i dati “aggiornati all’istante” che devono essere memorizzati insieme col contratto (nome del leader, numero di telefono, dimensioni del gruppo, componenti il gruppo e condizioni di pagamento).

Se qualche componente del gruppo sarà diverso per questo particolare contratto, sarà semplice modificare le informazioni nel nuovo record. Se le informazioni di base sono corrette, si evitano potenziali errori di ribattitura.

Analogamente, quando si sceglie un club per il contratto, farebbe piacere che venissero copiati i dati relativi al nome del manager attuale, il numero di telefono e gli orari abituali di spettacolo. Facciamo una prova scegliendo un gruppo.

Nel contratto appena aperto scegliereBuck And The Fullerenes dall’elenco Group. Si dovrebbe vedere che, come per “magia”, compaiono nella maschera le dimensioni del gruppo, il codice dell’agente, il nome del leader e il suo numero di telefono, i componenti del gruppo e le condizioni di pagamento, come si vede nella figura 2.

Perché questo funzioni occorre che i campi dai record correlati (appartenenti alla tabelle)Group e Club siano disponibili nell’origine dei record della maschera.

Questo abbiamo già imparato a farlo in un altro tutorial (Query per maschere), quando abbiamo visto come costruire una maschera “molti-a-uno” che permette di modificare dati nella tabella che si trova sul lato “molti” di una relazione (in questo caso, Contracts) mamostrare dati correlati dalla tabella sul lato “uno” (in questo caso, sia Groups sia Clubs).

Per questo esempio, non occorre visualizzare sulla maschera campi dalle tabelle del lato “uno”; tuttavia, occorre poter copiare valori da questi campi nei campi correlati del contratto usando codice VBA.

Se si dà un’occhiata alla query che costituisce l’origine dei record della maschera frmContracts, si vedrà che questa comprende sia la tabella tblClubs sia la tabella tblGroups, anche se il suo scopo principale è quello di consentire la modifica di righe in tblContracts.

Si può vedere laquery qrycontracts nella figura 3. Si osservi che molti campi dalla tabella tblGroups hannonomi alias (GName, GSize, GAgent...) perché sia facilefarvi riferimento indipendentemente dai campi con nomi simili nella tabella tblContracts.

Per compilare i campi con le informazioni su Group, è necessaria una routine evento che vada in esecuzione non appena viene aggiornata la casella combinata Group ID.

La routine evento in questione è "Dopo aggiornamento" (After_update) sul controllo casella combinata Group ID della maschera frmContracts.

L'eventoDopo aggiornamento (figura 4) scatta quandol'utente ha fatto clic sul menù a discesa della casella combinata dopo avere selezionato il Gruppo opportuno (nel nostra caso era Buck And The Fullerenes).

Ecco il codice dimostrativo chefa questa operazione. (Basta fare clic sul pulsante con i 3 puntini accanto a [Routine evento])

Private Sub GroupID_AfterUpdate()
     GroupIDSetValue
    ' Assicura che vengano compilati i dati sul club    
    If Not IsNothing(Me!ClubID) Then ClubIDSetValue
End Sub

Private Sub GroupIDSetValue()
' Questa routine è chiamata sia da Group che da Club ID dopo l'aggiornamento   
    Me!GroupName = Me!GName
    Me!Size = Me!GSize
    Me!GroupAgent = Me!GAgent
    Me!Leader = Me!GLeader
    Me!LeaderHomePhone = Me!HomePhone
    Me!LeaderSS = Me!GLeaderSS
    Me!LeaderWorkPhone = Me!WorkPhone
    Me!Member2 = Me!GMember2
    Me![Member2SS#] = Me!Member2SS
    Me!Member3 = Me!GMember3
    Me![Member3SS#] = Me!Member3SS
    Me!Member4 = Me!GMember4
    Me![Member4SS#] = Me!Member4SS
    Me!Member5 = Me!GMember5
    Me![Member5SS#] = Me!Member5SS
    Me!Member6 = Me!GMember6
    Me![Member6SS#] = Me!Member6SS
    Me!Member7 = Me!GMember7
    Me![Member7SS#] = Me!Member7SS
    Me!Member8 = Me!GMember8
    Me![Member8SS#] = Me!Member8SS
    Me!PaymentTerms = "To " & Me!Leader & " at the end of each working week."
End Sub

La routine evento AfterUpdate (DopoAggiornamento) chiama prima la routine sub GrouplDSetValue, anch’essa riportata qui sopra. Successivamente controlla se è impostato un valore nella casella combinata Club ID.

Se in Club ID c’è un valore, la routine evento chiama anche la routine sub ClubIDSetValue per accertarsi che vengano copiate anche le informazioni sul club.

Qualcuno si starà domandando: “Se è già impostato un ClubID, l’evento AfterUpdate di ClubID non dovrebbe aver già inserito le informazioni sui club?”

C’è dell’altro codice nell’evento Current (Corrente) che ha lo scopo di aiutare ancora di più l’utente.

Se, quando si avvia un nuovo contratto, è aperta la maschera frmGroups o la maschera frmClubs (o entrambe), la routine dell’evento Current imposta per conto nostro il valore predefinito di ClubID e/o di GrouplD.

L’impostazione del valore predefinito non fa sì che Access cominci a creare il nuovo record; questo non avviene fino a quando non si inserisce qualche altro valore in un qualunque punto della nuova riga.

Se, però, il valore predefinito è impostato perClubID e si sceglie un GrouplD su un nuovo record, Access imposta il valore di ClubID ma non attiva l’evento AfterUpdate.

Di conseguenza, questa verifica supplementare nelle routine AfterUpdate di ClubID e di GrouplD garantisce che entrambe copino automaticamente i valori predefiniti ogni volta che una delle due è impostata.

Volendo provare come funziona tutto questo, aprire la maschera Clubs e selezionare un club per il quale si vuole registrare un nuovo contratto.

Fare clic sul pulsante New Contract nella maschera Clubs per aprire la maschera Contracts su un nuovo record.

Ci si accorgerà che il nome del club compare nella maschera, ma nessuna delle informazioni correlate è ancora impostata.

Scegliere un gruppo per il contratto e si vedranno le informazioni predefinite che vengono incollate sia per il club sia per il gruppo.

Come si può immaginare, questo piccolo frammento di codice fa risparmiare all'utente un sacco di lavoro alla tastiera.



Esempi di accesso ai dati con VBA 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:


Google