Совершенствование приложений Oracle Forms

Многомодульные приложения и библиотеки объектов

Разбить на страницы
Показывать лекцию целиком

В Oracle Forms вы можете разрабатывать приложения, состоящие из одного и более модулей. В этой главе будет рассмотрено создание приложений с многомодульной структурой и обмен данными между составляющими этой структуры (рис. 12.1).

(рис 12.1) Организация многомодульного приложения

Основной вопрос, который возникает, - это какова потребность в таком приложении и какой выигрыш от использования такой архитектуры. Для ответа перечислим основные преимущества использования многомодульного приложения:

  • Отладка.
  • Логика приложения.
  • Масштабируемость и производительность.
  • Остановимся на каждом из пунктов более подробно.

    Отладка - многомодульное приложение проще отладить, так как намного проще разбираться в небольших фрагментах кода и не ставить точки останова по всему приложению в поисках ошибки, а отлаживать конкретный модуль. Если у вас, к примеру, имеется готовое отлаженное приложение, то почему бы не интегрировать его в основной модуль? Это значительно проще и эффективнее, чем дописывать существующее приложение.

    Логика приложения - многомодульное приложение позволяет разбить вашу задачу на логические единицы, тем самым давая возможность дорабатывать и вносить изменения не во все приложение, а лишь в отдельный модуль. Запуская отдельные модули приложения, вы можете определять тип открытия нового модуля, указывая Forms, открывать новую форму в той же сессии, что и родительская, или создать для него отдельную сессию. Логику такого приложения всегда проще понять и модернизировать.

    Производительность - большие формы всегда намного дольше загружаются; а зачем загружать те части приложения, которые в ходе работы оказываются ненужными? В многомодульных приложениях все намного проще, так как необходимые структуры можно загружать по мере их надобности. Приложения, имеющие такую архитектуру, расходуют намного меньше данных.

    Запуск другой формы

    В Oracle Forms для запуска другой формы существуют встроенные подпрограммы, которые перечислены ниже:

  • OPEN_FORM - открывает независимую форму ;
  • CALL_FORM - вызывает модальную форму ;
  • NEW_FORM - заменяет текущую форму.
  • Для более подробного ознакомления с этими процедурами выполните примеры, которые будут приведены далее.

    CALL_FORM - запускает указанную форму, оставляя порождающую форму активной; Forms запускает вызываемую форму с теми же опциями Run Form, что и у порождающей формы. Когда вызываемая форма завершается - по функции EXIT или в результате неправильной передачи управления - обработка возвращается в порождающую форму в точку, откуда исходил вызов CALL. По умолчанию CALL использует параметры HIDE и NO_REPLACE:

  • HIDE заставляет Forms стирать вызывающую форму с экрана перед рисованием вызываемой формы. Если вы используете параметр NO_HIDE, Forms не стирает вызывающую форму перед рисованием вызываемой формы. Это означает, что если вы вызываете форму с параметром NO_HIDE и некоторая страница вызываемой формы меньше области экрана, вызывающая форма выдается фоном.
  • NO_REPLACE заставляет Forms поддерживать характеристику Default Menu Application вызывающей формы. Если вы используете параметр REPLACE, Forms заменяет характеристику Default Menu Application вызывающей формы на характеристику Default Menu Application вызываемой формы.
  • Процедура CALL_FORM имеет много описаний, которые вы можете найти в Online Help Forms.

    Рассмотрим несколько основных способов написаний этих процедур, а также перечислим возможные параметры.

    Синтаксис процедуры CALL_FORM

    CALL_FORM (formmodule_name VARCHAR2);
    CALL_FORM (formmodule_name VARCHAR2, display NUMBER, 
               switch_menu NUMBER,  query_mode NUMBER, 
               data_mode NUMBER, paramlist_name VARCHAR2);
    ...
  • formmodule_name - определяет имя модуля. Тип данных VARCHAR2.
  • display ( HIDE установлен по умолчанию) - Form Builder скрывает вызывающее приложение перед прорисовкой вызванного модуля:
  • NO_HIDE - Form Builder не стирает вызывающую форму перед рисованием вызываемой формы;
  • HIDE - Form Builder скрывает вызывающее приложение перед прорисовкой вызванного модуля.
  • switch_menu ( NO_REPLACE по умолчанию) - заставляет Forms поддерживать характеристику Default Menu Application вызывающей формы:
  • DO_REPLACE - заставляет Form Builder заменить меню по умолчанию на модуль меню вызываемой формы;
  • NO_REPLACE - заставляет Form Builder поддерживать характеристику Default Menu Application вызывающей формы.
  • query_mode ( NO_QUERY_ONLY по умолчанию) - заставляет Form Builder запускать целевой модуль в нормальном режиме, разрешая выполнять операции DML:
  • QUERY_ONLY - заставляет Form Builder запускать формы в режиме RED_ONLY (только чтение), а также запрещает пользователю выполнять операции DML;
  • NO_QUERY_ONLY - заставляет Form Builder запускать формы в нормальном режиме.
  • data_mode ( NO_SHARE_LIBRARY_DATA по умолчанию) - в режиме выполнения Построитель форм не открывает общий доступ к данным библиотеки между формами:
  • SHARE_LIBRARY_DATA - в режиме выполнения построитель форм открывает общий доступ между формами;
  • NO_SHARE_LIBRARY_DATA - в режиме выполнения построитель форм не открывает общий доступ к данным библиотеки между формами.
  • paramlist_name [ID] - имя списка параметров или его идентификатор. С синтаксисом процедуры мы ознакомились, теперь можно перейти к выполнению примеров. Далее приведено два листинга, демонстрирующих вызов формы с параметрами (листинг 12.1) и без (листинг 12.2).
  • BEGIN
     CALL_FORM('FormB', no_hide, no_replace, query_only); 
    END;

    Ниже на рисунке приведен пример из листинга 11, где вызывающая форма не скрывается после запуска другой формы, но, несмотря на это, остается неактивной (рис. 12.2).

    (рис 12.2) Пример вызова формы с параметром NO_HIDE
    (рис 12.2 ) Пример вызова формы с параметром NO_HIDEDECLARE
     pl_id  PARAMLIST; 
    BEGIN
     pl_id := Get_Parameter_List('list_data'); 
     IF NOT Id_Null(pl_id) THEN
      Destroy_Parameter_List( pl_id );
     END IF;
     pl_id := Create_Parameter_List('list_data'); 
     Add_Parameter(pl_id,'l_param',TEXT_PARAMETER,:item.param); 
     CALL_FORM('C:\exemple\Formb',NO_HIDE, no_replace, 
               no_query_only, pl_id); 
    END;

    Предыдущий пример показывает, как с помощью списка параметров (рис. 12.3) можно передать значение переменной. Вы также можете использовать глобальные переменные и пользовательские параметры для передачи значений.

    (рис 12.3) Передача параметров через процедуру CALL_FORM

    Ограничения в использовании CALL_FORM:

  • Передаваемый список параметров может содержать параметры типа TEXT_PARAMETER, но не DATA_PARAMETER.
  • После окончания сессии память, занятая процедурой CALL_FORM, не освобождается и образует стек вызываемых форм, поэтому не стоит злоупотреблять этой процедурой.
  • Запуск формы с помощью процедуры OPEN_FORM

    OPEN_FORM - открывает указанную форму. Эта процедура в основном используется в многомодульных приложениях. Процедура OPEN_FORM может принимать различное число параметров, поэтому существует довольно много способов ее оформления. Ниже приведены некоторые из возможных вариантов написания этой процедуры.

    OPEN_FORM
    (form_name      VARCHAR2); 
    OPEN_FORM
    (form_name      VARCHAR2,
     activate_mode  NUMBER,
     session_mode   NUMBER,
     data_mode      NUMBER,
     paramlist_id   PARAMLIST); ...

    Принимаемые параметры:

  • form_name - имя открываемой формы;
  • activate_mode - управляет передачей фокуса. Это свойство может принимать два значения:
  • ACTIVE - после открытия формы передает фокус управления вызванной форме, делая ее активной;
  • NO_ACTIVE - после открытия фокус управления остается в вызывающем модуле;
  • session_mode - определяет, в какой сессии будет открыта форма. Для этого вам доступны следующие константы:
  • NO_SESSION - указывает, что открываемая форма должна использовать текущую сессию;
  • SESSION - указывает, что для открываемой формы нужно создать новую сессию;
  • data_mode - в режиме выполнения Построитель форм не открывает общий доступ к данным библиотеки между формами;
  • SHARE_LIBRARY_DATA - в режиме выполнения построитель форм открывает общий доступ между формами;
  • NO_SHARE_LIBRARY_DATA - в режиме выполнения построитель форм не открывает общий доступ к данным библиотеки между формами;
  • paramlist_name [ID] - имя списка параметров или его идентификатор.
  • Замечания:

  • Когда вы будете определять параметр ACTIVE или NO_ACTIVE, учтите, что в первом случае все выполняемые операторы, определенные после вызова процедуры, будут игнорироваться, так как фокус немедленно покидает вызывающее окно по завершении открытия новой формы. Если вы выбираете параметр NO_ACTIVE, то все исполняемые операторы, определенные ниже процедуры OPEN_FORM, будут выполнены по окончании загрузки открываемой формы в память.
  • Если вызывающая форма находится в режиме QUERY_ONLY, то и открываемая форма будет находиться в режиме QUERY_ONLY.
  • Ограничения:

  • Если вы используете параметр SESSION, то определение параметра data_mode как SHARE_LIBRARY_DATA вызовет ошибку выполнения (runtime error).
  • Теперь, когда мы ознакомились со всеми особенностями процедуры, выполним примеры, демонстрирующие влияние вышеописанных параметров.

    1.   OPEN_FORM('form_name'); 
    -- открывает форму с параметром NO_ SESSION по умолчанию, 
    -- то есть форма будет открыта в текущей сессии (процессе).
    2.   OPEN_FORM('form_name', activate, no_session) 
    -- открывает форму в текущей сессии и немедленно передает ей управление
    3.   OPEN_FORM('form_name', activate, session); 
    -- открывает форму и создает для нее новую сессию, 
    -- после загрузки форма немедленно получает управление.

    Ниже на рис. 12.4 изображен пример № 2 из листинга 12.3, на котором четко видны две активные формы.

    (рис 12.4) Вызов формы с помощью процедуры OPEN_FORM

    Для того чтобы передать значение в открываемую форму, воспользуйтесь нижеприведенным примером, в котором показано, как передаются параметры через процедуру OPEN_FORM (рис. 12.5).

    (рис 12.5) Передача параметров через процедуру OPEN_FORM
    (рис 12.14) Передача параметров через процедуру OPEN_FORMDECLARE
    pl_id  PARAMLIST; 
    form_name VARCHAR2(20); 
    BEGIN
     pl_id := Get_Parameter_List('list_data'); 
     IF NOT Id_Null(pl_id) THEN
      Destroy_Parameter_List( pl_id ); 
     END IF;
     pl_id := Create_Parameter_List('list_data'); 
     Add_Parameter(pl_id,'l_param',TEXT_PARAMETER,:item.param); 
     OPEN_FORM(Formb',activate, no_session, pl_id); 
    END;

    Объектные библиотеки

    Объектная библиотека ( Object Library ) - это модуль, который может объединять в себе различные наборы объектов, предназначенных для многократного использования. Объектная библиотека - это очень мощная структура, позволяющая хранить в себе всевозможные объекты и программные единицы. Применяя это средство многократного использования объектов, вы получаете возможность хранить в одном объекте однажды созданные объекты и программные единицы для совместной работы в других модулях. Объектная библиотека не имеет редактируемых свойств, кроме имени. Для включения в библиотеку новых объектов используется метод "Drag-and-Drop" ("перетащить и оставить").

    Создание библиотеки

    Для того чтобы создать объектную библиотеку и включить в ней различные объекты, выполните следующие действия:

  • Находясь в навигаторе объектов, выделите узел "Объектные библиотеки" и нажмите кнопку "Создать", после чего появится узел с именем библиотеки и иконкой в виде книги справа от названия.
  • Вызовите палитру свойств библиотеки и назовите ее "My_lib".
  • Находясь в узле "Объектные библиотеки", вызовите всплывающее меню и выберите пункт "Объектная библиотека" для открытия окна библиотеки (рис 12.6(рис 12.6) Объектная библиотека
  • Вы можете включить в библиотеку любой объект модуля формы или программную единицу. Для этого выделите объект, который хотите поместить в библиотеку, и, не отпуская левую кнопку мыши, перетащите его на вкладку библиотеки.
  • Перетаскиваемый объект при попадании в объектную библиотеку не изменяет своих свойств, поэтому отображается в ней с тем же именем и типом, с которым вы его перетащили (рис 12.7(рис 12.7) Перетаскивание объектов
  • После того как вы собрали в объектную библиотеку все необходимые объекты, сохраните ее командой меню "Файл | Сохранить Как". Библиотека хранится в формате .OLB.
  • Вы не можете редактировать или изменять объекты, помещенные в объектную библиотеку, зато вы можете добавить комментарий к объекту, нажав кнопку "Edit Comment", располагающуюся на верхней палитре инструментов. Чтобы добавить комментарий к объекту, нажмите кнопку "Edit Comment" и в появившемся окне "Comment" введите свой комментарий. Чтобы удалить объект из объектной библиотеки, нажмите кнопку "Удалить объект".

    Для повторного использования объекта библиотеки необходимо открыть ее в навигаторе объектов командой меню Файл | Открыть. Чтобы переместить объект в соответствующий модуль из объектной библиотеки, просто перетащите его, не отпуская левую кнопку мыши, в нужное место модуля.

    Библиотека PL/SQL

    Библиотека - это модуль, в котором объединены многократно использующиеся хранимые программы. Библиотеки позволяют однажды созданную программную единицу использовать совместно различными приложениями. Это средство удобно еще и потому, что имеет различные форматы файлов, специфичных своим содержанием. Ниже перечислены форматы фалов библиотеки и их описание:

  • lib_name.PLL - этот файл хранит в себе исходный и специфический для каждой платформы исполняемый код (p-код).
  • lib_name.PLX - этот файл хранит в себе только исполняемый код (скомпилированный).
  • lib_name.PLD - этот файл хранит в себе исходный текст библиотеки.
  • Если перед вами стоит задача скрыть исходный код библиотеки, то вам, несомненно, нужно использовать библиотечный файл .PLX, который содержит только исполняемый код.

    Создание библиотеки

    Для того чтобы создать библиотеку, выполните следующие действия:

  • Находясь в Навигаторе Объектов, выделите узел " Библиотеки PL/ SQL " и нажмите кнопку "Создать", после чего все в том же узле создастся новый узел с названием библиотеки.
  • Раскройте узел " Библиотеки PL/SQL " и выберите узел "Программы" для создания компонентов библиотеки. Находясь в узле "Программы", нажмите кнопку "Создать" для запуска окна "Новая программа", в котором определите имя и тип создаваемой программной единицы (функция, процедура, пакет). В запустившемся PL/SQL-редакторе наберите и скомпилируйте исходный текст программной единицы.
  • Вы также можете вставить уже готовую программную единицу в состав библиотеки, для этого достаточно просто скопировать целевую программу из узла "Программные единицы" модуля.
  • Когда вы пишете программные единицы для библиотек, вы не можете использовать глобальные и системные переменные, параметры и элементы, так как библиотека не компилируется отдельно от формы. Чтобы это обойти, нужно пользоваться встроенными подпрограммами NAME_IN и COPY для непрямого обращения к вышеперечисленным переменным.

    Подключение библиотек к модулю

    Теперь, когда мы научились создавать библиотеки, давайте попробуем их в работе. Для того чтобы подключить библиотеку, выполните следующие действия:

  • Находясь в навигаторе объектов, выделите узел "Attached Library" и нажмите кнопку "Создать" для запуска окна "Attached Library" (рис 12.8(рис 12.8) Окно "Attached Library"
  • Находясь в окне "Связать библиотеку", нажмите кнопку "Просмотр" для выбора подсоединяемой библиотеки из файловой системы.
  • Выбранная библиотека отобразится в поле "Библиотека" с указанием полного пути ее расположения в файловой системе. Нажмите кнопку "Связать" для подключения библиотеки к модулю формы.
  • После подтверждения связывания библиотеки Forms выведет на экран предупреждение (рис 12.9(рис 12.9) Предупреждение "Attached Library"

    Варианты выбора:

  • кнопка "Да" - в этом случае Forms удалит указанный путь к библиотеке и будет искать библиотеку в текущей директории, а затем в директориях, перечисленных в переменной среды PATH ( FORMS%_ PATH и ORACLE_PATH );
  • кнопка "Нет" - в этом случае Forms сохранит путь и во время выполнения будет искать библиотеку строго по указанному пути.
  • Примечание: с точки зрения переносимости нужно выбирать библиотеку без указания пути, так как в Forms определения пути для подключения библиотек хранятся внутренне.
  • После того как вы подтвердили одно из вышеперечисленных действий, библиотека появляется в узле "Attached Library" и готова к использованию.
  • Подключенная библиотека доступна только для чтения, поэтому недоступна для редактирования. Если вы все же хотите отредактировать библиотеку, то откройте ее в навигаторе объектов в узле " Библиотеки PL/ SQL ", для этого выполните Файл | Открыть.

    Для того чтобы обратится к хранимым программам или пакетам, определенным в присоединенной библиотеке, не нужно указывать никаких дополнительных префиксов, то есть все как обычно:

    Var_name:=lib_function_name; Procedure_lib_name;

    Вызов функций и процедур из базы данных

    Иногда не все можно сделать средствами одного только Oracle Forms, поэтому возникает необходимость в написании специфичных функций и процедур, т. к. PL/SQL в Forms не всегда позволяет использовать все расширения этого языка, да и зачем в Forms создавать функции или процедуры, которые уже есть в БД.

    Можно привести еще один пример, суть которого заключается в том, что нужно узнать IP-адрес машины, на которой установлен клиент Forms'a. Как не ищите и не старайтесь, средствами Forms'a вы этого не сделаете, т. к. даже известная нам функция get_application_property(), которая может вывести пароль, строку связи, имя вашей ОС и т. д., не содержит нужной нам константы. Если бы такая задача встала перед вами в другом виде, например, узнать свой IP-адрес в SQL*Plus'e, то все было бы намного проще, т. к. можно ограничиться одной стандартной функцией:

    SELECT SYS_CONTEXT ('USERENV','IP_ADDRESS') FROM Dual;

    После ее выполнения мы получим желаемый результат. Зная это, мы можем написать функцию, которая будет возвращать нужное нам значение:

    create or replace Function IP_ADDR return varchar2 is
    b varchar2(20); begin
    select sys_context('USERENV','IP_ADDRESS') into b from dual;
    return (b); end;

    Теперь нам остается в Forms'e прочитать значение этой функции в какую-либо переменную Forms или элемент текста. Для демонстрации примера создадим кнопку и в триггере WHEN_BUTTON_PRESSED наберем код:

    WHEN_BUTTON_PRESSED
    DECLARE
    a varchar2(20);
    BEGIN
     select имя_схемы.IP_ADDR into a from dual;
     select a into :block_name.item_name from DUAL;
    END;
    /* А лучше всего выбрать эти данные не прямым 
     запросом, причем у нас их два, а просто сделать вот так: */
    BEGIN
     :block_name.item_name:=имя_схемы.IP_ADDR 
    END;

    Из этого примера видно, что в Forms элементу формы можно присвоить значение функции и без выполнения двух запросов, а это намного экономичнее. С помощью такого подхода вы можете легко реализовать любую функцию трассировки БД и многое другое.

    Выполнение команд операционной системы

    В Oracle Forms вы можете выполнять команды операционной системы без особой сложности, используя встроенную процедуру HOST. HOST - выполняет команду операционной системы.

    Синтаксис:

    HOST (SYSCMD IN varchar2, KWD IN number); 
    HOST (SYSCMD IN varchar2);

    Параметры:

    SYSCMD - команда операционной системы.

    KWD - режим выполнения команды OS. Допустимые значения SCREEN и NO_SCREEN. Если вы используете параметр NO_SCREEN, Forms не очищает экран и не запрашивает у оператора выход из команды.

    Если ни один из параметров не указан, то по умолчанию команда выполняется с параметром NO_SCREEN.

    Выполнение команды операционной системы

    HOST ('start notepad.exe', NO_SCREEN); 
    HOST ('start notepad.exe', NO_SCREEN); 
    HOST ('start notepad.exe', NO_SCREEN);
  • Создайте форму и сохраните ее как OS.fmb.
  • Создайте блок и вызовите редактор разметки для автоматического создания холста.
  • Начертите кнопку и элемент текста на холсте.
  • Назовите элемент текста " os_com ", а кнопку - "Старт".
  • Создайте триггер WHEN-BUTTON-PRESSED и наберите в нем код, приведенный в листинге.
    WHEN_BUTTON_PRESSED
    HOST ('start '||:os_com);
  • Запустите форму на выполнение, введите в текстовый элемент команду notepad.exe и нажмите кнопку "Старт", после чего запустится блокнот.
  • Страницы:

    В Oracle Forms вы можете разрабатывать приложения, состоящие из одного и более модулей. В этой главе будет рассмотрено создание приложений с многомодульной структурой и обмен данными между составляющими этой структуры (рис. 12.1).

    (рис 12.1) Организация многомодульного приложения

    Основной вопрос, который возникает, - это какова потребность в таком приложении и какой выигрыш от использования такой архитектуры. Для ответа перечислим основные преимущества использования многомодульного приложения:

  • Отладка.
  • Логика приложения.
  • Масштабируемость и производительность.
  • Остановимся на каждом из пунктов более подробно.

    Отладка - многомодульное приложение проще отладить, так как намного проще разбираться в небольших фрагментах кода и не ставить точки останова по всему приложению в поисках ошибки, а отлаживать конкретный модуль. Если у вас, к примеру, имеется готовое отлаженное приложение, то почему бы не интегрировать его в основной модуль? Это значительно проще и эффективнее, чем дописывать существующее приложение.

    Логика приложения - многомодульное приложение позволяет разбить вашу задачу на логические единицы, тем самым давая возможность дорабатывать и вносить изменения не во все приложение, а лишь в отдельный модуль. Запуская отдельные модули приложения, вы можете определять тип открытия нового модуля, указывая Forms, открывать новую форму в той же сессии, что и родительская, или создать для него отдельную сессию. Логику такого приложения всегда проще понять и модернизировать.

    Производительность - большие формы всегда намного дольше загружаются; а зачем загружать те части приложения, которые в ходе работы оказываются ненужными? В многомодульных приложениях все намного проще, так как необходимые структуры можно загружать по мере их надобности. Приложения, имеющие такую архитектуру, расходуют намного меньше данных.

    Запуск другой формы

    В Oracle Forms для запуска другой формы существуют встроенные подпрограммы, которые перечислены ниже:

  • OPEN_FORM - открывает независимую форму ;
  • CALL_FORM - вызывает модальную форму ;
  • NEW_FORM - заменяет текущую форму.
  • Для более подробного ознакомления с этими процедурами выполните примеры, которые будут приведены далее.

    CALL_FORM - запускает указанную форму, оставляя порождающую форму активной; Forms запускает вызываемую форму с теми же опциями Run Form, что и у порождающей формы. Когда вызываемая форма завершается - по функции EXIT или в результате неправильной передачи управления - обработка возвращается в порождающую форму в точку, откуда исходил вызов CALL. По умолчанию CALL использует параметры HIDE и NO_REPLACE:

  • HIDE заставляет Forms стирать вызывающую форму с экрана перед рисованием вызываемой формы. Если вы используете параметр NO_HIDE, Forms не стирает вызывающую форму перед рисованием вызываемой формы. Это означает, что если вы вызываете форму с параметром NO_HIDE и некоторая страница вызываемой формы меньше области экрана, вызывающая форма выдается фоном.
  • NO_REPLACE заставляет Forms поддерживать характеристику Default Menu Application вызывающей формы. Если вы используете параметр REPLACE, Forms заменяет характеристику Default Menu Application вызывающей формы на характеристику Default Menu Application вызываемой формы.
  • Процедура CALL_FORM имеет много описаний, которые вы можете найти в Online Help Forms.

    Рассмотрим несколько основных способов написаний этих процедур, а также перечислим возможные параметры.

    Синтаксис процедуры CALL_FORM

    CALL_FORM (formmodule_name VARCHAR2);
    CALL_FORM (formmodule_name VARCHAR2, display NUMBER, 
               switch_menu NUMBER,  query_mode NUMBER, 
               data_mode NUMBER, paramlist_name VARCHAR2);
    ...
  • formmodule_name - определяет имя модуля. Тип данных VARCHAR2.
  • display ( HIDE установлен по умолчанию) - Form Builder скрывает вызывающее приложение перед прорисовкой вызванного модуля:
  • NO_HIDE - Form Builder не стирает вызывающую форму перед рисованием вызываемой формы;
  • HIDE - Form Builder скрывает вызывающее приложение перед прорисовкой вызванного модуля.
  • switch_menu ( NO_REPLACE по умолчанию) - заставляет Forms поддерживать характеристику Default Menu Application вызывающей формы:
  • DO_REPLACE - заставляет Form Builder заменить меню по умолчанию на модуль меню вызываемой формы;
  • NO_REPLACE - заставляет Form Builder поддерживать характеристику Default Menu Application вызывающей формы.
  • query_mode ( NO_QUERY_ONLY по умолчанию) - заставляет Form Builder запускать целевой модуль в нормальном режиме, разрешая выполнять операции DML:
  • QUERY_ONLY - заставляет Form Builder запускать формы в режиме RED_ONLY (только чтение), а также запрещает пользователю выполнять операции DML;
  • NO_QUERY_ONLY - заставляет Form Builder запускать формы в нормальном режиме.
  • data_mode ( NO_SHARE_LIBRARY_DATA по умолчанию) - в режиме выполнения Построитель форм не открывает общий доступ к данным библиотеки между формами:
  • SHARE_LIBRARY_DATA - в режиме выполнения построитель форм открывает общий доступ между формами;
  • NO_SHARE_LIBRARY_DATA - в режиме выполнения построитель форм не открывает общий доступ к данным библиотеки между формами.
  • paramlist_name [ID] - имя списка параметров или его идентификатор. С синтаксисом процедуры мы ознакомились, теперь можно перейти к выполнению примеров. Далее приведено два листинга, демонстрирующих вызов формы с параметрами (листинг 12.1) и без (листинг 12.2).
  • BEGIN
     CALL_FORM('FormB', no_hide, no_replace, query_only); 
    END;

    Ниже на рисунке приведен пример из листинга 11, где вызывающая форма не скрывается после запуска другой формы, но, несмотря на это, остается неактивной (рис. 12.2).

    (рис 12.2) Пример вызова формы с параметром NO_HIDE
    (рис 12.2 ) Пример вызова формы с параметром NO_HIDEDECLARE
     pl_id  PARAMLIST; 
    BEGIN
     pl_id := Get_Parameter_List('list_data'); 
     IF NOT Id_Null(pl_id) THEN
      Destroy_Parameter_List( pl_id );
     END IF;
     pl_id := Create_Parameter_List('list_data'); 
     Add_Parameter(pl_id,'l_param',TEXT_PARAMETER,:item.param); 
     CALL_FORM('C:\exemple\Formb',NO_HIDE, no_replace, 
               no_query_only, pl_id); 
    END;

    Предыдущий пример показывает, как с помощью списка параметров (рис. 12.3) можно передать значение переменной. Вы также можете использовать глобальные переменные и пользовательские параметры для передачи значений.

    (рис 12.3) Передача параметров через процедуру CALL_FORM

    Ограничения в использовании CALL_FORM:

  • Передаваемый список параметров может содержать параметры типа TEXT_PARAMETER, но не DATA_PARAMETER.
  • После окончания сессии память, занятая процедурой CALL_FORM, не освобождается и образует стек вызываемых форм, поэтому не стоит злоупотреблять этой процедурой.
  • Запуск формы с помощью процедуры OPEN_FORM

    OPEN_FORM - открывает указанную форму. Эта процедура в основном используется в многомодульных приложениях. Процедура OPEN_FORM может принимать различное число параметров, поэтому существует довольно много способов ее оформления. Ниже приведены некоторые из возможных вариантов написания этой процедуры.

    OPEN_FORM
    (form_name      VARCHAR2); 
    OPEN_FORM
    (form_name      VARCHAR2,
     activate_mode  NUMBER,
     session_mode   NUMBER,
     data_mode      NUMBER,
     paramlist_id   PARAMLIST); ...

    Принимаемые параметры:

  • form_name - имя открываемой формы;
  • activate_mode - управляет передачей фокуса. Это свойство может принимать два значения:
  • ACTIVE - после открытия формы передает фокус управления вызванной форме, делая ее активной;
  • NO_ACTIVE - после открытия фокус управления остается в вызывающем модуле;
  • session_mode - определяет, в какой сессии будет открыта форма. Для этого вам доступны следующие константы:
  • NO_SESSION - указывает, что открываемая форма должна использовать текущую сессию;
  • SESSION - указывает, что для открываемой формы нужно создать новую сессию;
  • data_mode - в режиме выполнения Построитель форм не открывает общий доступ к данным библиотеки между формами;
  • SHARE_LIBRARY_DATA - в режиме выполнения построитель форм открывает общий доступ между формами;
  • NO_SHARE_LIBRARY_DATA - в режиме выполнения построитель форм не открывает общий доступ к данным библиотеки между формами;
  • paramlist_name [ID] - имя списка параметров или его идентификатор.
  • Замечания:

  • Когда вы будете определять параметр ACTIVE или NO_ACTIVE, учтите, что в первом случае все выполняемые операторы, определенные после вызова процедуры, будут игнорироваться, так как фокус немедленно покидает вызывающее окно по завершении открытия новой формы. Если вы выбираете параметр NO_ACTIVE, то все исполняемые операторы, определенные ниже процедуры OPEN_FORM, будут выполнены по окончании загрузки открываемой формы в память.
  • Если вызывающая форма находится в режиме QUERY_ONLY, то и открываемая форма будет находиться в режиме QUERY_ONLY.
  • Ограничения:

  • Если вы используете параметр SESSION, то определение параметра data_mode как SHARE_LIBRARY_DATA вызовет ошибку выполнения (runtime error).
  • Теперь, когда мы ознакомились со всеми особенностями процедуры, выполним примеры, демонстрирующие влияние вышеописанных параметров.

    1.   OPEN_FORM('form_name'); 
    -- открывает форму с параметром NO_ SESSION по умолчанию, 
    -- то есть форма будет открыта в текущей сессии (процессе).
    2.   OPEN_FORM('form_name', activate, no_session) 
    -- открывает форму в текущей сессии и немедленно передает ей управление
    3.   OPEN_FORM('form_name', activate, session); 
    -- открывает форму и создает для нее новую сессию, 
    -- после загрузки форма немедленно получает управление.

    Ниже на рис. 12.4 изображен пример № 2 из листинга 12.3, на котором четко видны две активные формы.

    (рис 12.4) Вызов формы с помощью процедуры OPEN_FORM

    Для того чтобы передать значение в открываемую форму, воспользуйтесь нижеприведенным примером, в котором показано, как передаются параметры через процедуру OPEN_FORM (рис. 12.5).

    (рис 12.5) Передача параметров через процедуру OPEN_FORM
    (рис 12.14) Передача параметров через процедуру OPEN_FORMDECLARE
    pl_id  PARAMLIST; 
    form_name VARCHAR2(20); 
    BEGIN
     pl_id := Get_Parameter_List('list_data'); 
     IF NOT Id_Null(pl_id) THEN
      Destroy_Parameter_List( pl_id ); 
     END IF;
     pl_id := Create_Parameter_List('list_data'); 
     Add_Parameter(pl_id,'l_param',TEXT_PARAMETER,:item.param); 
     OPEN_FORM(Formb',activate, no_session, pl_id); 
    END;

    Объектные библиотеки

    Объектная библиотека ( Object Library ) - это модуль, который может объединять в себе различные наборы объектов, предназначенных для многократного использования. Объектная библиотека - это очень мощная структура, позволяющая хранить в себе всевозможные объекты и программные единицы. Применяя это средство многократного использования объектов, вы получаете возможность хранить в одном объекте однажды созданные объекты и программные единицы для совместной работы в других модулях. Объектная библиотека не имеет редактируемых свойств, кроме имени. Для включения в библиотеку новых объектов используется метод "Drag-and-Drop" ("перетащить и оставить").

    Создание библиотеки

    Для того чтобы создать объектную библиотеку и включить в ней различные объекты, выполните следующие действия:

  • Находясь в навигаторе объектов, выделите узел "Объектные библиотеки" и нажмите кнопку "Создать", после чего появится узел с именем библиотеки и иконкой в виде книги справа от названия.
  • Вызовите палитру свойств библиотеки и назовите ее "My_lib".
  • Находясь в узле "Объектные библиотеки", вызовите всплывающее меню и выберите пункт "Объектная библиотека" для открытия окна библиотеки (рис 12.6(рис 12.6) Объектная библиотека
  • Вы можете включить в библиотеку любой объект модуля формы или программную единицу. Для этого выделите объект, который хотите поместить в библиотеку, и, не отпуская левую кнопку мыши, перетащите его на вкладку библиотеки.
  • Перетаскиваемый объект при попадании в объектную библиотеку не изменяет своих свойств, поэтому отображается в ней с тем же именем и типом, с которым вы его перетащили (рис 12.7(рис 12.7) Перетаскивание объектов
  • После того как вы собрали в объектную библиотеку все необходимые объекты, сохраните ее командой меню "Файл | Сохранить Как". Библиотека хранится в формате .OLB.
  • Вы не можете редактировать или изменять объекты, помещенные в объектную библиотеку, зато вы можете добавить комментарий к объекту, нажав кнопку "Edit Comment", располагающуюся на верхней палитре инструментов. Чтобы добавить комментарий к объекту, нажмите кнопку "Edit Comment" и в появившемся окне "Comment" введите свой комментарий. Чтобы удалить объект из объектной библиотеки, нажмите кнопку "Удалить объект".

    Для повторного использования объекта библиотеки необходимо открыть ее в навигаторе объектов командой меню Файл | Открыть. Чтобы переместить объект в соответствующий модуль из объектной библиотеки, просто перетащите его, не отпуская левую кнопку мыши, в нужное место модуля.

    Библиотека PL/SQL

    Библиотека - это модуль, в котором объединены многократно использующиеся хранимые программы. Библиотеки позволяют однажды созданную программную единицу использовать совместно различными приложениями. Это средство удобно еще и потому, что имеет различные форматы файлов, специфичных своим содержанием. Ниже перечислены форматы фалов библиотеки и их описание:

  • lib_name.PLL - этот файл хранит в себе исходный и специфический для каждой платформы исполняемый код (p-код).
  • lib_name.PLX - этот файл хранит в себе только исполняемый код (скомпилированный).
  • lib_name.PLD - этот файл хранит в себе исходный текст библиотеки.
  • Если перед вами стоит задача скрыть исходный код библиотеки, то вам, несомненно, нужно использовать библиотечный файл .PLX, который содержит только исполняемый код.

    Создание библиотеки

    Для того чтобы создать библиотеку, выполните следующие действия:

  • Находясь в Навигаторе Объектов, выделите узел " Библиотеки PL/ SQL " и нажмите кнопку "Создать", после чего все в том же узле создастся новый узел с названием библиотеки.
  • Раскройте узел " Библиотеки PL/SQL " и выберите узел "Программы" для создания компонентов библиотеки. Находясь в узле "Программы", нажмите кнопку "Создать" для запуска окна "Новая программа", в котором определите имя и тип создаваемой программной единицы (функция, процедура, пакет). В запустившемся PL/SQL-редакторе наберите и скомпилируйте исходный текст программной единицы.
  • Вы также можете вставить уже готовую программную единицу в состав библиотеки, для этого достаточно просто скопировать целевую программу из узла "Программные единицы" модуля.
  • Когда вы пишете программные единицы для библиотек, вы не можете использовать глобальные и системные переменные, параметры и элементы, так как библиотека не компилируется отдельно от формы. Чтобы это обойти, нужно пользоваться встроенными подпрограммами NAME_IN и COPY для непрямого обращения к вышеперечисленным переменным.

    Подключение библиотек к модулю

    Теперь, когда мы научились создавать библиотеки, давайте попробуем их в работе. Для того чтобы подключить библиотеку, выполните следующие действия:

  • Находясь в навигаторе объектов, выделите узел "Attached Library" и нажмите кнопку "Создать" для запуска окна "Attached Library" (рис 12.8(рис 12.8) Окно "Attached Library"
  • Находясь в окне "Связать библиотеку", нажмите кнопку "Просмотр" для выбора подсоединяемой библиотеки из файловой системы.
  • Выбранная библиотека отобразится в поле "Библиотека" с указанием полного пути ее расположения в файловой системе. Нажмите кнопку "Связать" для подключения библиотеки к модулю формы.
  • После подтверждения связывания библиотеки Forms выведет на экран предупреждение (рис 12.9(рис 12.9) Предупреждение "Attached Library"

    Варианты выбора:

  • кнопка "Да" - в этом случае Forms удалит указанный путь к библиотеке и будет искать библиотеку в текущей директории, а затем в директориях, перечисленных в переменной среды PATH ( FORMS%_ PATH и ORACLE_PATH );
  • кнопка "Нет" - в этом случае Forms сохранит путь и во время выполнения будет искать библиотеку строго по указанному пути.
  • Примечание: с точки зрения переносимости нужно выбирать библиотеку без указания пути, так как в Forms определения пути для подключения библиотек хранятся внутренне.
  • После того как вы подтвердили одно из вышеперечисленных действий, библиотека появляется в узле "Attached Library" и готова к использованию.
  • Подключенная библиотека доступна только для чтения, поэтому недоступна для редактирования. Если вы все же хотите отредактировать библиотеку, то откройте ее в навигаторе объектов в узле " Библиотеки PL/ SQL ", для этого выполните Файл | Открыть.

    Для того чтобы обратится к хранимым программам или пакетам, определенным в присоединенной библиотеке, не нужно указывать никаких дополнительных префиксов, то есть все как обычно:

    Var_name:=lib_function_name; Procedure_lib_name;

    Вызов функций и процедур из базы данных

    Иногда не все можно сделать средствами одного только Oracle Forms, поэтому возникает необходимость в написании специфичных функций и процедур, т. к. PL/SQL в Forms не всегда позволяет использовать все расширения этого языка, да и зачем в Forms создавать функции или процедуры, которые уже есть в БД.

    Можно привести еще один пример, суть которого заключается в том, что нужно узнать IP-адрес машины, на которой установлен клиент Forms'a. Как не ищите и не старайтесь, средствами Forms'a вы этого не сделаете, т. к. даже известная нам функция get_application_property(), которая может вывести пароль, строку связи, имя вашей ОС и т. д., не содержит нужной нам константы. Если бы такая задача встала перед вами в другом виде, например, узнать свой IP-адрес в SQL*Plus'e, то все было бы намного проще, т. к. можно ограничиться одной стандартной функцией:

    SELECT SYS_CONTEXT ('USERENV','IP_ADDRESS') FROM Dual;

    После ее выполнения мы получим желаемый результат. Зная это, мы можем написать функцию, которая будет возвращать нужное нам значение:

    create or replace Function IP_ADDR return varchar2 is
    b varchar2(20); begin
    select sys_context('USERENV','IP_ADDRESS') into b from dual;
    return (b); end;

    Теперь нам остается в Forms'e прочитать значение этой функции в какую-либо переменную Forms или элемент текста. Для демонстрации примера создадим кнопку и в триггере WHEN_BUTTON_PRESSED наберем код:

    WHEN_BUTTON_PRESSED
    DECLARE
    a varchar2(20);
    BEGIN
     select имя_схемы.IP_ADDR into a from dual;
     select a into :block_name.item_name from DUAL;
    END;
    /* А лучше всего выбрать эти данные не прямым 
     запросом, причем у нас их два, а просто сделать вот так: */
    BEGIN
     :block_name.item_name:=имя_схемы.IP_ADDR 
    END;

    Из этого примера видно, что в Forms элементу формы можно присвоить значение функции и без выполнения двух запросов, а это намного экономичнее. С помощью такого подхода вы можете легко реализовать любую функцию трассировки БД и многое другое.

    Выполнение команд операционной системы

    В Oracle Forms вы можете выполнять команды операционной системы без особой сложности, используя встроенную процедуру HOST. HOST - выполняет команду операционной системы.

    Синтаксис:

    HOST (SYSCMD IN varchar2, KWD IN number); 
    HOST (SYSCMD IN varchar2);

    Параметры:

    SYSCMD - команда операционной системы.

    KWD - режим выполнения команды OS. Допустимые значения SCREEN и NO_SCREEN. Если вы используете параметр NO_SCREEN, Forms не очищает экран и не запрашивает у оператора выход из команды.

    Если ни один из параметров не указан, то по умолчанию команда выполняется с параметром NO_SCREEN.

    Выполнение команды операционной системы

    HOST ('start notepad.exe', NO_SCREEN); 
    HOST ('start notepad.exe', NO_SCREEN); 
    HOST ('start notepad.exe', NO_SCREEN);
  • Создайте форму и сохраните ее как OS.fmb.
  • Создайте блок и вызовите редактор разметки для автоматического создания холста.
  • Начертите кнопку и элемент текста на холсте.
  • Назовите элемент текста " os_com ", а кнопку - "Старт".
  • Создайте триггер WHEN-BUTTON-PRESSED и наберите в нем код, приведенный в листинге.
    WHEN_BUTTON_PRESSED
    HOST ('start '||:os_com);
  • Запустите форму на выполнение, введите в текстовый элемент команду notepad.exe и нажмите кнопку "Старт", после чего запустится блокнот.
  • Вернуться к учебному плану