Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

ClientDataSet.ApplyUpdates(0) for 2 Dataset s   Найти похожие ветки 

 
Andriy Tysh ©   (2004-04-14 10:43) [0]

Есть два клиентских датасета.
Открываю транзакцию через АДО.
Делаю сначала ApplyUpdates(0) для первого ДС, потом для второго.
Если в каком-то ДС не все изменения сохранились делаю РоллБек.
На сервере всё чётко. А вот в ДС, в котором все данные сохранились, Delta утрарил информацию о изменениях. Как их вернуть назад, что-бы можно было и в клиенте "откатать транзакцию". Тоесть повернуть в "незаписанноё состояние".
P.S.:Надеюсь я хорошо описал трабл. Если нет, спрашивайте. Очень нужно!


 
serge35   (2004-04-14 11:00) [1]

Очень хорошо написал, особенно удачно нолучилась фраза - Delta утрарил информацию.


 
Andriy Tysh ©   (2004-04-14 11:10) [2]


> serge35   (14.04.04 11:00) [1]

Ошибка сделана только грамматическая: вместо Delta надо было написать DeltaDS-тип OleVariant, который содержит в себе изменения в КлиентДатаСете. После ApplyUpdates он очищается.
Или я неверно размышляю?


 
serge35   (2004-04-14 11:22) [3]

Перед транзакцией сохрани данные в другом DataSet, при откате возьмешь их оттуда.


 
Nikolay M. ©   (2004-04-14 11:49) [4]

Возможно, SavePoint-ы спасут? Правда, они скорее должно помочь при CancelUpdates...


 
asp ©   (2004-04-14 12:23) [5]

Насколько понял, тебя могут спасти TField.NewValue & TField.OldValue


 
Nikolay M. ©   (2004-04-14 12:28) [6]


> asp ©   (14.04.04 12:23) [5]

Изменил я значения поля f1 в одной записи, перешел к след записи, изменил тоже поле, вернулся к первоначальной записи и еще раз изменил f1. Как после этих манипуляций откатиться к первоначальному состоянию через Old(New)Value?


 
Курдль ©   (2004-04-14 12:32) [7]

К "первоначальному состоянию" можно откатиться с помощью DataSet.Refresh :)


 
asp ©   (2004-04-14 12:35) [8]

Nikolay M. ©   (14.04.04 12:28) [6]> К первоначальному и откатится.


 
Nikolay M. ©   (2004-04-14 12:41) [9]


> 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 раза. А в третьей - сделаю ему же еще десять раз. К чему откатываться будем?


 
Romkin ©   (2004-04-14 12:42) [10]

Может, не надо? Переписывать... экзаменовать...
НАписать обработчик у cds надо, OnReconcileError, и в нем нужный флаг установить.


 
asp ©   (2004-04-14 12:45) [11]

Nikolay M. ©   (14.04.04 12:41) [9] >
...
DataSet.Edit;
DataSetFIELD1.NewValue:= DataSetFIELD1.OldValue;
DataSet.Post;
...
Я пробовал только 3 раза. Полную мат. индукцию, боюсь, не смогу осилить. :)


 
Andriy Tysh ©   (2004-04-14 13:26) [12]


> Romkin ©   (14.04.04 12:42) [10]

А какой именно флаг, если не секрет? Ещё, понимаете, ситуация такая, что первый датасет на сервер послал всё без ошибок, а второй сделал ошибки, то я хочу в обеих ДатаСетах восстановить все изменения.

Ибо я решил так:
1.Описал переменную OldData: OleVariant;
2. Присвоил ей значение на ClientDataSet.BeforeApplyUpdates:
OldData:=OwnerData;
чтобы все изменения запомнить;
3.А потом проверяю, если есть ошибка при ApplyUpdates(0) записи на сервер, то:
ClientDataSet.Reconcile(OldData);
ClientDataSet.Refresh;


Правильно ли я делаю.


 
Курдль ©   (2004-04-14 13:47) [13]

Я все-таки не понимаю, о чем вы все судите-рядите?
Если сервер откатил все изменения взад, то что еще вам надо, кроме Refresh?


 
Nikolay M. ©   (2004-04-14 14:24) [14]


> Курдль ©   (14.04.04 13:47) [13]

Грубо :)
Все же есть на клиенте, а если это вытягивается какой-нибудь немеряный отчет за несколько лет?


> asp ©   (14.04.04 12:45) [11]

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


 
Курдль ©   (2004-04-14 14:30) [15]


> Грубо :)
> Все же есть на клиенте, а если это вытягивается какой-нибудь
> немеряный отчет за несколько лет?

Скажу больше - грубо и не женственно! :)
Я не работал с ClientDataSet столь напряженно, но многие инструменты для связи с СУБД (DOA, SQLDirect, IB...) имеют ряд полезных свойств и событий типа onApplyRecord onUpdateRecord onCancelUpdate и т.п.


 
Andriy Tysh ©   (2004-04-14 14:34) [16]

Спецы, проанализируйте мои соображения об решении, которые я чуть выше описал.

> Курдль ©   (14.04.04 13:47) [13]

Представь себе, что ДатаСет с сервера берёт только два поля: ID и Name. А есть ещё, InternalCalc Field например с именем Cena. Два первых поля ты не можеш изменять, а третье-на здоровье. Вот ты изменил несколко его значений, скажем в 123-х записях. Потом ApplyUpdates(0). Ошибка на 99-й записи, РоллБек. Значения на сервере не сменились, а на клиенте как значения 123-х записей тебе оставить.
А теперь представь, что у тебя два разных датасета и ты хочеш записать их обоих и только обоих. Один не покатит. Как быть.


 
Курдль ©   (2004-04-14 14:39) [17]

Я обычно не даю юзерям таких вольностей, как редактирование 123-х записей с возможностью отката. Причем, на каждый сеанс редактирования поднимаю форму - шоб все было расписано хинтами и ругалось при попытке ввода ошибочного значения.


 
Andriy Tysh ©   (2004-04-14 16:55) [18]


> Курдль ©   (14.04.04 14:39) [17]

Согласен, очень хорошо делаете.
А если облом на сервере - невозможно было записать в тот момент, нет сети, или ... что-то ещё. Ведь невозможно всё на клиенте предотвратить?
Что тогда делать?


 
Desdechado ©   (2004-04-14 17:25) [19]

немного странно - что за отчет такой, с возможностью редактирования всего в нем?

а ты при неудаче CancelUpdates случайно не вызываешь?


 
Курдль ©   (2004-04-14 17:32) [20]


> А если облом на сервере - невозможно было записать в тот
> момент, нет сети, или ... что-то ещё. Ведь невозможно всё
> на клиенте предотвратить?

Тогда речь будет идти не о 123-х записях, а максимум - в нескольких записях связанных таблиц. В таком случае ошибка легко отлавливается и юзеру доходчиво разъясняется, в чем он не прав :)



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
3-1079539726
Rule
2004-03-17 19:08
2004.04.11
Где скачать обновление IBX 7 чтобы был компонент IBScript?


1-1079974572
Kiber
2004-03-22 19:56
2004.04.11
Преобразование строки в число


3-1081480032
F. Evgeney
2004-04-09 07:07
2004.04.11
как правильно подключить сетвую базу через ADOTable


14-1082143031
juiceman
2004-04-16 23:17
2004.04.11
Я так устал...


3-1081825030
rosl
2004-04-13 06:57
2004.04.11
ehlib