Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы к экзамену ИИС.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
445.95 Кб
Скачать

4. Триггер проверяет, чтобы дата заказа билетов не превышала даты проведения спектакля. Иначе выдает ошибку.

SQL> edit ORDERS_T1;

\\Текст триггера:

CREATE OR REPLACE TRIGGER ORDERS_T1

BEFORE

insert on ORDERS

for each row

declare

x date;

begin

select play_date into x

from play

where playid=:new.playid;

if :new.order_date>x then

raise_application_error(-20001, 'Слишком поздно!');

end if;

end;

/

SQL> SET SERVEROUTPUT ON;

SQL> @ ORDERS_T1

Триггер создан.

SQL> insert into orders

2 values (6, 1, 5, 2, '14-06-2009', null, null);

insert into orders

*

ошибка в строке 1:

ORA-20001: Слишком поздно!

ORA-06512: на "SCOTT.ORDERS_T1", line 8

ORA-04088: ошибка во время выполнения триггера 'SCOTT.ORDERS_T1'

SQL> insert into orders

2 values (6, 1, 5, 2, '01-06-2009', null, null);

1 строка создана.

28-29. Разработка клиентского приложения в СУБД Oracle средствами Developer/2000 6i. Описание Oracle Forms.

Developer/2000 обеспечивает комплект компонентов с общими возможностями и общим интерфейсом построителей для создания форм, отчетов и графических диаграмм.

Поддерживается общий интерфейс построителей, включающий Объектный навигатор, редактор макета, редактор PL/SQL и палитру свойств, а также предлагается исчерпывающая оперативная справочная система.

У каждого компонента Developer/2000 имеется набор предварительных установок, которые пользователь может изменять для текущего и последующих сеансов работы с построителем.

Окна Модули

Канвы

Блоки данных

Элементы

Отчеты

Списки значений

Триггеры

Сигналы (Alerts)

Параметры

Меню

Форматы файлов Forms 6i

*.FMB - Файл формы построенного в Forms Builder

*.FMX - Файл формы сгенерированного для выполнения в RunForms

*.PLL - Файл пользовательской библиотеки

*.PLX - Файл сгенерированной пользовательской библиотеки для

использования в сессии RunForm

*.MMB - Файл пользовательского меню построенного в Forms Builder

*.MMX - Файл меню сгенерированного для выполнения в сеансе RunForm

Принципы построения формы в Forms 6i:

Структура формы:

Форма представляет собой объект Вашего приложения , который выполняет определенную функцию той задачи под которую Вы проектируете приложение.

Форма отслеживает события, поступающие из рабочей среды такие как:

активизация / деактивизация формы

аппаратные события (от клавиатуры , мыши ,таймера…)

и т.п.

Перехватить эти события и обработать их по своему алгоритму можно при помощи объявления соответствующих триггеров.

Взаимосвязь формы с таблицами БД Oracle осуществляется с помощью базовых блоков , которые поддерживают функции редактирования, добавления и удаления записей в таблицах БД . Один блок связан содной таблицей или представлением…

Форма отслеживает события, поисходящие в блоке такие как:

активизация / деактивизация блока

добавление / удаление / корректировка записи в блоке

выполнение запроса

сохранение изменений

и т.п.

Для обработки событий на уровне блока необходимо объявить соответствующие триггеры с Вашим текстом обработчика события.

Иначе событие будет обработано стандартным образом…

Триггеры на уровне элемента , блока или формы оформляются в виде PL SQL блоков , программных единиц (процедур , функций , пакетов)

Если программные единицы повторяются в нескольких формах , то имеет смысл вынести их в пользовательские библиотеки…

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

На канвах кроме блоков можно разместить статический текст, рисунки графические объекты и т.п.

При запуске формы на выполнение в сеансе RunForm в первую очередь происходит соединение с базой данных : создается так называемая сессия.

Номер сессии доступен любой форме сеанса RunForm , в процедурах и триггерах БД …

Обмен данных между формами осуществляется с помощью списков параметров и глобальных переменных.

Глобальные переменные после объявления их в одной из форм становятся доступными всем формам и живут до окончания сессии RunForm или до ее уничтожения.

Объявить глобальную переменную можно в любом месте любого PL SQL блока:

:global.my_global:=’USER1’;

:global.other_gl:=’Форма’;

Форме доступны системные переменные в которых хранится состояние текущей сессии :

:system.form_status - состояние формы

:system.current_block - имя текущего блока

:system.message_level - уровень скрытия сообщений Формы и т.д.

Использование Forms Builder для построения форм, меню и библиотек

Основные компоненты Forms Builder

  • Навигатор объектов позволяет Вам оперативно перемещаться между :

формами

меню

библиотеками

и т.д.

создавать,копировать,редактировать одновременно несколько форм , меню и их компонентов

  • Окно свойств объектов

отображает перечень свойств и их значений присущих запрашиваемому объекту

  • Меню

Forms Builder позволяет открыть , создать , удалить объект из дерева компонентов с помощью меню или палитры инструментов навигатора объектов. Через меню определяются и параметры среды разработчика, текущий шрифт, размещение объектов на канвах , вызываются подсказки и т.п. Используя палитру инструментов или меню Вы можете сохранить, запустить на выполнение форму, сгенерировать Ваше меню …

  • Редактор Канвы

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

Толщина и стиль линий графических объектов изменяется через меню Format ;

Расположение объектов канвы выравнивается через меню Arrange;

  • Редактор PL SQL

С помощью редактора PL SQL Вы можете создать тело процедуры , функции или обработчика события в триггере…

  • Редактор меню

