Ricerca sottostringa con filtro

di il
5 risposte

Ricerca sottostringa con filtro

Salve,
chiedo un aiuto. Ho un programmino Access che tramite un form un utente inserisce il nome di un Comune e l'indirizzo ed gli estrapola dal database.
Il problema è che da come ho scritto la funzione di ricerca, i risultati contemplano tutte le sottostringhe del nome del Comune, facendo uscire Comuni non corretti.

Es. il mio DB ha dentro

[Verona, Milano, Lano, Venezia, Lano, Solano, Lano Marittima...]

la ricerca del Comune di Lano darà come risultato: Milano, Lano, Lano, Solano, Lano Marittima, ...

Cioè tutti i comuni che hanno "lano" all'interno della parola, ma non dovrebbe essere così.

Il risultato corretto sarebbe: Lano, Lano, Lano Marittima.

La funzione che ho scritto è questa:
SELECT Contatti.ID, Contatti.[Cognome_Società], Contatti.Nome, Contatti.Indirizzo, Contatti.Comune, Contatti.Telefono, Contatti.Cellulare, Contatti.Referente, Contatti.Note
FROM Contatti
WHERE ((
(LCase(Contatti.Comune)) Like "*" & LCase(Forms!Comune!NomeComune) & "*")

And ((LCase(Contatti.Indirizzo)) Like "*" & LCase(Forms!Comune!Indirizzo) & "*"))
ORDER BY Contatti.Indirizzo;
l'indirizzo potete anche non considerarlo perché è sempre opzionale.
soffermandoci sulla funzione where ho pensato di sostituirla con:
WHERE (
(
(("*" & LCase(Forms!Comune!NomeComune) & "*") Like ("* " & LCase(Contatti.Comune) & " *")) Or
(("*" & LCase(Forms!Comune!NomeComune) & "*") Like ("* " & LCase(Contatti.Comune))) Or
(("*" & LCase(Forms!Comune!NomeComune) & "*") Like (LCase(Contatti.Comune) & " *")) Or
(("*" & LCase(Forms!Comune!NomeComune) & "*") Like (LCase(Contatti.Comune)))
) 
And (LCase(Contatti.Indirizzo) Like ("*" & LCase(Forms!Comune!Indirizzo) & "*"))
)
ma ora ricevo un errore #Tipo!

Mi potreste aiutare, non so più come andare avanti.

Grazie

