Не прерывается цикл

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Не прерывается цикл

Сообщение galover »

Есть следующий код:

Код: Выделить всё

      StartNewVisual(vtRotateVisual, vfTimer + vfBreak + vfConfirm, 'Подождите. Идет запрос данных...', 1);
      {
          // Накладываем баундсы и кондишены на view vPlPorData
          ....
         
         // Получаем NRec-и записей, удовлетворяющих условию фильтра
         vPlPorData._loop PlPor
         {
            // Заполняем временную таблицу 
            insert into tblPlPor set tblPlPor.NRec := vPlPorData.PlPorNRec;

            if (not NextVisual())
            {
               Message('отмена'); // Вот сюда я никак не попадаю :(
               StopVisual('', vfTimer);
               exit;
            }
         }
      }
      StopVisual('', vfTimer);
Так вот на _loop я никак не могу прервать цикл, хотя кнопка <. Прервать .> активна и нажимается. Такое ощущение что в режиме vtRotateVisual я неправильно обрабатываю прерывание. В чем может быть косяк? Заранее спасибо!
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

в общем кажется понятно стало, _loop просто не срабатывал, поскольку выборка была пуста, а бегунок подвисал надолго при первом обращении к таблице view, когда и шла собственно выборка данных, т.е. еще до начала цикла. Вопрос снимается
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

ладно при первом обращении, меня бесит когда при инициализации интерфейса идет подвисание. ну отрисовали бы фейс а при обращении бы и шли по логической таблице.
А так вызываешь фейс - и тишина :) А секунд через 10 нате
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

все зависит от аккуратности программиста.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Кстати заметил, заметное подвисание идет на наложенных condition-ах. На одном еще ничего, но вот на нескольких - туши свет. Видимо (как предположение) для каждого condition-а ЛТ, для отсечения неподходящих записей, прогоняется каждый раз, а не один раз для всех условий. Гораздо эффективнее в таком случае наложить bounds-ы, а уже потом в цикле проверять подходит ли запись по условию, которое содержит condition.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Вообще то правильно "слепленная" create view с наложенными баундсами и ограничениями должна быстрее работать, чем внутри цикловые разного рода if при проходе внутри нее.А пользуетесь узловыми фильтрами ?
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

а если у меня фильтр может вызываться по нескольким условиям? т.е. галочку отметил - накладываем. не отметил - не накладываем.

баундсы работают только по индексу - потому баундсами я обычно отсекаю по датам и уже после кладу кондишны.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Алексей
да, у меня то же самое. Это фильтр и condition на view накладываются по условиям. А condition простой:

Код: Выделить всё

condition ByMultiStatus as (FoundMarker(filterParams.StatusMarker, PlPor.cClassBuh))
Накладываю как PushCondition, попробую переделать на PushConditionForLeave
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Den
да, узловой condition помог, стало заметно быстрее! спасибо!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Алексей писал(а):а если у меня фильтр может вызываться по нескольким условиям? т.е. галочку отметил - накладываем. не отметил - не накладываем.

баундсы работают только по индексу - потому баундсами я обычно отсекаю по датам и уже после кладу кондишны.
А в этом случае нельзя написать на каждый фильтр condition и до обращения с view по условию сразу обложить PushConditionForLeave ?
Вообще конечно не все так тут просто )

Вот здесь, кстати, разработчик немного пытался пояснить как работают некоторые вещи, из того что мы обсуждать тут принялись

http://forum.galaktika.by/viewtopic.php ... 420d#p1271
Ответить