Баксараев Андрей

 

Oracle Forms 6i

Практические занятия

 

Урок 4. Создание формы ведения сотрудников.

              Создание объектов списков значений LOV должностей и отделов.

              Связь  объектов LOV  с блоком ведения сотрудников отделов.

   

 Создадим формочку, в которой можно было бы вводить информацию о сотрудниках, принадлежность их отделу, должности…

 

Откроем форму Lesson3; изменим имя модуля на LESSON4; сохраним форму под именем Lesson4, используя меню File / Save As.

 

Создадим новый базовый блок SOTR связанный с таблицей Sotr и расположенный на канве CANVAS3 .

 

Исключим из канвы поле SOTR_ID, разместив его на Null - канве

 

В блоке Sotr создадим триггер Pre-Insert, для связи поля первичного ключа SOTR_ID с последовательностью SOTR_SEQ.  Тело триггера  будет следующим:

 

select sotr_seq.nextval into :sotr.sotr_id from dual;

 

Вызовем  редактор для канвы Canvas3 и разместим поля блока Sotr в необходимом порядке, удалим статический текст Sotr_Id  и  рамку  вокруг  блока. Изменим размер канвы Canvas3.

 

 

Создадим новое окно Window3  - копию окна Window0 , изменим свойство Title на «Сотрудники отделов» . Установим размеры Window3 согласно размерам канвы Canvas3…

 

Свяжем канву Canvas3 с окном Window3  (Свойство канвы -  Window).


Запустим форму на выполнение.

 

Осуществим навигацию в блок Sotr  (Ctrl-Page Down)

Выполним запрос , обратим внимание на значения полей OTD_OTD_ID и DOL_DOL_ID

 

Попробуйте ввести новую запись и укажите значения полей OTD_OTD_ID и DOL_DOL_ID как 100 и 200 .

 

Попытайтесь сохранить запись и обратите внимание на сообщение об ошибке. Текст ошибки можно посмотреть нажав комбинацию клавиш Shift-F1

 

 

При попытке вставить новую запись в таблицу Sotr отработало ограничение на таблицу SOTR - значения внешних ключей Dol_Dol_Id и Otd_Otd_Id должны ссылаться на существующий первичный ключ соответственно таблиц Dol и Otd. Значений 100 и 200 в них конечно же нет.

 

Чтобы выйти из этой ситуации необходимо знать какому отделу соответствует какой ключ и при вводе нового сотрудника или при переводе его с отдела в отдел заполнять поле Внешнего ключа этим значением…

 

Другой выход подразумевает создание списка значений Lov  и связь его с полями внешних ключей блока, при этом в блок будет добавлено небазовое поле в котором будет отображаться не код отдела, а его наименование …

 

Добавим в блок это небазовое поле:

*   в навигаторе раскроем узел блока SOTR и поместим курсор на узел Items

*   используя меню Navigator / Create, создайте новый элемент блока

*   в окне свойств этого элемента укажите

*   имя элемента Name  как  DSP_NAME

*   базовое свойство Base Table Item как False

*   принадлежность элемента канве Canvas как CANVAS3

*   в навигаторе определим принадлежность  элемента OTD_OTD_ID - Null канве

 

В редакторе канвы Canvas3 разместите поле Dsp_Name на месте, где было поле Otd_Otd_Id. Если есть необходимость в выравнивании объектов, то используйте меню Arrange / Align Objects .  В палитре инструментов редактора канвы выберите инструмент  статический текст и создайте заголовок для поля Dsp_Name, как Отдел.


Создадим в навигаторе новый объект Lov и в качестве запроса укажем новый запрос в новой группе записей:

 

Этот запрос будет возвращать наименование отдела и его первичный ключ.

 

Переименуем объект Lov в LOV1 и группу записей в RG1

 

Свяжите поле Otd_Id объекта Lov1  с  полем  SOTR.OTD_OTD_ID

Свяжите поле Name объекта Lov1 с полем  SOTR.DSP_NAME и определите для этого поля заголовок Отдел

 

 

В свойствах поля Sotr.Dsp_Name укажите связь его со списком значений

LOV как LOV1

LOV For Validation как True


Теперь необходимо создать триггер Post-Change на поле блока Sotr.Otd_Otd_Id, он необходим для  оперативного  отображения в поле DSP_NAME наименования отдела соответствующего ключу otd_otd_id .

 

Тело триггера Post-Change :

 

