Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];

Вниз

Обновление 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-44674
maxic
2003-06-30 13:26
2003.07.14
ShellExecute


1-44637
John-kam
2003-07-02 06:56
2003.07.14
Печать


14-44839
Карелин Артем
2003-06-26 13:01
2003.07.14
Как вам такой код? По-моему ужасно.


14-44867
Lord Warlock
2003-06-27 09:39
2003.07.14
SkinEngine


14-44826
Nick-From
2003-06-26 11:34
2003.07.14
Некоторые вопросы по сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский