Newsgroup: it.comp.lang.visual-basic
Titolo: [ADO] Find non funziona sotto win9x....non capisco

ho il seguente codice
' conto il numero di articoli contenuti nel db e popolo la listbox
With RsGiudiziario
If Not DbVuoto Then
    .MoveFirst
    While Not .EOF
        lstRisultati.AddItem .Fields("Titolo").Value
        .MoveNext
    Wend
End If
End With
cosi mi popolo la listbox
RsGiudiziario č questo
Set RsGiudiziario = New ADODB.Recordset
RsGiudiziario.CursorType = adOpenStatic 'adOpenDynamic
RsGiudiziario.LockType = adLockOptimistic
RsGiudiziario.Open "tabella", MyConn, , , adCmdTable
e adesso veniamo al punto che non funziona sotto Win9x ma funziona sotto
kernel NT
Private Sub lstRisultati_Click()
Dim strFind As String
strFind = "Titolo = '" & Virgolette(lstRisultati.Text) & "'"
RsGiudiziario.Find strFind, 0, adSearchForward, adBookmarkFirst
If Not RsGiudiziario.EOF Then
    txtDescrizione.Text = Left$(RsGiudiziario.Fields("Descrizione").Value,
700)
    txtTitolo.Text = RsGiudiziario.Fields("Titolo").Value
End If
End Sub
bene sotto winxp al click sulla listbox corrisponde la visualizzazione del
campo "Descrizione" del recordset nella richtextbox txtDescrizione mentre
sotto win9x niente......
chi mi sa spiegare il perchč??
sotto win9x ho installato Dcom Ie6 e mdac 2.5 poichč uso jet e nel 2.7 non
c'č piů
grazie

 RsGiudiziario.Find strFind, 0, adSearchForward, adBookmarkFirst
Cosa indica adBookmarkFirst? Ho gurdato nell'help, ma non mi pare che sia
una "costante" che indica il BM del primo record...


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adoce31/htm
l/ado30ref_22.asp
inzia la ricerca dal primo record
ho risolto in modo sporco facendo prima dopo la query sql o l'apertura della
tabella con un recordset un bel requery.....non chiedetemi perchè funziona
però perchè non lo sò
ciao

 inzia la ricerca dal primo record
Quel link porta alla Move, mentre la Find si aspetta (almeno così dice la
guida ADO) un Bookmark del record di inizio, potrebbe non equivalere a una
costante
Leggi tutto questo 3d:
http://makeashorterlink.com/?F29542C83


l'avevo già letto prima di postare....comunque bho non so come sia se tolgo
il requery non funziona sotto win9x lasciando adBoomarkFirst mentre non gli
fà differenza sotto win2k/Xp
grazie

Huntercity ha scritto:

