ошибка: FRM47337 Tree node label can not be null при выполнении скрипта DECLARE |
Меню в Oracle Forms
Использование PL/SQL в меню
Как и в случае с формой, вы можете управлять поведением меню и объектами, которые его составляют, во время выполнения, используя PL/SQL и встроенные подпрограммы Forms Builder. Основным отличием PL/SQL-программы, написанной в меню, от программы, написанной в модуле формы, является возможность исключительно косвенного обращения к элементам меню.
Когда вы проектируете и программируете меню, вы должны не забывать о том, что меню - это прежде всего средство быстрого доступа к наиболее часто выполняемым операциям, а не средство для реализации сложной логики приложения: проверки введенных значений, создания блокировок и так далее. Например, если вы создаете элемент меню, выполняющий команду COMMIT, то различные проверки перед сохранением изменений лучше выполнить в соответствующих триггерах модуля формы. Так, выполнение команды DO_KEY('COMMIT') меню аналогично срабатыванию триггера " KEY-COMMIT " формы, поэтому необходимые проверки вычисления можно выполнить в нем. Ниже перечислены основные операции, которые лучше всего отображать в меню:
- взаимодействие с БД Oracle (операции DML и DDL);
- выполнение предыдущих действий;
- выполнение сортировки в блоке, то есть сортировка в блоке по убыванию или возрастанию;
- исполнение команд операционной системы;
- вызов другого продукта Developer (Oracle Reports, Oracle Graphics);
- вызов встроенной подпрограммы DO_KEY для исполнения триггера клавиши;
- вызов пользовательских триггеров встроенной подпрограммой EXECUTE_TRIGGER.
В этом случае использование пользовательских триггеров оправдано, так как в них вы можете выполнять анонимные PL/SQL-блоки с прямым обращением к элементам. Рассмотрим пример программирования элементов меню:
- Взаимодействие с БД Oracle. Например, создайте пункт меню "Новая запись" и напишите для него следующий код:
Команда "Новая запись"
if :system.block_status!='NEW' then create_record; ELSE ... END IF;
- Вызовите пользовательский триггер:
Команда "Описание действия вашего триггера"
EXECUTE_TRIGGER('my_trg');
- Вызовите другие продукты Oracle Developer:
Команда "Печать"
DECLARE rep_url varchar2(300); BEGIN rep_url:='Ошибка! Недопустимый объект гиперссылки. ||'Repsrv&report=my_rep.rdf&desformat=htmlcss&destype=cache ' ||'&userid=user/pw@database&P_NAME =' ||:parameter.param_name ||'¶mform=no'; WEB.SHOW_DOCUMENT(rep_url,'_blank'); END;
- Выполните команду операционной системы, например, запустите калькулятор:
Команда "Калькулятор"
HOST('calc.exe');
- Выполнение сортировки в блоке. Например, выполните сортировку по возрастанию:
Команда "Сортировка по возрастанию"
set_block_property ('block_name', ORDER_BY, :system.current_item ||' asc');
"Магические" элементы
Ранее в этой же главе мы уже затрагивали тему о магических элементах, теперь остановимся на ней подробнее. "Магические", или Мастер-элементы - это элементы, имеющие функциональность по умолчанию и не требующие дополнительной программной обработки. Мастер-элементы полностью соответствуют командам, выполняемым из стандартного меню, и не требуют дополнительного подключения клавиш акселератов и команд PL/SQL, так как Forms Builder выполняет все это автоматически. Ниже приведена табл. 8.2 всех типов Мастер-элементов.
Подключение меню к форме
Для того чтобы подключить меню к форме, необходимо настроить соответствующие параметры модуля формы: имя исполняемого файла меню, место размещения меню, имя меню. Выполните следующее упражнение.
- Создайте новую форму.
- Разместите хотя бы один элемент на форме, чтобы ее можно было запустить. Вы также можете открыть любую существующую форму для выполнения примера.
- Вызовите палитру свойств модуля формы и установите значение свойств, как показано ниже:
Примечание: даже если файл меню расположен в той же директории, что и вызывающая форма, указывайте не только имя меню, но и путь, например, C:\FMENU.
- Откройте меню FMENU и выполните генерацию модуля для создания исполняемого файла FMENU.MMX. Если меню не будет сгенерировано, то при запуске формы вы получите ошибку чтения меню.
- Откройте палитру свойств модуля меню FMENU и установите значение свойств, как показано ниже:
- Main Menu - MYMENU ;
- Menu Directory - c:\forms\example\menu.
Запустите форму на выполнение и попробуйте поработать с меню.
Если при изменении свойств вы допустили ошибку или какой-либо элемент меню не будет содержать PL/SQL-команду, то при попытке запуска меню вы получите сообщение об ошибке (рис. 8.12) - "Невозможно читать файл FMENU".
Если вы работаете с многомодульным приложением, то можете назначить вызываемой форме текущее меню, используя параметр DO_REPLACE процедуры CALL_FORM при вызове формы процедурой CALL_FORM. По умолчанию при вызове формы процедурой CALL_ FORM применяется параметр NO_REPLACE, который означает, что вызываемая форма не будет наследовать меню родителя.
Типы меню
В предыдущих разделах мы с вами научились создавать стандартное меню, элементы которого имели вид текстовых ярлыков. В Oracle Forms вы можете изменять вид отображаемого элемента и его функциональность, изменяя его тип. Свойство "Тип элемента меню" используется для изменения типа отображаемого пункта меню. Создавая элемент меню, вы можете выбрать один из четырех типов (табл. 8.3).
Для того чтобы установить новый тип элемента, достаточно изменить значение свойства "Тип элемента меню" (рис. 8.12).
Радиокнопки и выключатели работают по такому же принципу, как и одноименные элементы модуля формы.
Обращение к элементам меню
Для обращения к элементам меню используйте синтаксис:
имя_меню.имя_элемента
Для получения значения состояния радиокнопки или выключателя (выбор) меню используйте функцию GET_MENU_ITEM_PROPERTY, а для установки значения - функцию SET_MENU_ITEM_PROPERTY.
Создание срываемых меню
Срываемое меню - это меню, которое пользователь может "оторвать" от линейки меню и расположить в любом месте. Для того чтобы создать срываемое меню, выполните следующие действия:
- Находясь в Menu Editor или в навигаторе объектов, выберите меню, например, MYMENU.
- Вызовите палитру свойств для этого меню и установите свойство Tear-off равным True.