Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как определить измемнение набора записей?


Автор: Lunatikus 24.7.2009, 08:24
Здравствуйте.  Помогите, пожалуйста.
Пытался сделать это через:
Код

ADOQuery.Open;
DataSetOld:=DBGridEh.DataSource.DataSet;

//и в функции ADOQuery.AfterOpen проверяю равны ли новый и старый датасеты
If DataSetOld<>DataSet Then...


Однако, они всегда не равны, даже если набор данных в источнике(база MS SQL 2005) не изменился.
Каким способом можно поймать момент изменения данных(да хотя бы не в самом источнике, а в DBGridEh)?Среди событий грида подходящих не увидел.
Через сохранение записей в массив и сравнение массивов знаю как, но хотелось бы более простой и удобный способ.

Автор: Romikgy 24.7.2009, 11:08
все классы в дельфи это указатели !
Цитата(Lunatikus @  24.7.2009,  07:24 Найти цитируемый пост)
DataSetOld<>DataSet 

это сравнение указателей т.к. у тя два разных датасета тогда и указатели разные .....
если надо сравнить датасеты имхо их надо сравнивать пробегая по ним и сверяя друг с другом ,
или как то исхитрится это организовать через запрос ,
а вообще не понятна сама цель зачем сравнивать датасеты?

Автор: Lunatikus 24.7.2009, 11:45
черт,действительно, указатели. совсем я с 1С заработался.

Датасеты, потому что это первое, что пришло в голову для сравнения данных до и после обновления.Потому и спрашиваю, что тогда еще сравнивать, если не датасеты?
Пока организовал сохранение полученных через ADOquery данных в массив. После обновления новые данные в новый массив и сравниваю эти два массива. Но если будет более простой вариант - будет хорошо.

Автор: Romikgy 24.7.2009, 12:15
а кто делает обновления? и еще раз повторюсь зачем сравнивать ?

Автор: Lunatikus 24.7.2009, 12:27
ADoquery.Open
обновляет он.

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

Автор: former 24.7.2009, 13:22
Цитата(Lunatikus @  24.7.2009,  12:27 Найти цитируемый пост)
Сравнивать, чтобы при изменении данных выдавать звуковой сигнал, например. 

ИХМО: не рационально, особенно при большом числе записей.
Как вариант:
- добавить в таблицу поле типа integer bigint (версия записи). 
- сделать его автоинкрементным
- сравнивать версии записей при открытии + проверять наличие новых записей.


Автор: Lunatikus 24.7.2009, 13:46
я могу только считывать данные.изменять таблицу мне не по правам.

а набор записей будет очень небольшим: строк 20-40

Автор: Romikgy 24.7.2009, 14:53
тогда запоминай при последнем обращении значение поля у которого автоинкримент и при повторном обращении сравнивай максимальный ид с тем что в памяти , если не одинаковые тогда есть изменения ,
(это если изменения типа инсерт )
а вот с изменениями типа апдейт имхо сложнее , было бы проще добавить какое то поле типа дата+время , и что бы оно автоматом добавлялось к каждой записи при изменении , ну что  то типа тригера прицепить .... и потом по времени отслеживать любые изменения....

Автор: Lunatikus 24.7.2009, 15:42
да
но только изменения важно отследить именно апдейтные, а не инсертные)

в общем, я пока так и осталю. Благо,записей немного и их считывание/сравнение почти не заметно глазу.

спасибо за поддержку

Автор: Romikgy 24.7.2009, 20:41
Цитата(Lunatikus @  24.7.2009,  14:42 Найти цитируемый пост)
отследить именно апдейтные

а бд заведуешь ты ? тогда тригеры добавь ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)