Newsgroup: it.comp.appl.access
Titolo: Maschera di ricerca

Ciao a tutti,
credo il mio sia un problema banale ma per un neofita di Access come me temo
non lo sia... veniamo al dunque...
ho una tabella di circa 1000 record con la mia brava chiave primaria ora
devo ricercare all'interno di questa tabella solo alcuni di questi record
che corrispondano ad alcune caratteristiche , ma visto che a volte la
discriminante della ricerca è solo il nome a volte solo il cognome a volte
la data di nascita a volte una combinazione di questi, non vorrei essere
costretto a dover fare una Query diversa per ogni tipo di ricerca... esiste
un modo per far questo ? ( risposte del tipo: " Si , esiste un modo " non
sono molto gradite...:-)  ) Quale?
Grazie in anticipo
Antonio

...

Il modo più semplice è questo.
Prepara una maschera in cui metterai dei controlli per ogni campo sui quali
poter filtrare. Il loro valore predefinito dovrà essere *.
Inoltre devi garantirti via codice che se i valori lì inseriti vengano
cancellati di nuovo venga scritto *.
La tua query, unica, sarà una query che per ogni campo da filtrare avrà
qualcosa come
Like [forms]![tuascheda]![controllo1]
Se non viene filtrato per quel controllo sarà like * e quindi nessun filtro,
altrimenti seleziona solo per quello che l'utente avrà scritto sulla
maschera
Antonio

Nell'evento dell'avvio della ricerca, inserisco il codice sotto che mi
permette di costruire dinamicamente la query di selezione dei dati che poi
andrò a visualizzare in altra maschera
dove "ME!..." indica che prelevo i dati dalla maschera di ricerca
    Dim MyDatabase As Database
    Dim MyQueryDef As QueryDef
    Dim strDlm As String
    Dim where As Variant
    strDlm = Chr$(34)
    Set MyDatabase = CurrentDb()
    On Error Resume Next
    MyDatabase.QueryDefs.Delete "qryDynAnagrafe"
    On Error GoTo 0
    where = Null
    If Not IsNull(Me![txtCognome]) Then
        If Left(Me![txtCognome], 1) = "*" Or Right(Me![txtCognome], 1) = "*"
Then
            where = where & " And [tblanagrafe].[str_Cognome] Like " &
strDlm + Me![txtCognome] + strDlm
        Else
            where = where & " And [tblanagrafe].[str_Cognome] = " + strDlm +
Me![txtCognome] + strDlm
        End If
    End If
    If Not IsNull(Me![txtNome]) Then
        If Left(Me![txtNome], 1) = "*" Or Right(Me![txtNome], 1) = "*" Then
            where = where & " And [tblanagrafe].[str_nome] Like " & strDlm +
Me![txtNome] + strDlm
        Else
            where = where & " And [tblanagrafe].[str_nome] = " + strDlm +
Me![txtNome] + strDlm
        End If
    End If
    If Not IsNull(Me![txtRagSoc]) Then
        If Left(Me![txtRagSoc], 1) = "*" Or Right(Me![txtRagSoc], 1) = "*"
Then
            where = where & " And [tblanagrafe].[str_ragSoc] Like " & strDlm
+ Me![txtRagSoc] + strDlm
        Else
            where = where & " And [tblanagrafe].[str_ragSoc] = " + strDlm +
Me![txtRagSoc] + strDlm
        End If
    End If
    If Not IsNull(Me![txtComune]) Then
        If Left(Me![txtComune], 1) = "*" Or Right(Me![txtComune], 1) = "*"
Then
            where = where & " And [tblanagrafe].[str_Comune] Like " & strDlm
+ Me![txtComune] + strDlm
        Else
            where = where & " And [tblanagrafe].[str_Comune] = " + strDlm +
Me![txtComune] + strDlm
        End If
    End If
    If Not IsNull(Me![txtPv]) Then
         where = where & " AND [tblanagrafe].[str_Pv]= " + Me![txtPv]
    Else
         where = where
    End If
    Set MyQueryDef = MyDatabase.CreateQueryDef("qryDynAnagrafe", _
        "Select tblanagrafe.*,qryCentroAttivo.lng_int_Salto from tblanagrafe
INNER JOIN qryCentroAttivo ON tblAnagrafe.lng_cnt_Centro =
qryCentroAttivo.LNG_CNT_CENTRO " & IIf(IsNull(where), "", "where " &
Mid(where, 6)) & " ORDER BY str_RagSoc, str_Cognome, tblanagrafe.str_Nome")
        DoCmd.OpenForm "frmAnagrafe"
        Forms!frmAnagrafe.RecordSource = "qryDynAnagrafe"

grazie, idea davvero geniale
Antonio


ottimo ma per i campi vuoti come faccio????
                                                        ciao Max

> cancellati di nuovo venga scritto *.
Altrimenti dovrai scrivere questo come criterio WHERE
like iif([forms]![tuascheda]![tuocontrollo] = "" or
isnull([forms]![tuascheda]![tuocontrollo]);"*";[forms]![tuascheda]![tuocontr
ollo])
Antonio

 sono molto gradite...:-)  ) Quale?
dopo averci lavorato su un po' direi che il modo c'e'
detto [contro] il controllo di ricerca nella maschera e [campo] il campo che
ci sta dietro,
metti nella struttura query nella colonna del [campo] il seguente criterio:
Iif(Forms!maschera![contro] Is Null;[campo];Forms!maschera![contro])
  il sistema dell'* non funziona con le combo associate a una colonna di ID
