Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora errore sul rs.field(i)

Ragazzi non pmi prendete per stupido, non voglio assillarvi ma non riesco a 
capire il perchè di questo errore.
Tralasciate per un momento il perchè di questo ciclo o sul fatto di poter 
usare altri modi  per comparare 2 field di 2 recordset completamente uguali 
nella struttura.
Perchè quando il ciclo arriva sull'ultimo campo VB mi da errore  3265 
dicendomi  "Impossibile trovare l'oggetto"?
      While Not rsOld.EOF
        If rsOld.Fields(i).Value <> rsNew.Fields(i).Value Then  <-----
          Flag = True
        End If
        i = i + 1
      Wend
Io nella finestra delle variabili locali sono andato a vedere i 2 recordset 
ma questi sono perfetti e l'ultimo campo esiste... la proprietà Value c'è ed 
ha un valore..
Mi sono detto.. forse rsOLD ha piu record e rsNew ne ha solo uno.
Nooooo entrambi i recordset hanno lo stesso numero di record ( ossia 1 ) e 
la struttura è identica ( ossia 10 campi)
Ma allora perchè dal primo al nono campo il ciclo funziona e quando arrivo 
sull'ultimo campo mi va in errore?
Vi prego mi aiutate a capire?
Stefano 

NoFLyZone ha usato la sua tastiera per scrivere :

Scusa, ma tu con quella roba lì fai un loop infinito.
E non ha neppure senso da un punto di vista logico.
Cioè, incrementi un indice basandoti sul fatto di non essere andato 
oltre l'ultimo record (che non ci vai mai perchè non fai mai un 
MoveNext), però usi l'indice per spostarti fra i campi.
Deciditi: in che direzione vuoi vare la scansione?
Prima in orizzontale e poi in verticale?
Se sì:
Rsold.MoveFirst
Rsnew.MoveFirst
Flag = False
if Rsold.fields.count<>rsnew.fields.count then
msgbox "diversi!"
exit sub
End If
Do While not (RSOld.EOF OR RSNew.EOF OR Flag)
For i = 0 to RSOld.Fields.Count
      Select Case True
        Case 
rsold.Fields.Item(i).Fieldtype<>rsnew.Fields.Item(i).Fieldtype
               Flag=True
         Case rsOld.Fields(i).Value <> rsNew.Fields(i).Value
           Flag = True
         End Select
If Flag then exit for
Next i
RsOld.MoveNext
RsNew.MoveNext
Loop
If Flag OR (rsOld.EOF <> RsNew.EOF) Then
   msgbox "Diversi!"
Endif
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

