Aktualisieren des Datensatzes
Frage
Nehmen wir an, ich habe 2 Datensätze: A und B, die die gleichen Spalten haben. Ich möchte den 'Distanzpfad' - minimale Vorgänge benötigen, um die Datensätze A auf B. zu ändern
Ich kann annehmen, dass A und B nur in wenigen Unterschieden enthalten und ich suche etwas Besseres, dann:
- Entfernen Sie alle Elemente von A
- Fügen Sie alle Elemente von B in a ein
Wie kann das archiviert werden?
Lösung
Wenn Sie herausfinden möchten, wie Sie A in B verwandeln können, müssen Sie wissen, was der Unterschied zwischen A und B ist. Dafür gibt es einen sehr einfachen allgemeinen Algorithmus, obwohl es möglicherweise komplizierter ist, je nachdem, wie viele Felder in Ihrem Datensatz enthalten sind und wie viele von ihnen sich von A bis B. unterscheiden können, aber hier ist die allgemeine Idee:
- Sortieren Sie beide Datensätze. Stellen Sie sicher, dass Sie genau die gleichen Kriterien sortieren. (An diesem Punkt wären beide die gleichen Datenelemente, die zwei Listen ihres Inhalts identisch wären, wenn sie nebeneinander betrachtet werden.)
- Beginnen Sie mit dem ersten Element beider Datensätze. Vergleichen Sie die beiden Elemente mit einem Vergleich, der zurückkehren kann
less than
,equal
odergreater than
. - Wenn a <b, beachten Sie den Unterschied und bewegen Sie sich in die nächste Reihe von A.
- Wenn a> b, beachten Sie den Unterschied und bewegen Sie sich in die nächste Reihe von B.
- Wenn a = b, fördern Sie beide Datensätze in die nächste Zeile.
- Wiederholen Sie den Vergleichs- und Advance-Schritt, bis Sie EOF in beiden Datensätzen erreicht haben.
Sobald Sie fertig sind, haben Sie eine vollständige Liste der Unterschiede zwischen A und B, wodurch die für die Umwandlung von a zu berechnenden Schritten erforderlich sind.
Andere Tipps
Wenn Sie wissen, wie man SQL verwendet:
SELECT a.* FROM a
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
Ich werde Ihnen alle Felder in a geben, die nicht in B. sind
Mach jetzt
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
Und dann tun (oder tun Sie nicht je nach Ihren Bedürfnissen).
DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL
Jetzt Tabelle a
und b
wird dasselbe sein.
Der Delphi -Code wie diesen sollte den Trick ausführen, aber der genaue Code hängt von Ihrer Datenbank und den verwendeten Abfragebonden ab.
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;