Newsgroup: it.comp.appl.access
Titolo: Ricerca dati in campo testo lungo

Ciao a tutti. Utilizzo Access 2016 solo per conservare dati di brevi ricette o film.
Utilizzo delle maschere create appositamente per scorrere i record e fare ricerca dei record che, ad
esempio, contengano una particolare parola nel campo "Titolo".
A tal proposito trovai anni orsono una routine da applicare su una maschera di ricerca e la cosa mi
ha sempre soddisfatto.
E' nata recentemente la necessità di cercare i vari records che, IN UN CAMPO DI TESTO LUNGO,
contengano una determinata parola.
Ho modificato la maschera di ricerca aggiungendo il nuovo campo "INGREDIENTI" in cui eseguire la
ricerca, ma non funziona.
Ho pensato che la cosa sia causata dal fatto che la ricerca non può essere eseguita con il codice in
mio possesso in campi di testo lunghi.
E' così o c'è la possibilità di superare l'ostacolo?
Grazie a quanti risponderanno.
Gianni

Mostra il codice che utilizzi attualmente per la ricerca.

Gianni explained :

Tabella2 è la tabella che contiene in campo [Testo], che contiene
il Long Test su cui cercare.
 
Private Sub Command9_Click()
Dim RS As Recordset, k As Integer, S As String
 
S = "nel mezzo del cammin di nostra vita" ' Testo da ricercare
 
Set RS = CurrentDb.OpenRecordset("Table2", dbOpenDynaset)
 
Do Until RS.EOF
    If InStr(1, RS("Testo"), S) Then
        k = k + 1
        MsgBox "Record " & k & vbCrLf & "Position = " & InStr(1, 
RS("Testo"), S)
    End If
    RS.MoveNext
Loop
 
End Sub
 
Bruno

Mostra il codice che utilizzi attualmente per la ricerca.
Ho visto che Bruno Campanini ha postato del codice e vorrei prima provarlo.
In caso non desse il risultato sperato, posterò il codice che utilizzo.
In ogni caso sei stato gentilissimo a rispondere, grazie.
 
 


Oh chi si rivede! Ciao e grazie per la disponibilità. Dopo alcuni anni che hai risolto un altro mio
problema, sono nuovamente nelle tue mani. Grazie, proverò il tuo codice e farò sapere com'è andata.
Ciao

 ha scritto:
 

Allora, ho provato il tuo codice e funziona perché mi da per ogni ricorrenza il NUMERO di Record e
la POSIZIONE all'interno del "campo".
Rimane un problema applicarlo al mio modello che ha una maschera con la lista dei "campi"; quando
cerco una parola che si trovi in uno dei campi (ed in questo caso il "campo" é INGREDIENTI) deve
visualizzare la maschera di QUEL RECORD. A secondo della mia zione successiva (posso scorrere i
records se sono più di uno e contengono IL DATO CERCATO, posso annullare la ricerca cliccando sul
tasto "Ricerca" e cambiare arametri o chiudere la ricerca stessa),
Per fare questo UTILIZZO LA SEGUENTE ROUTINE che parte non appena nella maschera di ricerca clicco
sul tasto "Cerca":
 
Private Sub cmdFind_Click()
    Dim fld As DAO.Field
    Dim ctl As Access.Control
    Dim sSQL As String
    Dim Attr As String
    Dim RicAss As String
    Dim ctlVal  As Variant
 
 
    Attr = " AND "
 
    If Me!boxAttr = 2 Then
        Attr = " OR "
    End If
    RicAss = ""
    If Me.boxRicerca = 1 Then
        RicAss = "*"
    End If
 
    For Each ctl In Me.Controls
        Select Case ctl.ControlType
            Case acTextBox, acComboBox
                If ctl <> "" Then
                   ctlVal = ctl.Value
                   If Me.RecordsetClone.Fields(ctl.Name).Type = dbText Then
                        ctlVal = RicAss & ctlVal & RicAss
                   End If
                   sSQL = sSQL & BuildCriteria(ctl.Name, Me.RecordsetClone.Fields(ctl.Name).Type,
ctlVal) & Attr
                End If
        End Select
    Next
    If Len(sSQL) > 0 Then
        sSQL = Mid$(sSQL, 1, Len(sSQL) - Len(Attr))
        DoCmd.OpenForm "frm_Ricette_Edit", , , sSQL
    End If
    If Len(sSQL) = 0 Then
        DoCmd.Close
        DoCmd.OpenForm "frm_Ricette_Edit"
        Forms![frm_Ricette_Edit].FilterOn = False
    End If
End Sub
 
La routine - come già scritto questa mattina - NON è mia e se non ricordo male la presi sul sito
Comune di Access tanti anni orsono.
Ha sempre funzionato egregiamente fino a quando non ho cercato un dato nel campo "INGREDIENTI" che è
un campo di testo LUNGO. Bene, questa ricerca non parte, scorre tutta la routine, mi trova la
ricorrenza MA NON MOSTRA LA MASCHERA con il record cercato.
 
Spero di essere stato chiaro e soprattutto, spero che tu mi possa risolvere il busillis.
Ciao, Gianni

Mostra il codice che utilizzi attualmente per la ricerca.
 
Qui sotto troverai il codice che utilizzo attualmente e il post di risposta per Bruno Campanini:

Propongo anche a te, Carlo, di provare a dare un'occhiata con la speranza di essere stato chiaro
nell'esposizione.
 
Grazie, Gianni
 
 

 ha scritto:
 




Non è certo questo il modo più consono per effettuare ricerche su dati è preferibile è molto più semplice usare le proprietà Filter e FilterOn della maschera stessa.

 conservare dati di film
 
sto cercando da anni e anni un film :)
 
roba vecchia, anni 50, più probabilmente 60, in bianco e nero (ma forse era 
la televisione), tipo commedia: storia di un furto in banca, passando dalle 
fogne, con i ladri a mollo nel liquame e l'esperto di casseforti, 
anzianotto e pasciuto, trasportato su un barchino gonfiabile
 
nella versione italiana è rimasta impressa la battuta "banchi di cacca a 
prora"
 
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........

Se devi fare una ricerca ai fini di visualizzare il risultato è assurdo usar eun Recordset...
 
sSQL= "SELECT * FROM T1 WHERE INGREDIENTI LIKE '*" & me!textBoxValoreDacercare & "*'"
 
Questo è il predicato SQL da attribuire ad una ListBox o Sottomaschera... che visualizzerà i dati corrispondenti alla ricerca nel campo "INGREDIENTI"
 
Saluti
@Alex

 Questo è il predicato SQL 
 
in MS SQL non uso * bensì %
 
sSQL= "SELECT * FROM T1 WHERE INGREDIENTI LIKE '%" & 
me!textBoxValoreDacercare & "%'"


 /-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\ 
 
A parte che la mia risposta era diretta all'OP non a te, ma mi pare un dettaglio poco rilevante quello che usi tu... nel caso anche Gianni usasse un RDBMS saprà benissimo quali siano i caratteri WILDCARD...!!
 
Il problema non è la WILDCARD ma il metodo da suggerire... ed è questo che rappresenta la cosa utile.
 
P.S. anche se usi JET con ADO la wildCard è %... ad esempio.
 
@Alex

me!textBoxValoreDacercare & "%'"
 
Ringrazio Alex per il suo intervento. Vedrò di provare il suo consiglio.
 


Ho fatto, come sempre un po' di confusione con i post. 
 
Ovviamente il messaggio inviato ad Alex era il seguente:
Ringrazio Alex per il suo intervento. Vedrò di provare il suo consiglio.
 
Gianni

me!textBoxValoreDacercare & "%'"
Ti chiedo scusa, ho fatto confusione tra te ed Alex.
Ringrazio anche te che hai dato il tuo contributo per aiutarmi.
 

 dettaglio poco rilevante quello che usi tu... 
 
ho suggerito la possibilità di un errore di "sintassi"
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\



La premessa che l'OP ha fatto al 1° POST è che usa Access2016, non ha mai espresso di usare un DB_Server... 
Senza andare oltrte io mi fermerei alla sostanza.
 
@Alex


Mi dispiace essere stato la causa di una discussione che, tanto è difficile per quelle che sono le
mie cognizioni, non riesco a seguire.
Alcune cose so per certo, ora ne ho la conferma e vorrei chiarire:
 
- NON sono un esperto; utilizzo da tanti anni in maniera quasi automatica gli strumenti che access
mette a disposizione e, SPECIALMENTE PER LE RICERCHE, uso una vecchia routine più volte riciclata
scovata anni addietro sul "Sito Comune" che poi fu chiuso (ma è ancora visitabile qui:
http://www.accessgroup.it/sitocomune/
)
 
- la routine di cui parlo é nella sezione Forms col numero 3.49 - "Maschera di ricerca records" con
questi "consigli" dell'autore: 
 
