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

Ciao vi chiedo nuovamente aiuto. La premessa è che conosco davvero
poco di access ^^.
Avrei bisogno di creare una maschera per la ricerca all'interno di una
tabella.
Funzioni sulla maschera:
Visualizzazione dei record filtrati non modificabili presi dalla
tabella.
Scelta del campo di ricerca (da casella combinata con quattro voci)
Spazio per inserire la parola o le parole da cercare.
Tasto cerca.
Per il momento ho creato una casella di testo non associato dove
inserire le parole... una combinata con le 4 voci... e le caselle che
consentono di visualizzare il record ma non di modficarlo.
Quali comandi devo usare nella routine del tasto "cerca"?
Grazie a chi vorrà rispondere... se avete bisogno di altre
informazioni chiedete pure.
PS
Ho provato a cercare in alcune funzioni di ricerca ma non ho trovato
nulla che mi andasse bene.

 nulla che mi andasse bene.
Ma non hai provato a cercare nello sconfinato sito comune
(
www.sitocomune.com
)...
Ciao.
--
Sergio MAZZA

Ciao.
Mi spiace deluderti.... ma ho provato anche nello sconfinato sito
comune ^__^
Ho scaricato qualche esempio di ricerca ma per lo più aprono altre
finestre per effettuare il filtraggi oppure non visualizzano il
risultati sulla maschera. Probabilmente una persona che ha una
conoscenza medio buona del programma da quegli esempi riesce a tirar
fuori qualcosa... ma la mia premessa invece era proprio il mio basso
livello di conoscenza... soprattutto in ambito pulsanti e funzioni ad
essi correlate.

 consentono di visualizzare il record ma non di modficarlo.
Allora una soluzione veloce veloce:
(ingredienti)
- casella combinata con opzioni:
    - nome: lstCampi;
    - (scheda dati) Tipo origine riga: "Elenco campi"
    - Origine riga: nomeTuaTabella
- casella di testo chiamata: "testoDaCercare"
- bottone con:
    - nome: bttnCerca;
    - evento "su clic" (occhio alle righe che vanno a capo):
Private Sub bttnCerca_Click()
If Not IsNull(Me!lstCampi) And Not IsNull(Me!testoDaCercare) Then
    If InStr(Me!testoDaCercare, ",") > 0 Then
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "] in (" & Me!testoDaCercare
& ")"
    Else
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "]='" & Me!testoDaCercare &
"'"
    End If
End If
End Sub
- bottone con:
    - nome: bttnTogliFiltro;
    - evento "su clic":
        DoCmd.ShowAllRecords
Se vuoi cercare più di un valore nel campo devi separarli con una virgola e
racchiuderli tra apostrofi:
es.
'Sergio MAZZA','Tizio FINIZIO','Pippo PALLA'
I tre controlli li inserisci nella intestazione della maschera...
Ciao.
--
Sergio MAZZA

