Форум: "Базы";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c