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

Вниз

Изменяю в ClientDataSet одну запись-на сервере изменяется вся tbl   Найти похожие ветки 

 
AkaSaint ©   (2003-11-21 16:54) [0]

Подробности таковы.

//Клиент:
CDS: TClientDataSet;
//Сервер приложений
DSP: TDataSetProvider;

Изменяю одну запись в CDS. Перед ApplyUpdates показывает ChangeCount = 1. Выполняю ApplyUpdates, и на сервере приложений в
DSP.BeforeUpdateRecord оказывается в DeltaDS - 2 записи. Их содержимое я узнаю так:

DSP.UpdateMode := upWhereChanged;
CloneDS := TClientDataSet.Create(nil);
CloneDS.CloneCursor(DeltaDS, True);
PrintDS(CloneDS, MainForm.mTestLog.Lines);//Выводит в //TStrings содержимое CloneDS
CloneDS.Free;

В CDS было изменено значение поля 3 с 1 на 2. Вот что показал PrintDS:

16:27:37 zebra Запись №1
16:27:37 zebra Поле 0:OldValue=1,Value=1,NewValue=1;
Поле 1:OldValue=1,Value=1,NewValue=1;
Поле 2:OldValue=1,Value=1,NewValue=1;
Поле 3:OldValue=1,Value=1,NewValue=1;
Поле 4:OldValue=1,Value=1,NewValue=1;
16:27:37 zebra Запись №2
16:27:37 zebra Поле 0:OldValue=Null,Value=Null,NewValue=;
Поле 1:OldValue=Null,Value=Null,NewValue=;
Поле 2:OldValue=Null,Value=Null,NewValue=;
Поле 3:OldValue=2,Value=2,NewValue=2;
Поле 4:OldValue=Null,Value=Null,NewValue=;

При входе в BeforeUpdateRecord DeltaDS.RecNo = 2. У DSP стоит свойство AllowMultiRecordUpdates, которое позволяет изменить сразу несколько записей в таблице, что мне не нужно. При его выключении ругается на попытку изменить более одной записи и потом, что ключ не указан.
Я не понимаю, почему
1)На сервере приложений в DeltaDS 2 записи, а не одна.
2)Почему 2-я запись в DeltaDS содержит одно и то же значение для
OldValue и NewValue, когда, как я думаю, она должна содержать 1 и 2, соответственно.
Посоветуйте что-нибудь, пожалуйста. Заранее спасибо.


 
sokohigh   (2003-11-21 17:29) [1]

А зачем делать
> DSP.UpdateMode := upWhereChanged;
?
Самый очевидный режим - upWhereKeyOnly. При этом надо еще пометить ключевые поля у датасета, из которого берет данные провайдер, флагом pfInKey. У Вас, видимо, две записи имеют начальное значение поля 3 = 1, вот их провайдер и апдейтит, в полном соответствии с Вашими указаниями.


 
sokohigh   (2003-11-21 17:42) [2]

Наверное, непонятно написал, уточняю:
Вы можете определить, что провайдер укажет в выражении where операторов SQL update, delete, insert путем задания UpdateMode и установки флагов pfInKey для upWhereKey или pfInWhere для upWhereAll у полей датасета-источника. Режим upWhereChanged, очевидно, будет правильно работать только при изменении всех полей ключа.


 
AkaSaint ©   (2003-11-21 23:37) [3]

>А зачем делать
>> DSP.UpdateMode := upWhereChanged;

Это нужно затем, что в этом случае, если 2 пользователя один за другим попробуют изменить одно и то же поле одной и той же записи, то второй получит ошибку, что и требовалось. Если же использовать upWhereKeyOnly, этого не произойдет.
sokohigh, большое спасибо вам за ответ: он позволил мне направить мышление в нужное русло, а именно, по поводу установки ProviderFlags для полей. Напишу, в чем была проблема и как она решилась, может быть, это еще кому-нибудь поможет.
У меня на сервере приложений использовался с целью экономии ресурсов один TADODataSet на несколько десятков провайдеров данных. Когда этим провайдерам требовалось считать или обновить данные из БД, они делали это так:

procedure TrdmBSAS.dsHotelServicesBeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
ADODataSet.Close;
ADODataSet.CommandText := <SQL-запрос на получение данных>
ADODataSet.Open;
//(*)
end;

Чтобы работать через один ADODataSet, у всех провайдеров ResolveToDataSet = False. Я нигде не указал флаги для полей, да и не сразу понятно, где это делать - ADODataSet-то один. Видимо, неустановка флагов в адекватные ситуации значения и привела к некорректной работе. Флаги можно установить вместо (*), тогда все работает правильно. Правда, содержимое DeltaDS осталось таким же, и, к сожалению, я все-таки не понял, почему.
Еще раз спасибо, sokohigh!



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
7-36880
Dimaxx
2003-09-30 00:53
2003.12.12
Про печать графики на принтере...


4-36906
Brabadu
2003-10-09 15:37
2003.12.12
Перехват доп клавиш клавиатуры


1-36676
ИМХО
2003-12-03 06:48
2003.12.12
TListView - выделить строку жирным цветом


7-36866
KIE
2003-10-06 12:19
2003.12.12
Как мне получить изображение с ...


3-36559
IGORYOK
2003-11-20 12:49
2003.12.12
Чтобы работала на всех виндах