AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
NAV
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.08.2009, 16:20   #1  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
всем привет,

возникла задача быстрого сравнения двух идентичных по структуре таблиц. то есть, отфильтровали одну, отфильтровали вторую и нужно определить, являются ли полученные наборы данных в них идентичными. построчно сравнивать все поля - вариант, но как-то неэстетично тем более, что наборы данных могут быть в сотни тысяч записей, а полей в таблицах поболее десятка.
никогда раньше не сталкивался с подобными задачами, может у кого уже есть красивое универсальное решение?
Старый 18.08.2009, 17:30   #2  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Если sql версия - сформируйте SQL запрос вида
select PK_Поле1, .. PK_ПолеN
from ТаблцаА A inner join ТаблицаБ B on A.PK_Поле1=B.PK_Поле1 and ... A.PK_ПолеN=B.PK_ПолеN
where A.ПолеДляСравнения1<>B.ПолеДляСравнения1 or A.ПолеДляСравнения2<>B.ПолеДляСравнения2 ... or
A.ПолеДляСравненияX<>B.ПолеДляСравненияX

В качестве результата вернутся различающиеся данные
Старый 18.08.2009, 17:38   #3  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
об sql я уже думал. ) но решение должно быть именно универсальным, потому как среди предполагаемых пользователей есть много таковых, кто пользует native БД.
Старый 18.08.2009, 18:01   #4  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Ну тогда только построчное стравнение.
Если не секрет - для чего может использоваться подобный функционал сравнения всех со всеми?
Старый 19.08.2009, 09:25   #5  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Если нужен только факт различия двух записей, без указания по каким полям и кол-во полей не большое, то возможно подойдет условие типа FORMAT(Rec1) = FORMAT(Rec2).
Старый 19.08.2009, 09:43   #6  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от Raul Посмотреть сообщение
Если нужен только факт различия двух записей, без указания по каким полям и кол-во полей не большое, то возможно подойдет условие типа FORMAT(Rec1) = FORMAT(Rec2).
Вылетит с ошибкой, как только размер format(rec) превысит 1000 символов
Старый 19.08.2009, 11:11   #7  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Да это ограничение естественно упускать нельзя, для большей универсальности можно закодить так
Rec1.SETRECFILTER;
Rec1 := Rec2;
IF Rec1.FIND THEN MESSAGE('Записи совпадают');
Старый 19.08.2009, 13:47   #8  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
FORMAT - идея хороша, спасибо. надо просмотреть структуры таблиц, возможно, подойдет
SETRECFILTER - оперирует со значениями ключа, но не всех полей. или я не понимаю идею?
Старый 19.08.2009, 13:55   #9  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Цитата:
Сообщение от Nosta Посмотреть сообщение
FORMAT - идея хороша, спасибо. надо просмотреть структуры таблиц, возможно, подойдет
SETRECFILTER - оперирует со значениями ключа, но не всех полей. или я не понимаю идею?
Ну надо уточнить, если вы сравниваете записи из одной таблицы, то этот способ то что нужно, тк достаточно сравнить только ключи, если из разных, то тогда только FORMAT с его ограничениями.
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:42.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.