Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1126693482
Булат Шакиров
2005-09-14 14:24
2005.10.09
Россия снизила производство водки на 9%


3-1124798024
Ландграф Павел
2005-08-23 15:53
2005.10.09
Копирование данных из одного .mdb в другой .mdb


1-1127052828
Андрей Молчанов
2005-09-18 18:13
2005.10.09
Узнать, что главная форма является активной для приложения


4-1123759691
BFG9k
2005-08-11 15:28
2005.10.09
Окно с прозрачной областью


14-1126713394
lookin
2005-09-14 19:56
2005.10.09
Кажется, я уже полностью потерял нить идеи компонентосоздания...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский