Newsgroup: it.comp.appl.access
Titolo: Maschera di ricerca a campi multipli.

Buonasera a tutti!
Vi ho "lasciato in pace" per un po' e adesso torno a chiedere.
Mesi fa, dal Sito Comune ho scaricato l'esempio per le maschere di ricerca e
sono riuscita ad adeguarlo alle mie esigenze. Funziona tutto perfettamente, ma
adesso mi trovo nella necessita' di cercare campi multipli e non più un solo
valore per volta
Il codice relativo alla ricerca singola era questo:
============
Private Sub CercaOrdine_Click()
Dim strValue As String, strMsg As String
    If IsNull(Me!Ordine) Then
    MsgBox "Attenzione! La maschera di ricerca è vuota!!"
    End If
    If Not IsNull(Me!Ordine) Then
 
strValue = Me.Ordine.Value
DoCmd.OpenForm "Sottomaschera_Ricerca_Ordine", acFormDS, , _
"[Ordine] Like " & "'*" & Me![Ordine] & "*'"
Exit_CercaOrdine_Click:
    Exit Sub
Err_CercaOrdine_Click:
    MsgBox Err.Description
    Resume Exit_CercaOrdine_Click
End If
End Sub
=========================
Adesso pero' ho tre campi: Ordine, Fornitore e Data Acquisto e io ho modificato
il codice in questo modo:
==============================
Private Sub CercaOrdine_Click()
Dim strValue As String, strMsg As String
    If IsNull(Me!Ordine) And IsNull(Me!Fornitore) And IsNull(Me!Data) Then
    MsgBox "Attenzione! La maschera di ricerca è vuota!!"
    End If
    If Not IsNull(Me!Ordine) Or Not IsNull(Me!Fornitore) Or Not IsNull(Me!Data)
Then
 
strValue = Me.Ordine.Value Or strValue = Me.Fornitore.Value Or strValue = _
Me.Data.Value
DoCmd.OpenForm "Sottomaschera_Cerca_Ordine", acFormDS, , _
"[Ordine] Like " & "'*" & Me![Ordine] & "*'" Or _
"[Fornitore] Like " & "'*" & Me![Fornitore] & "*'" Or _
"[Data] Like " & "'*" & Me![Data] & "*'"
Exit_CercaOrdine_Click:
    Exit Sub
Err_CercaOrdine_Click:
    MsgBox Err.Description
    Resume Exit_CercaOrdine_Click
End If
End Sub
==========================
Evidentemente il mio codice è sbagliato, ma io non so da che parte cominciare a
modificarlo.
L'errore me lo da' a questo punto:
strValue = etc etc
e a seguire: "tipo non corrispondente"
Mi date una mano a capire dove sbaglio?
Molte grazie
Erika
-- 
Per rispondermi... Togli "nospam"
To send me an email... take out "nospam"


Inizia col togliere quel .value.
MAssimiliano

MAssimiliano
Ciao e grazie per l'aiuto...
ho tolto il .value, ma non funziona nulla lo stesso. 
Mi puoi almeno dire se sono sulla strada giusta?
Voglio dire, ha senso una modifica di questo tipo a partire dal primo codice che
avevo?? Una ricerca ad un solo campo non mi basta proprio, in questo caso.
Ciao e grazie ancora


 ha scritto nel messaggio
news:us23m0ts2bpmedarm...@4ax.com...

Ciao Erika,
1° problema
togli questa istruzione che non serve
strValue = Me.Ordine.Value Or strValue = Me.Fornitore.Value Or strValue =
Me.Data.Value
2° problema
se Ordine e Fornitore sono dati di tipo testo  puoi modifcare la stringa di
ricerca in questo modo:
filterstring = "[Ordine] Like '" & nz(me![Ordine], "*")  & "' Or [Fornitore]
Like '" & nz(Me![Fornitore], "*") & "'" & iif(len(me![Data])=0, "", "OR
Data=#" &me![Data] & "#")
DoCmd.OpenForm "Sottomaschera_Cerca_Ordine", acFormDS, , filterstring
Verifica che filterstring restituisca una Where valida non ho verificato e
potrei essermi dimenticata qualche apice da qualche parte
Saluti
Cinzia

potrei essermi dimenticata qualche apice da qualche parte
Ok, adesso il codice č cosě:
===
Private Sub CercaOrdine_Click()
Dim strValue As String, strMsg As String
    If IsNull(Me!Ordine) And IsNull(Me!Fornitore) And IsNull(Me!Data) Then
    MsgBox "Attenzione! La maschera di ricerca č vuota!!"
    End If
    If Not IsNull(Me!Ordine) Or Not IsNull(Me!Fornitore) Or Not IsNull(Me!Data)
Then
 