declare

 cursor c1 is

 select name from otd where otd_id=:sotr.otd_otd_id;

begin

 open c1;

  fetch c1 into :sotr.dsp_name;

  if c1%notfound then

    :sotr.dsp_name:=null;

  end if; 

 close c1;

end;

 

 

В навигаторе объектов измените свойства объекта LOV1:

   Title как Список Отделов

   X Position  на  100

   Y Position  на  50

 

Запустим форму на выполнение …

Перейдем в блок Sotr и выполним запрос .

Обратите внимание на значение поля Отдел

 

Поместите курсор в поле Отдел и вызовите список значений по клавише F9

Выберите из списка новое значение и сохраните запись.

 

Попытайтесь исправить название отдела в поле Отдел на несуществующее

значение. Что произошло?

 

Закройте форму …

 

Создадим новый список значений должностей и их окладов и свяжем его с внешним ключом Sotr.Dol_Dol_Id

 

Для отображения наименования должности и ее оклада необходимо добавить в блок Sotr два небазовых блока  DSP_NAME_D  и  DSP_OKLAD , а также убрать с канвы поле внешнего ключа DOL_DOL_ID :

 

*   в навигаторе раскроем узел блока SOTR и поместим курсор на узел Items

*   используя меню Navigator / Create создайте два новый элемент блока

*   в окне свойств этих элементов укажите

*   имя элемента Name  как  DSP_NAME_D и DSP_OKLAD соответственно

*   базовое свойство этих полей Base Table Item как False

*   принадлежность элементов канве Canvas как CANVAS3

*   в навигаторе определим принадлежность  элемента DOL_DOL_ID - Null канве

 

 

В редакторе канвы Canvas3 разместите поля Dsp_Name_D и Dsp_Oklad  на месте, где было поле Dol_Dol_Id . Если есть необходимость в выравнивании объектов, то используйте меню Arrange / Align Objects.  В палитре инструментов редактора канвы выберите инструмент  статический текст и создайте заголовки для поля Dsp_Name_D и Dsp_Oklad, как  Должность и Оклад соответственно.


Создадим в навигаторе новый объект Lov и в качестве запроса укажем новый запрос в новой группе записей:

 

Select Name_D,Oklad,Dol_Id from Dol

 

Этот запрос будет возвращать наименование должности и оклад.

 

Переименуем объект Lov в LOV2 и группу записей в RG2

 

Свяжите поле Dol_Id объекта Lov2  с  полем  SOTR.DOL_DOL_ID

 

Укажите ширину поля Dol_Id объекта Lov2 значением 0 , для того чтобы оно  не появлялось в списке значений  LOV

 

Свяжите поле Name_D объекта Lov2 с полем  SOTR.DSP_NAME_D и определите для этого поля заголовок Должность

 

Свяжите поле Oklad объекта Lov2 с полем  SOTR.DSP_Oklad и определите для этого поля заголовок Оклад

 

В свойствах поля Sotr.Dsp_Name_D укажите связь его со списком значений

LOV как LOV2

LOV For Validation как True

 

Теперь необходимо создать триггер Post-Change на поле блока Sotr.Dol_Dol_Id, он необходим для  оперативного  отображения в полей 

DSP_NAME_D и DSP_OKLAD наименований  должности и оклада соответствующего ключу dol_dol_id .

 

Тело триггера Post-Change :

 

declare

 cursor c1 is

 select name_d,oklad from dol where dol_id=:sotr.dol_dol_id;

begin

 open c1;

  fetch c1 into :sotr.dsp_name_d,:sotr.dsp_oklad;

  if c1%notfound then

    :sotr.dsp_name_d:=null;

    :sotr.dsp_oklad :=null;

  end if; 

 close c1;

end;

 

 

 

В навигаторе объектов измените свойства объекта LOV2 :

   Title как Список Должностей

   X Position  на  200

   Y Position  на  50


Запустим форму на выполнение …

Перейдем в блок Sotr и выполним запрос .

Обратите внимание на значение полей Отдел , Должность , Оклад

 

 

 

 

Поместите курсор в поле Должность и вызовите список значений по клавише F9.

Выберите из списка новое значение и сохраните запись.

 

Попытайтесь исправить название должности  в поле Должность на несуществующее значение. Что произошло?

Введите несколько новых записей, сохраните изменения.

 

Закройте форму. Сохраните форму, используя меню File / Save