Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
ciao Andrea,
il modo più corretto per filtrare records in una form è l'impostazione di un filtro e non una query che compone la sua clausola where leggendo i parametri dalla form.
Inciso a parte, secondo me, per partecipare e rispondere in modo proficuo ai quesiti della community, spesso credo sia il caso non assecondare le intenzioni degli utenti ma cercare di indirizzarli verso la strada più tecnicamente corretta al limite dell'OT.
Vedo che qui sto fallendo alla grande, nel senso che il vero nodo cruciale è la messa a punto della base dati, non importa, ok, con maggiore padronanza dello strumento sarà un argomento che riprenderai più avanti.
Per quanto al quesito che poni la strada ed il ragionamento che fai è sostanzialmente corretto.
Qual è l'escamotage per filtrare la form dalla/dalle listboxes ?
E' possibile ricorrere alla funzione instriseca instr per farsi restituire la posizione di una stringa all'interno di un'altra.
Come fare nel tuo caso.
Supponiamo che tu stia selezionando, dalla demo che ti avevo preparato "agente di commercio" e "Brasile"
Se crei due campi calcolati su una query che restituiscono per ogni riga della query la posizione di "agente di commercio" e "Brasile" cosa otterrai? otterrai 0 quando la posizione è diversa da agente di commercio e 0 quando il paese non sarà Brasile, altrimenti un valore maggiore, giusto?
Lo stesso nel caso in cui la scelta dovesse essere multipla.
Ora viene la parte difficile.
Se imposti il filtro nella query >0 per la posizione e O >0 per il paese dovresti ottenere le righe corrispondenti al filtro.
Questo però solo nel caso in cui una della listBoxes non presenti selezioni perché se invece tutte le listboxes hanno una o più selezioni il criterio non è >0 O >0 ma >0 E >0.
Proviamo.
Nella demo che ti ho preparato inserisci due textBoxes nella form clienti.
La prima la chiami txtFilter, la seconda txtPaese.
modifichi la funzione per la creazione del filtro nel seguente modo :
Private Function createFilter2(ByVal lst As Access.ListBox) As String
Dim varItem As Variant
Dim strFilter As String
' ciclo gli elementi selezionati della listBox passata come argomento lst
' concatenadoli tra loro per la creazione del filtro
For Each varItem In lst.ItemsSelected
strFilter = strFilter & "," & lst.Column(0, varItem)
Next
strFilter = Mid$(strFilter, 2)
createFilter2 = strFilter
End Function
ed inserisci un command button che assegna alle textBoxes il risultato della/delle selezioni e al contempo risolverà la query una volta ancora con le nuove impostazione aggiornando il recordSource della form :
Private Sub cmdFilter2_Click()
Me.txtFilter = createFilter2(Me.lstPosizione)
Me.txtPaese = createFilter2(Me.lstPaese)
Me.Requery
End Sub
imposti e salvi una query con il seguente statement sql che diventerà il recordSource della tua form :
SELECT Clienti.IDClienteTesto,
Clienti.NomeSocietà,
Clienti.Contatto, Clienti.Posizione,
Clienti.Paese,
InStr(forms!Clienti!txtpaese,[paese]) AS pae,
InStr([forms]![clienti]![txtfilter],[posizione]) AS pos
FROM
Clienti
WHERE
IIf(len(forms!Clienti!txtpaese & "")>0 And len(forms!clienti!txtfilter & "")>0,
InStr(forms!Clienti!txtpaese,[paese])>0 And InStr(forms!clienti!txtfilter,[posizione])>0,InStr(forms!Clienti!txtpaese,[paese])>0 Or InStr(forms!clienti!txtfilter,[posizione])>0)
Or forms!Clienti!txtpaese Is Null Or forms!clienti!txtfilter Is Null;
come vedi la clausola where è complicata anche se facilmente comprensibile, ma con più listboxes da gestire lo statement diventa più verboso.
Attraverso la creazione di un filtro hai qualche riga di VBA in più, ma il procedimento è assolutamente più rigoroso, quindi prendi questa soluzione solo per scopo didattico per capire cosa non fare :-)
Tutto questo sempre IMHO.
Ciao, Sandro.