filterstring = "[IDOrdine] Like '" & Nz(Me![Ordine], "*") & "' OR
[NomeFornitore] Like '" & Nz(Me![Fornitore], "*") & "'" & IIf(Len(Me![Data]) =
0, "", "Or DataOrdine=#" & Me![Data] & "#")
DoCmd.OpenForm "_Sottomaschera_Ricerca_Ordine", acFormDS, , filterstring
Exit_CercaOrdine_Click:
    Exit Sub
Err_CercaOrdine_Click:
    MsgBox Err.Description
    Resume Exit_CercaOrdine_Click
End If
End Sub
====
Purtroppo continua a darmi errore di sintassi sul campo data! 
Il punto č che io voglio trovare tutti e 3 i record contemporaneamente o anche
singolarmente.
Ponendo che io cerchi tutti gli ordini effettuati su "amazon" che inizino con
numero d'ordine "1" del "2004", ricevo sempre errore run-time 3075 sintassi
della data.
Pero' io non posso sempre immettere la data esatta dell'ordine: se la sapessi
non avrei bisogno di fare la ricerca... e cmq, in questo caso... mi elenca come
risultati TUTTI i records della tabella.
Cercando su google, qualcuno ha suggerito di usare + al posto di &. In effetti
cosě facendo l'errore di sintassi 3075 non c'č piu', ma mi ritrovo di nuovo con
tutti i records indipendentemente dal valore che io inputo nel campo di ricerca.
Mi date un'altra spintarella per capire dov'e' l'inghippo?
Grazie


 Grazie
Ciao Erika,
il problema con il campo data è dovuto al fatto che se tu scrivi 2004 nella
casella Data, per Access "2004" non è una data e quindi ti da l'errore sul
formato data.
Per cui supponendo che nella casella l'utente digiti solo l'anno e che tu
voglia trovare tutti gli ordini di quell'anno la filterstring diventerebbe:
filterstring = "[IDOrdine] Like '" & Nz(Me![Ordine], "*") & "' OR
 [NomeFornitore] Like '" & Nz(Me![Fornitore], "*") & "'" &
IIf(Len(Me![Data]) = 0, "", "Or DataOrdine>=#01/01/" & Me![Data] & "# AND
DataOrdine<=#12/31/" & Me![Data] )
Certo se l'utente a volte scrive l'anno, a volte il mese e l'anno e a volte
giorno/mese/anno la cosa diventerebbe più complicata e in questo caso ti
consiglierei di mettere due caselle Data Inizio e DataFine in modo tale che
se l'utente deve cercare un mese specifico scriverà DataInizio= 01/01/2004
DataFine= 31/01/2004    e se vuoi semplificargli la vita mettigli pure un
controllo calendario dove sceglie la data direttamente dal calendario.
Spero di averti dato un altro piccolo aiuto.
Saluti
Cinzia

giorno/mese/anno la cosa diventerebbe più complicata
No, no mi basta l'anno ^_^
Pero' continua a darmi l'errore di sintassi... boh, ormai sta cosa sta
diventando un incubo!. La query funziona, la sottomaschera con i risultati è ok,
ma non riesco a dare l'input via form. 
Grazie ancora, comunque!!!



Modifica la fine della stringa con:
..." Or DataOrdine>=#01/01/" & Me![Data] & "# AND DataOrdine<=#12/31/" & Me![Data] & "#")
- inserire uno spazio prima di OR;
- inserire un cancelletto di chiusura;
Ciao.
-- 
Sergio MAZZA

..." Or DataOrdine>=#01/01/" & Me![Data] & "# AND DataOrdine<=#12/31/" & Me![Data] & "#")
Ok... le ho provate veramente tutte, ma non funziona.
Se inserisco uno solo dei 3 campi mi vengono restituiti *tutti* i valori della
tabella. Se compilo tutti e 3 i campi la tabella viene filtrata solo in base
alla data. E, soprattutto, se non inserisco il valore relativo alla data mi
torna fuori il famigerato errore 3075 di sintassi.
Ormai mi viene veramente voglia di sbattere la testa contro il muro. Collego la
query ad un pulsante ed inserisco i parametri quando mi vengono chiesti, cosi'
almeno funziona. Ma è veramente cosi' difficile quello che sto cercando di fare?
O è possibile che stia facendo un errore a monte? Che tipo di struttura devo
creare?
Quando ho scaricato l'esempio di partenza dal sito comune, avevo una situazione
di questo tipo:
Query basata su tabella Ordini
Maschera di ricerca
Sottomaschera con i risultati
E' giusto riprodurre ora la stessa struttura? E, soprattutto, non posso filtrare
i risultati tramite la query usando VBA solo per dare il comando di esecuzione
della query stessa?
Grazie a tutti per l'aiuto!