End Sub
Mi da un errore di sintassi su
    DoCmd.ApplyFilter , "[" & Me!lstCampi & "] in "( &
Me!testoDaCercare& ")"
Il messaggio esatto č: errore di compilazione: errore di sintassi...
Cosa ho sbagliato?

 Cosa ho sbagliato?
Riga spezzata? Dopo la & la riga continua con Me!...
Ciao.
--
Sergio MAZZA

 a capo
    Else

     Else
Che stringa hai inserito? Attenzione a scrivere parole contenenti
l'apostrofo.
Facciamo cosě, scaricati dal sito comune le funzioni per "Estrarre l'n-mo
elemento (token) da un elenco delimitato." - sezione General e incollale in
un modulo; poi modifica il codice cosě:
'--------------------
Private Sub bttnCerca_Click()
If Not IsNull(Me!lstCampi) And Not IsNull(Me!testoDaCercare) Then
    If NumToken(Me!testoDaCercare, ",") > 0 Then
        Dim conta As Integer, totToken As Integer, stringaDaCercare As
String
        totToken = NumToken(Me!testoDaCercare, ",")
        For conta = 1 To totToken
            stringaDaCercare = stringaDaCercare & Chr(34) &
Token(Me!testoDaCercare, ",", conta) & Chr(34) & ","
        Next
        stringaDaCercare = Left(stringaDaCercare, Len(stringaDaCercare) - 1)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "] in (" & stringaDaCercare
& ")"
    Else
        stringaDaCercare = Chr(34) & Me!testoDaCercare & Chr(34)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "]='" & Me!testoDaCercare &
"'"
    End If
End If
End Sub
'--------------------
Ciao.
--
Sergio MAZZA

    If NumToken(Me!testoDaCercare, ",") > 0 Then
NumToken
 :( e ci sto capendo sempre di meno
Ciao.

 Ciao.
Sono due le funzioni da copiare/incollare nel modulo: token e numtoken...
Ciao.
--
Sergio MAZZA

Ciao.
Si hai ragione avevo scordato la seconda... ma il risultato è sempre
lo stesso... le ricerche portano sempre all'ultimo record... quello
contatore.
O_o
*perplesso mode on*

 *perplesso mode on*
Invia la copia del codice che hai inserito nell'evento "su clic" e descrivi
le operazioni che fai (scelgo il campo X, inserisco il testo Y e premendo il
bottone succede...)...
Ciao.
--
Sergio MAZZA

bottone succede...)...
[inizio evento Su Clic]
Private Sub bttnCerca_Click()
If Not IsNull(Me!lstCampi) And Not IsNull(Me!TestoDaCercare) Then
    If NumToken(Me!TestoDaCercare, ",") > 0 Then
        Dim conta As Integer, totToken As Integer, stringaDaCercare As
String
        totToken = NumToken(Me!TestoDaCercare, ",")
        For conta = 1 To totToken
            stringaDaCercare = stringaDaCercare & Chr(34) &
Token(Me!TestoDaCercare, ",", conta) & Chr(34) & ","
        Next
        stringaDaCercare = Left(stringaDaCercare,
Len(stringaDaCercare) - 1)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "] in (" &
stringaDaCercare & ")"
    Else
        stringaDaCercare = Chr(34) & Me!TestoDaCercare & Chr(34)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "]='" &
Me!TestoDaCercare & "'"
    End If
End If
End Sub
[fine evento Su Clic]
Procedura:
Apro la maschera di ricerca.
Le caselle di visualizzazione mostrano tutti i record della tabella.
Seleziono il campo di ricerca dalla casella combinata "lstCampi".
Inserisco la parola da cerca nella casella di testo "testoDaCercare".
Premo il pulsante "bttnCerca".
Le caselle di visualizzazione mostrano il record con ID contatore
scrivendo 1 filtrato qualsiasi sia la parola inserita nel
"testoDaCercare".

"testoDaCercare".
Se inserisco la ricerca per anno o per sigla e metto un valore
presente nei campi allora la ricerca funziona. Se metto un valore non
presente (ad esempio la sigla sbagliata) allora visualizza il record
contatore...
Da questo suppongo la visualizzazione del record contatore e basta
corrisponda al fatto che non ha trovato nessun record che soddisfi i
criteri di filtro... da cosa può dipendere.
In pratica non vanno la ricerca per titolo e quella per autore.

 In pratica non vanno la ricerca per titolo e quella per autore.
La prova che ho fatto è su una tabella con due campi in formato testo e
funziona benissimo. Quello che non è previsto nel mio esempio è la ricerca
in campi diversi dal tipo testo (numerico, data, etc. etc.) e come dicevo
prima la ricerca è per corrispondenze esatte; cioè se cerchi "Sergio MAZZA"
devi inserirlo per intero.
Se devi implementare tipologie diverse di ricerche devi:
- (una volta scelto il campo) riconoscere il tipo di campo (se testo o
numerico);
- indicare se il testo da ricerca è parziale (es. "Sergio" invece di "Sergio
MAZZA");
- eseguire la ricerca;
Ciao.
--
Sergio MAZZA

- eseguire la ricerca;
In che modo posso farlo?


Svelato l'arcano eh? Dirlo prima che tipo di campi erano e che tipo di
ricerca volevi fare no eh?
Chiariamoci; fermo restando che se vuoi selezionare il campo dove eseguire
la ricerca devi prima individuare che tipo di campo è e quindi costruire la
condizione where (filtro) adatto, la soluzione per cercare parte del testo
in un campo memo potrebbe essere:
If Not IsNull(Me!lstCampi) And Not IsNull(Me!testoDaCercare) Then
    If NumToken(Me!testoDaCercare, ",") > 1 Then '<--- RIGA MODIFICATA
        Dim conta As Integer, totToken As Integer, stringaDaCercare As
String
        totToken = NumToken(Me!testoDaCercare, ",")
        For conta = 1 To totToken
            stringaDaCercare = stringaDaCercare & "[" & Me!lstCampi & "]
Like " & Chr(34) & Token(Me!testoDaCercare, ",", conta) & Chr(34) & " OR "
        Next
        'stringaDaCercare = Left(stringaDaCercare, Len(stringaDaCercare) -
1)
        stringaDaCercare = Left(stringaDaCercare, Len(stringaDaCercare) - 4)
        'DoCmd.ApplyFilter , "[" & Me!lstCampi & "] in (" & stringaDaCercare
& ")"
        DoCmd.ApplyFilter , stringaDaCercare
    Else
        stringaDaCercare = Chr(34) & Me!testoDaCercare & Chr(34)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "] like " & stringaDaCercare
    End If
End If
E puoi inserire in testoDaCercare *Sergio* o Sergio* e *Sergio, i doppi
apici (Chr(34)) li inserisce lui...
Ciao.
--
Sergio MAZZA

Like " & Chr(34) & Token(Me!testoDaCercare, ",", conta) & Chr(34) & " OR "
La riga stringaDaCercare = .... da errore di compilazione: errore di
sintassi.
Io avevo provato ad inserire nell'altro evento il like ma
probabilmente sbaglio qualche cosa. Ti posto i tentativi
DoCmd.ApplyFilter , "[" & Me!lstCampi & "]= like '*" &
Me!TestoDaCercare & "*'"
End if
DoCmd.ApplyFilter , "[" & Me!lstCampi & "]= LIKE '" &
Me!TestoDaCercare & "'" 
End If
DoCmd.ApplyFilter , "[" & Me!lstCampi & "]= like *'" &
Me!TestoDaCercare & "'*"    
End If

 End If
Con patate!
Risultato: 0 strike, 0 balls;
Quindi hai risolto?
Ciao.
--
Sergio MAZZA

Quindi hai risolto?
Come ti ho detto all'inizio del post... provando a creare un altro
tasto cerca con il codice scritto da te mi da errore di compilazione
nella riga stringaDaCercare... dove ho interrotto il quote nell'altro
post.
Gli altri erano tentavi che stavo facendo... tutti vani come puoi
immaginare! ^_____-
La risposta è quindi no! Non ho risolto... puoi vedere se c'è qualche
errore nel codice che hai postato tu? Da errore di compilaz.

 errore nel codice che hai postato tu? Da errore di compilaz.
Nessun errore; in "mano" hai due soluzioni (ruotine):
per ricerche testuali (no memo)
'-----------
If Not IsNull(Me!lstCampi) And Not IsNull(Me!testoDaCercare) Then
    If NumToken(Me!testoDaCercare, ",") > 1 Then
        Dim conta As Integer, totToken As Integer, stringaDaCercare As
String
        totToken = NumToken(Me!testoDaCercare, ",")
        For conta = 1 To totToken
            stringaDaCercare = stringaDaCercare & Chr(34) &
Token(Me!testoDaCercare, ",", conta) & Chr(34) & "," '<-- solo campo testo
(no memo)
        Next
        stringaDaCercare = Left(stringaDaCercare, Len(stringaDaCercare) - 1)
'<-- solo campo testo (no memo)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "] in (" & stringaDaCercare
& ")" '<-- solo campo testo (no memo)
        DoCmd.ApplyFilter , stringaDaCercare
    Else
        stringaDaCercare = Chr(34) & Me!testoDaCercare & Chr(34)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "]=" & stringaDaCercare '<--
solo campo testo (no memo)
    End If
End If
'-----------
per ricerche testuali (solo memo)
If Not IsNull(Me!lstCampi) And Not IsNull(Me!testoDaCercare) Then
    If NumToken(Me!testoDaCercare, ",") > 1 Then
        Dim conta As Integer, totToken As Integer, stringaDaCercare As
String
        totToken = NumToken(Me!testoDaCercare, ",")
        For conta = 1 To totToken
            stringaDaCercare = stringaDaCercare & "[" & Me!lstCampi & "]
Like " & Chr(34) & Token(Me!testoDaCercare, ",", conta) & Chr(34) & " OR "
        Next
        stringaDaCercare = Left(stringaDaCercare, Len(stringaDaCercare) - 4)
        DoCmd.ApplyFilter , stringaDaCercare
    Else
        stringaDaCercare = Chr(34) & Me!testoDaCercare & Chr(34)
        DoCmd.ApplyFilter , "[" & Me!lstCampi & "] like " & stringaDaCercare
    End If
End If
Scegli quale utilizzare e confronta il codice..
Ciao.
--
Sergio MAZZA

Scegli quale utilizzare e confronta il codice..
Quindi nessuna delle due sembra andare... il punto dove il codice è
interrotto era quello a cui mi riferivo nel post di eri.
Ciao.

 Ciao.
Altro giro, altra corsa...
Ciao.
--
Sergio MAZZA

Altro giro, altra corsa...
^______-
*prende il tempo*
Ciao.

 Ciao.
Come fai a discrimirare tra una ricerca esatta e una ricerca parziale?
Come faccio a sapere la "direzione" della ricerca parziale? Es. "*Sergio"
non è uguale a "*Sergio*" che è diverso da "Sergio*"...
Si può fare tutto (o quasi); il La te l'ho dato, devi solo studiarti un po'
di VBA (istruzioni) e la sintassi delle condizioni Where SQL. Trovi tutto
nell'help in linea (F1)...
Ciao.
--
Sergio MAZZA

Ciao.
Ciao ciao.

 Ciao ciao.
No, non lasciarlo così; se hai quella necessità, studi, provi e poi inoltri
un messaggio spiegando cosa volevi fare e dove hai incontrato problemi.
Non è che ho finito la pazienza, ma una cosa è andare avanti da soli (anche
sbagliando ma almeno provarci) e un'altra è aspettare che qualcun'altro
risolva il problema. Non è questo lo spirito di questo NG (e neanche il
mio); ti viene indicata la via, messo in condizione di lavorare ma il resto
lo devi fare tu. Certo, se la soluzione è breve o ho già pronta la soluzione
perché in questi anni di risposte ho un mdb con i vari esempi non vuol dire
che è tutto risolvibile un 4 e 4 = 8. Guarda solo i giorni che sono passati
per arrivare alla (quasi) soluzione, e la gran parte dei messaggi era sul
ribadire di fare attenzione alla scrittura del codice.
Questo significa che devi approfondire VBA (e il resto) per poter tu andare
avanti e l'NG impiegare meno a risponderti...
Ciao.
--
Sergio MAZZA


Ciao Daniele

 Ciao Daniele
Eh! Eh!
Perň (Altro giro, altra corsa...) era riferito ai "calciInCulo"; era la
frase che dicevano i giostrai per indicare che si doveva pagare il nuovo
giro (sulla giostra dei "calci in culo") e se volevamo vincere un altro giro
(appunto!) ti dovevano spingere da dietro... Il piů delle volte beccavi un
calcio in culo (ari-appunto!) e diventavi l'articolo della serata...
Ciao.
--
Sergio MAZZA

Ciao.
Si... ci studierò su questo è sicuro... se poi dovessi avere ulteriori
dubbi beh credo che mi rivolgerò nuovamente a voi. Del resto ritengo i
gruppi di discussione una fonte molto utile e potente... un'analisi di
un problema visto da occhi esperti può portare soluzioni semplici a
cui uno a volte neppure pensa.
Grazie ancora per i suggerimenti. Ciao.

 Grazie ancora per i suggerimenti. Ciao.
Ok; ti aspettiamo...
Ciao.
--
Sergio MAZZA

 ha scritto nel messaggio
news:boav95$mqi$1...@canarie.caspur.it...

Ricordo...sob....ricordo....sigh.... :-'(
Nelle feste di paese(di una volta...) lo dicevano(gridavano) anche i gestori
di bancarelle che facevano dei giochi con una grande ruota numerata oppure
con delle buste(simile al gioco di Bonolis)
Ciao Daniele