Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 утрарил информацию.


Наверх

Титульная страница Поиск, карта сайта Написать письмо