Queries

2.36 Filtrare una query parametrica in base alla selezione multipla di una casella di riepilogo
  Roberto

In una query la selezione su più valori normalmente si effettua usando nella WHERE l'operatore IN seguito dalla lista di valori in base ai quali si vuole effettuare il filtraggio dei dati visualizzati nella query.
In Access non è però possibile che una query parametrica usi nella WHERE l'operatore IN, ovvero non è possibile passare ad una query parametrica una lista di valori sui quali effettuare una selezione.
Per sopperire a questo limite una delle soluzioni più usate è quella di modificare da VBA il codice SQL della query di selezione tenendo conto della selezione multipla effettuata in una casella di riepilogo per la quale si è impostata a Semplice la proprietà Selezione multipla.

Se la query si chiama Query1.
Se la casella di riepilogo si chiama Elenco.
Se i dati da selezionare sono contenuti in in una tabella chiamata Tabella1.
Se il campo di Tabella1 su cui effettuare la selezione multipla si chiama Anno.
A fronte dell'evento "Su clic" di un pulsante di comando contenuto nella stessa maschera che contiene la casella di riepilogo genera il seguente codice VBA:
Private Sub Comando2_Click()
    Dim strLista As String
    Dim varItem As Variant
    'Se non ci sono voci selezionate
    'non ci sono attivitą da effettuare
    If Me!Elenco.ItemsSelected.Count = 0 Then Exit Sub
    'Cicla nell'insieme delle voci selezionate
    For Each varItem In Me!Elenco.ItemsSelected
        'Cattura l'anno selezionato
        strLista = strLista & _
            Me!Elenco.Column(0, varItem) & ","
    Next varItem
    'Elimina la virgola eccedente
    strLista = Left$(strLista, Len(strLista) - 1)
    'Imposta codice SQL della query
    CurrentDb.QueryDefs("Query1").SQL = "SELECT * FROM Tabella1 " _
        & "WHERE Anno IN (" & strLista & ") " _
        & "ORDER BY IdCliente, Anno;"
    DoCmd.OpenQuery "Query1"
    'Deseleziona tutte le righe della casella di riepilogo
    Dim Cont As Integer
    For Cont = 0 To Me!Elenco.ListCount - 1
        Me!Elenco.Selected(Cont) = False
    Next Cont
End Sub
Il codice VBA di cui sopra fa riferimento alla libreria Microsoft DAO quindi, se lo si usa con una versione di Access successiva ad Access 97, il database deve fare riderimento a Microsoft DAO 3.6 Object Library.

Download:
 
  QuerySelMult.zip (22Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.