barbi

barbi
Che intendi?
Antonio

 wrote in message
87e8er$c2d$1...@lacerta.tiscalinet.it...

cioe' una combo di ricerca associata ad es. a un campo tipo IDprodotto, non
al campo NomeProdotto che e' quello significativo, e quindi e' fatta da due
colonne:
1)IDprodotto, invisibile, associata
2)NomeProdotto, visibile
se cerco di mettere * nel valore predefinito mi forza "*" e cosi' mi frega,
al lancio della maschera vedo tutto grigio.
barbi

al lancio della maschera vedo tutto grigio.
Non capisco, deve funzionare lo stesso
Mi spieghi la tua struttura?
Antonio


parlo del caso in cui la maschera e' associata a una query "principale" che
comprende alcuni campi tipo ID di una tabella "principale", piu' i
corrispondenti campi tipo "Nome" in altrettante tabelle "secondarie". La
combo generica di ricerca ha due colonne come descritto, prese dalla query
"secondaria". Se nella query "principale" pongo i criteri come hai detto tu
cioe'
Like Forms!maschera![contro], al lancio della maschera non mi appare niente
ma solo lo sfondo grigio; cio' significa che non ha trovato nessun record,
perche' e' la stessa cosa che succede a me col mio sistema del criterio:
Iif(Forms!maschera![contro] Is Null;[campo];Forms!maschera![contro]) quando
non trova nessun record (e' un inconveniente che va corretto, perche' se no
posso solo chiudere e riaprire la maschera).  Il fatto che non trova nessun
record lo attribuisco al fatto che, nell'elenco delle proprietą di [contro],
se tento di mettere valore predefinito = * mi forza "*" e penso che voglia
dire che lo considera solo come stringa e quindi non funziona con gli
interi, ma forse
mi sbaglio. Oppure non va bene perche' non e' nell'elenco dei valori
previsti dalla query "secondaria" per la combo, e non si riesce a porre
"solo in elenco"=no perche' la colonna associata alla combo e' invisibile.
barbi


http://www.penguinpowered.com/~ecesena
Ci sono tre persone superstiti su un'isola, un poliziotto, un finanziere
ed un carabiniere.  Il poliziotto guarda, oltre il mare, verso la terra
del continente, stimata a circa 20 chilometri da loro.  Cosi' esclama:
"Provero' a raggiungere l'altra riva a nuoto".  Il poliziotto parte,
nuota per cinque chilometri, e si stanca parecchio.  Arriva a dieci
chilometri, ma non ce la fa piu' ed annega.  Il finanziere: "Mi chiedo
se ce l'abbia fatta.  Credo sia meglio se ci provo anch'io".  E si tuffa
anche lui.  Nuota per cinque, dieci chilometri.  Ma arriva a quindici
stanchissimo, non riesce ad andare avanti ed affoga.  Il carabiniere,
rimasto solo, si chiede: "Chissa' se ce l'hanno fatta...  Penso che sia
meglio se provo anch'io", e va.  Nuota per cinque chilometri, poi arriva
a dieci, quindici, DICIANNOVE chilometri dall'isola.  La costa del
continente e' bene in vista, ma lui, fra se', dice: "Sono troppo stanco
per proseguire, non ce la faccio piu'!", cosi' gira e torna indietro.
		-- Da it.hobby.umorismo


http://www.penguinpowered.com/~ecesena
America:
	L'ultima voga TV e' un quiz intitolato ``DEBITI''.  Chi vince,
vede saldati tutti i propri debiti.  Si tratta di rispondere a domande
sullo spettacolo.  Potremmo mandarci qualcuno del Governo a concorrere
per l'Italia.  Se vince, si ripiana il debito pubblico.  Magari
Veltroni: qualche videocassetta l'ha vista.  Un'idea che collimerebbe
con le sue posizioni politiche.  E' Veltroni infatti ad aver proposto
nuovi Gratta e Vinci per aumentare il gettito fiscale.  Ehi!  E allora
perche' non un 740 abbinato alla Lotteria?  Ogni 740 ha un numero
progressivo, come un biglietto della Lotteria.  A capodanno c'e'
l'estrazione.  Se viene estratto il tuo 740, vinci un miliardo.  Non so
voi, ma io pagherei le tasse piu' volentieri.
		-- Panfilo Maria Lippi, "TABLOID TABLOID"@"Mai Dire Gol"

perche' e' la stessa cosa che succede a me col mio sistema del criterio:
Hmmm....
A parte che in questi casi è meglio lasciare legata la colonna col nome e
riferirsi a column(1) per l'ID, prova a utilizzare un controllo nascosto
dove metterai *. All'evento dopo aggiornamento della combo scrivi nel
controllo invisibile il valore dell'ID cioè di column(1) e baserai la query
della maschera sul controllo invisibile...
Antonio


guarda, ormai non ne posso piů di provare varianti, in sostanza ho messo a
punto una maschera che mi costruisce i criteri della query in VBA, perň mi
sembrava attraente concludere il discorso col mio sistema del criterio
Iif(Forms!maschera![contro] Is Null;[campo];Forms!maschera![contro]) che
funziona salvo il caso di nessun record trovato, che si dovrebbe poter
intercettare in VBA, magari ci farň un pensierino
barbi