Вниз
Скачать: CL | DM;

Странное поведение в TClientDataset   Найти похожие ветки 

 
Desdechado ©   (2004-02-24 16:35) [0]

Есть связка TSQLDataset-TDatasetProvider-TClientDataset-TDataSource
Выполняется некий запрос SELECT, результат которого модифицируется. Запрос сложный, поэтому обработка изменений делается через TDatasetProvider.BeforeUpdateRecord.
Вопрос в чем. Если запись изменилась, но не все поля, то в DeltaDS этого обработчика для неизмененных полей значение NewValue может быть либо unassigned, либо null. В связи с этим приходится каждый раз писать проверку, а не совпадает ли значение поля с OldValue, а требуется ли сохранение этих полей в БД и т.д.
Просто, если тупо брать Field.AsInteger (например), то преобразование от NULL приводит к 0 и затирает при сохранении старое значение.
Объясните кто-нибудь, зачем такие сложности в реализации поведения ClientDataSet. Ведь гораздо проще было бы, если бы NewValue содержал бы ВСЕГДА данные: если изменились - то новые, если не изменились - то старые.
Может, кто знает лучший способ проверок? Ссылочку киньте какую-нить.


 
Nikolay M. ©   (2004-02-24 18:09) [1]


> Ведь гораздо проще было бы, если бы NewValue содержал бы
> ВСЕГДА данные: если изменились - то новые, если не изменились
> - то старые

Программисты в Борланде не дураки, они делают не как проще, а как правильно. Допустим, изменил ты в одной табличке на 50 полей одно-единственное поле. Тогда, по твоей логике, на сервер должен уйти немеряный запрос, который апдейтит все 50 полей вместо одного, единственно нужного.
Конечно, если я правильно понял вопрос...


 
Desdechado ©   (2004-02-24 18:52) [2]

Я запрос конструирую сам, поэтому что отправлять на сервер тоже решаю я. Я бы просто проверял, равны ли OldValue и NewValue, а так приходится еще анализ на пустоту встраивать :(


 
Desdechado ©   (2004-02-25 11:41) [3]

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


 
Asdor   (2004-02-25 12:00) [4]

Если не ошибаюсь (не очень хорошо помню - давно это было),
в DeltaDS при UpdateKind=ukModify содержаться по 2 записи на каждую измененную - одна - то, что было раньше, вторая - то, что изменилось.

При UpdateKind=ukDelete или ukInsert - на каждую меняющуюся запись в DeltaDS содержится по одной записи.


 
Desdechado ©   (2004-02-25 12:51) [5]

ну, это собственно и есть OldValue и NewValue
а NewValue содержит только те поля, в которых изменения были


 
Desdechado ©   (2004-02-26 14:01) [6]

посоветуйте что-нибудь, народ!


 
Polevi ©   (2004-02-26 14:27) [7]

а чем тебя "анализ на пустоту" так пугает ?


 
Desdechado ©   (2004-02-26 19:05) [8]

Да не пугает, просто у меня огромное количество кода переводится с БДЕ. А там поведение такое, как мне нравится - в новой версии записи хранятся ВСЕ поля, даже неизмененные.
А теперь придется перелопачивать все, проверять логику и поведение программ, да и вставлять везде вместо одной строчки присваивания кучу проверок не есть гуд :(



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.021 c
9-1062001143
Ландграф Павел
2003-08-27 20:19
2004.03.28
Посмотрите мою игрушку (2D скролл-аркада на DelphiX c исходникам)


1-1078965622
Chlavik
2004-03-11 03:40
2004.03.28
При Application.Minimize оставляем одно окно в OnTop


3-1077853217
Апач
2004-02-27 06:40
2004.03.28
Update без выполнения триггеров


3-1077804454
MIDPAD
2004-02-26 17:07
2004.03.28
перенос данных


14-1078231163
Harm
2004-03-02 15:39
2004.03.28
Нравственность и наука




   Наверх