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

Вниз

TClientDataSet и RefreshRecord   Найти похожие ветки 

 
Alexxx9801   (2002-10-21 15:45) [0]

Здравсвтвуйте. При попытке обновить текущую запись в TClientDataSet через RefreshRecord на клиента прокачиваются все данные выборки. Вопрос: Как сдалать так, чтобы при вызове ClientDataSet.RefreshRecord с сервера считывалась именно та запись, которую мне нужно обновить на клиенте.


 
Erik ©   (2002-10-21 16:48) [1]

А что при Refresh происходит?


 
Polevi ©   (2002-10-21 17:44) [2]

в НД должно быть поле с флагом Key в ProviderFlags


 
Alexxx9801   (2002-10-21 18:03) [3]

2 Erik:
При Refresh происходит следующее: из базы закачивается весь набор данных (100 - 500 - 20000 записей), в нем находится запись, соответствуя текущей в ClientDataSet и обновляются значения полей. А мне не нужно считывать заново все записи. Достаточно только одну, соответствующую текущей. Я даже готов отдельный запрос написать, который выдает ту единственную нужную мне запись. Вот только куда его вставить?
2 Polevi:
Есть такое поле. Оно же первичный ключ в таблице.


 
Alexxx9801   (2002-10-22 15:20) [4]

Ну что, так никто и не знает?


 
Romanos ©   (2002-10-22 17:05) [5]

Короче, если ты готов ради этой "мути" использовать целый запрос, то:

1) Создай 2-ой объект TClientDataSet на форме пользователя.
2) Настрой его на тот же провайдер и все такое, как у первого экземпляра класса TClientDataSet.
3) В свойство TClientDataSet. CommandText второго экземляра, пиши запрос:
Select * From <Таблица> Where
<Ключ.поле-уникальное поле> = <Знач. уникального поля>;
Затем вызывай метод TClientDataSet. Execute
4) Получаешь свою обновленную запись во втором экземпляре объекта TClientDataSet. И далее решаешь, ЧТО ДЕЛАТЬ , но это делать нужно уже ручками. Обновляешь запись в первом экземпляле на ту, которая во втором экземпляре класса TClientDataSet.

Примечание1:

Вообще, свойство( CommandText ) отвечает за содержание запроса, который будет выполнен на сервере и результат которого будет помещен в соответствующий экземпляр класса TClientDataSet.
А метод TClientDataSet. Execute непосредственно передают содержание SQL - запроса для выполнения, через провайдер на сервер приложений.

Примечание2:

<Знач. уникального поля> - тебе оно известно, т.к. запись редактируется, и значит она была добавлена уже ранее.


 
Polevi ©   (2002-10-22 17:31) [6]

создай наследника TDatasetProvider
перегрузи в нем
function InternalRowRequest(const Row: OleVariant; RequestType: TFetchOptions): OleVariant; override;

именно эта ф-ия вызывается при RefreshRecord на клиенте

function TYourProvider.InternalRowRequest(const Row: OleVariant;
RequestType: TFetchOptions): OleVariant;
var
ID:integer;
qry:TADOQuery;
Field:TField;
i:integer;
begin
Delta.Close;
Delta.Data:=Row;
//значение ключевого поля записи, которую хочет обновить клиент
ID:=Delta.FieldByName("ID").AsInteger;
qry:=TADOQuery.Create(nil);
try
qry.Connection:=TADOQuery(Dataset).Connection;

//формируешь нужный запрос к базе
qry.SQL.Add(Format("SELECT * FROM YourTable WHERE ID=%d",[ID]));
qry.Open;

//Заполняешь дельту
Delta.Edit;
for i:=0 to Delta.FieldCount-1 do
begin
Field:=qry.FindField(Delta.Fields[i].FieldName);
if (Field <> nil) then Delta.Fields[i].Assign(Field);
end;
Delta.Post;
finally
qry.Free;
end;
//отсылаешь ее клиенту
Result:=Delta.Data;
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.023 c
14-34166
Феликс
2002-10-17 14:12
2002.11.11
Почему?


14-34163
Дремучий
2002-10-24 12:37
2002.11.11
Всевозможные ДОС-меню....


1-34117
ИгорьК
2002-10-31 15:07
2002.11.11
Доступ к форме Owner-у


1-33979
ab programmer
2002-11-01 14:00
2002.11.11
Как поймать вывод консольного приложения


14-34237
Peter Gluhiy
2002-10-23 13:50
2002.11.11
Для любителей OnLine тестов!