Newsgroup: it.comp.appl.access
Titolo: Filtrare dati con diverse condizioni

ciao a tutti,
ho una maschera non associata, dove all'interno ho inserito una 
sottomaschera associata ad una tabella dati,
e che dovrebbe essere filtrata in base ad una multiselezione con dei campi 
che ho inserito nella maschera
costituita presso a poco come l'esempio riportato sotto:
campo1 ------->  è una casella combinata, e come origine dati è impostata a 
campi (mi riporta i campi della tabella associata alla sottomaschera)
operatore1 ---> è una casella combinata, e come origine dati è impostata a 
valori e contiene : =, <,>,<>
valore1 ------> è una casella di testo dove inserisco il valore da cercare 
in base al valore indicato nel campo1
condizione ---> che può essere and o Or
campo2 ....
operatore2...
valore2....
condizione1 ( and o Or)
campo3...
operatore3...
valore3...
e cosi via, il filtro lo vorrei applicare ad almeno 4 condizioni diverse
come posso realizzrmi una struttura del genere?
Ciao Tommy
 

 ha scritto nel messaggio news:a_5Ff.77362$eD5.1...@twister2.libero.it...

Vedi help (attivabile con ALT-F11, poi F1) alla voce: Metodo BuildCriteria...
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
ho guardato l'help ho grosso modo capito come funziona il Metodo 
BuildCriteria, ma nell'esempio che oho ripčortato io come faccio a 
raccogliere tutti gli eventuali criteri  e parametri di selezione 
considerato che tutti i valori possono essere riferiti a diversi campi?
Tommy 

 Tommy
Questo č un altro problema; io avevo capito che tu non sapessi come creare il criterio in base alla scelta del campo e 
dell'operatore di confronto.
Comunque; il problema si risolve con il possesso di queste informazioni:
- nome dei campi;
[soluzione] Crei una casella di combinata e imposti la proprietą (nella scheda dati) "tipo origine riga" a "elenco campi" e indichi 
in "origine riga" il nome della tabella.
- tipo del campo
[soluzione] Con VBA leggi il tipo del campo scelto della tabella indicata:
es.
Dim oRst As New ADODB.Recordset
oRst.Open nomeTabella, CurrentProject.Connection, , , adCmdTable
Debug.Print oRst(nomeCampo).Type '<-- vedi help alla voce proprietą Type o Funzione VarType
oRst.Close
Set oRst = Nothing
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio 
news:ds5ged$nd6$1...@area.cu.mi.it...

credo che tu avessi capito bene, io oltre a non sapere come impostarmi il 
criterio in base alla scelta del campo e dell'operatore di confronto, non so 
nel caso di diversi criteri per diversi campi e con diversi operatori come 
impostare il codice.
Esempio: campo1 ---> Cittą     valore1 ---> Milano
                and o or
                campo2 ---> Cittą    valore2 ---> Roma
                and o or
                campo3 ---> Abitanti     valore3 ---> <1000
come imposto il codice?
grazie Tommy 

 grazie Tommy
Se vuoi dare la possibilità ad un utente di crearsi una selezione di quel tipo devi per forza memorizzarla da qualche parte; 
chiaramente in una tabella.
Potresti fare così:
- crearti una tabella di appogio chiamiamola [tmp_condizioni] con la struttura:
-- campo, testo, 255;
-- idOparatoreConfronto, numerico, intero lungo;
-- valore, testo, 255;
-- idOperatoreLogico, numerico, intero lungo;
-- stringaCondizione, testo, 255.
poi una tabella con l'elenco degli operatori [t_Operatori] con la struttura:
- id, contatore, indicizzato (duplicati non ammessi);
- txtOperatore, testo, 255;
- operatore, testo, 255;
poi la tabella [t_OperatoriFinali] finale che unisce le condizioni con gli operatori and or:
- id, contatore, indicizzato (duplicati non ammessi);
- txtOperatore, testo,255;
- operatore, testo, 255;
Il contenuto della tabella  [t_Operatori] sarà:
id, txtOperatore, operatore
1, Uguale a, =
2, Minore di, <
3, Maggiore di, >
4, Diverso da, <>
6, Vuoto, Is Null
7, Non Vuoto, Is Not Null
Il contenuto della tabella [t_OperatoriFinali] sarà:
id, txtOperatore, operatore
1, E, And
2, Oppure, Or
Ora una maschera in visualizzazione foglio dati o maschere continue (associata alla tabella [tmp_condizioni]); con in controlli:
- casella combinata [campo], associata a [campo], con "tabella origine riga" a "campi" e in "origine riga" il nome della tabella con 
i campi da utilizzare per il filtro;
- casella combinata [operatore], associata a [idOperatoreConfronto], "tipo origine riga" "tabella/query" con "origine riga": SELECT 
t_Operatori.id, t_Operatori.txtOperatore, t_Operatori.operatore FROM t_Operatori;
"colonna associata" = 1
"numero colonne" = 3
"Larghezza colonne" = 0;2;0
- casella di testo [valore], associata a [valore];
- casella combinata [operatoreLogico], associata a [idOperatoreLogico], "tipo origine riga" "tabella/query" con "origine riga": 
SELECT t_OperatoriFinali.id, t_OperatoriFinali.txtOperatore, t_OperatoriFinali.operatore FROM t_OperatoriFinali;
"colonna associata" = 1
"numero colonne" = 3
"Larghezza colonne" = 0;2;0
Gestione dell'evento "prima di aggiornare" della form con il codice:
Me!stringaCondizione = BuildCriteria(Me!campo, VarType(Me!campo), Me!operatore.Column(2) & Me!valore)
Manca il bottone che legge il contenuto della tabella e crea la condizione:
es.
'---
Dim rst As DAO.Recordset, strWhere As String, nmRecord As Long
Set rst = CurrentDb.OpenRecordset("tmp_condizioni", dbOpenTable)
'--> sostituisco le doppie virgolette con l'apice singolo
Do While Not rst.EOF
    If InStr(1, rst!stringaCondizione, Chr(34)) > 0 Then
        rst.Edit
        rst!stringaCondizione = StrTran(rst!stringaCondizione, Chr(34), 0, 0, "'")
        rst.Update
    End If
    rst.MoveNext
