Чтобы можно было корректно сохранить изменения данных либо не сохранять их, в форме нужно предусмотреть две кнопки «ОК» и «Отмена». По кнопке «ОК» будет осуществляться вызов процедуры, которая запишет все изменения в БД и закроет форму. По кнопке «Отмена» будет произведен выход из формы без сохранения обновлений.
Для начала требуется создать процедуру, которая будет сохранять данные формы. Для этого в окне Object Navigator нужно выбрать узел Программы и в меню выбрать Edit->Create. Теперь в окне Нов. Программа введем имя новой процедуры: SAVE_FORM.
Код процедуры сохранения будет таким:
PROCEDURE SAVE_FORM IS
BEGIN
Post;
Commit_Form;
END;
Следующим шагом необходимо создать служебный блок данных, в котором будут располагаться кнопки «ОК» и «Отмена». Блок необходимо создать с выбором опции Build a new data block manually.
Новому блоку данных присвоим имя TAIL и в Палитре его свойств установим свойство Database Data Block в значение NO, отметив тем самым, что данный блок не связан с БД.
Сделать активным окно с канвой CANVAS4, на которой изображается блок данных DOVER.
|
|
Теперь необходимо в окне Layout Editor на панели инструментов выбрать инструмент Button (кнопка) и разместить на требуемой форме кнопки. Новые кнопки будут помещены скорее всего в блок данных DOVER, поэтому в окне Object Navigator их нужно перетащить мышью в блок TAIL.
В Палитре свойств (Property Palette) первой кнопки установим следующие свойства:
· Name: OK_BUTTON
· Label: OK
Для второй кнопки:
· Name: CANCEL_BUTTON
· Label: Отмена
Чтобы по нажатию кнопок выполнялись нужные действия, следует для каждой из кнопок создать триггер WHEN-BUTTTON-PRESSED, который вызывается при нажатии кнопки.
Для кнопки «ОК» код триггера будет следующим:
Save_Form;
Exit_Form(NO_VALIDATE);
А для кнопки «Отмена»:
Exit_Form(NO_VALIDATE);
Создание триггеров входа и выхода из формы
Триггер, который вызывается при открытии формы – WHEN-NEW-FORM-INSTANCE. В нашей форме необходимо, чтобы при загрузке сразу выполнялись запросы в блоках данных, чтобы можно было видеть, какие данные уже внесены в таблицы.
Заполнение полей из справочников при открытии формы
Чтобы поля, которые были созданы для отображения дополнительных данных справочников, были заполнены соответствующими данными уже при открытии формы, в блоках DOVER и DOVER_SP нужно создать триггеры POST-QUERY.
Код POST-QUERY триггера для блока DOVER:
if:DOVER.kod_org is not null then
SELECT naimen INTO:DOVER.naim_org FROM s_org WHERE kod =:DOVER.kod_org;
end if;
if:DOVER.kod_fiz_lic is not null then
SELECT Concat(Concat(Concat(Concat(fam, ' '), im), ' '), otch) as fio
INTO:DOVER.fio
FROM s_fiz_lic WHERE kod =:DOVER.kod_fiz_lic;
end if;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
Код POST-QUERY триггера для блока DOVER:
if:DOVER_SP.kod_s_naimen is not null then
SELECT naimen INTO:DOVER_SP.naimen FROM s_naimen
WHERE kod =:DOVER_SP.kod_s_naimen;
end if;
|
|
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
Триггер WHEN-NEW-FORM-INSTANCE
Код триггера WHEN-NEW-FORM-INSTANCE:
:System.Message_Level:= '5';
Go_Block('DOVER');
Execute_Query;
Go_Block('DOVER_SP');
Execute_Query;
Go_Block('DOVER');
Триггер WHEN-WINDOW-CLOSED
При закрытии окна формы срабатывает триггер WHEN-WINDOW-CLOSED. Если в форме есть несохраненные данные, то нужно предложить пользователю их сохранить. Для этих целей необходимо использовать сообщение Alert.
Чтобы создать Alert, необходимо в окне Object Navigator выделить узел Alerts и выбрать пункт меню Edit->Create.
Для нового сообщения Alert установим следующие свойства:
· Name: SAVE_ALERT
· Title: Сообщение
· Message: Вы хотите сохранить сделанные Вами изменения?
· Button 1 Label: Да
· Button 2 Label: Нет
· Button 3 Label: Отмена
· Default Alert Button: Button 3
Теперь создадим триггер формы с WHEN-WINDOW-CLOSED следующим кодом:
DECLARE
but NUMBER;
stat VARCHAR2(14);
BEGIN
Go_Block('DOVER');
stat:=:System.Block_Status;
Go_Block('DOVER_SP');
stat:= stat ||:System.Block_Status;
if stat <> 'QUERYQUERY' THEN
but:= Show_Alert('SAVE_ALERT');
if but = ALERT_BUTTON3 then -- Нажали "Отмена"
return;
end if;
if but = ALERT_BUTTON1 then -- Нажали "Да"
Save_Form;
end if;
end if;
Exit_Form(NO_VALIDATE);
END;