Dopo aver creato la struttura del database, le maschere e le query principali, dobbiamo lavorare sull’interfaccia, sul front-end. Se l’utente non è facilitato nell’utilizzo del nostro database, forse tra sé dirà: “Meglio Excel…”. Sta a noi sviluppatori arricchire l’interfaccia per rendere Access uno strumento indispensabile ed efficace al fine di memorizzare dati e poi interrogarli.
Abbiamo visto come usare caselle combinate per filtrare i record di una maschera. E’ ora di imparare come filtrare i record utilizzando una casella di riepilogo. Con questo controllo, infatti, è possibile selezionare più valori. Basta impostare una proprietà (Altro-Selezione Multipla-Semplice). Il difficile, però, sta nello scrivere il codice che mi consente di leggere gli elementi che l’utente ha selezionato e poi utilizzarli per applicare il filtro alla maschera.
Ingredienti
1) una maschera che abbia tra i campi dell’origine record il campo IDCategoria
2) una casella di riepilogo che abbia come origine riga una query che visualizza IDCategoria e NomeCategoria
3) la casella di riepilogo impostata per consentire la selezione multipla “Semplice”
4) la casella di riepilogo impostato con Numero Colonne: 2 e Larghezza Colonne: 0cm (così la prima sarà nascosta, IDCategoria, la seconda visibile, NomeCategoria)
5) un pulsante di comando che esegue il codice VBA
Procedimento
Clic con il tasto destro sul pulsante di comando, scegliamo “Genera evento” e poi “Routine Evento”. Saremo condotti nell’ambiente VBA. Vogliamo che Access esegua il nostro codice quando si verifica l’evento di default del pulsante di comando (che naturalmente è il clic dell’utente sul pulsante)
Private Sub cmdFiltro_Click() End Sub
Ora, dopo la riga Private e prima di End Sub scriviamo il nostro codice:
Dim strSQL As String Dim varItm As Variant
Creo due variabili. La prima conterrà il filtro da applicare alla maschera. La seconda serve per effettuare un ciclo negli elementi della casella di riepilogo
If lstCategorie.ItemsSelected.Count = 0 Then MsgBox "Selezionare almeno una categoria.", vbInformation Exit Sub End If
Controllo se è selezionato almeno un elemento, altrimenti è inutile eseguire il codice successivo. Count è una proprietà della collezione ItemsSelected, che contiene gli elementi selezionati nella casella di riepilogo. Se il conteggio è 0, significa che l’utente non ha selezionato nulla. In tal caso, lo avviso e poi esco. Potrei anche rimuovere l’eventuale filtro esistente scrivendo prima di Exit Sub, su una riga a sé, Me.FilterOn=False. Così il pulsante Filtra se ci sono elementi selezionati, applica il filtro. Se non esistono elementi selezionati, lo rimuove. Non servirebbe nemmeno il pulsante Rimuovi filtro.
For Each varItem In lstCategorie.ItemsSelected If lstCategorie.Selected(varItem) = True Then strSQL = strSQL & lstCategorie.ItemData(varItem) & "," End If Next
Per ogni elemento (varItem) nella collezione degli elementi selezionati eseguo un test: se l’elemento è selezionato, aggiungo il suo valore alla stringa SQL con il filtro.
strSQL = Left(strSQL, Len(strSQL) - 1)
Ora tolgo la virgola finale. Infatti, il mio codice concatena il valore selezionato e una virgola. Se fossero selezionate due categorie, la variabile conterrebbe: “6,7,”. La virgola finale causerebbe un errore di run-time. Perciò devo eliminarla. Prendo da sinistra tanti caratteri quanti sono la lunghezza della mia variabile meno 1 (la virgola finale, appunto).
Me.Filter = "IDCategoria IN(" & strSQL & ")"
La proprietà Filter della maschera imposta il filtro, ma NON lo applica. Il filtro utilizza l’operatore SQL di appartenenza IN. Come dire: filtra tutti i record il cui IDCategoria appartiene all’elenco che passo in strSQL (nel nostro esempio 6 e 7).
Me.FilterOn = True
Last, rendo attivo il filtro. (E dunque impostandolo a False lo posso disattivare).
Ok, direi che il messaggio finale del mio post è… impara il linguaggio VBA! Enjoy it