Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2011, 15:57   #1
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию Сравнение записей в двух таблицах

Добрый день!
Имеется две таблицы tb_new (из Access), tb_old (из PostgreSQL). Обе таблицы имеют одинаковые поля: DSE(строка), SE(строка), KSE( в tb_new - числовой[двойное с плавающей точкой], в tb_old - numeric[12,6]).
Необходимо сравнить значения этих таблиц и результат занести в новую таблицу.

Код:
for q:=0 to datam.tb_new.RecordCount-1 do      // БС
  begin
  updaterw.ProgressBar1.Position:=q;
    if datam.tb_old.Locate('DSE',datam.tb_new.FieldByName('DSE').AsString, [])=true then
    begin

    datam.qr_detalseDSE.Close;  // все записи с текущим DSE из tb_old
    datam.qr_detalseDSE.SQL.Clear;
    datam.qr_detalseDSE.SQL.Add('select * from detalse where dse=' +''''+           datam.tb_new.FieldByName('DSE').AsString + '''');
    datam.qr_detalseDSE.Open;

if not datam.qr_detalseDSE.Locate('SE; KSE', varArrayof([datam.tb_new.FieldByName('SE').AsString, datam.tb_new.FieldByName('KSE').AsFloat]),[]) then
      begin
....
...   // запись результата сравнения в таблицу
...
     end;
    end;
    datam.tb_new.Next;
  end;
Собственно проблема в строке

Код:
if not datam.qr_detalseDSE.Locate('SE; KSE', varArrayof([datam.tb_new.FieldByName('SE').AsString, datam.tb_new.FieldByName('KSE').AsFloat]),[])
В поле KSE даже одинаковые данные определяются как разные и не получается нормально сравнить. Например
0,03(из tb_old) <> 0,030000(из tb_new). Посоветуйте как поступить в этом случае
aimk0 вне форума Ответить с цитированием
Старый 10.01.2011, 16:47   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

с вещественным числами далёко не всё так просто и очевидно.
Неочевидные особенности вещественных чисел
цитирую пример из этой статьи:
Цитата:
var R:Double; // или Single
begin
R:=0.1;
if R=0.1 then
Label1.Caption:='Равно'
else
Label1.Caption:='Не равно'
end;
ну, как вариант "навскидку"...
через locate ищите совпадение других полей, а потом перебирайте найденные значения,
в цикле вычитайте из одной величины другую и сравнивайте модуль разности с очень малой величиной (например, 1E-6 )
if abs(datam.tb_new.FieldByName('KSE') .AsFloat - datam.qr_detalseDSE.FieldByName('KS E').AsFloat) < 0.000001 then СОВПАЛО

p.s. а вообще-то, зачем сравнивать две таблицы?!
может проще произвести импорт данных в одну СУБД и потом выполнить один SQL запрос, который выдаст несовпадающие данные..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2011, 23:11   #3
aimk0
Пользователь
 
Регистрация: 05.05.2010
Сообщений: 35
По умолчанию

Serge_Bliznykov, большое спасибо за советы, статья многое разъяснила.
Не знаю на сколько это правильно, но я делал следующим образом: при сравнении полей KSE я записывал значения в переменную типа real, потом из этой переменной в переменную типа string, т.е. сравнивал две строковые переменные)) (результат вроде как верный).
В любом случае попробую ваш вариант с модулем разности, чтобы убедиться в правильности сравнения.
aimk0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одновременное удаление записей в разных таблицах Lkhasa БД в Delphi 9 16.12.2010 13:21
Запрос на сравнение записей двух таблиц. papos SQL, базы данных 0 25.09.2010 12:31
Сравнение и замена значений в двух таблицах Excel shalinoleg Microsoft Office Excel 2 10.06.2010 09:53
update или исправление записей в таблицах. Roof БД в Delphi 4 15.08.2008 15:35
Множественное перемещение в двух таблицах Arteom БД в Delphi 7 16.07.2008 16:59