Newsgroup: it.comp.lang.visual-basic
Titolo: Ciclo su Recordset

Ho  capito perchč mi da errore questo codice, ma non so risolvere il 
problema.
Io devo verificare se i record di rsOld siano uguale a quelli di rsNew ( 
calcolando che
sono dei  gruppi di record  - nel senso piů righe)
Scrivendo cosi mi funziona fino alla fine della prima riga poi mi dice che 
non trova l'oggetto.
Calcolando che i campi sono 4 ( colonne) il valore di "i" deve arrivare 
massimo a 4 poi
quando passa al record della riga sotto dovrebbe ricominciare da 0
In poche parole come faccio a girarmi tutto il recordset oppure c'č un'altra 
strada?
Se io faccio if rsOld <> rsNew then mi da errore quindi avevo pensato a 
questa soluzione
rsOld.MoveFirst
rsNew.MoveFirst
i = -1
While Not rsOld.EOF
  i = i + 1
  If rsOld.Fields(i) <> rsTratta.Fields(i) Then
     flag = True
  End If
Wend
Stefano

 Wend
Da dove salta fuori rsTratta?
Nella condizione (While) dovrebbe esserci anche " OR rsNew.EOF".
Manca il MoveNext di entrambi i recordset.
L'uso di While Wend e' deprecato.
Se i=i+1 lo sposti alla fine, non hai bisogno dell'inizializzazione i=-1.
Mi pare che ci sia un metodo GetString() che ti restituisce tutto il 
recordset in formato
stringa, con i separatori che scegli tu.
Se il recordset non e' troppo grande, potresti fare la comparazione in 
questo modo:
If rsOld.GetString(...) <> rsNew.GetString() Then
    '...
End If
A quest'ora o si dorme, o si piglia un caffe'. Postare selvaggiamente sul 
newsgroup non aiutera' a risolvere in tempi brevi il problema =)
hth,
Lokar

Aggiungo altre tre cose.
1.
Usa Option Explicit. Ti bastera' compilare per scoprire errori di scrittura 
o variabili non dichiarate.
2.
Se vuoi confrontare due campi, devi usare la loro proprieta' Value
If rsOld.Fields(i).Value <> rsNew.Fields(i).Value Then
   '...
End If
3.
La guida in linea di VB e' abbastanza completa (anche di esempi) relativi ad 
ADO.
Se hai dubbi, e' la tua migliore amica... soprattutto a quest'ora!
Buona notte!
Lokar 

 Se io faccio if rsOld <> rsNew then mi da errore
c'č un'altra strada: dichiari due variabili variant, le riempi con i
recordset utilizzando il metodo GetRows, e poi le confronti.
    Dim arrNew() As Variant, arrOld() As Variant, diversi As Boolean
    arrNew = rsNew.GetRows
    arrOld = rsOld.GetRows
    diversi = Not (rsNew = rsOld)
Spero ti sia utile. Ciao
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Molto bella questa scorciatoia, se l'unico scopo è
ottenere il FLAG(True/False) è l'ottimo.
In ogni caso se serve tenerne traccia per effettuare correzioni io
farei così:
Dim rsOld as DAO.Recordet
Dim rsNew as DAO.Recordset
Dim fld  as DAO.Fielf
 ' Apri i 2 RS, non serve usare MoveFirst, OpenRecordset implementa
questa
 ' funzione all'apertura, solo io verificherei
 'all'inizio EOF per evitare errori se sono vuoti
Do Until rsOld.EOF
    For each fld in rsOld
         If fld<>rsNew.Fileds(fls.Name) then
            ' Memorizza il Field diverso come credi
            ' oppure agisci
         End if
    next
    rsOld.Movenext
Loop
@Alex


Ciao, supposto che il numero di colonne sia conosciuto a priori e sia 
invariante, la si potrebbe riscrivere così:
rsOld.MoveFirst
rsNew.MoveFirst
do While Not (rsOld.EOF or rsnew.eof)
    for i = 0 to 3
      If rsOld.Fields(i) <> rsTratta.Fields(i) Then
         flag = True
      End If
   next i
loop
così però ci sono alcuni errori logici:
quando testi flag?
appena flag diventa true devi uscire o devi continuare?
versione rivista:
rsOld.MoveFirst
rsNew.MoveFirst
'''in questo caso esce quando flag diventa vero oppure uno dei due recordset 
arriva alla fine
do While (Not  (rsOld.EOF or rsnew.eof) ) or flag
    for i = 0 to 3
            flag = flag or (rsOld.Fields(i) <> rsTratta.Fields(i))
   next i
    rsOld.movenext
    rsnew.movenext
loop
ps: non l'ho provato quindi non garantisco.
ciao
Stefano 

     diversi = Not (rsNew = rsOld)
A parte che avrebbe dovuto essere
    diversi = Not (arrNew = arrOld)
quel codice non può comunque funzionare.
L'operatore "=" non può essere usato per confrontare matrici, nemmeno se sono in
variabili Variant: se provi dà un run-time error "Type mismatch".
Per stabilire la loro uguaglianza occorre fare il confronto elemento per
elemento.
Il metodo più furbo è quello di Lokar (GetString), previo controllo della
corrispondenza del RecordCount di entrambi i recordset: se contengono un numero
diverso di record, potrebbero già essere considerati diversi.
Se il numero di record è elevato è comunque possibile "spezzare" il confronto
leggendo ad es. 1000 righe alla volta con GetString(,1000)...
Bye
Raf

 diverso di record, potrebbero già essere considerati diversi.
Allora il secondo metodo più furbo (e stavolta funziona, perché qui ho VB e
l'ho provato!) è come segue:
    Dim arrOld() As Variant, arrNew() As Variant, diversi As Boolean
    Dim i As Long
    arrOld = rsOld.GetRows
    arrNew = rsNew.GetRows
    ' per il test ho caricato la stessa tabella nei due recordset, quindi
diversi = False
    ' se decommento la prossima riga, diversi = True
    ' arrNew(0, UBound(arrNew, 2)) = arrNew(0, UBound(arrNew, 2)) + 5
    For i = 0 To UBound(arrOld, 2)
        diversi = Not (arrOld(0, i) = arrNew(0, i))
        If diversi Then Exit For
    Next i
    MsgBox "diversi = " & diversi
E per quanto riguarda la velocità, appena posso lo testo con il benchmark di
Baraldi.


Ore 0.50 Giornata = Riposo .. ho fatto un cu*o più di quando lavoro.
Non ci devo venire da mia suocera. Oggi ho fatto l'elettricista, il 
falegname
il cuoco e pure il fattorino.
Ore 0.40 ho finito ora di aggiustare il divano .. allucinante!!!
Allora rispondo a tutti ( e vi ringrazio di cuore ) in questa mail.
Sono dentro una funzione dove passo i due recordset. In poche parole io 
leggo
una fonte dati e la devo inserire dentro un Database ma prima di fare 
l'update verifico
se ci sono cambiamenti e nel caso ci siano avverto l'utente.
i 2 recordset sono perfettamente uguali nella struttura ( stesse colonne )
 COSA VOGLIO FARE?
Invece di fare un'infinita di If Then ho pensato di fare un ciclo. In questo 
caso le colonne sono poche
ma siccome in futuro mi può tornare utile questa funzione volevo farlo coon 
il ciclo
COME MI SONO ORGANIZZATO?
Ciclo una classe d'insieme dove ho i dati nuovi ( o pseudo nuovi)  e li 
metto  dentro il recordset che teoricamente
dovrei aggiungere al database
Prendo i record presenti nel Database tramite una SELECT ...WHERE
[entrambi i Recordset sono ordinati allo stesso modo] BY ORDER
Poi con un altro ciclo li vorrei mettere in "comparazione" per vedere se 
sono dei nuovi dati oppure se il rincojonito
sta importando lo stesso file.
COSA SUCCEDE CON IL MIO CICLO E/O CON IL VOSTRO?
Il ciclo funziona fino all'ultima colonna poi invece di uscire dal ciclo 
continua e mi da un errore
"impossibile trovare l'oggetto nell'insieme corrispondente"
Ossia fa solo la prima riga, poi dopo l'ultima colonna, invece di passare 
alla riga dopo mi va in errore.
COSE CHE NON CAPISCO
I vostri cicli, le vostre dritte le ho capite tutte e ho provato anche a 
fare un Ciclo  WHILE WEND dentro un FOR NEXT
ma nulla anzi, se come contatore  uso rsOld.RecordCount mi da come 
risultato -1
Comunque ora sono cotto, MastroGeppetto va a nanna. proverò la soluzione di 
yronium domani
perchè la soluzione di LOKAR mi potrebbe dare un risultato che non voglio 
del tipo
rsOld = a 4 righe
rsNew = a 5 righe
PS
Sto sempre lavorando sul quel fatto delle attività giornaliere e sul turno 
giornaliero
Se io inizialmente ho 4 fascie di lavoro nella giornata e poi ho una 
variazione e il datore di lavoro ne aggiunge 1  io devo
fare in modo che quella fascia nuova venga aggiunte
oppure
Se io inizialmente ho 4 fascie di lavoro nella giornata e poi ho una 
variazione e il datore di lavoro ne modifica 1  io devo
fare in modo che la fascia modificata venga aggiunta togliendo quella 
vecchia.
Grazie di nuovo a tutti