Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora errori nella ricerca

Salve a tutti, scusate se vi rompo... ma volevo sapere come fare una 
ricerca di questo tipo:
ho un archivio in cui alcuni campo contengono degli apostrofi, tipo SAN 
NICOLO' D'ARCIDANO
Per fare la ricerca ho scritto
	MioRecordset.Find "Comune='" & Replace$(ComuneDaCercare, "'", "''") & "'"
ma la ricerca si pianta dandomi un errore.
Allora ho aperto un nuovo progetto e collegandomi direttamente al DB ho 
scritto
	MioRecordset.Find "Comune='SAN NICOLO'' D''ARCIDANO'"
ma continua a darmi errore.
Dove sbaglio?
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque. (Micheal Corleone)
Posted from X-Privat Free NNTP server - 
www.x-privat.org

 Dove sbaglio?
Sbagli a non citare il codice dell'errore e la sua descrizione, il tipo di
database e il metodo (DAO/ADO) di accesso.

 database e il metodo (DAO/ADO) di accesso.
Errore di run-time '3001'
Gli argomenti non sono di tipo valido, non sono compresi nell'intervallo 
consentito o sono in conflitto
--------------
Il database è Access 2000 e il metodo è ADO
So che c'è il problema degli apici nelle stringhe e che questi vanno 
sostituiti con la Replace$, ma funziona finchè il dato da cercare 
contiene un solo apostrofo (Forli'), ma se becco un campo con più 
apostrofi sparsi (SAN NICOLO' D'ARCIDANO) la replace me li sostituisce 
tutti per bene ma mi viene generato un errore.


Risoooooooooltoooooo!!!!
Era circa un'ora che cercavo di risolvere!!!
Allora... notizia per tutti!
Se c'è una stringa da cercare in un DB Access con ADO, e la Stringa S 
contiene più di un apostrofo a zonzo (tipo D'ALO' MARIO), la procedura 
da seguire sarebbe:
S=Replace$(s,"'","''")
MioRecordset.Find "CampoDaCercare = '" & S & "'"
Ma se ci provate vi dà errore.
Allora si aggiusta tutto così:
La stringa S "NON VA AGGIUSTATA CON REPLACE" ma passata così com'è alla 
Find, facendo però attenzione:
MioRecordset.Find "CampoDaCercare = #" & S & "#"
Cioè gli apostrofi della stringa di Find vanno sostituiti con i # 
sperando di non avere campi che contengono i #.
Good Coding!!!!!!!!!!!


 Good Coding!!!!!!!!!!!
cmq, il good coding lo posso usare soltanto io, l'ho registrato alla SIAE
come brevetto internazionale......
good coding (originale)!!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!

 Good Coding!!!!!!!!!!!
ciaociao

 Risoooooooooltoooooo!!!!
...
Dubito fortemente.
Ho provato il tuo codice (la normale Replace) e a me funziona
regolarmente...
Non so che dire.

 good coding (originale)!!!
Che te lo dico a fare!!!! (Donnie Brasco)


Ragazzi a scanso di equivoci ho c reato un nuovo DB con uan sola tabella 
con un solo campo di tipo testo.
Nella tabella ci ho messo 5-6 record, di cui uno dal testo:
D'ALO' ALFIERI
Da VB ho fatto questo codice:
Dim Conn As ADODB.Connection
Dim RS As ADODB.Recordset
Private Sub Form_Load()
Dim S As String
     Set Conn = New ADODB.Connection
     Set RS = New ADODB.Recordset
     With Conn
         .CursorLocation = adUseClient
         .Mode = adModeShareDenyNone
         .Open "provider=microsoft.jet.oledb.4.0; data 
source=c:\prova.mdb; persist security info=false"
     End With
     S = "D'ALO' ALFIERI"
     S = Replace$(S, "'", "''")
     RS.Open "Select * from tabella", Conn, adOpenDynamic, adLockOptimistic
     RS.Find "Campo='" & S & "'"
     If Not RS.EOF Then Caption = RS!campo
     RS.Close
     Conn.Close
End Sub
e mi dà l'errore 3001.
Allora ho tolto la riga in cui faccio la replace su S e modoficato la 
find così:
     RS.Find "Campo=#" & S & "#"
e l'errore non mi viene dato più.
Ora.. uso Win2k, Office 2k e VB6 con riferimento Microsoft ActiveX Data 
Object 2.5
Testato mi funziona... testata la  replace si blocca.


 l'errore 3001.
NON E' VERO! insisto, stai sbagliando qualcos'altro!
Form con un pulsante. Nella click questo codice:
Private Sub Command1_Click()
Dim xc As New ADODB.connection
Dim MioRecordset As New ADODB.Recordset
Dim ComuneDaCercare As String
xc.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\prova.mdb"
ComuneDaCercare = "SAN NICOLO' D'ARCIDANO"
MioRecordset.Open "SELECT * FROM prova", xc, adOpenStatic, adLockReadOnly
MioRecordset.Find "Comune='" & Replace$(ComuneDaCercare, "'", "''") & "'"
If MioRecordset.EOF Then
   MsgBox "non trovato"
Else
   MsgBox "TROVATO!"
End If
End Sub
Esce un messaggio con scritto "TROVATO!"
Ripeto, sbagli qualcos'altro
ciaociao


Allora prova ad aggiornare l'MDAC, perchè con il codice che hai postato qui
sopra a me funziona!
(ho sia con i riferimenti a MDAC 2.5,  che 2.6, che 2.7 e va con tutti)
ciaociao

 tutti)
