Come aggiungere un valore a una casella combinata in Microsoft Access

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:

solo_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:

caricamento_libri

Indubbiamente nella realtà vi saranno molti altri campi.

Abbiamo poi una query, che alimenta l’origine riga della casella combinata:

originerigaautori

 

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:

testonotinlist

 

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.

notinlist

Ora ci troveremo nel VBA, dove scrivere il codice necessario:

subnotinlist

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.