aggiornamento dataset
Domanda
Diciamo che ho 2 set di dati: A e B, che hanno le stesse colonne. Voglio ottenere il 'percorso a distanza' -. Operazioni minime necessarie per essere fatto, cambiare set di dati da A a B
I può assumere, che A e B contengono solo in poche differenze e sto cercando qualcosa di meglio, allora:
- rimuovere tutti gli elementi di A
- Inserisci tutti gli elementi di B in A
Come può essere archiviata?
Soluzione
Se si vuole trovare il modo di trasformare A in B, è necessario sapere quale sia la differenza tra A e B è. C'è un semplice algoritmo generale per questo, anche se potrebbe essere più complicato a seconda di quanti campi sono nel vostro set di dati e quanti di loro possono essere diverso da A a B. Ma qui è l'idea generale:
- Ordina entrambi i set di dati. Assicurati di sorta sugli stessi criteri esatti. (A questo punto, se entrambi contenevano lo stesso insieme di elementi di dati, le due liste dei loro contenuti sarebbero identici se visti affiancati.)
- Inizia con il primo elemento di entrambi
set di dati. Confrontare le due voci con un confronto che può restituire
less than
,equal
ogreater than
. -
- Se A
-
- Se A> B, notare la differenza e passare alla successiva riga di B.
-
- Se A = B, avanzano due serie di dati alla riga successiva.
- ripetere il passaggio compare-and-anticipo fino a quando hai raggiunto EOF su entrambi i set di dati.
Una volta fatto, si avrà un elenco completo delle differenze tra A e B, che renderà i passi necessari per trasformare A a B semplice da calcolare.
Altri suggerimenti
Se si sa come utilizzare SQL:
SELECT a.* FROM a
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
vi darà tutti i campi di A che non sono in B.
Ora fare
INSERT INTO b
SELECT a.* FROM a
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
E poi fare (o non fare a seconda delle esigenze).
DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL
Ora a
tavolo e b
sarà lo stesso.
codice Delphi come questo dovrebbe fare il trucco, ma il codice esatto dipende dalla vostra base di dati ed i componenti di query utilizzate.
procedure TForm1.equalize(A, B: TDataset);
var
tablenameA: string;
tablenameB: string;
MyQuery: TQuery;
begin
tablenameA:= IProviderSupport(A).PSGetTableName;
tablenameB:= IProviderSupport(B).PSGetTableName;
MyQuery:= TQuery.Create(self);
MyQuery.Database:= .....
MyQuery.SQL.Text:= ' INSERT INTO '+tablenameA+' .....
MyQuery.ExecSQL;
end;