double arrow

Создание кнопок для работы с формой

Чтобы можно было корректно сохранить изменения данных либо не сохранять их, в форме нужно предусмотреть две кнопки «ОК» и «Отмена». По кнопке «ОК» будет осуществляться вызов процедуры, которая запишет все изменения в БД и закроет форму. По кнопке «Отмена» будет произведен выход из формы без сохранения обновлений.

Для начала требуется создать процедуру, которая будет сохранять данные формы. Для этого в окне 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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: