Форум: "Основная";
Текущий архив: 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("Òèïû îáúåêòîâ íå ñîâìåñòèìû");
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.043 c