Ciao Erika,
ripartendo dall'inizio mi sembra che tu voglia creare una maschera di
ricerca contenente N.ordine, Fornitore e Data Acquisto che una volta
impostati ti aprano una seconda maschera contenete i risultati richiesti.
Io in casi del genere applico una procedura di questo tipo:
Dim stdocName as string
Dim stLinkCriteria as string
Dim l as integer
Dim NuovaData As string
    stDocName = "frm_Aziende"    ' Nome del from che voglio aprire
        If Len(NOrdine) > 0 Then
            stLinkCriteria = "([NOrdine] like " & "'" & Nordine & "*')"
        End If
        If Len(Me.Fornitore) > 0 Then
            If Len(stLinkCriteria) > 0 Then
                stLinkCriteria = stLinkCriteria & " AND ([Fornitore] like
'*" & Replace(Me![Fornitore], "'", "''") & "*')"
            Else
                 stLinkCriteria = " ([Fornitore] like '*" &
Replace(Me![Fornitore], "'", "''") & "*')"
            End If
        End If
         If Len(Me.DataAcquisto) > 0 Then
            l = Len(dataAcquisto)     'In base alla lunghezza cerco di
ricostruire una data valida
            Select case l
                case 4   ' solo anno
                        NuovaData= "01/01/" & me.dataAcquisto
                case 7   ' mm/aaaa
                        NuovaData = "01/" & me.dataAcquisto
                case 9,
                case 10
                        NuovaData = Me.dataAcquisto
                case else  ' nessun caso precedente va bene gli metto il 1
Gennaio dell'anno corrente
                        NuovaData = "01/01/" & year(date())
            end select
            If Len(stLinkCriteria) > 0 Then
                stLinkCriteria = stLinkCriteria & " AND ([DataAcquisto]>=#"
& Format(NuovaData, "aaaa/mm/dd")  & "#)"
            Else
                 stLinkCriteria = " ([DataAcquisto] >=#" & Format(NuovaData,
"aaaa/mm/dd")   & "#)"
            End If
        End If
    End If
    DoCmd.OpenForm stDocName, , , stLinkCriteria
Ho adattato al tuo caso una mia procedura che funziona, non escludo che ci
possa essere qualche errore di sintassi da qualche parte, ma la logica
dovrebbe essere a posto, spero possa aiutarti!
Saluti
Cinzia

dovrebbe essere a posto, spero possa aiutarti!
Ciao Cinzia
Funziona!!!
Non so come ringraziarti! 
All'inizio mi funzionava solo il campo fornitore, da li' sono partita a
modificare il resto e adesso la forma del codice è la seguente:
==========
Private Sub CercaOrdine_Click()
Dim stdocName As String
Dim stLinkCriteria As String
Dim l As Integer
Dim NuovaData As String
    stdocName = "_Sottomaschera_Ricerca_Ordine"    ' Nome del from che voglio
aprire
        If Len(Me.Ordine) > 0 Then
            If Len(stLinkCriteria) > 0 Then
                stLinkCriteria = stLinkCriteria & " AND ([IDOrdine] like '*" &
Replace(Me![Ordine], "'", "''") & "*')"
            Else
                 stLinkCriteria = " ([IDOrdine] like '*" & Replace(Me![Ordine],
"'", "''") & "*')"
            End If
        End If
        If Len(Me.Fornitore) > 0 Then
            If Len(stLinkCriteria) > 0 Then
                stLinkCriteria = stLinkCriteria & " AND ([NomeFornitore] like
'*" & Replace(Me![Fornitore], "'", "''") & "*')"
            Else
                 stLinkCriteria = " ([NomeFornitore] like '*" &
Replace(Me![Fornitore], "'", "''") & "*')"
            End If
        End If
         If Len(Me.Data) > 0 Then
            If Len(stLinkCriteria) > 0 Then
                stLinkCriteria = stLinkCriteria & " AND ([DataOrdine] like '*" &
Replace(Me![Data], "'", "''") & "*')"
            Else
                 stLinkCriteria = " ([DataOrdine] like '*" & Replace(Me![Data],
"'", "''") & "*')"
            End If
        End If
        DoCmd.OpenForm stdocName, acFormDS, , stLinkCriteria
End Sub
=========
Adesso che la vedo davanti capisco la logica del tuo codice, ma non sarei mai
riuscita ad arrivarci da sola.
Grazie ancora a te e a tutti quelli che mi hanno aiutata!!


Buongiorno e buona domenica a tutti,
ho un'ultima domanda relativa alla maschera di ricerca: se io dovessi inserire
una discriminante di tipo sì/no, che codice dovrei aggiungere?
Mi spiego: la ricerca mi restituisce l'elenco di tutti i prodotti che
corrispondono ai criteri da me inseriti. Ma se io volessi vedere solo i prodotti
già venduti? Nella mia tabella il campo venduto è di tipo "sì/no".
Partendo dal codice che mi avete suggerito, che cosa dovrei aggiungere o
modificare, se volessi *solo* i record che che corrispondono a venduto = sì?
Grazie in anticipo per l'aiuto!


Ritiro quanto precedentemente affermato!
Avevo fatto un errore io nella query!
Adesso funziona tutto!
Moltissime grazie
