Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.044 c
3-1119934973
evg00
2005-06-28 09:02
2005.08.07
Проблема с общим доступом к базе


1-1121759874
serguncho
2005-07-19 11:57
2005.08.07
Представление Float на разных машинах


14-1121752401
SLP
2005-07-19 09:53
2005.08.07
Графический компонент для отображения направления и силы ветра


1-1121345438
dRake
2005-07-14 16:50
2005.08.07
Проблема с классами...


14-1121360156
Sanya_BS
2005-07-14 20:55
2005.08.07
Неохото заправлять картриджи самому. Нужны причины для отказа.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский