![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование комонента ( набора данных ?)
Juice © (2005-07-15 19:27:00)Задача: есть датасет1 и датасет2. В датасете1 делаем выборку которая занимает значительное время. Теперь следует сделать так, чтобы в датасете2 содержались абсолютно аналогичные датасету1 данные без выполнения аналогичного SQL-запроса (копия данных). Поискав я понял (может я ошибаюсь) что TIBQuery и его родители таких методов не предоставляют. Теперь пытаюсь скопировать один датасет в другой как компоненты :
procedure CloneComponent(C1: TComponent; var C2: TComponent);
var
S: TMemoryStream;
begin
if C1.ClassType C2.ClassType then
raise EComponentError.Create('Òèïû îáúåêòîâ íå ñîâìåñòèìû');
if C1 is TWinControl then
TWinControl(C2).Parent := TWinControl(C1).Parent;
S := TMemoryStream.Create;
with S do
begin
WriteComponent(C1);
Seek(0, soFromBeginning);
//ReadComponent(C2); пробовал вместо следующей ставить эту строку
C2 := ReadComponent( nil ) as TIBQuery; //вот тут ошибка
Free;
end;
end;
function Replicator(C: TComponent): TComponent;
begin
Result := TComponentClass(C.ClassType).Create(C.Owner);
CloneComponent(C, Result);
end;
RegisterClass(TIBQuery);
RegisterClass(TIntegerField);
TComponent(dm.qPMarketUngr) := Replicator(dm.qPortfolio);
Когда написал просто ReadComponent(с2) то на этой строчке вываливалась ошибка что "компонент с1 уже создан". Причем тут с1 если я пишу в с2 ?
Попробовал сделать так:
C2 := ReadComponent( nil ) as TIBQuery;
И начали сыпаться ошибки что класс TIBQuery не найден, - зарегистрировал его, потом TIntegerField не найден - зарегистрировал его, теперь еще какой-то field не найден. Терпение быстро лопнуло. Может быть вы подскажите как это лучше реализовать, или я на единственном правильном пути?
Гаврила (2005-07-15 22:12:00) [1]TClientDataSet посмотри, может подойдет
Alexander Panov (2005-07-15 21:53:00) [2]Можно попробовать дублировать в TStringGrid
Juice (2005-07-15 21:30:00) [3]Ну конечно можно создать и свой класс, но такой вариант был бы самым оптимальным в условиях моей задачи. Есть конечно вариант и такой: включить у датасет2 CachedUpdates = true, написать псевдозапросы на вставку , редактирование, удаление. Сделать селект-запрос, где вместо всех полей которые в датасете1 подставить вычисляемые значения. А потом статически перенести в цикле все записи из датасета1. Это решение, но оно тоже не краивое.
Гаврила (2005-07-15 20:48:00) [4]А результирующий набор надо хранить именно в DataSet?
другие варианты (например свой класс) не подходят?
Juice (2005-07-15 20:32:00) [5]Оба варианта будут очень некрасивыми.
AlexWlad (2005-07-15 20:18:00) [6]Запрос, выполненный вторично, думаю выполнится быстро (ну там - кэшироватие и пр.).
Если запрос выполняется долго и регулярно, м.б. имеет смысл выводить результат во временную таблицу на сервере и пользовать ее.
Juice (2005-07-15 20:04:00) [7]Возможны другие способы ?
Гаврила (2005-07-15 19:50:00) [8]
> А к чему тогда ?
К тем свойствам компонента, кототыре отражены в инспекторе объектов.
Juice (2005-07-15 19:47:00) [9]
> Так как readcomponent не имеет ни малейшего отношения к
> данным в датасете.
А к чему тогда ?
Reindeer Moss Eater (2005-07-15 19:31:00) [10]Когда написал просто ReadComponent(с2) то на этой строчке вываливалась ошибка что "компонент с1 уже создан".
Это все равно не поможет.
Так как readcomponent не имеет ни малейшего отношения к данным в датасете.