Oracle-club: FAQ - Forms


Новости | FAQ | Ссылки | Темы | Утилиты | Documentation | Семинары
Подскажите пожалуйста, есть ли в Oracle Forms глобальные
переменные ? Если есть, то где они зарыты ?
( Невидимые объекты на канве, через которые доступны значения
всем функциям, уже видел, но хочется чего-нибудь поизящней )
С уважением, Поляков А.
---
А как же! К примеру в триггере WHEN-NEW-FORM-INSTANCE
                      можно ее объявить:
                      GLOBAL.YourVariableName:='Значение';
---------------------------
Конечно же есть! Для обращения к ним используй ключевое слово global, но
есть одна особенность - глобальные переменные используют тип CHAR(255),
со всеми вытекающими последствиями. Обращаться к ним можно также как и к
другим переменным, единственное, что нужно - это добавлять префикс
:global
Например: :global.myVar := 'It's my first global of varable';
----------------------------
Можно использовать и PARAMETERS. Бывают char, number, date.
---------------------------
Можно использовать DEFAULT_VALUE built-in, чтобы быть уверенным, что
глобальная переменная существует перед проверкой (в IF например).
Иначе выдается сообщение об ошибке, что глобальной переменной не существует.

> Есть форма созданная под Forms5.0 Win95 > Как мне заставить е_ работать под UNIX SCO ? > Какое програмное необходимо ? 1) Developer 2000 5.0 for SCO 2) Поставить SCO Merge 4.0.2 (но могут возникнуть проблемы)
Forms 3 help need!!! могу порекомендовать свой излюбленный финт ушами : в триггеры базы позасовывать dbms_pipe.send_message(...), а в формочке on-error - if error_code=0 then dbms_pipe.receive_message(..) ...unpack_message(..); message(what_you_have_got); end if;
При выполнении формы после перехода из одного поля в другое происходит автоматическое переключение языка (по умолчанию первичный язык в Windows95 - Русский.). Для операторов это крайне не удобно. Исли кто знает как бороться с этой проблемой подскажите пожалуйста. Спасибо Всем, Я нашел ответ - все дело в dll'ке: tk23w32.dll: Я взял dll'ку tk23w32.dll от Release 1.5 и скопировал в каталог oracle_home\bin\. где у меня стоит Release 1.3.2 и все сразу заработало
Вопрос: Есть проблемка, которая очень мешает жить, а как победить - не знаю. Короче, NT 4.0, Forms 4.5, patch (версию не помню, исправляет глюк с пустым combobox'ом). А сама проблема в том, что при нажатии мышью на кнопку триггер WHEN-BUTTON-PRESSED вызывается только в том случае, если кнопка Navigable=False; Mouse Navigable=False и, до кучи в другом блоке (вот это точно не понял), причем даже так работает не всегда. Ответ: Дело в том, что если кнопка находится в другом блоке, то при нажатии на нее мышкой, при выставленном Mouse Navigate = True, ты переводиш навигацию на другой блок, а в это время в текущем блоке у тебя могут оставться Required поля, которые не заполнены, и поэтому Forms не отрабатывает твой клик и возвращает навигацию назад в текущий блок. Если же Mouse Navigate = False, то перевода навигации не требуется и нажатие мышкой на кнопку отработает.
Вопрос: Как в Forms вместо константы PROPERTY_TRUE (/FALSE) использовать переменную? Ответ: DECLARE v_property number; BEGIN if .... then v_property := PROPERTY_TRUE; else v_property := PROPERTY_FALSE; end if; set_item_property('my_block.my_item',updateable,v_property); ...... END;
Может кто знает как програмно обновить LOV,созданный по группе записей, если отключено автообновление. С использованием populate_group_with_query и populate_group почемуто ничего не получается.
>Подскажите пожалуйста, чего нужно сделать, что бы пользователя не >беспокоили сообщения вроде "Нет изменения для сохранения"? Создайте процедуру, типа нижеприведенной, и используйте всякий раз когда не хотите видеть "Нет изменения для сохранения". PROCEDURE commit2 IS message_level VARCHAR2 (100) := :SYSTEM.MESSAGE_LEVEL; BEGIN IF message_level = '0' THEN :SYSTEM.MESSAGE_LEVEL := '5'; COMMIT_FORM; :SYSTEM.MESSAGE_LEVEL := message_level; ELSE COMMIT_FORM; END IF; END commit2; -- Павел Лузанов

Вопрос:

Кто поделится информацией, где взять Oracle Developer Server. Что это такое? Насколько я понял, нечто типа картриджа для OWAS, однако в его стандартную поставку, кажется, не входит. >Просьба поделиться впечатлениями о его работе, в частности, интересует объем генерируемых Java-апплетов.

Ответ:

Входит в поставку Oracle Developer/2000 2.*. Состоит из трёх компонентов: 1. Forms Server - в сущности - Run Forms, реализованый как ява-апплет. Наличие Oracle Application Server необязательно, т.к. имеет два формата оформления - как картридж, и как хтмл-страница. После некоторой адаптации (шрифты, иконки, и т.п.) крутит на сервере FMX-файлы и отдаёт графический выход по ВЕБу в клиентский браузер, умеющий крутить яву. Он же крутит Графикс и Репортс. Репортс отдаёт в ХТМЛ и ПДФ форматах в зависимости от настройки. Общие впечатления противоречивые - с одной стороны - за дёшево имеешь Формс на ВЕБе (даже достаточно навороченые формы очень презентабельно крутит), с другой - на слишком навороченых формах бывают глюки. Тем не менее продукт впечатляет... 2. Reports Queue Manager - HTML-аналог аналогичного OCX-а. Наличие Oracle Application Server необязательно. 3. Graphics Server - критит по ВЕБу OGD-файлы. Наличие Oracle Application Server обязательно. У меня запустить его в полном объёме пока не удалось. Утешает то, что то же самое, но в явском представлении можно сделать на Forms Server.

Вопрос:

Давно мучает вопрос, возможно ли в триггере Forms, отследить какое-нибудь внешнее событие и по этому условию прекратить выполнение триггера. Или только task-manager может помочь. т.е. хотелось бы: loop if KeyboardPressed then exit; end if; [ cycle body ] end loop;

Ответ:

Есть такая библиотека - D2KWUTIL.PLL В ней есть функция: win_api_utility.interruptcheck(ButtonHandle IN PLS_INTEGER) RETURN BOOLEAN; Я так понял, что тебе надо следующее: 1) Создай кнопку, назови 'CANCEL_BUTTON', никаких триггеров на нее вешать не надо. 2) В том триггере Forms, где хочешь отследить внешнее событие, пишешь код: loop -- if KeyboardPressed then -- заметил разницу ? if win_api_utility.interruptcheck(get_item_property('CANCEL_BUTTON',WINDOW_HANDLE)) then exit; end if; [ cycle body ] end loop; Только что проверил - все работает, единственный недостаток - только под Win. Морозов Владимир (bob@morozov.ryazan.ru)

