Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копирование комонента ( набора данных ?)


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 не имеет ни малейшего отношения к данным в датасете.


Наверх

Титульная страница Поиск, карта сайта Написать письмо