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

Вниз

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

 
Juice ©   (2005-07-15 19:27) [0]

Задача: есть датасет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("&#210;&#232;&#239;&#251; &#238;&#225;&#250;&#229;&#234;&#242;&#238;&#226; &#237;&#229; &#241;&#238;&#226;&#236;&#229;&#241;&#242;&#232;&#236;&#251;");
 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 не найден. Терпение быстро лопнуло. Может быть вы подскажите как это лучше  реализовать, или я на единственном правильном пути?


 
Reindeer Moss Eater ©   (2005-07-15 19:31) [1]

Когда написал просто ReadComponent(с2) то на этой строчке вываливалась ошибка что "компонент с1 уже создан".

Это все равно не поможет.
Так как readcomponent не имеет ни малейшего отношения к данным в датасете.


 
Juice ©   (2005-07-15 19:47) [2]


> Так как readcomponent не имеет ни малейшего отношения к
> данным в датасете.

А к чему тогда ?


 
Гаврила ©   (2005-07-15 19:50) [3]


> А к чему тогда ?


К тем свойствам компонента, кототыре отражены в инспекторе объектов.


 
Juice ©   (2005-07-15 20:04) [4]

Возможны другие способы ?


 
AlexWlad ©   (2005-07-15 20:18) [5]

Запрос, выполненный вторично, думаю выполнится быстро (ну там - кэшироватие и пр.).
Если запрос выполняется долго и регулярно, м.б. имеет смысл выводить результат во временную таблицу на сервере и пользовать ее.


 
Juice ©   (2005-07-15 20:32) [6]

Оба варианта будут очень некрасивыми.


 
Гаврила ©   (2005-07-15 20:48) [7]

А результирующий набор надо хранить именно в  DataSet?
другие варианты (например свой класс) не подходят?


 
Juice ©   (2005-07-15 21:30) [8]

Ну конечно можно создать и свой класс, но такой вариант был бы самым оптимальным в условиях моей задачи. Есть конечно вариант и такой: включить у датасет2 CachedUpdates = true, написать псевдозапросы на вставку , редактирование, удаление. Сделать селект-запрос, где вместо всех полей которые в датасете1 подставить вычисляемые значения. А потом статически перенести в цикле все записи из датасета1. Это решение, но оно тоже не краивое.


 
Alexander Panov ©   (2005-07-15 21:53) [9]

Можно попробовать дублировать в TStringGrid


 
Гаврила ©   (2005-07-15 22:12) [10]

TClientDataSet посмотри, может подойдет



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

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

Наверх




Память: 0.49 MB
Время: 0.05 c
4-1117818174
kami
2005-06-03 21:02
2005.08.07
несколько FileDescriptor в FileGroupDescriptor


1-1121927266
MAVr
2005-07-21 10:27
2005.08.07
Возможно ли изменить атрибуты файла?


14-1120217146
Kerk
2005-07-01 15:25
2005.08.07
Яндекс. Статистика запросов. Эксперимент.


4-1118239226
Andreykass
2005-06-08 18:00
2005.08.07
LPT порт


3-1120106160
Киря
2005-06-30 08:36
2005.08.07
Как выполнить поиск по DBGrid у?