![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ClientDataSet.ApplyUpdates(0) for 2 Dataset's [D6, D7, MSSQL]
Andriy Tysh © (2004-04-14 10:43:00)Есть два клиентских датасета.
Открываю транзакцию через АДО.
Делаю сначала ApplyUpdates(0) для первого ДС, потом для второго.
Если в каком-то ДС не все изменения сохранились делаю РоллБек.
На сервере всё чётко. А вот в ДС, в котором все данные сохранились, Delta утрарил информацию о изменениях. Как их вернуть назад, что-бы можно было и в клиенте "откатать транзакцию". Тоесть повернуть в "незаписанноё состояние".
P.S.:Надеюсь я хорошо описал трабл. Если нет, спрашивайте. Очень нужно!
Курдль (2004-04-14 17:32:00) [1]
> А если облом на сервере - невозможно было записать в тот
> момент, нет сети, или ... что-то ещё. Ведь невозможно всё
> на клиенте предотвратить?
Тогда речь будет идти не о 123-х записях, а максимум - в нескольких записях связанных таблиц. В таком случае ошибка легко отлавливается и юзеру доходчиво разъясняется, в чем он не прав :)
Desdechado (2004-04-14 17:25:00) [2]немного странно - что за отчет такой, с возможностью редактирования всего в нем?
а ты при неудаче CancelUpdates случайно не вызываешь?
Andriy Tysh (2004-04-14 16:55:00) [3]
> Курдль © (14.04.04 14:39) [17]
Согласен, очень хорошо делаете.
А если облом на сервере - невозможно было записать в тот момент, нет сети, или ... что-то ещё. Ведь невозможно всё на клиенте предотвратить?
Что тогда делать?
Курдль (2004-04-14 14:39:00) [4]Я обычно не даю юзерям таких вольностей, как редактирование 123-х записей с возможностью отката. Причем, на каждый сеанс редактирования поднимаю форму - шоб все было расписано хинтами и ругалось при попытке ввода ошибочного значения.
Andriy Tysh (2004-04-14 14:34:00) [5]Спецы, проанализируйте мои соображения об решении, которые я чуть выше описал.
> Курдль © (14.04.04 13:47) [13]
Представь себе, что ДатаСет с сервера берёт только два поля: ID и Name. А есть ещё, InternalCalc Field например с именем Cena. Два первых поля ты не можеш изменять, а третье-на здоровье. Вот ты изменил несколко его значений, скажем в 123-х записях. Потом ApplyUpdates(0). Ошибка на 99-й записи, РоллБек. Значения на сервере не сменились, а на клиенте как значения 123-х записей тебе оставить.
А теперь представь, что у тебя два разных датасета и ты хочеш записать их обоих и только обоих. Один не покатит. Как быть.
Курдль (2004-04-14 14:30:00) [6]
> Грубо :)
> Все же есть на клиенте, а если это вытягивается какой-нибудь
> немеряный отчет за несколько лет?
Скажу больше - грубо и не женственно! :)
Я не работал с ClientDataSet столь напряженно, но многие инструменты для связи с СУБД (DOA, SQLDirect, IB...) имеют ряд полезных свойств и событий типа onApplyRecord onUpdateRecord onCancelUpdate и т.п.
Nikolay M. (2004-04-14 14:24:00) [7]
> Курдль © (14.04.04 13:47) [13]
Грубо :)
Все же есть на клиенте, а если это вытягивается какой-нибудь немеряный отчет за несколько лет?
> asp © (14.04.04 12:45) [11]
Неплохо бы еще изменение поля присобачить, иначе не понимаю, в чем показательность твого примера.
Курдль (2004-04-14 13:47:00) [8]Я все-таки не понимаю, о чем вы все судите-рядите?
Если сервер откатил все изменения взад, то что еще вам надо, кроме Refresh?
Andriy Tysh (2004-04-14 13:26:00) [9]
> Romkin © (14.04.04 12:42) [10]
А какой именно флаг, если не секрет? Ещё, понимаете, ситуация такая, что первый датасет на сервер послал всё без ошибок, а второй сделал ошибки, то я хочу в обеих ДатаСетах восстановить все изменения.
Ибо я решил так:
1.Описал переменную OldData: OleVariant;
2. Присвоил ей значение на ClientDataSet.BeforeApplyUpdates:
OldData:=OwnerData;
чтобы все изменения запомнить;
3.А потом проверяю, если есть ошибка при ApplyUpdates(0) записи на сервер, то:
ClientDataSet.Reconcile(OldData);
ClientDataSet.Refresh;
Правильно ли я делаю.
asp (2004-04-14 12:45:00) [10]Nikolay M. © (14.04.04 12:41) [9] >
...
DataSet.Edit;
DataSetFIELD1.NewValue:= DataSetFIELD1.OldValue;
DataSet.Post;
...
Я пробовал только 3 раза. Полную мат. индукцию, боюсь, не смогу осилить. :)
Romkin (2004-04-14 12:42:00) [11]Может, не надо? Переписывать... экзаменовать...
НАписать обработчик у cds надо, OnReconcileError, и в нем нужный флаг установить.
Nikolay M. (2004-04-14 12:41:00) [12]
> asp © (14.04.04 12:35) [8]
Read the OldValue property to examine or retrieve the original value of the field that was obtained from the dataset before any edits were posted.
В [6] я сделал Post одному поле в одной записи 1 раз и в другой записи - 2 раза. А в третьей - сделаю ему же еще десять раз. К чему откатываться будем?
asp (2004-04-14 12:35:00) [13]Nikolay M. © (14.04.04 12:28) [6]> К первоначальному и откатится.
Курдль (2004-04-14 12:32:00) [14]К "первоначальному состоянию" можно откатиться с помощью DataSet.Refresh :)
Nikolay M. (2004-04-14 12:28:00) [15]
> asp © (14.04.04 12:23) [5]
Изменил я значения поля f1 в одной записи, перешел к след записи, изменил тоже поле, вернулся к первоначальной записи и еще раз изменил f1. Как после этих манипуляций откатиться к первоначальному состоянию через Old(New)Value?
asp (2004-04-14 12:23:00) [16]Насколько понял, тебя могут спасти TField.NewValue & TField.OldValue
Nikolay M. (2004-04-14 11:49:00) [17]Возможно, SavePoint-ы спасут? Правда, они скорее должно помочь при CancelUpdates...
serge35 (2004-04-14 11:22:00) [18]Перед транзакцией сохрани данные в другом DataSet, при откате возьмешь их оттуда.
Andriy Tysh (2004-04-14 11:10:00) [19]
> serge35 (14.04.04 11:00) [1]
Ошибка сделана только грамматическая: вместо Delta надо было написать DeltaDS-тип OleVariant, который содержит в себе изменения в КлиентДатаСете. После ApplyUpdates он очищается.
Или я неверно размышляю?
serge35 (2004-04-14 11:00:00) [20]Очень хорошо написал, особенно удачно нолучилась фраза - Delta утрарил информацию.