5 Risposte

  • Re: Ricerca sottostringa con filtro

    Dividerei il problema in 2.
    Prima cosa non serve e forse è proprio poco funzionale giocare con una Query in quel modo, rendendola poco efficace con i criteri così inseriti.
    Immagino tu parta da ELENCO COMPLETO, quando non hai valorizzato un criterio.

    La cosa migliore credo sarebbe appoggiare la maschera alla query o tabella senza alcun criterio e, sfruttare la Proprietà FILTER di maschera utilissima anche per altri utilizzi(vedi apertura di Report con WHERE condition).

    Detto questo se sei certo di non voler cercare PAROLE PARZIALI, io non ne sono così certo sia sempre centrato, credo possa servire la ricerca solo INIZIALE o FINALE... (tempo però possa escludere qualche caso ma vedrai al momento).

    P.S. aggiungo che JET non è CASE SENSITIVE, quindi tutto quel PIPPONE che applichi con gli LCASE nons erve a nulla.

    Quindi la gestione diverrebbe
    
    Dim strWHR		As String
    
    If Len(Me!NomeComune & vbNullstring)>0 Then 
    	strWHR="Contatti.Comune Like '* " & Me!NomeComune & "'"
    	strWHR= strWHR & " OR Contatti.Comune Like '" & Me!NomeComune & " *'"
    End if
    
    Me.Filter=strWHR
    Me.FilterOn=Len(strWHR)>0
  • Re: Ricerca sottostringa con filtro

    Eventualmente puoi pensare di inserire uno spazio prima ed uno dopo nei 2 criteri parziali proposti, sarebbe più esclusivo e sicuramente più centrato.
  • Re: Ricerca sottostringa con filtro

    Finalmente ho avuto un po' di tempo per leggere la tua soluzione. Grazie mille!

    Ora vorrei però capire un paio di cose forse banali o di base, ma che mi danno errore quando provo a modificare il tuo codice.

    @Alex ha scritto:


    
    	strWHR="Contatti.Comune Like '* " & Me!NomeComune & "'"
    	strWHR= "Contatti.Comune Like '* " & Me!NomeComune & "'" & " OR Contatti.Comune Like '" & Me!NomeComune & " *'"
    	
    ho qualche dubbio sul tuo utilizzo degli apostrofi e virgolette. Ho cercato sulla documentazione ma non ho trovato tutte le risposte.
    Mi spieghi cosa vuol dire l'uso di un apostrofo prima o dopo l'asterisco? '* e *'
    Non mi è chiara poi la tua suddivisione durante la concatenazione.
    spezzo in tre:
    "Contatti.Comune Like '* " 
    & 
    Me!NomeComune 
    &
     "'"
    perché aggiungere un apostrofo finale?
  • Re: Ricerca sottostringa con filtro

    Studia la concatenazione di stringhe!
    scusa ma come lo scriveresti se non dovessi prendere i valori da campi?
    qualcosa tipo
    Contatti.Comune Like '*parola1*' or Contatti.Comune Like '*parola2*'
    no?
    Alex ha semplicemente concatenato una stringa con un valore variabile derivante da un campo associato alla form
  • Re: Ricerca sottostringa con filtro

    xiD ha scritto:


    Finalmente ho avuto un po' di tempo per leggere la tua soluzione. Grazie mille!

    Ora vorrei però capire un paio di cose forse banali o di base, ma che mi danno errore quando provo a modificare il tuo codice.

    @Alex ha scritto:


    
    	strWHR="Contatti.Comune Like '* " & Me!NomeComune & "'"
    	strWHR= "Contatti.Comune Like '* " & Me!NomeComune & "'" & " OR Contatti.Comune Like '" & Me!NomeComune & " *'"
    	
    ho qualche dubbio sul tuo utilizzo degli apostrofi e virgolette. Ho cercato sulla documentazione ma non ho trovato tutte le risposte.
    Mi spieghi cosa vuol dire l'uso di un apostrofo prima o dopo l'asterisco? '* e *'
    Non mi è chiara poi la tua suddivisione durante la concatenazione.
    spezzo in tre:
    "Contatti.Comune Like '* " 
    & 
    Me!NomeComune 
    &
     "'"
    perché aggiungere un apostrofo finale?
    Questi non sono "dubbi" ma lacune tecniche che si colmano studiando, gli esempi ci sono sia per la concatenazione, che per l'uso del LIKE che per l'uso delle WILDCARD che per la formattazione richiesta per i campi TESTO in SQL...!

    Le stringhe si concatenano con &, ma il costrutto deve soddisfare in questo caso la sintassi SQL dei Testi.
    Quando ricerchi una stringa in SQL va delimitata da APICETTI...! [CODE] strSQL="SELECT * FROM T1 WHERE Nome='Paolo'" Se cerchi tutti i nomi che iniziano con "P" allora si usa il LIKE ma devi usare le cosi dette WILDCARD o JOLLY dopo la "P"...! [CODE] strSQL="SELECT * FROM T1 WHERE Nome='P*'" Se cerchi tutti i nomi che finiscono con con "O" allora si usa il LIKE ma devi usare le cosi dette WILDCARD o JOLLY prima di "O"...! [CODE] strSQL="SELECT * FROM T1 WHERE Nome='*O'" Se cerchi tutti i nomi che contengono "A" allora si usa il LIKE ma devi usare le cosi dette WILDCARD o JOLLY prima e dopo di "A"...! [CODE] strSQL="SELECT * FROM T1 WHERE Nome='*A*'" Ora se il costrutto dfeve essere Flessibile e non RIGIDO, ovvero se non devi semrpe e solo cercare "A" ma devi cercare quello che digiti da altre parti... la stringa la devi costruire in modo da integrare il riferimento interno.
    strSQL="SELECT * FROM T1 WHERE Nome='*" & ValoreEsterno & "*'"
Devi accedere o registrarti per scrivere nel forum
5 risposte