Newsgroup: it.comp.appl.access
Titolo: Come realizzare una funzione di ricerca

Vorrei realizzare una banale funzione di ricerca in un insieme di record
visualizzato in una maschera, assegnando 1,2,3... caselle combinate, mi pare
un problema comunissimo ma ho difficoltà a districarmi tra query, querydef,
oggetti, metodi, azioni e altre diavolerie. Aggiungo che ce la faccio a
programmare in VBA però non conosco quello che Access fa per conto suo, di
nascosto a me, sia pur con le migliori intenzioni. Si tratta in pratica di
lanciare una query dove i criteri cambiano ogni volta e far si' che mi
travasi i campi nella maschera.
E' chiaro che l'optimum sarebbe che ogni volta che assegno una casella
combinata mi scatti la query e mi cambi il numero di record visualizzato
nella barra in basso, però forse e' un lavoro eccessivo e dispendioso su
grandi tabelle. Mi accontento di assegnare le caselle che voglio e quindi
cliccare su un pulsante per lanciare la ricerca. C'e' qualche sistema già
collaudato?
Mi conviene tener separate le caselle di ricerca da quelle di
visualizzazione del recordset risultante? anche tenendo conto che il passo
successivo alla ricerca e' quello di far passare i record trovati. Insomma,
la solita gestione database accoppiata a ricerca, mi meraviglio di non
averla trovata nelle FAQ, forse sarò anch'io uno zuccone...
barbi

travasi i campi nella maschera.
A grandi linee:
- definisci una query che restituisce dalle tabelle del db tutti  i
campi che vuoi visualizzare nella form, nonchè tutti i campi sui quali
potranno essere effettuate selezioni (per esempio un campo Codice
numerico ed un campo Descrizione alfanum.);
- costruisci la tua form (per es. selForm) , definendo come origine
record la query costruita al passo precedente, e aggiungendo i
controlli (non associati) necessari per impostare i valori che
serviranno da filtro per la query (per es. una combo cmbSel1 per
effettuare selezioni sul campo Codice ed una casella di testo txtSel1
per effettuare selezioni sul campo Descrizione);
- modifica la query impostando i criteri per tutti i campi sui quali è
prevista la possibilità di effettuare selezioni, nel modo seguente:
per il campo Codice: 
[forms]![selForm]![cmbSel1] Or Is Null
per il campo Descrizione: 
=[forms]![selForm]![cmbTxt1] Or Is Null
In questo modo. la query utilizza come valori per la selezioni sui
campi Codice e Descrizione ciò che è contenuto nei controlli della
form al momento dell'esecuzione della query.
Per forzare il refresh dei dati della maschera, su questa dovrai
aggiungere un pulsante dove nell'evento su click metterai l'istruzione
me.requery.
Prova e riposta per eventuali ulteriori dubbi.
Vincenzo Turturro
----------------------------------
Niuna impresa, per minima che sia, 
può avere cominciamento e fine
senza queste tre cose:
e cioè senza sapere,
senza potere,
senza con amore volere
(Anonimo fiorentino, XIV sec.)
------------------------------

 
Ma, per quanto riguarda il campo Codice, come faccio a dirgli di
visualizzare TUTTI i codici.
Se metto un numero, trova quello.
Se non metto niente, in teoria, dovrebbe trovarmi tutti quelli che hanno un
codice null.
Ma per vederli tutti?
Grazie 
-- 
Ivan MO
 

 visualizzare TUTTI i codici.
infatti se non metto niente nel controllo di selezione lui assume che quel
campo deve essere vuoto e quindi non mi trova nessun record, e' un problema
che ho già avuto. Io ho verificato che basta porre come criterio Like
[forms]![selForm]![cmbSel1] e battere nella cas.comb. "*", però dal punto di
vista dell'utente mi sembra meglio non fargli battere proprio niente (anche
perche' nel caso "*" bisogna disabilitare la proprietà "solo in elenco").
Ho provato a mettere come criterio:
Like Iif([forms]![selForm]![cmbSel1] Is Null;
"*";[forms]![selForm]![cmbSel1])
e cosi' funziona.
Però non funziona nel caso di ricerca su campi che prevedono un insieme
limitato di valori, che io rappresento nelle tabelle "grosse" con dei
puntatori (es. IdPippo) a tabelle più piccole, che contengono tutti i valori
possibili di Pippo, e quindi li rappresento nella maschera con caselle
combinate basate a loro volta su altre query più "piccole", a 3 colonne:
1) IdPippo nella TabValoriPippo, colonna associata alla cas.comb.,
invisibile;
2) Pippo, 
ord.in
 senso crescente, visibile;
