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

Не получается прервать выполнение отчета

Добавлено: 21 ноя 2011, 14:37
s2176
Добрый день!
Проблема такая:
Есть достаточно сложный ard-отчет. Нужна возможность его прервать.

.form errpo_xls
.ard
...
startNewVisual(vtRotateVisual,vfBreak+vfConfirm+vfTimer+vfThread,'Выгружаю отпуска.....',100);
...
.{ table t1
..
if NextVisual()=false { stopVisual('',0); errpo_xls.fbreak; }
..
.}
.endforn
При нажатии кнопки "Прервать" визуализация прерывается, но на экране остается окно "Формирование Х отчета", которое я никаким образом не могу снять.

Re: Не получается прервать выполнение отчета

Добавлено: 21 ноя 2011, 16:30
RAJAH
Может быть, fexit лучше вместо fbreak? Либо вот так попробовать:

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

errpo_xls.fexit;
exit;

Re: Не получается прервать выполнение отчета

Добавлено: 21 ноя 2011, 17:37
edward_K
И уж лучше restartvisual чем start - stop. У вас визуализация, что осталось на экране просто не знает, что ее прервали.
Если же делаете так, то уж сделайте цикл while и выйдите из него по какой нибудь переменной - чтобы отчет нормально заверщил свою работу.
Возможно в месте вызова ард отчета имеет сделать
if visualisationactive then stopvisual('',0).
А лучше делать на vip или FastReport.

Re: Не получается прервать выполнение отчета

Добавлено: 22 ноя 2011, 09:28
s2176
errpo_xls.fexit; exit; - не помогает.
Проблема, похоже, в том, что внутри цикла по таблице t1 есть еще дюжина вложенных циклов по другим таблицам.
Когда я nextvisual вставила во все циклы, тогда визуализация прервалась, хотя Гал-ка еще какое-то время продолжала что-то делать, т.е. была недоступна для пользователя.
Если я все это переложу в vip, не возникнет ли там такая же проблема?

Re: Не получается прервать выполнение отчета

Добавлено: 22 ноя 2011, 13:00
edward_K

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

.var
 wkl:boolean;
.endvar
.begin
 wkl:=(t1.getfirst table0=0)
 end.
.{ while wkl
.....
.begin
  wkl:=(t1.getnext table=0)
 if not nextvisual wkl:=false
 end.
.} // while wkl
На vip нормально работают функции break (прерывание цикла), exit (выход из процедуры) - вам этого вполне хватит. Делаете вывод в процедуре или в функции и все. StartNewVisual - StopVisual и другие аналогичные пары, которые нужно выполнить независимо от прерывания, делаете в месте вызова этой процедуры, а не в ней самой.
Fcom же заточен под управлениями событиями на vip. В нем самом обрабатывать прерывание не очень удобно, хотя и на vip использование переменой для информации о прерывании тоже полезно.

Re: Не получается прервать выполнение отчета

Добавлено: 23 ноя 2011, 09:50
s2176
Пришлось превратить отчет в интерфейс, теперь прерывание отрабатывает нормально.
Спасибо!