Newsgroup: it.comp.appl.access
Titolo: criteri di ricerca in una Query con parametri

Like "*" & [Forms]![ricerche]![parola] & "*"
Utilizzando questa espressione nei criteri di un dato campo di una Query
vado a pescare i record che in quel dato campo contengono la parola
contenuta nel controllo "parola" della maschera "ricerche" indipendentemente
dalla posizione in cui si trova la parola stessa all'interno del campo.
Domanda: č possibile invece utilizzare un'espressione che faccia riferimento
a piů parole contenute nel controllo della maschera e separate da uno
spazio? In sostanza vorrei ottenere come risultato della query tutti i
record in cui in un dato campo vengono trovate le parole contenute in un
unico controllo (separate eventualmente da uno spazio o da un segno +),
indipendentemente dalla posizione in cui queste si trovano all'interno del
campo stesso.
Sperando di essere stato sufficientemente chiaro saluto e ringrazio.

 Sperando di essere stato sufficientemente chiaro saluto e ringrazio.
Nel caso in cui le parole digitate nel controllo chiamato Parola della
maschera Ricerche sono una o due (nel qual caso sono separate da uno
spazio), nei criteri prova a scrivere:
Like "*" & Left([Forms]![Ricerche]![Parola];
Len([Forms]![Ricerche]![Parola]) - InStr([Forms]![Ricerche]![Parola]; " "))
& "*" And Like "*" & Mid([Forms]![Ricerche]![Parola];
InStr([Forms]![Ricerche]![Parola]; " ") + 1) & "*"
Se le parole possono essere più di due penso che la cosa migliore sia avere
una casella di testo per ogni parola (Parola1, Parola2 ecc.) e mettere le
varie Like in And, insomma una cosa del genere:
Like "*" & [Forms]![Ricerche]![Parola1] & "*" And Like "*" &
[Forms]![Ricerche]![Parola2] & "*" And Like & [Forms]![Ricerche]![Parola3] &
"*" ecc. ecc.
Oppure devi crearti una funzione che ti divide le varie parole e con le
variabili risultanti, invece di scriverci i criteri di una query, ci filtri
direttamente una maschera o un report tramite le proprietà Filter e
FilterOn, evitando così anche di crearti una query di selezione.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 FilterOn, evitando così anche di crearti una query di selezione.
Al momento mi accontento di far funzionare a dovere la tua prima proposta ma
mi ripropongo per il futuro di approfondire questa possibilità di creare una
funzione che divida le varie parole contenute in controllo. Se credi, dammi
una parola chiave che mi possa eventualmente essere utile per un
approfondimento in Google o nel Sito comune.
Ti ringrazio sinceramente

approfondimento in Google o nel Sito comune.
Posso proporti una funzione scritta da me qualche tempo fa, e affinata
con la collaborazione del newsgroup. L'avevo mandata anche al sito
comune, ma evidentemente è stata ritenuta non interessante. O forse,
penso io, perché funziona solo in A2K e superiori, a causa della
presenza delle funzioni Replace e Split.
La posto ancora una volta poiché è il frutto di alcuni ulteriori
suggerimenti.
' ************************************************************
  Public Function EstraiParole( _
    ByVal Stringa As String _
  , Optional ByVal DaParola As Long = 1 _
  , Optional ByVal NumeroParole As Long = 1 _
  , Optional ByVal Delimitatori As String = " " _
  , Optional ByVal Separatore As String = " " _
  ) As String
' ------------------------------------------------------------
' Questa funzione serve per estrarre "NumeroParole" parole
' dalla stringa "Stringa", partendo dalla parola "DaParola".
' Per parola si intende tutto ciò che nella stringa
' viene separato facendo uso di un qualunque carattere
' contenuto in "Delimitatori".
' Se si specifica 0 come "NumeroParole" si ottiene l'insieme
' dalle parole dalla parola "NumeroParola" fino alla fine.
' Accetta valori negativi per l'argomento "DaParola", con il
' significato "le ultime n parole".
' Per esempio, DaParola=-3 significa dalla terzultima parola.
' Specificando una stringa in "Separatore", è possibile
' impostare la stringa che dividerà le "parole" nell'output
' finale.
' ------------------------------------------------------------
' Esempi:
' EstraiParole("Questa, *è* una -frase-", 2, 2, " ,*-")
'   --> "è una"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-")
'   --> "Questa è una frase"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-",";")
'   --> "Questa;è;una;frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*-")
'   --> "una frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*")
'   --> "una -frase-"
' ------------------------------------------------------------
' Scritta da Claudio, con preziosi consigli da parte di
' tutto il newsgroup it.comp.appl.access.
' Grazie a Maurizio, Alessandro e Marco.
' Ultimo aggiornamento novembre 2002
' ------------------------------------------------------------
  Dim ParolaArray() As String
  Dim i             As Long
  Dim vbNullChar2   As String
' ------------------------------------------------------------
  For i = 1 To Len(Delimitatori)
    Stringa _
      = Replace( _
            Stringa _
          , Mid$(Delimitatori, i, 1) _
          , vbNullChar)
  Next i
  vbNullChar2 = vbNullChar & vbNullChar
  While InStr(Stringa, vbNullChar2)
    Stringa = Replace(Stringa, vbNullChar2, vbNullChar)
  Wend
  If (Len(Stringa) < 2) Then
    EstraiParole = Stringa
    Exit Function
  End If
  If (Left$(Stringa, 1) = vbNullChar) Then
    Stringa = Mid$(Stringa, 2)
  End If
  If (Right$(Stringa, 1) = vbNullChar) Then
    Stringa = Left$(Stringa, Len(Stringa) - 1)
  End If
  ParolaArray = Split(Stringa, vbNullChar)
  If (DaParola < 0) Then
    DaParola = UBound(ParolaArray) + DaParola + 2
  End If
  If (DaParola <= 0) Then
    DaParola = 1
  End If
  If (DaParola > (UBound(ParolaArray) + 1)) Then
    DaParola = UBound(ParolaArray) + 1
  End If
  If ( _
       (NumeroParole = 0) _
       Or _
       ((DaParola + NumeroParole) > (UBound(ParolaArray) + 2)) _
  ) Then
    NumeroParole = UBound(ParolaArray) - DaParola + 2
  End If
  EstraiParole = ParolaArray(DaParola - 1)
  For i = DaParola To DaParola + NumeroParole - 2
    EstraiParole = EstraiParole & Separatore & ParolaArray(i)
  Next i
End Function
Guarda anche sul sitocomune, nella sezione General, il documento
"Estrarre l'n-mo elemento (token) da un elenco delimitato.". Trovi
funzioni meno generali ma più leggere, che probabilmente ti sono
sufficienti.
Ciao. Claudio.

 Ti ringrazio sinceramente


 ");0)+1) & "*"
E' ok (ho eliminato "*" dopo il primo punto e virgola perchè voglio che mi
restituisca 0 record se il testo nel controllo -quando presente- non trova
corrispondenze nel campo).
Mi sono però accorto a posteriori di alcune anomalie alla base
dell'espressione.
Finchè inserisco una sola parola, il Like "*"&(-----)&"*" sembra fare il suo
dovere, ma quando le parole diventano due cominciano i problemi: non
funziona se la 2^ parola è più lunga della prima (es. agostino vescovo 1
record;  vescovo agostino 0 record). Se invece scrivo nel controllo agostini
vescovo (cambiando quindi l'ultima lettera della parola "agostino") anzichè
restituirmi 0 record come dovrebbe mi restituisce il record che comprende le
parole "agostino" e "vescovo" (come se l'ultima lettera della prima parola
non fosse stata considerata). Ed ancora, se scrivo "agostino" "ve" la
ricerca viene effettuata con l'OR anzichè con l'AND (tutti i record in cui
compare "agostin" e tutti quelli in cui compare "ve". Insomma come avrai
intuito ho qualche seria difficoltà a riadattarla.
Grazie per la pazienza.

 ' finale.
Ho letto proprio questa mattina su google la "storia" di questa funzione.
Avevo già archiviato i tuoi post per un futuro approfondimento...
Al momento peccherei di presunzione se volessi applicarli al database su cui
sto lavorando (troppo poco tempo a disposizione).
Grazie. Sono certo che torneremo sull'argomento. E' da molto tempo che sento
l'esigenza di creare un unico controllo nel quale inserire più parole da
adoperare come criterio di ricerca.

 ha scritto nel messaggio
news:j%OC9.1203$3l.2...@twister1.libero.it...

In effetti c'erano un bel po' di cavolate; prova a scrivere nei criteri
questo:
Like "*" & Left([Forms]![ricerche]![Parola];
IIf(InStr([Forms]![ricerche]![Parola]; " ")= 0;
Nz(Len([Forms]![ricerche]![Parola]); 1);
Nz(InStr([Forms]![ricerche]![Parola]; " ")-1; 0))) & "*" And Like "*" &
Mid([Forms]![ricerche]![Parola]; Nz(InStr([Forms]![ricerche]![Parola]; " ");
0) +1) & "*"
e fammi sapere.


 e fammi sapere.
L' ho testata per un po' e sembra perfetta!
L'unico rammarico che ho è che so quasi per certo (dato il mio dislivello di
conoscenza)  che non avrò mai modo di ricambiare tutte le vostre cortesie.

 conoscenza)  che non avrň mai modo di ricambiare tutte le vostre cortesie.
Se continuerai a frequentare il NG, prima o poi troverai qualcuno che ha da
risolvere un problema che tu sei in grado di risolvere, ed allora lo
aiuterai: cosě anche tu contribuirai a tenere in vita il NG.
