Newsgroup: it.comp.appl.access
Titolo: Filtrare query senza filtro ma con variabili di una selezione multipla

Salve a tutti.
Ho un problema da risolvere per fare un piccolo motore di ricerca che potrei risolvere con un filtro di una query. 
In verità non sono in grado di scrivere il codice per costruire un filtro complesso e quindi per rendere "modulare" e di facile modificabilità la query, la maschera e i report, voglio evitare di scrivere la sql con righe di codice in VBA creando delle query parametriche basate unicamente su caselle di testo, selezioni multiple, ecc di una form.
Per semplificare diciamo che ho un Db con 2 tabelle.
Tabella "iscritti" composta come segue:
IDiscritti 	codice
1	PA
2	MM05
ecc	ecc
Tabella "Tab015" composta come segue:
codice		Desc_codice
PA		PAGAMENTO
MM05		Abbonamento MM05
ecc		ecc
La form "RICERCA" ha una casella di riepilogo con una selezione multipla chiamata "codice1" (in verità ne avrà tante di caselle) che prende i dati da "Tab015".
Con il seguente codice (ne scrivo solo una parte per fare capire) la casella "codice1" riempie una casella di testo chiamata "codice" facendo una stringa che come risultato finale avrà come valori (a seconda dei dati che seleziono) "PA, MM05, ecc". 
Private Sub codice1_Click()
    For Each varItem In Me!codice1.ItemsSelected
       Me!codice = Me!codice & Me!codice1.Column(0, varItem) & ", "
    Next varItem
