Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sliv0210
Зарегистрирован: 15.02.2016 Сообщения: 18
|
Добавлено: Ср Апр 20, 2016 14:40 Заголовок сообщения: Прерывание выполнения Scan |
|
|
Код следующий:
SCAN @RepTable EXECUTE
{
......
CON @RepTable:1, @RepTable:2, @RepTable:3, @RepTable:4;
......
......
}; -- End SCAN
При выполнении выводится окно с кнопкой <Cancel> и если на нее нажать или давануть на <Esc> то выполнение отчета прерывается и не выполняются все нужные завершающие действия.
Помогите, пжлста, советом...
Как отловить прерывание? |
|
Вернуться к началу |
|
 |
Mikhail
Зарегистрирован: 16.08.2012 Сообщения: 177 Откуда: Москва
|
Добавлено: Ср Апр 20, 2016 15:47 Заголовок сообщения: |
|
|
Если прервали по Esc, то код после SCAN..EXECUTE не выполняется же?
Попробуйте добавить после EXECUTE {...} присвоение значение какой-нибудь переменной и далее анализировать её значение: если проверочное значение не присвоено, стало быть выполнение execute было прервано. |
|
Вернуться к началу |
|
 |
sliv0210
Зарегистрирован: 15.02.2016 Сообщения: 18
|
Добавлено: Чт Апр 21, 2016 06:37 Заголовок сообщения: |
|
|
Именно!
Код после SCAN EXECUTE { }; не выполняется.
Т.е. воообще... Ни вывод MSG, ни проверки переменных... не отрабатывает ничего.  |
|
Вернуться к началу |
|
 |
Mikhail
Зарегистрирован: 16.08.2012 Сообщения: 177 Откуда: Москва
|
Добавлено: Чт Апр 21, 2016 14:47 Заголовок сообщения: |
|
|
Полагал, что в любом случае отработает доп. сегмент after, но сейчас проверил и только убедился в правоте ваших слов. |
|
Вернуться к началу |
|
 |
Mikhail
Зарегистрирован: 16.08.2012 Сообщения: 177 Откуда: Москва
|
Добавлено: Пт Апр 22, 2016 17:39 Заголовок сообщения: |
|
|
Если без использования SCAN не обойтись (например, используя WHILE), и при этом необходимо сразу определить прерывание SCAN (не заглядывая в протокол и т.п.) то можно использовать следующий способ, который у меня сработал.
Тестовый пример:
создал x-процедуру user_scan_interrupt_0:
Код: |
let _int := 0;
scan @x
select
pid
from people
execute
{
};
let _int := 1;
|
затем создал диалог user_scan_interrupt_dlg и в секцию <триггер UPDATE> поместил вызов процедуры user_scan_interrupt_0:
Код: |
execute user_scan_interrupt_0;
|
ну и на последок создал еще одну x-процедуру user_scan_interrupt_1:
Код: |
dialog user_scan_interrupt_dlg;
return _int;
|
Для проверки надо выполнить
Код: |
execute user_scan_interrupt_1;
|
При успешном выполнении RETURN вернет значение _int = 1, если SCAN прервать, то RETURN вернет значение _int = 0.
Наверняка, разработчики могут предложить значительное более простое решение, но я остановился копать, как только получил нужный результат. |
|
Вернуться к началу |
|
 |
Green
Зарегистрирован: 20.09.2013 Сообщения: 32
|
Добавлено: Ср Авг 17, 2016 10:49 Заголовок сообщения: |
|
|
Добавьте секцию exception в scan:
scan @x select * from "#green"
execute {
let _ii += 1;
@@xUtil(sleep 1000);
}
exception {;}
;
return hello;
В скобках exception{...} что-то должно быть, точки с запятой хватает, иначе не отрабатывает. При наличии этой секции, предшествующий ей блок в фигурных скобках (это может быть скан, процедура и т.п.), при возврате ошибки (в том числе cancel), выполняет секцию exception и продолжает выполнение программы. Будьте внимательны, ведь может быть реальная ошибка, а не просто отмена. Как отследить этот нюанс, увы, не знаю. Кто подскажет - буду премного благодарен  |
|
Вернуться к началу |
|
 |
|