Developer2000 OPEN_FORM встроенный

Я новичок в Developer2000. У меня есть процедура Oracle pl/sql (скажем, proc_submit_request), которая извлекает тысячи запросов и отправляет их планировщику dbms_job. Вызов dbms_job

кодируется внутри цикла для каждого извлеченного запроса.

В настоящее время у меня есть кнопка (скажем, кнопка SUBMIT) на экране форм оракула, нажатие которой вызывает proc_submit_request. Проблема здесь в том, что ... элемент управления не возвращается на мой экран до тех пор, пока ВСЕ полученные запросы не будут отправлены в dbms_job (для завершения требуется несколько часов). Экран становится серым, и до завершения процедуры появляются только песочные часы. proc_submit_request. proc_submit_appears возвращает на экран сообщение о том, что «запросы XXXX отправлены».

Теперь мое требование состоит в том, что после того, как пользователь нажмет кнопку SUBMIT, экран больше не должен быть серым. Пользователь должен иметь возможность переходить к другим экранам, а не просто нажимать на экран отправки, пока вызванная процедура не будет завершена.

Я предложил запускать прослушиватели (скрипты оболочки и вещи на Perl), которые могут прослушивать любые сообщения в канале и запускать запросы в качестве фонового процесса. Но пользователь просит меня исправить проблему в приложении, а не запускать прослушиватели.

Я немного слышал о встроенной OPEN_FORM. Предположим, у меня есть две формы, а именно Форма-1 и Форма-2. Форма-1 вызывает форму-2, используя OPEN_FORM. Теперь возможны ли следующие вещи с использованием OPEN_FORM?

  1. При вызове open_form('Form-2',OTHER-ARGUMENTS...) управление должно быть в форме-1 (т.е. пользователь не должен знать, что открывается другая форма), а форма-2 должна вызывать proc_submit_request.

  2. Пользователь должен иметь возможность переходить на другие экраны в приложении. Но форма-2 все еще должна работать, пока не завершится proc_submit_procedure.

  3. Что произойдет, если пользователь закроет (выйдет) Form-1? Будет ли Form-2 по-прежнему работать?

Пожалуйста, дайте мне ответы или предложите хорошее решение.


person user503604    schedule 10.11.2010    source источник


Ответы (2)


Хорошая мысль о сценарии Form-1, Form-2 - я не уверен, сработает это или нет. Но вот гораздо более простой способ, без необходимости возиться с координирующими формами, скрытыми и работающими, и выходящими на передний план, когда функция фактически возвращает... и т.д., и т.д.

Перепишите свою функцию, которая запускает задания базы данных, чтобы она выполнялась как AUTONOMOUS_TRANSACTION. Взгляните на директиву компилятора PRAGMA AUTONOMOUS_TRANSACTION для более подробной информации. Вы должны использовать это в функции/пакете/процедуре базы данных - это недействительно с формами (по крайней мере, формы 10, не уверен насчет 11).

Затем вы можете сохранить результат задания где-нибудь из своей функции (переменная пакета, таблица и т. д.), а затем использовать встроенный CREATE_TIMER в сочетании с триггером уровня формы WHEN-TIMER-EXPIRED, чтобы проверять место хранения каждые 10 секунд или около того — вы затем может отобразить сообщение пользователю о заданиях и убить таймер с помощью DELETE_TIMER.

person Eddy B    schedule 21.01.2011

Вы можете создать один DBMS_JOB для вызова proc_submit_request. Таким образом, ваша форма должна будет сделать только один вызов; а создание всех остальных заданий будет выполнено в отдельном сеансе.

person Jeffrey Kemp    schedule 29.08.2012