среда, 23 января 2013 г.

Каскадные списки (LOV).Cascade List of values.



       Часто возникает необходимость в  создании на странице двух списков. Причем что бы второй формировался в зависимости  от значения первого. Такие  списки называются каскадными.
       Для создания списков будем использовать стандартную тестовую базу Scott.
В этой базе находится таблицы Dept(отделы)и Emp(сотрудники).


Dept
Название поля
Тип
Описание
Deptno
Number
Номер отдела
Dname
String
Имя отдела
Loc
String
месторасположение

Emp
Название поля
Тип
Описание
Empno
Number
Номер сотрудника
Ename
String
Имя сотрудника
Job
String
Должность
Mgr
Number
Номер руководителя
Hiredate
Date
Дата принятия
Sal
Number
Зарплата
Comm
String
Примечание
Deptno
Number
Номер отдела
       
       Каждый отдел  имеет свой номер и имя. А каждый сотрудник имеет номер, имя и номер отдела к которому он принадлежит. Создадим каскадные списки, что бы при выборе отдела в одном списке, во втором выводились его сотрудники. Приступим.
-          Создайте приложение "CascadeLovApp".
-          Создайте View объекты EmpView и DeptView  на основе таблиц с БД Dept и Emp.
Создайте View объект. В первом окне в поле name напишите CascadeLOV и снизу выберите "Rows populated programmatically, not based on a query" и нажмите  "Next".






           Во втором окне с помощью кнопки New создайте два поля «Dept» и «Emp» c type:Number и с Updatable: Always  и нажмите «Finish»


            В CascadeLOV мы и создадим каскадные списки.
            Откройте CascadeLOV и во вкладке Attributes нажмите один раз по Dept.Добавьте LOV как показано на сл. картинках
                                         





     Далее сделайте тоже самое для Emp, только используя List Data Source:EmpView1, List Attribte:EmpNo, UI Hints:Ename.

     Списки созданы. Теперь нам их надо как то связать. Для этого зайдите во VO объект EmpView  во вкладку Query и создайте Bind Variable : dempno и View Criteria: EmpViewCriteria как показано на сл. картинках.





       После этих операций мы создали  критерий по отбору сотрудников по номеру отдела  ( (Emp.DEPTNO = :dempno ) )  через созданный нами параметр dempno. Теперь нам надо в этот параметр вставить выбираемое значение из списка отделов. Для этого вернитесь  в CascadeLOV и выберите вкладку View Acessors и нажмите на редактирование EmpView1
       В открывшемся окне добавьте созданный нами критерий как показано на картинке и впишите в  Value название нашего поля в CascadeLOV с выбранным отделом, то есть Dept.
Добавим наш VO CascadeLOV в наш AppModule
       Все.Наши каскадные списки созданы и их работу можно проверить в Application Module. Создадим теперь эти списки на форме и добавим операцию Create insert, так как CascadeLOV сейчас пустая и что работать с ней нужно добавить запись 

                Если сейчас запустить cascaelov.jspx, то можно убедиться что списки не выпадают каскадом.
              И что бы они работали, нам необходимо настроить обновление компонентов на странице. Эта настройка происходит с помощью свойств компонент AutSubmit(Обновление компонент(True,False)) и PartialTriggers(в нем указываем компонент от которого зависит обновление и в котором AutoSubmit=True)
                     Установите в SelectOneChoice - Dept свойство autoSubmit="true", а  Установите в SelectOneChoice - Emp свойство partialTriggers="soc1"(id списка Dept).
Каскадный список готов : )