Non mi sono spiegato: La Find si aspetta un BookMark, non una costante come
la Move.
Il fatto che la costante possa equivalere a un bookmark, ci può stare, ma mi
lascia molto perplesso.
Comunque, giusto per capire, facciamo una cosa (perchè, per quanto io non
ami ADO, l'anomalia non mi piace affatto, ci dev'essere dell'altro):
Pubblica il codice esatto (e attuale) che prepara ed esegue la Find.
Ti va?


certo ecco il codice che utilizzo
in un modulo bas
Global MyConn As ADODB.Connection
Global RsGiudiziario As ADODB.Recordset
'---------------------------------------------------------------------------
------------
Sub Main()
On Error GoTo PasswordErr
strPassword = ""
strSource = "data\archivio.crl"
' Open the database
Set MyConn = New ADODB.Connection
'open exclusively
MyConn.Mode = adModeShareExclusive
MyConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
strSource & ";Persist Security Info=False"
MyConn.Properties("Jet OLEDB:database Password").Value = strPassword
MyConn.Open
On Error GoTo 0
Set RsGiudiziario = New ADODB.Recordset
RsGiudiziario.CursorType = adOpenStatic 'adOpenDynamic
RsGiudiziario.LockType = adLockOptimistic
RsGiudiziario.Open "tabella", MyConn, , , adCmdTable
frmMain.Show
Exit Sub
PasswordErr:
    If Err.Number = -
2147217843
 Then 'password sbagliata
        strPassword = DialogBox("Inserisci password", "PASSWORD", True)
        If strPassword = "" Then
            Exit Sub
        Else
            MyConn.Properties("Jet OLEDB:database Password").Value =
strPassword
            Resume
        End If
    Else
        MsgBox "Errore sconosciuto" & Error, vbCritical, "ATTENZIONE"
    End If
End Sub
nel FORM PRINCIPALE
'---------------------------------------------------------------------------
------------
Private Sub Form_Load()
' conto il numero di articoli contenuti nel db e popolo la listbox
With RsGiudiziario
If Not DbVuoto Then
    .MoveFirst
    While Not .EOF
        lstRisultati.AddItem .Fields("Titolo").Value
        .MoveNext
    Wend
End If
End With
lbCount.Caption = Format(lstRisultati.ListCount, "###,###,##0")
'leggo il primo record
If DbVuoto Then
    MsgBox "Il database č vuoto", vbInformation, "ATTENZIONE"
Else
    RsGiudiziario.Requery
    lstRisultati.ListIndex = 0
End If
End Sub
'---------------------------------------------------------------------------
------------
Private Function DbVuoto() As Boolean
On Error GoTo gestione_errori
If RsGiudiziario.BOF And RsGiudiziario.EOF Then
    DbVuoto = True
Else
    DbVuoto = False
End If
Exit Function
gestione_errori:
    MsgBox "errore durante dbvuoto " & Err, vbCritical, "!!! E R R O R E
!!!"
    Resume Next
End Function
'---------------------------------------------------------------------------
------------
ECCO LA PARTE INCRIMINATA
'---------------------------------------------------------------------------
------------
Private Sub lstRisultati_Click()
Dim strFind As String
strFind = "Titolo = '" & Virgolette(lstRisultati.Text) & "'"
RsGiudiziario.Find strFind, 0, adSearchForward, adBookmarkFirst
If Not RsGiudiziario.EOF Then
    ReadRecorset
Else
    MsgBox "errore"
End If
End Sub
l'unico modo che ho trovato per far funzionare questa private sub č stato
mettere un requery nella form load altrimenti mi ritorna sempre
RsGiudiziario.EOF=TRUE
cioč facendo la find non trova niente
ciao

 cioè facendo la find non trova niente
Come ti dicevo a me funziona senza problemi (ovviamente con miei dati),
anche togliendo il Requery.
Siamo sicuri che la Funzione Virgolette lavori bene?
Ovvero, prova a mettere un Debug.Print strFind immediatamente prima della
Find, giusto per vedere se la sintassi è corretta
Nota anche che l'evento Click di lstRisultati viene scatenato anche quando
carichi il Listbox.
Io, sinceramente, metterei un test per eseguire le varie istruzioni solo
dopo il caricamento, magari testando una variabile assegnata a False prima
del caricamento e a True dopo il suo termine

 carichi il Listbox.
su questo punto ho qualcosa da ridire ho appena fatto l'esecuzione passo
passo
e mentre faccio l'additem non si scatena l'evento click comunque grazie del
consiglio

 anche a me ma solo sotto win2k o winxp non sotto win9x
Io ho provato sotto XP... (senza SP1)


se faccio come dici tu con il bookmark se cancello il primo record mi dà
errore
ti ringrazio del tempo che hai perso, ma purtroppo non se ne viene a capo se
non mettendo senza nessuna logica un requery e per adesso mi basta
ciao

 non mettendo senza nessuna logica un requery e per adesso mi basta
Come vuoi, ma finchè non si capisce dove sta il problema (che io non ho, col
tuo codice) si rischia di "fidarsi", poi il bubbone scoppia quando meno te
l'aspetti, fidati. Con il codice che hai pubblicato, _esattamente quello_ e
senza requery davvero non ti funziona? Se va, allora il problema sta da
qualche altra parte, nel resto del codice...
Che versione di ADO usi? E di Jet?


allora forse non mi sono spiegato bene, la versione senza requery e con il
bookmark come lo avevo messo io funziona senza problemi ma solo
su sistemi win2k e winXp, lo stesso eseguibile provato su win98SE full
patched e su Win95 Osr2.5 con ie4+ie5 +dcom +mdac 2.5 +mdac 2.7 quando
arriva
alla parte del codice dove facci la find mi restituisce sempre il recordset
vuoto
sulla macchina su cui sviluppo WinXp Pro Corporate Sp1 + ultime patch uso
VB6 SP5 e uso ado 2.7 e jet4, se per te non ci sono problemi ti posso anche
spedire
via mail un file zippato con dentro i sorgenti non ho problemi
ciao

 via mail un file zippato con dentro i sorgenti non ho problemi
Non mi hai risposto: Anche quel codice che hai pubblicato NON va su Win98SE?
Ripeto: Se invece va, il problema sta da un'altra parte del codice. Se non
va, dovrei avere gli stessi risultati anch'io su Win98.
La Virgolette funziona bene? Il Dubug.Print della stringa per la Find l'hai
verificato sintatticamente?


la funzione Virgolette non l'ho controllata con Debug adesso provo ma, e
questa è una mia opinione, è strano che dia risultati diversi una funzione
in semplice
vb tra due sistemi operativi diversi

 vb tra due sistemi operativi diversi
Vero. Hai avuto modo di provare su due macchine diverse con Win98?
Voglio dire, lo fa su _ogni_ Win98 o _solo_ su quella macchina?
Non sarà un Jet (o un ADO) mal installato?
Comunque, ripeto, domani provo quel codice (senza Requery) su Win98SE,
ovviamente con un mio db...


grazie
per il db penso che non dipenda da quello....anche perchè il campo del db su
cui uso la find è un campo di testo di 50 caratteri


ma porca.....ho reinstallato l'mdac 2.7 e adesso funziona senza il requery
ma va a capire che in tutte e due le macchine erano installati male
scusa ti ho fatto perdere un sacco di tempo
ciao

 ma va a capire che in tutte e due le macchine erano installati male
Meglio così.
Io, intando, ho provato su Win98. Tutto ok, senza requery