3) IdPippo nella tabella diciamo TabGrossa, invisibile
con la solita relazione uno-a-molti fra TabValoriPippo e TabGrossa.
Insomma alla fin fine mi sembra necessario fare tutto in VBA, cioe'
costruire la stringa "WHERE criteri" e attaccarla in query.SQL
barbi


ok in generale funziona, ma osservo:
1) a cosa serve "or is null"?
2) il caso in cui l'utente non mette niente nella casella di criterio, per
significare che non mette condizioni, lo tratto nella risposta a IvanMo
3) dal punto di vista dell'interfaccia utente, le stesse caselle che uso per
la ricerca mi servono anche poi, a ricerca effettuata, in fase di gestione
dei record, per eventualmente modificarle e quindi non mi sembra conveniente
usare le stesse caselle; però non vorrei creare una maschera di sola ricerca
e una maschera di sola gestione ma mi sembra più conveniente per l'utente
unificarle; a questo punto dividerei in due la maschera:
1) una zona "di ricerca", contenente alcune caselle (non associate ai
relativi campi)
2) una zona "di gestione" contenente una replica delle caselle di ricerca,
stavolta associate ai relativi campi, piu' altre caselle, e naturalmente a
questo punto mi dovrei gestire da VBA la transizione fra i due stati di
ricerca e di gestione. Ho pensato di mettere una fila di pulsanti tipo menu'
del DB3: Cerca - Visualizza - Aggiungi - Modifica - Cancella
cosa te ne pare?
barbi

Il Tue, 25 Jan 2000 09:25:23 GMT,
semitogliprimadirisp...@plugit.net
 (VT @ work)
scrisse:
Scusate .....
a causa della fretta ho dimenticato una parte:
=[forms]![selForm]![cmbSel1] Or [forms]![selForm]![cmbSel1] Is Null
e, analogamente,
=[forms]![selForm]![cmbTxt1] Or [forms]![selForm]![cmbTxt1] Is Null
In questo modo, se nei controlli della form l'utente imposta un
qualche valore in uno dei due controlli, la query seleziona tutti i
record che nei campi corrispondenti contengono quei valori (in questo
caso è vera la prima parte del criterio di selezione), mentre se
l'utente non imposta niente, la seconda parte di ciascuna condizione
vale True e quindi la query selezionerà tutti i record.



accidenti, questa poteva essere la formula che cercavo invano di
realizzare... ma purtroppo non funziona, sia che la scrivo cosi' nella
casella dei criteri, sia che la sdoppio in due caselle di criteri. Se la
scrivo in due caselle di criteri, lui mi sega la 2.a (quella con Is Null);
se la scrivo tutta in una casella, impazzisce e mi fa nascere parecchie
caselle di criteri replicate.
In effetti la 2.a parte, quella che dovrebbe funzionare nel caso
...[cmbSel1]=null, darebbe in questo caso come criterio: ...[cmbSel1]=true,
che non ha senso.
Direi che l'unica e' ricorrere a VBA come dice il Biso nel tema "Il solito
problema di requery"
(cioe', non e' che non voglio usare VBA, e' che ho letto che e' piu' veloce
usare una query definita in visualizzazione struttura)
E' aperto un concorso per escogitare la formula che fa al caso nostro!
barbi


ehi ho vinto il concorso!
la formuletta e' questa, detto campo1 il campo visualizzato da cmbSel1:
 Iif([forms]![selForm]![cmbSel1] Is Null; [campo1];
[forms]![selForm]![cmbSel1])
funziona perche':
1) se cmbSel1 e' stato assegnato, il criterio diventa:  [campo1] =
[forms]![selForm]![cmbSel1]
2) se cmbSel1 e' stato lasciato vuoto,   "        "          [campo1] =
[campo1] che e' sempre vero
e quindi vanno bene tutti i valori di [campo1]
spero che IvanMo sia soddisfatto...
Un piccolo inconveniente: se non c'e' NESSUN record che soddisfa, la
maschera diventa tristemente grigia, spariscono tutte le scatoline! sono
obbligato a chiuderla e riaprirla...
ma sono sicuro che qualcuno saprà risolvere il problema...
barbi