Qualcuno mi ha chiesto come aggiungere un valore a una casella combinata in Microsoft Access. Vediamo insieme come procedere. Quando creo una casella combinata, esistono diverse proprietà che posso impostare per obbligare l’utente a scegliere solo valori presenti in elenco:
In versioni precedenti di Microsoft Access non esisteva la possibilità di impostare una maschera per l’inserimento dei nuovi valori. Ora è possibile con la proprietà: Maschera di modifica voci…, tuttavia non è ciò di cui voglio occuparmi.
La mia idea è di suggerire un metodo che può sveltire l’operazione di caricamento dati, senza costringere l’utente ad aprire un’altra maschera.
Immaginiamo un database con due tabelle:
- tblAutori: IDAutore (chiave primaria, numerazione automatica), CognomeAutore (testo), NomeAutore (testo)
- tblLibri: IDLibro (chiave primaria, numerazione automatica), IDAutore (numerico), Titolo (testo)
Il campo IDAutore nella tabella tblLibri è la chiave esterna (FK, Foreign Key) che consente di agganciare il libro all’autore. Naturalmente, se il libro può avere (come spesso accade) più autori, occorre valutare come progettare la struttura della tabella e decidere se creare altri campi, oppure gestire l’associazione 1 Libro – N Autori (ossia un libro, molti autori) con una tabella di collegamento, tblLibriAutori, che conterrà i due campi IDLibro, IDAutore.
Non conviene impostare la relazione tra le tabelle tblLibri e tblAutori, perché esistono anche libri senza autore, banalmente perché potreste non sapere quale sia l’autore nel momento in cui inserite i dati. Se avete impostato la relazione tra le tabelle, potreste incontrare delle difficoltà (tipicamente se avete impostato applica integrità referenziale).
Abbiamo una maschera per il caricamento dati dei libri:
Indubbiamente nella realtà vi saranno molti altri campi.
Abbiamo poi una query, che alimenta l’origine riga della casella combinata:
come vedete, ho concatenato il cognome e il nome dell’autore separandoli con l’asterisco. Capirete a breve il motivo.
Ora, se impostiamo le proprietà della casella combinata per l’autore come vi ho illustrato all’inizio, se l’utente digita un valore non presente in elenco, riceve un messaggio di avviso:
Il messaggio è attivato dall’evento Not In List che si “scatena” quando appunto l’utente digita un valore non presente in elenco e contestualmente abbiamo impostato la proprietà Solo in elenco = Sì.
Il codice VBA da scrivere intercetta l’evento Not In List e aggiunge il record alla tabella autori. Ora vediamo come.
1) nell’elenco degli eventi della casella combinata Su Non in elenco clic con il tasto destro poi scegliamo Genera… – Generatore di codice.
Ora ci troveremo nel VBA, dove scrivere il codice necessario:
Iniziamo dicendo a Microsoft Access di non gestire l’errore dato dal fatto che l’utente ha digitato un valore non presente in elenco:
Response = acDataErrContinue
Poi ci creiamo alcune variabili che useremo dopo:
Dim intRisposta As Integer Dim strNome As String Dim strCognome As String Dim intPosAsterisco As Integer
Ora prepariamo la nostra domanda:
intRisposta = MsgBox("Vuoi inserire " & vbLf & NewData & vbLf & " come nuovo autore?", vbInformation + vbYesNo)
intRisposta è la variabile che conterrà il valore del pulsante scelto dall’utente tra Sì e No (infatti abbiamo impostato vbYesNo, che corrisponde a visualizzare quei due pulsanti).
A questo punto se l’utente ha risposto No, evidentemente si è sbagliato, chiediamo a Microsoft Access di visualizzare il messaggio di errore standard e usciamo dalla procedura:
If intRisposta = vbNo Then 'l'utente ha annullato, quindi visualizzo il messaggio di errore perché ha scelto un valore non presente in origine riga Response = acDataErrDisplay Exit Sub End If
Le successive istruzioni sono eseguite solo se l’utente preme Sì alla nostra domanda.
Come prima cosa cerco l’asterisco nel valore digitato dall’utente
' trovo la posizione dell'asterisco intPosAsterisco = InStr(NewData, "*")
Instr è una funzione che restituisce la posizione di un testo al’interno di un altro, un po’ come la funzione Trova in Excel. NewData è una variabile fornita da Microsoft Access e corrisponde al valore digitato dall’utente e non presente in elenco.
L’idea è che se l’utente digita per esempio Bobbio*Norberto, via codice sono in grado di suddividere cognome da nome e inserirlo in tabella tblAutori. Senza l’asterisco non saprei come distinguere cognome da nome nel caso di cognomi o nomi doppi.
Se l’asterisco è presente, posso scorporare NewData in Cognome e Nome, altrimenti assumo che l’utente abbia inserito solo il cognome.
If intPosAsterisco > 0 Then ' l'asterisco esiste strCognome = Left(NewData, intPosAsterisco - 1) strNome = Mid(NewData, intPosAsterisco + 1) Else ' se non esiste l'asterisco, l'utente ha inserito solo il cognome strCognome = NewData End If
Ora aggiungo il record alla tabella degli autori:
Dim strSQL As String
strSQL = "INSERT INTO tblAutori(CognomeAutore,NomeAutore) VALUES (""" & strCognome & """,""" & strNome & """)" CurrentDb.Execute strSQL
Prestate attenzione alle doppie virgolette che sono ripetute!
Per finire, diciamo a Microsoft Access che la nostra casella combinata ha un nuovo valore:
Response = acDataErrAdded
Poche istruzioni VBA e cerchiamo di migliorare la user experience nell’utilizzo del nostro database.