Albè avevo scritto appunto di tralasciare un attimo il fattore logico.
Io con questo ciclo mi voglio muovere per campi visto che in questo caso
io avrò solo e unicamente un record.
In seguito ( ma in un'altra parte del codice) dovrò fare una cosa simile 
perchè sarò
in presenza di piu record ma ora non ci voglio pensare. Mi sono bloccato su 
questo ciclo con un solo record
figuriamoci quando ne avrò di più.
Quello che voglio capire è perchè mi da errore quando arrivo all'ultimo 
campo. Ho detto anche che andando a
controllare le prorpietà dei 2 recordset con la finestra "variabili locali" 
ho visto che entrambe le proprietà .value
sono piene e non vuoto.
Per rispondere alla tua domanda in che modo mi voglio muovere ( se in 
verticale prima e in orizzontale poi) in questo
caso io mi voglio muovere in senso orizzontale avendo due recordset da 
confrontare entrambi con un record ciascuno.
Ripeto entrambi i recordset sono identici nella struttura.
Nel tuo esempio:   [ if Rsold.fields.count<>rsnew.fields.count then ]
usi la proprietà count che a me non serve perchè già so che saranno uguali
poi sotto nella select case usi prima la proprietà Fieldtype che anche 
questa non mi serve ed infine
la proprietà .Value che è quella che serve a me.
Tornando alla mia domanda. Perchè riesco a girare e comparare l'uguaglianza 
della proprietà value fino al penultimo campo e poi
mi va in errore sull'ultimo?

 io avrò solo e unicamente un record.
allora a cosa serve while not eof ?
i a cosa e' legata?
se sei sicuro che i due record hanno la stessa struttura, afaik un ciclo di
questo tipo deve funzionare
For j = 0 To rsIn.Fields.Count - 1 '<--- NB .count - 1
    rsOut.Fields(j) = rsIn.Fields(j)
Next
ciao, a.

Andrew la i è legata a nulla, nel senso che la dimensiono uguale a 1 prima 
di entrare
nel ciclo
While Not rsOld.EOF mi serve ( almeno penso di usarlo bene) per dire a VB 
che quando arrivo
alla fine del recordset ( che in questo caso ha un solo record con 10 campi) 
di uscire dal ciclo
Ad ogni passaggio incremento i di una unità in modo da cambiare la proprietà 
value passando dal campo 1 al campo 2
e cosi via.!
Questo funziona bene fino al campo 9 ( ossia il penultimo). QUando arrivo al 
10 ( ultimo campo ) mi da l'errore
che ho elencato nella mia prima mail.
Ora tralaciando il fattore logico della correttezza del cilco io mi chiedo 
per quale motivo sull'ultimo campo mi da errore?
C'entra qualcosa il tipo di cursore o aòtre proprietà che uso per la 
connessione al database visto che rsOLD lo prendo dal
databse e che la connessione rimane aperta?
Scusate queste due domande che magari sono fuori luogo e senza logica ma non 
so piu a cosa pensare. Io devo semplicemente
verificare l'uguaglianza delle proprietà del recordset nuovo con quello 
presente nel database e se il Flag mi diventa vero, devo cancellare
il recordset presente nel database per inserirci quello nuovo ( ossia quello 
modificato) nel database.
Semplici a dirsi difficile a farsi..
Stefano 

 Ora tralaciando il fattore logico della correttezza del cilco
dici niente...
ciao, a.

Nulla ho provato anche a scrivere cosi ma mi da errore sull'ultimo campo. Mi 
dice che è impossibile trovare l'oggetto
      rsOldGiornata.MoveFirst
      rsGiornata.MoveFirst
      While Not rsOld.EOF
        For i = 0 To rsOld.Fields.Count
          If rsOld.Fields(i).Value <> rsNew.Fields(i).Value Then
            Flag = True
          End If
        Next
      Wend
rsOld.Count è = a 10
e quando la i è = a 10 mi arriva l'errore.
Non so piu dove mettere le mani perchè nella finestre della variabili locali 
il rsOld.Fields(10) lo vedo ed è uguale a "False" ( visto che è un campo 
boleano) e la stessa cosa faccio per rsNew.Fields(10) anch'esso = a "False"
Misterie di VB o cazzate mie?
La connessione al DB la faccio in questo modo ( mi sorge il dubbio di aver 
sbagliato qualcosa qui) chiamando una SubRoutine nominata ConnDB
Public Sub ConnDB(NomeDB As String)  '(nomeDB As String)
  '--------------------------------------------------------------------
  'Connette al database dove sono tutte le aliquote e apre la connessione al 
recordset
  '--------------------------------------------------------------------
  Set cn = New ADODB.Connection
  Set rs = New ADODB.Recordset
  rs.CursorType = adOpenDynamic
  rs.LockType = adLockOptimistic
  rs.CursorLocation = adUseClient
  '--------------------------------------------------------------------
  'Si assicura che la connessione non sia gia aperta
  '--------------------------------------------------------------------
  If cn.State <> 0 Then cn.Close
  Dim DBPath As String
  '--------------------------------------------------------------------
  'Il database è nella stessa directory del programma
  '--------------------------------------------------------------------
  If Right(App.Path, 1) <> "\" Then
    DBPath = App.Path & "\"
  Else
    DBPath = App.Path
  End If
  DBPath = DBPath & NomeDB
    Debug.Print DBPath
  'strCnn è la stringa di connessione al database
  strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath & ";"
  Debug.Print strCnn
  cn.Open strCnn
 End Sub

 rsOld.Count è = a 10
quindi 11 (0-10) ...

 ha scritto nel messaggio
news:drj1pi$u47$1...@newsreader.mailgate.org...

A Ste'... in che lingua te lo si deve dire? ;-)
EOF = End Of File = "Ho oltrepassato l'ultimo record".
Tu non cicli sui record (=righe) del recordset, usando MoveNext, ma sui
campi (=colonne), incrementando l'indice i.
Ora capisci perché testare EOF non serve a nulla in questo caso?!
Detto questo, la banale causa del runtime error è che la collection Fields è
0-based, ossia parte da 0 e arriva fino a .Count - 1.
Quindi nel ciclo, i deve partire da 0 e non superare Fields.Count - 1.
A te la scelta se farlo con un ciclo For, un Do While (i<rs.Fields.Count),
oppure un For Each... tanto il risultato è lo stesso!
Chiaro?
Bye
Raf

 A Ste'... in che lingua te lo si deve dire? ;-)
Ah beh, vedo ora che "Andrew" ti aveva già risposto... eheheh!
Raf

 Misterie di VB o cazzate mie?
Oh mamma mia...
Ti avevo scritto il codice a mano in un post, e avevo dimenticato il 
'-1' dopo il .Count
Ma con un breakpoint, vedendo che count=10, e vedendo che 
Fields.Item(0) esiste, non è complesso capire che la collection Fields 
è a base 0 anzichè 1...
Purtroppo hai avuto una reazione particolarmente sfigata al mio post.
Nel senso che pur di contestare ciò che ho scritto, hai completamente 
perso di vista l'errore in cui cadevi, e che ti facevo notare, ossia 
quello di ciclare basandoti su Eof, ma senza fare Movenext.
Per la cronaca, il fatto che i due recordset abbiano un solo record 
ciascuno, non inficiava che il mio codice funzionasse (a parte quel -1 
dimenticato), per cui proprio non capisco il tuo rifiuto a leggerlo.


        For i = 0 To rsOld.Fields.Count
Stupido e' chi lo stupido fa. (cit.)
Lokar 

Raf, Albe,Lokar e in ultimo Andrea.
Scusatemi non sapevo ( e su quel cavolo di libro non c'è scritto) che gli 
indici dei field partono
da 0 ecco il perchè del mio problema. Infatti mi andava in errore perchè gli 
andavo a chiedere un campo che non esisteva
Ora ho capito come spostarmi nel modo giusto tra i campi e tra i records.
Grazie per la vostra comprensione e di nuovo scusatemi :(
PS
E' sorto un altro problema ma aprirò un altro 3d.
Stefano 

 andavo a chiedere un campo che non esisteva
Altro problema, è stato il metodo, l'approccio.
Se un loop ha un problema, si mette un breakpoint.
Al che iniziavi a premere F8, ad ogni giro guardavi il contenuto, e ti 
accorgevi in 3 minuti del problema.
Invece prosegui forsennatamente a postare, replicando a dei post che ti 
avrebbero aiutato, ma che avevi letto molto superficialmente.


 accorgevi in 3 minuti del problema.
ALbe il Breakpoint lo avevo messo e troppe volte ho premuto F8 ( che ormai è 
tatuato sul mio dito)
Il fatto è che non ciclando con For Next e indicizzando la "i" con metodi 
poco ortodossi non vedevo
l'errore perchè contavo ( e vedevo il valore di i nella finestra delle 
variabili locali) la i  fino a 10 ma
in verità arrivavo all'undicesima riga.
Ma ti ripeto non lo riuscivo a vedere.. mi sfuggiva anche per il fatto che 
non sapevo che il primo field è
uguale a zero
Inoltre non leggo mai i post a me rivolti in maniera superficiale, magari 
non essendo un mago non li capisco
e cose per voi palesi per me risultano misteri della vita.
Grazie ancora

 in verità arrivavo all'undicesima riga.
effetti collaterali.
prova a incollare e lanciare, e confronta msgbox (fuori ciclo) e caption
(dentro ciclo).
ciao, a.
Private Sub Form_Load()
    Dim j As Long
    For j = 0 To 10
        Caption = j
    Next
    MsgBox j
End Sub


 e cose per voi palesi per me risultano misteri della vita.
Ripeto: non è un discorso di competenze.
Hai affrontato un problema con un metodo sbagliato.
Sei partito convinto che il loop andasse bene, e non ti sei mai messo 
in discussione. Perfino Andrea ti aveva evidenziato con un commento il 
-1 del Count. Se tu avessi copiaincollato il codice, avresti visto quel 
commento in verde, e avresti capito.
Invece hai risposto ad Andrea con un post chilometrico, convinto che 
anche lui stesse sbagliando bersaglio.
Credimi, è l'umiltà la miglior virtù dello sviluppatore.


 -1 del Count.
grazie del "perfino" :))

 lui stesse sbagliando bersaglio.
Albe sull'umiltà hai perfettamente ragione anche se proprio ieri ci sono 
rimasto male ( ma è una cosa mia personale non condivisibile)
su un messaggio a me rivolto.
Il fatto di incollare e copiare SICURAMENTE mi avrebbe aiutato ma come 
Andrea ( forse) potrà, per lo meno qui darmi ragione, io sono
un tipo che vuole prima capire i concetti.
Raf si fece in 4 per farmi capire alcune cose sugli oggetti e ancora oggi 
quando scrivo alcune tracce di codice mi viene in mente lui e non finirò
mai di ringraziarlo.
Insomma dicevo che il copiare e incollare sicuramente mi avrebbe risolto il 
problema ma non avrei capito il concetto.
Tu giustamente mi hai detto ma dopo che l'F8 si è impiantato sulla tua pelle 
non ti è venuto in mente di controllare i valore di .Value
L'ho fatto ma la svista era sul fatto che gli ultimi 3 campi erano su False 
( proprietà booleana) e quindi essendo gli ultimi valori tutti
uguali mi è passato l'errore sotto il naso.
Comunque ora il punto che mi crocifiggeva è stato risolto e come al solito 
prendendo una strada nuova ( quella dei DataBase) altri problemi
vengono a galla ( come nell'altro post) ma piano piano se non mi demoralizzo 
prima, arriverò al traguardo.
Grazie de core a tutti :)