Actualización del conjunto de datos
Pregunta
Digamos que tengo 2 conjuntos de datos: A y B, que tienen las mismas columnas. Quiero obtener la 'ruta de distancia': se deben realizar operaciones mínimas para cambiar los conjuntos de datos A a B.
Puedo suponer que A y B contienen solo en pocas diferencias y estoy buscando algo mejor, entonces:
- Eliminar todos los elementos de A
- inserte todos los elementos de B en un
¿Cómo se puede archivar esto?
Solución
Si desea averiguar cómo transformar A en B, necesita saber cuál es la diferencia entre A y B. Hay un algoritmo general muy simple para eso, aunque podría ser más complicado dependiendo de cuántos campos hay en su conjunto de datos y cuántos de ellos pueden ser diferentes de A a B. Pero aquí está la idea general:
- Ordena ambos conjuntos de datos. Asegúrese de ordenar exactamente los mismos criterios. (En este punto, si ambos contenían el mismo conjunto de elementos de datos, las dos listas de sus contenidos serían idénticas si se ve una al lado de la otra).
- Comience con el primer elemento de ambos conjuntos de datos. Compare los dos elementos con una comparación que puede devolver
less than
,equal
ogreater than
. - Si a <b, tenga en cuenta la diferencia y muévase a la siguiente fila de A.
- Si A> B, tenga en cuenta la diferencia y muévase a la siguiente fila de B.
- Si a = B, avance ambos conjuntos de datos a la siguiente fila.
- Repita el paso de comparación y advance hasta que haya alcanzado EOF en ambos conjuntos de datos.
Una vez que haya terminado, tendrá una lista completa de diferencias entre A y B, lo que hará que los pasos necesarios para transformar A a B sean fáciles de calcular.
Otros consejos
Si sabe cómo usar SQL:
SELECT a.* FROM a
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
Te dará todos los campos en un que no están en B.
Ahora haz
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
Y luego hazlo (o no lo haga dependiendo de sus necesidades).
DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL
Ahora mesa a
y b
será lo mismo.
El código de Delphi como este debería hacer el truco, pero el código exacto depende de su base de datos y los componentes de consulta utilizados.
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;