С помощью редактора меню Вы можете построить модуль меню с необходимой иерархией.

Cохраните его в виде файла меню *.MMB и сгенерируйте в RunTime *.MMX - файл , который можно подключать к форме…

Место расположения элемента в последовательности навигации определяется его положением под узлом в объектном навигаторе.

31-32. Триггеры форм.

Триггер будет срабатывать при переходе к следующей закладке. Вследствие этого блок данных на целевой закладке станет текущим.

Требуется создать триггер модуля формы WHEN-TAB-PAGE-CHANGED и ввести в его тело следующий код:

declare

name_block_pre varchar2(20);

name_block_curr varchar2(20);

rowcount number;

begin

if :System.Tab_New_Page = 'PTABFILM' then

name_block_curr := 'FILM';

elsif :System.Tab_New_Page = 'PTABKLIENT' then

name_block_curr := 'KLIENT';

else

name_block_curr := 'DOGOVOR';

end if;

Go_Block(name_block_curr);

end;

    1. Необходимо организовать заполнение блоков данных при загрузке формы.

Для этого тело триггера WHEN-NEW-BLOCK-INSTANCE каждого из блоков должно содержать следующий код.

execute_query;

    1. Необходимо создать триггер для проверки правильности введенных данных.

Для этого создать триггер WHEN-VALIDATE-ITEM элемента KLIENTID (Код клиента) блока DOGOVOR (Договор). Триггер должен содержать следующий код:

declare

TYPE cur IS REF CURSOR;

cur_klient cur;

Num NUMBER;

begin

OPEN cur_klient FOR

SELECT KlientID

FROM klient

WHERE KlientID = :DOGOVOR.KlientID;

fetch cur_klient into Num;

if cur_klient%ROWCOUNT < 1 THEN

Set_Alert_Property('ALERT_DOG',TITLE,'Ошибка ввода данных.');

Set_Alert_Property('ALERT_DOG',ALERT_MESSAGE_TEXT,'Клиента с таким кодом не существует в БД.');

Num := SHOW_ALERT('ALERT_DOG');

Go_Item('DOGOVOR.KLIENTID');

CLEAR_ITEM;

:DOGOVOR.KlientID := '';

end if;

CLOSE cur_klient;

end;

    1. Требуется создать два предупреждения ALERT_FILM и ALERT_KLIENT. Предупреждения будут срабатывать при попытке ввода значения первичного ключа уже существующего в БД. Для этого:

  • Свойству Title (заголовок) элементов ALERT_FILM и ALERT_KLIENT присвоить одинаковые «Ошибка ввода данных».

  • В поле свойства Message (сообщение) предупреждения ALERT_FILM ввести «Фильм с таким кодом уже имеется в БД.».

  • В поле свойства Message предупреждения ALERT_KLIENT ввести «Клиент с таким кодом уже имеется в БД.».

  • Свойству Button 1 Label обоих элементов присвоить значение « &OK ».

  • Свойству Button 2 Label обоих элементов присвоить пустое значение.

В тело триггеров WHEN-VALIDATE-ITEM ввести следующий программный код:

  • Для элемента FILMID блока данных FILM:

declare

TYPE cur IS REF CURSOR;

cur_film cur;

Num NUMBER;

begin

OPEN cur_film FOR

SELECT FilmID

FROM film

WHERE FilmID = :FILM.FilmID;

fetch cur_film into Num;

if cur_film%ROWCOUNT > 0 THEN

Num := SHOW_ALERT('ALERT_FILM');

Go_Item('FILM.FILMID');

CLEAR_ITEM;

:FILM.FilmID := '';

end if;

CLOSE cur_film;

end;

    1. Создать предупреждение, которое запрашивало бы согласие пользователя на фиксацию изменений. Для этого следует создать подтверждение ALERT_COMM. Для этого:

  • Свойству Title нового подтверждения присвоить значение «Подтверждение».

  • Свойству Message присвоить значение «Вы действительно хотите зафиксировать изменения в БД, после фиксации отменить изменения станет невозможно?».

  • Свойству Alert Style (стиль сигнала) присвоить значение «Caution».

  • Свойству Button 1 Label присвоить значение « &Да ».

  • Свойству Button 2 Label присвоить значение « &Нет ».

Триггер WHEN-BUTTON-PRESSED кнопки B_COMMIT блока данных BLOCK33 будет содержать код:

if Show_Alert('ALERT_COMM') = ALERT_BUTTON1 then

commit;

end if;

  1. При переходе к другой форме. Тело триггера WHEN-BUTTON-PRESSED этой кнопки должно содержать код:

show_window('WIN_FILM');

Go_Block('FILM');

  1. Для кнопки «Выход». В тело триггера WHEN-BUTTON-PRESSED ввести код:

hide_window('WIN_FILM');

Go_Item('PB_FILM');

  1. Создать триггер модуля формы WHEN-WINDOW-CLOSED, тело которого будет содержать код:

Go_Item('PB_FILM');

  1. Навигация по записям: Чтобы информация автоматически загружалась в поля блока FILM1 при появлении окна WIN_DOGOVORS, необходимо ввести в тело триггера WHEN-NEW-BLOCK-INSTANCE этого блока следующий код:

execute_query;

Выход

Close_form('MODULE1');

Добавить запись

Last_Record;

Create_Record;

Удалить запись

Delete_Record;

Зафиксировать

if Show_Alert('ALERT_COMM') = ALERT_BUTTON1 then

commit;

end if;

Отменить

rollback;

execute_query;

Следующая запись

if :System.Last_Record = 'FALSE' then

Next_Record;

end if;

Предыдущая запись

previous_record;