Newsgroup: it.comp.lang.visual-basic
Titolo: confronto tra record di access

salve,
devo effettuare svariati confronti tra tabelle di due database access (DAO,
VB5) per rintracciare eventuali differenze tra le tabelle dei due db. sapete
dirmi qual'è il metodo più veloce essendo questa una operazione massiva che
devo effettuare tutte le notti in background sul server?
inoltre, lo stesso tipo di operazione la devo portare a termine su due
diversi db: uno access e l'altro informix(odbc, RDO, vb5), questa ancor più
critica in quanto devo confrontare circa 10 tabelle di 500 db per notte
oltre a varie insert e update (mi basterà una notte??? al limite terremo
chiuso l'ufficio e entriamo al lavor più tardi: tutti contenti eccetto il
sottoscritto che andrà a far programmi all'aria aperta!!!).
grazie
andrea

L'algoritmo non č semplice da spiegare cosě, comunque ci provo :
- Ordina le tabelle secondo un campo a tua scelta (uguale per tutte e due)
- Carica in 2 collection i record delle due tabelle
- Devi lavorare con gli indici :
Ammettiamo che le 2 tabelle siano cosě :
idx   t1           t2
1)    A            A
2)    B            C
3)    E            D
4)    G            G
for i=1 to collection.Count
    if t1=t2 then
        'Controlla se gli altri campi sono uguali e se sě, fai l'update.
        'incrementa indice di t1 e di t2
    if t1<t2 then
        'aggiungi questo record in t2 nella tabella t1
        'incrementa indice di t1
    if t2<t1 then
        'aggiungi questo record in t1 nella tabella t2
        'incrementa indice di t2
next
Spero di essere riuscito a spiegarti.
Ciao

devo effettuare tutte le notti in background sul server?
Che operazioni devi compiere?
Suppongo:
1)  Rintracciare queli record sono stati aggiunti
2)  Rintracciare queli record sono stati eliminati
3)  Rintracciare eventuali differenze dei record, avendo come riferimento
una chiave univoca per entrame le tabelle, confrontando campo per campo i
due records aventi uguale chiave.
4) Utilizzare 2 o + database insieme in modo da poter utilizzare comandi SQL
La cosa + veloce e' usare pesantemente SQL.
Per i punti 1 e 2, dato la scarsa versatilita' dell'SQL di ACCESS, uso dei
barbatrucchi.
Per esempio, se voglio sapere quali lecord in piu' ci sono nella tabella A
rispotto alla B, eseguo una SQL con un JOIN di tipo LEFT (o RIGHT) in modo
da "includere tutti i record di A e solo i record di B in cui i campi
collegati sono uguali", e che dia come risultato solo i campi chiave di
entrambe le tabelle, e mettendo nel WHERE la condizione per isolare solo i
record di A che non hanno corrispondenza in B.
Un esempio pratico e' questo:
SELECT A.Chiave, B.Chiave FROM A LEFT JOIN B ON A.Chiave = B.Chiave WHERE
(((B.Chiave) Is Null));
oppure questa per fare il contrario, ossia,  isolare i record di B che non
hanno corrispondenza in A.
SELECT A.Chiave, B.Chiave FROM A RIGHT JOIN B ON A.Chiave = B.Chiave WHERE
(((A.Chiave) Is Null));
Per il punto 3 consiglio di assemblare dinamicamente le SQL per rintracciare
i record che, a parita' di campo chiave, hanno i restanti campi non
identici.
Supponendo sempre le due tabelle A e B, farei cosi':
Function SQL_Di_Paragone(tabella1$,Tabella2$,CampoChiave$) as string
    Dim Where$
    Dim SQL$
    Dim IxCampo as integer
    Where$ = ""
    For IxCampo=0 to MioDB(tabella1$).Fields.Count-1
        if len(Where$) then Where$=Where$ & " OR "
        Where$= Where$ & "([" & tabella1$ & "].[" &
