Страница 1 из 1

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

Добавлено: 15 мар 2010, 18:18
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 я неправильно обрабатываю прерывание. В чем может быть косяк? Заранее спасибо!

Добавлено: 15 мар 2010, 19:41
galover
в общем кажется понятно стало, _loop просто не срабатывал, поскольку выборка была пуста, а бегунок подвисал надолго при первом обращении к таблице view, когда и шла собственно выборка данных, т.е. еще до начала цикла. Вопрос снимается

Добавлено: 16 мар 2010, 05:50
Алексей
ладно при первом обращении, меня бесит когда при инициализации интерфейса идет подвисание. ну отрисовали бы фейс а при обращении бы и шли по логической таблице.
А так вызываешь фейс - и тишина :) А секунд через 10 нате

Добавлено: 16 мар 2010, 20:51
edward_K
все зависит от аккуратности программиста.

Добавлено: 17 мар 2010, 10:54
galover
Кстати заметил, заметное подвисание идет на наложенных condition-ах. На одном еще ничего, но вот на нескольких - туши свет. Видимо (как предположение) для каждого condition-а ЛТ, для отсечения неподходящих записей, прогоняется каждый раз, а не один раз для всех условий. Гораздо эффективнее в таком случае наложить bounds-ы, а уже потом в цикле проверять подходит ли запись по условию, которое содержит condition.

Добавлено: 17 мар 2010, 11:20
Den
Вообще то правильно "слепленная" create view с наложенными баундсами и ограничениями должна быстрее работать, чем внутри цикловые разного рода if при проходе внутри нее.А пользуетесь узловыми фильтрами ?

Добавлено: 17 мар 2010, 11:23
Алексей
а если у меня фильтр может вызываться по нескольким условиям? т.е. галочку отметил - накладываем. не отметил - не накладываем.

баундсы работают только по индексу - потому баундсами я обычно отсекаю по датам и уже после кладу кондишны.

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

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

condition ByMultiStatus as (FoundMarker(filterParams.StatusMarker, PlPor.cClassBuh))
Накладываю как PushCondition, попробую переделать на PushConditionForLeave

Добавлено: 17 мар 2010, 11:52
galover
Den
да, узловой condition помог, стало заметно быстрее! спасибо!

Добавлено: 17 мар 2010, 12:01
Den
Алексей писал(а):а если у меня фильтр может вызываться по нескольким условиям? т.е. галочку отметил - накладываем. не отметил - не накладываем.

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

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

http://forum.galaktika.by/viewtopic.php ... 420d#p1271