Newsgroup: it.comp.lang.visual-basic
Titolo: Diff tra recordset

Salve , volevo sapere come posso fare per trovare delle differenze tra due
recordset ricavati da due tabelle ( che dovrebbero essere uguali se non
per qualche record )
La struttura delle due tabelle è la medesima.
Un pò quello che fa il comando diff in unix.
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 La struttura delle due tabelle è la medesima.
Se hai delle chiavi univoche:
-Scandagli il primo, cerchi la stessa chiave sul secondo
-   se la trovi, confronti i valori dei campi del primo e del secondo e ne
rilevi eventuali differenze
-   se non la trovi, significa che è un record presente nel primo e non nel
secondo
-passi al record successivo del primo
-Scandagli poi il secondo e fai la stessa cosa al contrario per rilevare, in
questo caso, solo la presenza di records che ci sono nel secondo e non nel
primo
Personalmente farei un'unica query per comporre il primo recordset e poi,
record per record, una query per cercare solo "lo stesso" record nell'altra
tabella e fare i confronti del caso. Alla fine stesso metodo, ma al
contrario.
Se ti interessa solo la differenza nel numero complessivo dei records ti
basta RecordCount (se disponibile) o Select Count(*)...

 *Davide Comerlati* ha scritto:






Io non ho nessuna chiave.
Attualmente lo sto facendo con find ma dopo 3-4000 record il tutto si
rallenta in modo inaccettabile.


 rallenta in modo inaccettabile.
Non ho capito: come fai, senza una chiave a cercare il record "gemello" sul
secondo recordset per confrontarne i valori?
Cosa dici alla Find di cercare?
Facci un esempio inventando 2/3 records e specificando bene cosa vuoi
ottenere.

 *Davide Comerlati* ha scritto:



Allora ...
Il mio primo recordset si chiama recArtTmp
Il secondo si chiama recArt
Io parto dal primo record di recArtTmp e verifico se c'è in recArt.
Se non c'è lo aggiunge e scrive tutti i campi , se c'è riscrive  solo il
campo prezzo .
Ecco un pezzo di codice...
recArtTmp.MoveFirst
Do               'comincia il ciclo per copiare i dati da tabSchedeTmp a
tabSchede
  cod = recArtTmp!Libero1
 
  recArt.Find "Libero1 LIKE '" & cod & "'"
 
  'INSERISCE I RECORD CHE NON ESISTONO
If recArt.EOF Then 'se non esiste il cod - find non ha trovato niente -
'inserisce un nuovo record e scrive tutti i campi che deve scrivere
 
 
    recArt.MoveFirst
Else        'se il codice è stato trovato 
recArt!Prezzo1 = recArtTmp!Prezzo1
recArt.Update
End If
Grazie


 Ecco un pezzo di codice...
Io (non ho provato, tantomeno la velocità, magari lo farai tu) farei così
(non usando affatto la Find e partendo dal presupposto che recArtTmp sia già
composto e con almeno un record):
Dim recArt As ADODB.Recordset
Set recArt = New ADODB.Recordset
Set recArt=Nothing
Dim comando_sql As String
Dim n_campo As Integer
recArtTmp.MoveFirst
Do
    If recArtTmp.EOF then Exit Do
    comando_sql="Select * From Nome_Tabella2 Where Libero1='" &
recArtTmp!Libero1 & "'"
    recArt.Open comando_sql, oggetto_connessione, adOpenStatic,
adLockOptimistic
    If recArt.BOF=True And recArt.EOF=True Then
'            Il record non esiste - Lo aggiungo pari a quello di recArtTmp
        recArt.AddNew
        For n_campo=0 to recArtTmp.Fields.Count-1
recArt(recArtTmp.Fields(n_campo).Name).Value=recArtTmp(recArtTmp.Fields(n_ca
mpo).Name).Value
        Next n_campo
    Else
'                Il record esiste - Aggiorno solo il prezzo
'                (Non avendo visto l'istruzione Edit,
'                suppongo che stai lavorando con ADO, non DAO)
            recArt!Prezzo1 = recArtTmp!Prezzo1
    End If
    recArt.Update
    recArt.Close
    recArtTmp.MoveNext
Loop
Set recArt=Nothing

 Set recArt=Nothing
con le righe che vanno a capo quando cacchio ne hanno voglia loro non è il
massimo della leggibilità, ma spero si capisca il concetto
--
Salutoni
Sergio

 Sergio
Ragazzi, vi ringrazio moltissimo, sia Lupo che Sergio, mi avete aperto gli
occhi su un modo nuovo di lavorare.
Appena ho un secondo provo sia le versione di Lupo che quella tua e vi
saprò dire...intanto grazie.


 spirituale ;-) )
Certo, ci mancherebbe, ma ... io resto della mia idea...
Aspettiamo che Davide faccia prove di velocità.
Ohhh, non ho alcuna certezza, ma solo un ... rughino...

 Ohhh, non ho alcuna certezza, ma solo un ... rughino...
Sì, la parte relativa alle prestazioni è da verificare. Io ho fatto qualche test
e i risultati dell'applicazione del filtro su un recordset, contro la
chiusura/riapertura con clausola where, erano favorevoli alla prima soluzione,
ma si trattava di poche centinaia di record, quelli di davide sono molti di più.
--
Salutoni
Sergio

 La struttura delle due tabelle è la medesima.
E fare fare tutto al motore DB?
Fai una
SELECT tabella1.* FROM tabella1
WHERE tabella1.campo1 <> tabella2.campo1 OR
      tabella1.campo2 <> tabella2.campo2
      ...
i risultanti sono i record diversi.
Ciao

 i risultanti sono i record diversi.
Vero, ma resta il problema di creare i record mancanti o di aggiornare un
campo per quelli presenti... ;-)

 campo per quelli presenti... ;-)
Il problema è un altro: non avendo nessun punto fermo per dire "questo
record dovrebbe essere uguale a quest'altro" il risultato è una tabella con
tutti gli incroci possibili.
Io ad es. con due tabelle con circa 3000 record ciascuna mi risulta in un
bel recordset di 9.000.000 di record differenti, ma questo è un limite nella
logica, non nell'algoritmo usato.
Ciao

 logica, non nell'algoritmo usato.
Naturalmente.