MioDB(tabella1$).Fields(IxCampo).Name & "]<>["
        Where$ = Where$ & tabella2$ & "].[" &
MioDB(tabella1$).Fields(IxCampo).Name & ")"
    Next IxCampo
    SQL$ = "SELECT [" & tabella1$ & "].*, [" & tabella2$ & "].* FROM ["
    SQL$ = SQL$ & tabella1$ & "] INNER JOIN [" & tabella1$ & " ON ["
    SQL$ = SQL$ & tabella1$ & "].[" & CampoChiave$  & "] = [" & tabella2$ &
"]." & CampoChiave$ & "] "
    SQL$ = SQL$ & " WHERE (" & Where$ & ");"
    SQL_Di_Paragone = SQL$
End Function
Richiamando questa funzione ottieni una stringa SQL che se applicata ricava
i record che sono diversi.
PS: L'ho scritta a mano qui nella mail, ed e' passibile di errori.
esempio:
SQL$ = SQL_Di_Paragone("A","B","Chiave")
Il punto 4 lo si risolve usando le mitiche Tabelle Attaccate, ossia crei un
tuo database di lavoro, ed in questo crei le Tabelle Attaccate, ossia dei
"links" a tabelle posti in altri database.
Alla fine ti ritrovi virtualmente a lavorare sul tuo database di lavoro come
se fosse un DB Access DAO locale, mentre invece stai lavorando su N tabelle
poste su N altri database.
Volendo il database di lavoro e le tabelle attaccate si possono anche creare
dinamicamente.
Spero _vivamente_ di averci azzeccato con la risposta.
Fammi sapere se era quello che cercavi.
Salutoni
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

Confermo e sottoscrivo in pieno la soluzione di Ettore, ho utilizzato questa
tecnica per confronti e sincronizzazioni di tabelle con milioni di record ed
è senz'altro la più efficace, certo non puoi aspetterti di finire tutto in
tre minuti, ma su un sistema adeguato e inserendo tutti gli indici nel posto
giusto la mattina non avrai problemi.
L'unica cosa che vorrei aggiungere o sottolineare è quella di filtrare al
massimo i record prima di effettuare le modifiche, cioè, secondo me (ma è
solo un'opinione) non si dovrebbero effettuare modifiche mentre si
reperiscono i dati da sottoporre ad editing, ma prima si filtrano e poi con
una ulteriore query si analizzano o si editano, questo approccio, oltre ad
essere consigliato per svariati motivi, offre comunque miglior rapporto
tempo/traffico di rete e non ultima la possibilità di ripensamenti in base
al numero di record filtrati.
Non ho applicato la SQL_Di_Paragone ma ho castruito una query fissa che
controlla tutti i campi ma mi riservo di provarla al più presto.
A titolo di riferimento ti dico i tempi (approssimativissimi) della mia
esperienza:
due tabelle da 500.000 record con una decina di campi da confrontare con
operazioni di:
Copia di sicurezza della tabella originale
Allega tabelle
Imposta Indici (operazione tediosa su grandi tabelle)
Verifica dati aggiunti
Verifica modifiche
Nessuna verifica record cancellati poichè la seconda tabella è incrementale
1)Macchina Pentium 133, 32 ram : Circa 15/20 min
2) Macchina biprocessore Pentium II 400 , 256 ram, raid 5 : circa 2 min.
comprese tutte le operazioni di servizio come importazione delle tabelle
ecc.
Ciao Axelmet

 Confermo e sottoscrivo in pieno la soluzione di Ettore, ho utilizzato
questa
quale tecnica scusa mi sonoperso la risposta in questi giorni cosě pieni di
lavoro!!!!
tempo fa qualcuno mi suggerě l'uso di lset e poi confrontare le due stringhe
contenenti l'intero tracciato.
indici ed entrate per chiave diamoli per scontati........
grazie
ciao
andrea

dirmi qual'č il metodo piů veloce essendo questa una operazione massiva che