mi è sfuggito un 'ho provato' :)

 mi è sfuggito un 'ho provato' :)
Confermo, ma c'è comunque qualcosa di strano:
La sintassi con # prima e dopo funziona (trova), senza rimpiazzare la
stringa con gli apicini.
La sintassi (tanto per provare) '#...#' genera errore, indovinate..., 3001.
Io credo che ADO voglia dire AlcoolDovunqueOvunque.

 Io credo che ADO voglia dire AlcoolDovunqueOvunque.
quindi DAO= DovunqueAlcoolOvunque ? ;-)
ciaociao

 quindi DAO= DovunqueAlcoolOvunque ? ;-)
No, per ADO avevo sbagliato (c'era una ripetizione):
AlcoolDammiOra

 AlcoolDammiOra
E' lo stesso: DAO=DammiAlcoolOra
(che sitatticamente č anche piů corretto!) ;-)
ciaociao

 rispettare il raddoppio degli apici come è giusto che sia
Ho un attimo di scompenso...
Raddoppiare i delimitatori (che non sono in questo caso i #)?


esatto

 esatto
No, scusa! volevo dire raddoppiare gli apici che stanno nella stringa, non i
delimitatori!

[*Marg* = 
ke...@inwind.it
 in
news:bpihdi$1otred$
1...@ID-193795.news.uni-berlin.de
] ha scritto:

Ahhh, ecco! MePareva...
Ovviamente (lo sai vero?) non trova un tubo... Com'č giusto che sia perchč
vengono cercati anche i #
Approfitto per riportare quel che dice la guida di ADO 260, si capiscono
alcune cose...
Remarks
Only a single-column name may be specified in criteria. This method does not
support multi-column searches.
The comparison operator in Criteria may be ">" (greater than), "<" (less
than), "=" (equal), ">=" (greater than or equal), "<=" (less than or equal),
"<>" (not equal), or "like" (pattern matching).
The value in Criteria may be a string, floating-point number, or date.
String values are delimited with single quotes or "#" (number sign) marks
(for example, "state = 'WA'" or "state = #WA#"). Date values are delimited
with "#" (number sign) marks (for example, "start_date > #7/22/97#").
If the comparison operator is "like", the string value may contain an
asterisk (*) to find one or more occurrences of any character or substring.
For example, "state like 'M*'" matches Maine and Massachusetts. You can also
use leading and trailing asterisks to find a substring contained within the
values. For example, "state like '*as*'" matches Alaska, Arkansas, and
Massachusetts.
Asterisks can be used only at the end of a criteria string, or together at
both the beginning and end of a criteria string, as shown above. You cannot
use the asterisk as a leading wildcard ('*str'), or embedded wildcard
('s*r'). This will cause an error.
Note   An error will occur if a current row position is not set before
calling Find. Any method that sets row position, such as MoveFirst, should
be called before calling Find.


[...]
...tranne il perchè a DarkByte non funge se usa gli apici....
:-?

 :-?
Che non sia per l'ultima (ma proprio l'ultima) nota?

 Che non sia per l'ultima (ma proprio l'ultima) nota?
tutto è possibile, ma visto che si tratta sempre e comunque di un find,
dubito che sia quella la risposta.
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 Che non sia per l'ultima (ma proprio l'ultima) nota?
non credo, a me funziona senza toccare il cursore prima, anzi aspetta un
secondo......
.....ok, va anche se metto un movelast prima della find (non trova nulla ma
non da nessun errore).
adesso provo con una select che ritorna un recordset vuoto....
.....nessun errore.
deve avere per forza un problema di MDAC

 vengono cercati anche i #
