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

Вниз

Обновление TClientDataSet   Найти похожие ветки 

 
Eugene_e ©   (2003-06-20 14:43) [0]

Добрый день!
Исходные данные:
- Есть клиент TClientDataSet, получающий данные с использованием RemoteServer

Вопрос к знатокам: каким способом можно корректно установить указатель на запись добавленную в TClientDataSet, после обновления данных на сервере с помощью TClientDataSet.ApplyUpdates(). Проблема заключается в том, что набор содержит ключевое автоинкрементное поле, значение которого нужно получить на клиента обратно. Вариант работы не обязательно однопользовательский.

С уважением, Евгений


 
Polevi ©   (2003-06-20 14:49) [1]

см DatasetProvider.BeforeUpdateRecord


 
Eugene_e ©   (2003-06-20 15:07) [2]

А чем сей метод может быть мне полезен?
Хотелось бы понять могу я сделать это без излишних манипуляций? Теоретически я понимаю, что используя DatasetProvider.BeforeUpdateRecord() я могу заменить процедуру добавления записи убрав данную запись из DeltaDS, получив код добавленной записи через тот же @@Identity (MSSQL), а затем вернув это значение в DatasetProvider.AfterApplyUpdates(), но как-то громоздко выглядит.
Может у кого-нибудь еще есть предложения?


 
Juggler   (2003-06-20 16:44) [3]

Как это ты не знаеш значение ключевого поля?
Ограничения на поля не дадут просто внести запись в локальный кэш.
если нет значения ключевого поля.
Геморой в MIDAS с автоинкрементальными полями.
Еще до ApplyUpdates добраться надо.;)


 
Eugene_e ©   (2003-06-20 17:50) [4]

Как раз в локальный кэш я и могу добавить запись без значения ключевого поля (того, что ключевое по базе) и даже сохранить ее на сервере без всякой обработки в BeforeUpdateRecord(), но вот получить обратно значение автоинкрементного поля проблемно :)


 
AkaSaint ©   (2003-06-21 00:10) [5]

У меня такая же ситуация, я после ApplyUpdates делаю в клиентском НД Locate по всем полям, кроме автоинкрементного. Но тут такой недостаток, что если все остальные поля, кроме автоинкрементного, могут составить неуникальное значение, то будет ай-ай-ай.


 
Polevi ©   (2003-06-21 10:01) [6]

>Eugene_e © (20.06.03 15:07)
все правильно, только
>а затем вернув это значение в DatasetProvider.AfterApplyUpdates()

не нужно, надо так

DeltaDS.FieldByName("ID").NewValue:=@@IDENTITY


 
Eugene_e ©   (2003-06-21 12:25) [7]

Манипуляции с DeltaDS можно производить в DatasetProvider.AfterUpdateRecord(), однако внесение изменений в DeltaDS не проходит, хотя после обновления мастер-записи значение автоинкрементного поля уже доступно через SourceDS.FieldByName("ID").AsInteger


 
Eugene_e ©   (2003-06-21 15:29) [8]

Всем спасибо за отклики.

В результате выяснилось что проблема решается следующим образом:

a) для TDataSetProvider устанавливаем опции [poAutoRefresh,poPropogateChanges]
б) TDataSetProvider.ResolveToDataSet установлен [True]
в) Обработчик TDataSetProvider.AfterUpdateRecord() формируется наподобие следующего:


procedure TSCSRVXD.ds_wpAfterUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind);
var
fld: TField;
begin
try
fld := DeltaDS.FieldByName("ID");
except
//По желанию чего-нибудь
end;

fld.ReadOnly := False; //Если был установлен

try
fld.NewValue := SourceDS.FieldByName("ID").AsVariant;
except
//По желанию чего-нибудь
end;

fld := nil;

end;


Таким образом после выполнения на клиенте TClientDataSet.ApplyUpdates(), позиция сразу будет содержать значение автоинкрементного поля.

Евгений
PS. Проверено: D6, MSSQL7



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
3-44601
explorer
2003-06-20 14:39
2003.07.14
Анализ данных


14-44845
Санек
2003-06-26 19:15
2003.07.14
sticker


4-44947
Алексей К
2003-05-13 21:40
2003.07.14
Вытащить иконку из приложения


3-44580
Fiend
2003-06-20 15:01
2003.07.14
FireBird Events


1-44651
Darrin
2003-07-02 11:41
2003.07.14
Зависание MDI приложения.