Condividi tramite

Access. Filtrare Records con doppia casella di Riepilogo

Anonimo
2020-03-04T06:45:49+00:00

Un saluto a tutti. Espongo il mio problema.

In una maschera con centinaia di record ho creato 2 caselle di riepilogo (una elenca i Dipartimenti e l'altra le unità operative afferenti ai dipartimenti stessi) entrambe a selezione multipla. Il codice VBA associato all'evento click di un pulsante, mi permette di filtrare i records in base ai valori selezionati in una sola ListBox per volta. Avrei bisogno di aiuto per capire come filtrare i records in base alle scelte fatte sia nella prilla Listbox che nella seconda (per intenderci meglio, come accade in visualizzazione "Foglio Dati" dove è possibile discriminare  i dati da più colonne).

Grazie a tutti coloro che offriranno il loro aiuto

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
{count} voti

4 risposte

Ordina per: Più utili
  1. Anonimo
    2020-03-06T15:24:31+00:00

    ciao Gianni,

    le due tabelle catergorie e prodotti sono legate tramite chiave primaria, ed e' bene che lo siano indipendentemente dal fatto che sia numerica o testo.

    Meglio se numerica dal mio punto di vista.

    Se sono tre le listBoxes il ragionamento no cambia, avrai la tabella fornitori e una tabella di raccordo per la relazione molti a molti tra prodotti e fornitori. ( sempre che la relazione sia tra prodotti e fornitori e non tra prodotti e categorie...)

    Nel mio esempio non ci sono legami nel predicato sql nel senso che le categorie non filtrano i prodotti relativi, ma ovviamente si puo' ottenere questo risultato in modo semplce.

    Come lo si puo' ottenere nel caso che citi con una terza listBox mostante il fornitore, basta impostare correttamente la clausole where nell'origine riga della listBox.

    Ciao, Sandro.

    0 commenti Nessun commento
  2. Anonimo
    2020-03-06T14:39:48+00:00

    ciao Gianni,

    devi concatenare gli itemsSelected delle due listBox in modo da generare il filtro desiderato.

    Prova come segue. Data la form :

    ho preso ispirazione dal DB di NothWind.

    la listBox di sx e' basata sulla tabella prodotti con questa rowSource :

    SELECT Prodotti.IDProdotto, Prodotti.NomeProdotto

    FROM Prodotti;

    quella diu Dx sulla tabella categorie, questa la sua rowSource :

    SELECT Categorie.IDCategoria, Categorie.NomeCategoria

    FROM Categorie;

    il pulsante filtra invoca il codice che segue per realizzare il filtro e mostrare i records da esso derivati nella form :

    Option Compare Database

    Option Explicit

    Private strWhere  As String

    Private Sub cmdFilter_Click()

    Dim blnContF As Boolean

    With Me

        strWhere = vbNullString

        If .lstcategorie.ItemsSelected.Count > 0 Then concatenateListBox lst:=.lstcategorie, strField:="NomeCategoria in ("

        If .lstProdotti.ItemsSelected.Count > 0 Then concatenateListBox lst:=.lstProdotti, strField:="nomeprodotto in ("

        blnContF = .lstcategorie.ItemsSelected.Count Or .lstProdotti.ItemsSelected.Count

        .FilterOn = blnContF

    End With

    End Sub

    Private Sub concatenateListBox(ByVal lst As Access.ListBox, strField As String)

    Dim varItem   As Variant

    Dim strFilter As String

    For Each varItem In lst.ItemsSelected

        strFilter = strFilter & ",'" & Replace(lst.Column(1, varItem), "'", "''") & "'"

    Next

    strFilter = Mid$(strFilter, 2)

    If Len(strWhere) = 0 Then strWhere = "1=1 " + strWhere

    strWhere = strWhere + " and " + strField & strFilter & ")"

    With Me

        .Filter = strWhere

        .FilterOn = True

    End With

    End Sub

    Private Sub Form_Unload(Cancel As Integer)

    With Me

        .FilterOn = False

        .Filter = vbNullString

    End With

    End Sub

    ciao, Sandro.

    Buongiorno a tutti.

    Gent.mo Sandro, grazie ancora per il tuo aiuto. Nell'esempio che hai postato le Tabelle "Podotti"e "Categorie", hanno entrambe un Id numerico che rende l'una facilmente concatenabile all'altra. Il problema sorge quando il valore da filtrare è indipendente. Mi spiego meglio. Se nei prodotti, "Pane" appartiene alla categoria "Cereali" (utilizzando la list box "Prodotti"  o Categorie" il risultato restituito sarò ogni record in cui c'è "Pane" e quindi "Cereali"). Ma se io volessi isolare un unico Fornitore di tutti quelli da cui acquisto "Pane" utilizzando una terza ListBox?

    Il mio obiettivo è scegliere prima la "Categoria" (Cereali, Legumi, Verdure, Frutta ecc) poi il Prodotto (Pane) e infine il Fornitore.

    Grazie di cuore per i preziosi suggerimenti

    0 commenti Nessun commento
  3. Anonimo
    2020-03-04T16:55:11+00:00

    Grazie di cuore Sandro per la celere risposta... davvero gentilissimo. Provo ad applicare il codice suggerito. A dopo.

    0 commenti Nessun commento
  4. Anonimo
    2020-03-04T09:05:33+00:00

    ciao Gianni,

    devi concatenare gli itemsSelected delle due listBox in modo da generare il filtro desiderato.

    Prova come segue. Data la form :

    ho preso ispirazione dal DB di NothWind.

    la listBox di sx e' basata sulla tabella prodotti con questa rowSource :

    SELECT Prodotti.IDProdotto, Prodotti.NomeProdotto

    FROM Prodotti;

    quella diu Dx sulla tabella categorie, questa la sua rowSource :

    SELECT Categorie.IDCategoria, Categorie.NomeCategoria

    FROM Categorie;

    il pulsante filtra invoca il codice che segue per realizzare il filtro e mostrare i records da esso derivati nella form :

    Option Compare Database

    Option Explicit

    Private strWhere  As String

    Private Sub cmdFilter_Click()

    Dim blnContF As Boolean

    With Me

        strWhere = vbNullString

        If .lstcategorie.ItemsSelected.Count > 0 Then concatenateListBox lst:=.lstcategorie, strField:="NomeCategoria in ("

        If .lstProdotti.ItemsSelected.Count > 0 Then concatenateListBox lst:=.lstProdotti, strField:="nomeprodotto in ("

        blnContF = .lstcategorie.ItemsSelected.Count Or .lstProdotti.ItemsSelected.Count

        .FilterOn = blnContF

    End With

    End Sub

    Private Sub concatenateListBox(ByVal lst As Access.ListBox, strField As String)

    Dim varItem   As Variant

    Dim strFilter As String

    For Each varItem In lst.ItemsSelected

        strFilter = strFilter & ",'" & Replace(lst.Column(1, varItem), "'", "''") & "'"

    Next

    strFilter = Mid$(strFilter, 2)

    If Len(strWhere) = 0 Then strWhere = "1=1 " + strWhere

    strWhere = strWhere + " and " + strField & strFilter & ")"

    With Me

        .Filter = strWhere

        .FilterOn = True

    End With

    End Sub

    Private Sub Form_Unload(Cancel As Integer)

    With Me

        .FilterOn = False

        .Filter = vbNullString

    End With

    End Sub

    ciao, Sandro.

    0 commenti Nessun commento