Loop
rst.MoveFirst
'--> aggiungo l'operatore finale a tutti i record -1 (l'ultimo)
'--> se non è presente, per default, considero And
For nmRecord = 1 To rst.RecordCount
    If nmRecord = rst.RecordCount Then
        strWhere = strWhere & rst!stringaCondizione
    Else
        strWhere = strWhere & rst!stringaCondizione & IIf(rst!idOperatoreLogico > 0, " " & DLookup("operatore", "t_operatoriFinali", 
"id=" & rst!idOperatoreLogico) & " ", " And ")
    End If
    rst.MoveNext
Next
'Debug.Print strWhere '<-- per controllo
Set rst = Nothing
'--
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:

grazie per la risposta e la disponibilità, faccio delle prove e se ci
sono dei problemi, mi auguro di no, ti faccio sapere
Tommy

 Tommy
C'è solo il problema del quoting.
Taglia tutto se vuoi solo ringraziare
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

per quanto riguarda la prima parte va bene, però all'atto della
conferma su un pulsante di comando mi da l'errore alla riga
rst!stringaCondizione = StrTran(rst!stringaCondizione, Chr(34), 0, 0,
"'")
su strTran mi dice: errore di compilazione: prevista matrice.
Che vuol dire?
Tommy

 ha scritto nel messaggio news:1139313921.8...@g43g2000cwa.googlegroups.com...

Tommy
[risposta]
Non ne ho idea; ti ho descritto la "procedura" che ho pocanzi provato e non mi presenta il tuo errore.
Cosa ci scrivi nella tabella [tmp_condizioni]?
Cosa trovi scritto nel campo [stringaCondizione] della stessa tabella?
Se l'errore persiste incolla il codice che hai scritto...
Ciao.
-- 
Sergio MAZZA 

 0, " " & DLookup("operatore", "t_operatoriFinali", "id=" & rst!IdOperatoreLogico) & " ", " And ")
    End If
    rst.MoveNext
Next
DoCmd.OpenForm "MLIsta_Pratiche", , , strWhere
MsgBox "Il risultato è:" & strWhere
Set rst = Nothing
End Sub
per controllare il risultato finale per vedere cosa torna la stringa
strWhere, mi chiamo una finestra di  messaggio e mi dice: Il risulatto
è: NumeroPratica=01040/0 and numeroPratica<01045/0 però l'ottengo
solo se annullo la riga di codice che ti ho descritto, altrimenti la
routine si blocca.
Poi ho provato togliendo la riga di codice che si blocca, ad applicare
il filtro per aprirmi una maschera DoCmd.OpenForm "MLIsta_Pratiche", ,
, strWhere
ma la condizione strWhere non mi funziona, puoi darmi un chiarimento
anche per la seconda parte del codice, risolvendo innanzitutto il
primo, di come devo applicare strWhere per aprirmi una maschera
filtrata?
ti prego di avere ancora un po di pazienza...
Tommy

 ha scritto nel messaggio 
news:1139394932.5...@z14g2000cwz.googlegroups.com...


End Sub





End Sub

[risposta]
Il problema è sapere se il campo [NumeroPratica] è testo o numerico.
Se è numerico non puoi inserire, nella ricerca, caratteri diversi da numeri 
e separatori decimali.
Se è testo devi racchiudere il valore tra doppi apici o apice singolo; ma 
questo dovrebbe farlo automaticamente la BuildCriteria in base al tipo di 
campo che viene letto dalla funzione VarType(Me!Campo)...
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:

.. e per quanto riguarda la condizione where associata all'apertura
della form
DoCmd.OpenForm "MLIsta_Pratiche",,, strWhere
quello che ho scritto io va bene?
Tommy

 ha scritto nel messaggio 
news:1139411128.7...@g44g2000cwa.googlegroups.com...
.. e per quanto riguarda la condizione where associata all'apertura
della form
DoCmd.OpenForm "MLIsta_Pratiche",,, strWhere
quello che ho scritto io va bene?
Tommy
[risposta]
Sě se la maschera ha come origine dati la tabella con i campi che vuoi 
filtrare...
Ciao.
-- 
Sergio MAZZA 

scusami ma a me mi torna sempre lo stesso errore quando vado a leggere
strTran(rst!stringaCondizione, Chr(34), 0, 0, "'"),
praticamente l'istruzione si ferma a strTran e mi compare un messaggio
di errore "sub o function non definita"
Tommy

 ha scritto nel messaggio 
news:1139488745....@g14g2000cwa.googlegroups.com...

Manda il file...
Ciao.
-- 
Sergio MAZZA 

allora con l'aiuto del buon Sergio abbiamo risolto l'inghippo,
il problema dell'errore che tornava sopra era dovuto al fatto che la
funzione strTran è una funzione propria di A97 e quindi non prevista
in A2000 e l'abbiamo sostituita con Replace(rst!stringaCondizione,
Chr(34), 0, 0, "'"), ed il tutto funziona.
grazie