Страница 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