lo stavo giusto postando io. Secondo me il fatto di mettere # come
delimitatori provoca una qualche sorta di schifosa conversione della
stringa, che fa saltare del tutto la gestione degli apici. Notare, come ha
postato Lupo citando, credo da MSDN, che # viene usato per indicare le
date........
per cui secondo me, ripeto, non vorrei che mettere # provochi la conversione
da String a Date (!!)
boh, chenesoio?
good coding!!!


 indicare le date........
no:


[*Marg* = 
ke...@inwind.it
 in
news:bpilnb$1n991r$
1...@ID-193795.news.uni-berlin.de
] ha scritto:

Infatti. Mi riferivo a questo quando dicevo "... si capiscono alcune
cose..."

 cose..."
sarà, ma allora non capisco una cosa. Da quel che dici, sembra usare l'apice
o il # è identico, o sbaglio? :
String values are delimited with single quotes or "#"
quindi, perchè Lupo non trovo nulla se usa il # invece dell'apice? lo dice
qua:
<post_di_lupo>
Ovviamente (lo sai vero?) non trova un tubo... Com'è giusto che sia perchè
vengono cercati anche i #
</post_di_lupo>
se la stringa fosse veramente delimitata da #, non dovrebbe esser cercata
con # incluso, o sbaglio?


 good coding!!!

Risolto tutto: aggiornato MDAC e ora uso Microsoft ActiveX Data Object 2.8
Ora quell'errore non si presenta più quando uso Replace$(...)
Però resta il fatto che sia con ADO 2.8 che con ADO 2.5, posso 
tranquillamente fare:
	S="D'ALO' ALFIERI"
	RS.Find "Campo=#" & S & "#"
invece di
	RS.Find "Campo='" & S & "'"
o invece di
	RS.Find "Campo='" & Replace$(S, "'", "''") & "'"
In ogni caso la prima (quella dei #) funziona benissimo.
Grazie a tutti!!!!
-- 
Nella vita una sola cosa è certa: se la storia ci ha insegnato qualcosa, 
è che si può uccidere chiunque.
(Michael Corleone)


 In ogni caso la prima (quella dei #) funziona benissimo.
Sě, se leggi meglio il resto dei post, questo č stato chiarito. E' previsto
dalla sintassi del Find ed č documentato sulla guida (ADO260.CHM).
Quanto non era (e, IMHO, ancora non č) chiaro č perchč mai quanto a te non
funzionava (la Replace, senza #), a tutti noi funzionava. Non č escluso che
l'aggiornamento a 2.8 abbia rimesso a posto la tua macchina, quasi a
dimostrare che prima c'era qualche anomalia, come Marg aveva lecitamente
ipotizzato.

 ipotizzato.
Non sarà stato per caso solo l'aggiornamento a migliorare la situazione?
Infatti alle 13 ho staccato da lavoro e alle 16 appena tornato la prima 
cosa che ho fatto è stata aggiornare l'MDAC. Dopodichè tutto ok.
Non sarà stato per caso un bug di ADO 2.5?


 Non sarà stato per caso un bug di ADO 2.5?
No, io ho provato con 2.5 (oltre che con 2.7)

 Non sarà stato per caso un bug di ADO 2.5?
no, ho provato con 2.5, 2.6 e 2.7 (come avevo già detto prima)
ciaociao

 ciaociao
Goodbye


 problema.
Infatti: ho appena aperto vb6, creato un nuovo progeto con riferimento a 
2.5 e fatto quel programmino di prova in cui ricerco D'ALO' ALFIERI con 
la replace.
Niente.
Il progetto l'ho salvato e chiuso vb, dopodichè ho installato 
l'aggiornamento MDAC. Poi ho riaperto il progetto e ho lasciato sempre 
il riferimento a 2.5.
L'errore ora non c'è più.
Quindi vuol dire che con l'aggiornamento non solo vengono installati i 
nuovi riferimenti ma vengono sovrascritti e corretti quelli vecchi.
Un saluto a tutto il newsgroup!!!!!!
P.S.: Ma si dice GLI mdac, LE mdac o i MDAC?


 P.S.: Ma si dice GLI mdac, LE mdac o i MDAC?
Beh, teoricamente dovrebbe essere i MDAC (Microsoft Data Access ComponentS,
quindi plurale), ma io dico sempre l'MDAC inteso come nome colletivo.
ciaociao

 no, ho provato con 2.5, 2.6 e 2.7 (come avevo già detto prima)
Non con un unico sistema operativo, spero.
Altrimenti, ho la sensazione che le prove con 2.5 e 2.6 siano passate
attraverso qualche tlb...
Ciao
Alberto

 Alberto
ciaociao