Вопрос:

Возникла интересная проблемка с FORMS 5.0 - при создании достаточно сложного приложения (размер процедуры или триггера - более 30-50 строк программного кода) он при компиляции выдает ошибку ORA-600 в стоке 0 столбце 0 (т.е. неизвестная ошибка в неизвестном месте по документации). Причем это-же приложение отлично компилируется на Forms 4.5. Место возникновения такой ошибки - случайное, единственная закономерность - возникает на больших процедурах. Глюк этот проявляется всех машинах, куда установлен FORMS 5.0. Версия FORMS 5.0 - 5.0.6.8.0, PL/SQL - 2.3.4.0.0

Ответ:

Это известная проблема Forms 5. Work around давно найден. 1. Закрыть форму 2. Открыть Форму 3. Ctrl+Shit+K в дальнейшем пункт 3 использовать почаще :-(. Раздражает но жить можно. Под Ctrl+Shift+K Вы имеется ввиду Program->Compile All в Form Builder? Мы тоже прежде чем делать какие-то изменения в больших формах, дважды делаем Compile All сразу после открытия этих форм :) Кто еще не пользуется этим, и вынужден переоткрывать форму заново из-за внутренней ошибки Form Builder при попытке Run - возьмите на заметку этот trick! Если сделать Ctrl+Shit+K (Compile All) на больших формах _СРАЗУ_ после открытия, то в дальнейшем использовать Compile All не обязательно. Обычно достаточно ОДНОГО раза. ВТОРОЙ раз нужен, ЕСЛИ после первой компиляции становится "активной" кнопка [Goto Error...] (как будто обнаружены ошибки компиляции), а в окне ошибок ничего нет... Это на ОЧЕНЬ сложных модулях происходит. В этом случае необходимо ВТОРОЙ раз сделать Compile All. И все будет okay. IMHO если делать это всегда ПРИ ОТКРЫТИИ МОДУЛЯ, то вы экономите время на п.п. 1 и 2 .

Новости | FAQ | Ссылки | Темы | Утилиты | Documentation | Семинары