Списки значений (LOV)
Цель лекции: научить слушателя создавать списки значений, управлять их свойствами и ознакомить со встроенными подпрограммами, предназначенными для обработки LOV.
LOV ( List Of Values – список значений ) – список значений представляет данные, содержащиеся в именованном объекте, и предназначенные для выбора возможных значений из некоторого поля. LOV выводит на дисплей диалоговое окно с возможными данными на основе запроса или групп записей. Список значений LOV можно задать двумя способами:
- вручную;
- с помощью LOV Wizard.
В LOV список возможных значений может определяться не только одним столбцом данных, но и несколькими столбцами, что очень удобно и часто используется в моделях типа "Главный-подчиненный" (master-detail), а также позволяет работать с уже сгруппированными и предварительно отсортированными данными. Также списки позволяют оперативно и быстро вводить данные, т. к. свойства автоуменьшения и поиска по LOV позволяют пользователям быстро находить конкретные значения – для этого вам достаточно ввести хотя бы один символ искомого значения; по умолчанию поле поиска содержит символ "%", что означает "вывести все элементы, соответствующие запросу LOV ".
Основные свойства LOV в таблице свойств
Перечислим здесь только основные свойства LOV, так как остальные свойства типа General или Font имеют такие же значения, как и у других объектов.
- Функциональные (Functional):
- Record Group – здесь вы указываете имя Record Group (группы записей), с которой будет работать ваш LOV. При выборе этого значения, если у вас больше одной Record Group, поле значения будет иметь вид выпадающего списка.
- Column Mapping Properties – при выборе этого свойства запускается окно LOV Column Mapping, в котором вы можете задать такие свойства, как Column Title (синоним столбца), Column Names (имена отображаемых столбцов), Return item (возвращаемый элемент), Display Width (указать ширину столбца). Для выбора значения поля Return item нажмите кнопку "Browse", после чего появится окно с возможными вариантами.
- Фильтровать перед отображением – это свойство отвечает за вывод диалога критериев запроса перед выводом LOV, где "Yes" означает, что диалог с критерием запроса будет выведен до списка возможных значений. После того как вы выбрали критерий запроса, нажмите кнопку "Найти".
- Automatic Display (автоматическое отображение) – имеет всего два значения, "Yes" и "No", отвечающих за автоматическое отображение значений LOV на дисплее, то есть если вы установите значение этого свойства на "Yes", то при навигации к элементу, к которому оно подсоединено, будет автоматически отображаться окно LOV.
- Automatic Refresh (автоматическое обновление) – имеет два значения, "Yes" и "No", отвечающих за автоматическое обновления дисплея LOV. "Yes" означает "применить автоматическое обновление" – выполнить запрос при заполнении LOV.
- Automatic Select (автоматический выбор) – имеет два значения, "Yes" и "No", где "Yes" говорит о том, что при сокращении элементов в LOV до одного это значение автоматически выберется в поле.
- Automatic Skip (автоматический пропуск) – в этом поле вы указываете, следует ли перемещать курсор на следующий элемент при заполнении последнего символа в текущем элементе.
- Automatic Position (автоматическая позиция) – имеет два значения, "Yes" и "No", где "Yes" означает, что LOV будет автоматически располагаться возле того поля, из которого был вызван.
- Automatic Column Width (автоматическая ширина столбца) – автоматическое определение ширины колонок. Это свойство в режиме "Yes" разрешает Forms самому определить ширину колонки, что очень удобно, т. к. дает возможность не заполнять эти параметры вручную.
- Физические (Physical):
- X Position – указание координаты размещения LOV по оси Ox;
- Y Position – указание координаты размещения LOV по оси Oу;
- Height – в этом поле указывается высота диалогового окна LOV ;
- W idth – в этом поле указывается ширина диалогового окна LOV.
Вот, в принципе, и все основные свойства для работы LOV, которые вам необходимо знать.
Приступим к созданию LOV. Создавать LOV будем с помощью LOV Wizard в 5 шагов:
- Специфицируем отображаемые LOV значения. Когда вы создаете новый LOV, вы создаете SQL-запрос, который возвращает данные для отображения списка значений LOV. Этот запрос создает новую рабочую группу автоматически, если вы пишете его с помощью LOV Wizard. Если же вы при создании LOV выбираете опцию "Build a new LOV manually", то вы должны помнить, что значения LOV происходят от внутренней структуры данных, называемой Record Group. Поэтому когда вы создаете LOV, вы связываете его с именной группой записей.
- Формат отображения LOV. В LOV элементы отображаются в виде таблицы, и в этом шаге вы выбираете, модифицируете названия поля (столбца), ширину, длину, количество отображаемых столбцов, определяете поля, отображаемые в LOV, и указываете элемент формы, в который будет возвращено значение.
- Привязка LOV к текстовому полю. Вы должны ассоциировать ваш LOV с соответствующим текстовым элементом формы. Это нужно для того, чтобы при входе курсора в элемент или при нажатии какой-либо кнопки автоматически открывалось диалоговое окно LOV.
- Переименование. При создании LOV мы пользовались мастером создания списков значений LOV Wizard, который при создании LOV и Record Group автоматически присваивает имя, состоящее из имени объекта и порядкового номера, поэтому лучше вам изменить имена по умолчанию на более понятные, что придаст вашему приложению большую читабельность.
- Создать вызов LOV в приложении с помощью кнопки либо в ответ на любое другое событие.
Теперь выполним следующее упражнение:
- Откройте ранее созданную нами форму MOBILS.fmb, которую мы делали в предыдущем упражнении. Нам необходимо создать LOV для поля Models блока Mobils. Это делается для того, чтобы пользователь при вводе новой модели мог точно определить фирму для создаваемой модели, проверить, существует ли эта фирма вообще, дабы не нарушить ссылочную целостность, организовать корректный ввод значения, определить для пользователя формат вводимых данных. Также списком значений очень удобно пользоваться в режиме ввода запроса, т. к. вы можете легко просмотреть все возможные критерии выборки.
- Для запуска LOV выберите Tools->LOV Wizard либо в Навигаторе – узел LOV, затем выполните команду Create в меню Навигатора или LOV Wizard – во всплывающем меню.
- После запуска LOV Wizard вы увидите окно (
рис.
14.1).
Здесь вам предлагается два способа построения запроса:
- Build SQL Query – построить запрос с помощью мастера запросов. После нажатия этой кнопки запустится окно, где вам будут предложены следующие возможности: выбрать одну или более таблиц, связать таблицы (если вы выбрали более одной таблицы) и выбрать нужные вам столбцы, пометив нужный вам столбец галочкой.
- Import SQL Query – предлагает вам выбрать из вашей файловой системы ранее созданный вами запрос.
Кнопки, расположенные под редактором SQL Query Statement, выполняют следующие действия:
- Connect – соединяет пользователя с БД, запуская окно соединения;
- C heck Syntax – проверяет введенный вами запрос на ошибки.
Затем для подтверждения нажмите кнопку Apply, после чего Forms сделает неявную проверку Check Syntax введенного вами SQL-предложения, и если проверка завершится успешно, Forms, пока невидимо для вас, создаст Группу записей ( Record Group ) на основе вашего запроса ( SQL Query Statement ).Select MOBILS.MODEL, Firm.Firm_Name From MOBILS m, Firm f where f.Firm_ID=m.Firm_Fk
- Затем появится следующее окно, в котором будут отображены выбранные вами столбцы. Нажмите кнопку с иконкой """, чтобы переместить сразу все столбцы, и нажмите кнопку Next.
- В следующем окне – окно форматирования LOV Display – вам будет предложено задать размеры ( Width ) колонок в дисплее LOV, а также возвращаемое значение Return Value Column, определяющее текстовое поле формы, с которым будет связан наш LOV. Для определения этого значения будет выведено окошко.
К примеру, когда пользователь переведет фокус в поле, связанное с LOV, будет выведено диалоговое окно LOV, в котором будут перечислены возможные значения этого поля. После выбора одного из возможных значений поле, с которым вы работаете, примет выбранное вами значение из списка. Чтобы создать связку, выполните следующие действия:
- Выберите в окне поле, которое хотите связать, затем нажмите кнопку Look up return item и в появившемся окне выберите:
- Models – выберем элемент MOBILS.MODEL;
- Firm – элемент FIRM.Firm_Name.
- После этого при вводе курсора в поле Model будет открываться список значений с данными из элементов MOBILS.MODEL и FIRM.Firm_Name.
- Выберите в окне поле, которое хотите связать, затем нажмите кнопку Look up return item и в появившемся окне выберите:
Теперь создадим кнопку, по нажатию которой будет вызываться наш LOV, и напишем обработчик для вызова списка значений.
- Создайте в блоке MOBILS кнопку, с помощью навигатора или нажав соответствующую кнопку на панели инструментов Редактора разметки (Layout Editor).
- Создав кнопку, перейдите в навигатор, выделите созданную вами кнопку и нажмите правую кнопку мыши. Во всплывающем меню выберите пункт Smart Triggers (специальные триггеры и наиболее часто используемые)-> WHEN_BUTTON_PRESSED.
- В запустившемся PL/SQL-редакторе наберите и скомпилируйте следующий код:
GO_ITEM ('MOBILS.Model'); //— перейти к элементу LIST_VALUES; //— вызвать список значений
- После этого нажмите кнопку Compile PL/SQL Code для компилирования вашего триггера и выполните команду Run Form.
Результат будет следующим: после нажатия кнопки курсор перейдет в элемент MOBILS.Model и вызовет LOV.
Если же вы хотите вызывать LOV автоматически при входе в поле и при этом не писать обработчик для каждого поля, выполните следующие действия.
В объектном навигаторе выделите блок Mobils, затем вызовите всплывающий список правым щелчком мыши и выберите пункт Smart Triggers -> WHEN_NEW_ITEM_INSTANCE. Этот триггер срабатывает всякий раз, когда курсор будет входить в элемент.
Теперь в редакторе PL/SQL напишите следующий обработчик:
Declare a varchar2(20):=:system.current_item; orient varchar2(20):=:system.block_status; begin IF ( orient = 'NEW' or orient = 'INSERT' ) THEN select a into :client.C_name from dual; GO_ITEM ( 'Client.'||a) ; LIST_VALUES; END IF; END;
Мы рассмотрели два основных и наиболее часто применяемых вызова LOV. Можно посоветовать вам использовать второй вариант, так как он более гибкий за счет того, что вы можете управлять выводом LOV в зависимости от статуса блока, и за счет того, что вам не придется узнавать каждый раз имя элемента, для которого нужно вывести соответствующий список.