Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизКак копировать экземпляр TIBQuery? Найти похожие ветки
← →
White_ (2005-08-18 20:07) [0]Здравствуйте!
У меня такая проблемка.
Есть компонент IBQuery, причём формируется его SQL запрос динамически. Далее для каждого элемента из полученого набора данных (который возвращает IBQuery) генерируется новый скрипт и заносится в этот же IBQuery (перед этим он очищается и заново активируется) и т.д. (Вообщем рекурсия). Как вы уже догадались работать всё будеть только для первых записей наборов данных т.к. набор перекроется другим набором и т д. ведь IBQuery один. Следует по-моему перед обработкой каждой записи набора сохранять IBQuery в новый IBQuery (создав конечно его) и при этом он должен быть как бы зеркалом старого, т.е все курсоры должны стоять на тех местах где и стояли т.к. потом после восстановления придётся идти дальше по записям (т.е. положить в стэк IBQuery), а после обработки восстанавливать из сохранённого объекта в старый IBQuery и созданныё убивать.(Вообще это возможно) Так вот как это правильно реализовать или подскажите иной вариант решения проблемы. Или просто расскажите как создавать правильно экземпляры объектов при помощи *.Create. Если можно пример
Спасибо за помошь.
← →
DrPass © (2005-08-18 20:50) [1]Если ты используешь рекурсию, то создавай объект динамически в рекурсивной процедуре. Тогда у каждой итерации будет свой персональный экземпляр. В противном случае получится черт знает что, а не рабочий код
← →
x111 © (2005-08-18 23:13) [2]Я бы так не заморачивался.
процедура обработки IBQuery возвращающая TStringList
одна строка - один запрос.
загружаешь их в IBQuery и выполняешь.
← →
Desdechado © (2005-08-19 12:37) [3]думаю, проще написать рекурсивную ХП с использованием FOR SELECT
функционал как раз по описанию подходит
← →
Juice © (2005-08-19 14:58) [4]
> т.е. положить в стэк IBQuery
И что оно тебе даст ?
← →
Defunct © (2005-08-19 22:00) [5]> как создавать правильно экземпляры объектов при помощи *.Create.
procedure Recurse( <hparams : sometype> );
begin
with TIBQuery.Create( self ) do
try
DataBase := DB;
Transaction := DB.DefaultTransaction;
..
SQL.Add("kuku");
Active := True;
while not Eof do
begin
<read Fileds[i]>
if <some condition> then
Recurse( <some params> );
Next;
end;
finally
free
end
end;
Уж не знаю насколько это правильно. Т.к. не было необходимости использовать такой код
← →
}{ander © (2005-08-20 12:22) [6]2 Desdechado © (19.08.05 12:37) [3]
> думаю, проще написать рекурсивную ХП с использованием FOR SELECT
Не всегда подходит - если уровень рекурсии будет больше 16, то получим ошибку. С этой стороны обработка таких запросов в приложении, имхо, безопаснее. Хотя, если есть абсолютная уверенность, что уровень рекурсии не достигнет 16, тогда согласен ;-)
← →
Desdechado © (2005-08-22 14:07) [7]16 - это теоретическое ограничение
вот такая процедураcreate procedure New_Procedure ( n integer )
returns (n1 integer)
as
begin
n1 = n;
suspend;
if( n < 750 ) then
begin
for select n1 from New_procedure( :n + 1 ) into :n1 do
suspend;
end
end
у меня на 750 остановилась, глубже не захотела
но, имхо, зависит от размеров самой процедуры - контекст выполнения сохряняется-то
← →
White_ (2005-08-23 20:02) [8]Спасибо ребята!
Пока я ждал ответов, вернее почти сказу после того как я задал вопрос (всё из-за DialUp :), выхожу редко), мне пришла мысль какраз о ХП, что с советами многих совпало. Причём всё так красиво получилось что лучше не придумаешь (ну вы сами понимаете мысль одна пришла, затем другая более лучшая, из аналица плохой первой, но пришлось всё делать заново). Вот только теперь меня терзает вопрос на счёт уровня рекурсии говорят и 16 и более. Я так понимаю это зависит от конкретной процедуры (т.е. отводимого места под нее). придётся анализировать
Спасибо огромное каждому за совет.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.016 c