3.49 Maschera di ricerca record.
  Norica
Invio (questa è la prima volta...) un file in formato .mdb (A97), secondo me molto utile per
"sedare" alcuni dubbi in merito alla creazione di una maschera con delle caselle utili alla ricerca
di records presenti in una tabella.
I records trovati verranno visualizzati in una ListBox, oggetto molto gestibile via VBA ed elegante
graficamente rispetto alle sottomaschere.
I records trovati e visualizzati potranno anche venir stampati.
 
Download:
 
  Ricerche.zip (27Kb) MSAccess97 database 
 
- La suddetta routine l'ho sempre utilizzata per ricerche in campi "Testo breve" e funziona alla
grande, selezionando solo i records che soddisfano positivamente la ricerca. In pratica nella
maschera originale perla visualizzazione dei records, VEDO SOLO I CAMPI che ha selezionato in cui
appare la parola da me richiesta. Posso scorrere avanti e indietro i records fino a quando esistono
le ricorrenze dopo di che mostra la maschera senza alcun dato e, chiudendo la maschera di ricerca
torno alla situazione d'inizio.
 
- Adesso, per una nuova necessità, ho utilizzato la stessa routine inserendo la ricerca in un campo
"Testo Lungo" e mi sono accorto che, con QUESTO TIPO di campo, NON funziona. Ne ho la certezza
perché se trasformo il campo TESTO LUNGO in TESTO BREVE, i dati vengono mostrati come sempre
(ovviamente devrei però rinunciare al testo lungo privandomi di altri dati che non potrei mai più
conservare). 
 
- Mi ha risposto Bruno ma non sono riuscito a far girare la sua routine (quasi sicuramente per mia
imperizia) all'interno della mia maschera di visualizzazione che è quello che vorrei.
 
Detto ciò chiedo nuovamente se anche a voi risulta che con la routine "mia" sia impossibile cercare
dati in un campo TESTO LUNGO (la routine completa l'ho postata qualche giorno fa) e vi chiedo una
alternativa che funzioni come il sistema di ricerca che utilizzo da sempre.
 
Chiedo scusa per la prolissità, ma ho cercato di essere quanto più chiaro possibile (queste sono le
mie capacità), non voglio mettere in campo attriti fra chi tanto cortesemente espone le proprie
metodologie e considerate che il database di cui parlo ha solo un utilizzo casalingo e consente ad
un anziano signore di passare il tempo con l'illusione di essere in grado di utlizzare la tecnologia
a disposizione.
Ringrazio ognuno di voi per quello che già mi ha offerto, augurandomi di trovare fra voi una persona
più paziente che possa aiutarmi.
Grazie a tutti, Gianni. 
 
 
 
 
 
 

Senza un file di esempio è difficile verificare che cosa accade e quindi poterti aiutare.

Senza un file di esempio è difficile verificare che cosa accade e quindi poterti aiutare.
Ho già postato la routine e la spiegazione sul funzionamento della meschera per la ricerca.
Sicuramente sarò stato infelice nella spiegazione ma, credimi, di meglio non riesco a fare.
Grazie in ogni caso per l'interesse.
Gianni
 

Gianni submitted this idea :

"la maschera di quel record è un non-senso"
Volevi dire mostrare nelle maschera (che brutto mome per Form!)
quell'unico record che contiene il campo che contiene la stringa
trovata, ovvere tutti i record che conrengono nei campi INGREDIENTI
quella stessa stringa.
 
Collega a un Buttom su Form:
====================================
Private Sub Command9_Click()
Dim RS As Recordset, k As Integer, S As String
 
S = "nel mezzo del cammin di nostra vita" ' Testo da ricercare
 
Set RS = CurrentDb.OpenRecordset("Table2", dbOpenDynaset)
 
Do Until RS.EOF
    If InStr(1, RS("Testo"), S) Then
        k = k + 1
        MsgBox "Record " & k & vbCrLf & "Position = " & InStr(1, 
RS("Testo"), S)
    End If
    RS.MoveNext
Loop
 
FilterOn = True
DoCmd.ApplyFilter , "Testo Like '*Nel mezzo del cammin di nostra 
vita*'"
 
End Sub
=========================================
 
 
 
 
Per eliminare il filtro aggiungi su Form altro Button:
======================================================
Private Sub Command17_Click()
FilterOn = False
Requery
End Sub
==============================
 
Bruno
 
PS
Miei personali riferimenti:
BC1.accdb, Table2, Form: Searching_LongText