End Sub
La form richiama con un bottone il report "ELENCO" i cui dati sono basati sulla query "00_RICERCA"
La query "00_RICERCA" è composta come segue:
SELECT iscritti.codice, iscritti.* FROM iscritti 
WHERE ((iscritti.codice) In ([forms]![RICERCA]![codice]))
Ora: se nella maschera la casella "codice" ha 1 valore solo (es: MM05) la  query "00_RICERCA" funziona filtrando i dati correttamente.
Però se la casella codice ha più di 1 valore (es: PA, MM05)  la  query "00_RICERCA" non funziona.
Inserendo a mano i valori  PA, MM05 la query funziona perfettamente (la condizione diventa: WHERE ((iscritti.codice) In ([PA, MM05)).
Ho provato a inserire tutti gli apici possibili e immaginabili facendo in modo che la casella di testo "codice" avesse i seguenti valori:
"PA", "MM05" 
oppure
'PA', 'MM05'
Tuttavia il risultato è sempre lo stesso: funziona con un valore solo (con o senza apici)
Penso che il problema stia nel fatto che non riesco a "formattare" le condizioni separate da una virgola come stringhe singole mentre la query mi legge la casella "codice" come un unica stringa: un po' come se la stringa finale della condizione fosse "PA, MM05, ecc" e non "PA", "MM05", "ecc".
C'è un modo per "formattare" le stringhe in modo corretto senza usare VBA (o usandolo solo in minima parte)?
grazie per la pazienza a chiunque mi può dare una mano.
-- 
km5000 
------------------------------------------------------------------------
View this thread: 
http://www.itsistemi.net/viewtopic-775476.html
Inviato via 
http://www.itsistemi.net

il post è kilometrico e da quello che penso di aver capito ti conviene
usare una query passandogli i parametri interessati piuttosto che un
filtro (che a mio modestissimo parere è più difficile da controllare)
per passare i valori all'sql puoi usare la sintassi
select campo as tabella prova where id=2 or id=3 or id=4
devi solo costruirti la parte where da passare all'sql a seconda di cosa
selezioni per l'estrazione
per far questo il metodo migliore è quello di fare una function pubblica e
di richiamarla nell'sql
non so la tua capacità (non voglio offendere nessuno ovviamente) perfar
questo ma io che non sono gran che sono riuscito a farla (quindi penso che
anche tu ce la possa fare)
ciao e buon lavoro
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Per facilitare l'aiuto posto il db da scaricare qui di seguito
DB_PROVA.mdb (
http://www.amcli.it/DB_PROVA.mdb
) 
grazie


Ti ringrazio per l'interessamento.
Se al limite vuoi dare un occhiata perdendo del tuo tempo prezioso, ho inserito il Db da scaricare nel post precedente.
In effetti sto facendo come mi hai suggerito con dei checkbox che attivano di relativi valori da passare alla query anche se il tempo di costruzione è immenso rispetto il metodo delle selezioni multiple con una condizione per ciascuna selezione multipla.
Inoltre passando dei valori precisi come mi indichi tu (id=1) nella query dovrei impostare Nz([forms]![RICERCA]![codice_01],"*") per elencare tutti i valori in caso la variabile codice_01 fosse nulla. 
Questo va bene finche c'è una sola variabile. Quando sono più di una nella maschera, dovrei impostare l'OR come segue per ottenere (id=1 OR id=2):
Nz([forms]![RICERCA]![codice_01],"*") OR Nz([forms]![RICERCA]![codice_02],"*") .
Ma questa condizione è assurda e inutile perchè basta una variabile nulla per elencare tutti i valori.


 km5000
Devi togliere il criterio nella query e aprire il report passandogli 
l'elenco dei valori tramite il parametro CondizioneWhere del metodo 
OpenReport (vedi help).
Quindi Nella:
Private Sub codice1_Click()
togli il commento alla riga:
Me!codice = Me!codice & "'" & Me!codice1.Column(0, varItem) & "', "
le altre le puoi eliminare.
Nella:
Private Sub Comando14_Click()
inserisci la CondizioneWhere:
DoCmd.OpenReport stDocName, acPreview, , "[codice] In (" & Me!codice & ")"
Ciao.
-- 
Sergio MAZZA 

Grazie per l'interessamento. 
Sto provando a fare come mi suggerisci però,  scusami la mia incapacità, non capisco cosa intendi per "togli il commento alla riga:"
Inserendo le righe che mi hai postato non appena clicco su una voce della casella codice parte il Debug indicando un errore di sintassi su:
Me!codice = Me!codice & &#8220; '&#8220; & Me!codice1.Column(0&#8218; varItem) & &#8220;'&#8218; &#8220;
In effetti l'editor VB mi lascia in verde come "commento" tutta la parte dopo l'apice: &#8220; & Me!codice1.Column(0&#8218; varItem) & &#8220;'&#8218; &#8220;
Il debug analizza come errore:
DoCmd.OpenReport stDocName&#8218; acPreview&#8218; &#8218; &#8220;[codice] In (&#8221; & Me!codice & &#8220;)"
Anche senza far partire la maschera ,l'editor VB mi lascia in rosso tutta la stringa    DoCmd.OpenReport stDocName&#8218; acPreview&#8218; &#8218; &#8220;[codice] In (&#8221; & Me!codice & &#8220;)"


 km5000
Praticamente deve rimanere solo la riga che ti ho segnalato, le altre le puoi cancellare o commentarle (inserire come primo 
carattere l'apice)...
Ciao.
-- 
Sergio MAZZA 

 -- 
Sembra mancare qualche virgoletta...doppio apice....ecc.
Il tuo db non si apre!.
Ciao, Carlo

Per Carlo
Il tuo db non si apre!.
E' un Db Access 2000 zippato. 
Non si apre con lo Zip o il Rar o non si apre il DB?
Per Sergio MAZZA 
Modificando con i giusti apici le righe che mi hai passato, FUNZIONA!
Se scrivi messaggi in html sarà dura riuscire a capirci.
quando hai ragione hai ragione.
Praticamente deve rimanere solo la riga che ti ho segnalato, le altre le puoi cancellare o commentarle
Se rimane solo la riga segnalata non mi elimina le voci che deseleziono dalla lista multipla.
Inserendo la tua riga nel codice funziona perfettamente.
Posso dire di essere a 1/3° dell'opera.
Ora però ho altri 2 problemi:
1)
Quando non seleziono una delle voci dalla lista "codice", mi da ovviamente questo errore: operatore mancante nell'espressione " [codice] In ()"
Come faccio a far caricare tutti i dati se NON seleziono voci dalla lista multipla chiamata "codice"?
Ho provato con la seguente riga:
DoCmd.OpenReport stDocName, acPreview, , IIf(IsNull([Forms]![RICERCA]![codice]), [codice], "[codice] In (" & Me!codice & ")")
oppure con questa
DoCmd.OpenReport stDocName, acPreview, , Nz("[codice] In (" & Me!codice & ")", "*")
ma gli argomenti dell' "Iff" (espressione e parte vera) sono sbagliati.
Quali alrgomenti posso inserire correttamente per visualizzare tutti i record se non seleziono nulla dalla lista multipla?
2)
Ho aperto un'altro thread con questo titolo "Baco di query su tabelle che richiamano un valore di un campo = Null".
Sto cercando una soluzione basandomi sulla risposta di un'utente.
Potreste dare un'occhiata? perchè altrimenti tutto lo sforzo che sto (ops: state) facendo risulta inutile
grazie




Rispondo solo al punto 1) che è quello che stiamo trattando qui.
Non c'è bisogno di complicarsi la vita con IIF, puoi fare un semplice IF.
es.
'----
dim strCondizione as string
If isnull(me!codice) then
    strCondizione = ""
else
    strCondizione = "[codice] In (" & Me!codice & ")"
end if
DoCmd.OpenReport "...",,,strCondizione
'----
Ciao.
-- 
Sergio MAZZA 

Seguendo le tue indicazioni ho provato ad inserire una condizione con più di un parametro ma non riesco a farlo funzionare
es:
"[codice] In (" & Me!codice & ") AND [parametro1] like *" & Me!parametro1& "*" 
Posso chiederti se la condizione da passare al report può contenere 10 o 20 parametri?


 km5000
Non è un problema di numero di parametri; hai scritto male la stringa, 
verifica la sintassi dei comandi SQL.
I valori testo devono essere delimitati da apici o doppie virgolette, se 
vuoi utilizzare anche i caratteri jolly (es. *) devi comunque inserirli tra 
i caratteri che delimitano il valore testo;
es.
"[codice] In (" & Me!codice & ") AND [parametro1] like '*" & Me!parametro1 & 
"*'"
Devi studiarti il linguaggio SQL e come scrivere le condizioni where...
Ciao.
-- 
Sergio MAZZA 

Ricevuto.
Infiniti RINGRAZIAMENTI per i vostro prezioso supporto.
