Обновление набора данных

#delphi #delphi-xe #tdataset

#delphi #delphi-xe #tdataset

Вопрос:

Допустим, у меня есть 2 набора данных: A и B, которые имеют одинаковые столбцы. Я хочу получить «путь расстояния» — минимальные операции, которые необходимо выполнить, чтобы изменить наборы данных A на B.

Я могу предположить, что A и B содержат лишь несколько различий, и я ищу что-то лучшее, тогда:

  • удалите все элементы A
  • вставить все элементы B в

Как это можно заархивировать?

Ответ №1:

Если вы знаете, как использовать SQL:

 SELECT a.* FROM a 
LEFT JOIN b on (a.field1 = b.field1 AND a.field2 = b.field2 AND ....)
WHERE b.field1 IS NULL
  

Предоставит вам все поля в A, которых нет в B.

Теперь сделайте

 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
  

А затем сделайте (или не делайте в зависимости от ваших потребностей).

 DELETE b FROM b
LEFT JOIN a ON (a.field1 = b.field1 and a.field2 = b.field2 AND ...)
a.field1 IS NULL
  

Теперь таблица a и b будут такими же.

Подобный код Delphi должен сработать, но точный код зависит от вашей базы данных и используемых компонентов запроса.

 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;
  

Комментарии:

1. Решение SQL, по моему мнению, быстрее, потому что оно будет работать на сервере, поэтому будет быстрее для большого объема данных. Но ИМХО, вы не ответили на два пункта: «удалить все элементы A вставить все элементы B в A». A все еще там. Пожалуйста, добавьте DELETE * FROM B утверждение в свой ответ. 😉

Ответ №2:

Если вы хотите узнать, как преобразовать A в B, вам нужно знать, в чем разница между A и B. Для этого существует очень простой общий алгоритм, хотя он может быть более сложным в зависимости от того, сколько полей в вашем наборе данных и сколько из них может отличаться от A до B. Но вот общая идея:

  • Отсортируйте оба набора данных. Убедитесь, что выполняется сортировка по точно таким же критериям. (На этом этапе, если бы они оба содержали один и тот же набор элементов данных, два списка их содержимого были бы идентичны при параллельном просмотре.)
  • Начните с первого элемента обоих наборов данных. Сравните два элемента с помощью сравнения, которое может возвращать less than , equal или greater than .
    • Если A < B, обратите внимание на разницу и перейдите к следующей строке A.
    • Если A > B, обратите внимание на разницу и перейдите к следующей строке B.
    • Если A = B, переместите оба набора данных в следующую строку.
  • Повторяйте шаг сравнения и продвижения, пока не достигнете EOF для обоих наборов данных.

Как только вы закончите, у вас будет полный список различий между A и B, что упростит вычисление шагов, необходимых для преобразования A в B.