Лабораторная работа № 2. Знакомство со средой разработки Oracle Application Express. Доработка исходного приложения

Задачи:

1)  Изменить поля на странице Создать/Редактировать Работника так, чтобы они отображали выпадающие списки выбора (selection lists).

2)  Добавить на Главной странице ссылку на страницу отчета Работники.

3)  Соединить отчеты Работники и Подразделения. Для этого сначала создать новую область (region) и новый элемент (item) на странице Работники для того, чтобы пользователь мог выбирать подразделение. Затем изменить отчет Работники так, чтобы он отображал только работников выбранного подразделения. В заключение добавить в один из столбцов отчета Подразделения ссылку на отчет Работники, которая будет перенаправлять пользователя на соответствующую страницу и устанавливать фокус на выбранном подразделении.

Создание выпадающих списков выбора производится в два этапа:

·  Создать списки значений (Lists of Values - LOVs) для каждого уникального поля.

·  Изменить поле так, чтобы оно могло отображать выпадающий список, и связать его с необходимым списком значений.

Создание списков значений.

1.  Зарегистрируйтесь в APEX, используя выданные Вам преподавателем регистрационные данные (название рабочей области, имя пользователя, пароль).

2.  Откройте свое приложение в Application Builder.

3.  Щелкните по иконке Shared Components.

4.  На странице Shared Components в секции User Interface щелкните по ссылке Lists of Values.

НЕ нашли? Не то? Что вы ищете?

5.  Создайте список значений для должностей (JOBS):

а.  На странице Lists of Values щелкните по кнопке Create >.

б.  На шаге Source выберите From Scratch («с нуля»).

в.  На шаге Name and Type в поле Name введите JOBS, а в Type выберите Dinamic.

г.  На шаге Query or Static Values замените текст запроса на следующий[1]:

SELECT job_title d, job_id v

FROM oehr_jobs

ORDER BY d

Обратите внимание на подсказку, содержащуюся в названии поля:

«Query (SELECT DISPLAY_VALUE, RETURN_VALUE FROM...):»

Это означает, что важен порядок, в котором возвращаются значения. В первом столбце должно возвращаться отображаемое значение (которое будет видеть пользователь), а во втором – собственно значение, которое будет вставлено в поле таблицы.

д.  Щелкните по кнопке Create List of Values. Созданный список значение отобразится на странице Lists of Values.

6.  Создайте список значений для работников (EMPLOYEES):

а.  На странице Lists of Values щелкните по кнопке Create >.

б.  На шаге Source выберите From Scratch.

в.  На шаге Name and Type в поле Name введите EMPLOYEES, а в Type выберите Dinamic.

г.  На шаге Query or Static Values замените текст запроса на следующий:

SELECT first_name ||' '|| last_name d, employee_id v

FROM oehr_employees

ORDER BY last_name

Обратите внимание на то, что значения в первом столбце представляют собой имя и фамилию работника, разделенные пробелом.

д.  Щелкните по кнопке Create List of Values. Созданный список значений отобразится на странице Lists of Values.

7.  Подобным образом создайте список значений для подразделений (DEPARTMENTS). Значения должны выбираться из таблицы oehr_departments. Роль отображаемого значения должны играть значения столбца department_name, а роль возвращаемого значения – значения столбца department_id.

Связывание элементов со списками значений.

После создания списков значений необходимо настроить визуальные элементы (items) таким образом, чтобы они отображались как выпадающие списки выбора (select lists). По умолчанию визуальные элементы отображаются в виде текстовых полей.

8.  Откройте окно редактирования (Page Definition) для страницы 4 Создать/Редактировать Работника. В разделе Page Rendering найдите секцию Items. В этой секции отображается список всех визуальных элементов страницы. Обратите внимание, что на данный момент все элементы кроме двух имеют тип «Текстовое поле» (Text Field).

9.  Чтобы отредактировать визуальный элемент, отображающий должность (P4_JOB_ID):

а.  В секции Items щелкните по ссылке P4_JOB_ID. Отобразится страница редактирования элемента.

б.  В секции Name выберите Select List в поле Display As.

в.  В секции Label измените значение в поле Label на Должность.

г.  В секции List of Values в поле Named LOV выберите JOBS.

д.  Примените изменения.

10.  Аналогичным образом отредактируйте элемент, отображающий менеджера (P4_MANAGER_ID):

а.  В секции Items щелкните по ссылке P4_MANAGER_ID. Отобразится страница редактирования элемента.

б.  В секции Name выберите Select List в поле Display As.

в.  В секции Label измените значение в поле Label на Менеджер.

г.  В секции List of Values:

·  в поле Named LOV выберите EMPLOYEES.

·  В поле Display Null выберите Yes (отображать неопределенные значения).

·  В поле Null display value (не перепутайте с Null return value) введите
-нет начальника-.

Обратите внимание, что Вы не указывали такую информацию для элемента Должность, т. к. он является обязательным и не может иметь неопределнных значений. Для опциональных же столбцов необходимо указать, что список выбора может содержать и неопределенное (пустое) значение. Кроме того, необходимо определить и подходящий текст, который будет отображаться пользователю, когда в соответствующем поле стоит (или необходимо поставить) неопределенное значение.

д.  Примените изменения.

11.  Аналогично отредактируйте элемент, отображающий подразделение (P4_DEPARTMENT_ID). В качестве названия элемента должно отображаться Подразделение, для неопределенных значений должно отображаться - нет подразделения-. В качестве списка значений выберите DEPARTMENTS.

12.  Запустите страницу.

Обратите внимание, что поля Должность, Менеджер и Подразделение теперь отображаются как выпадающие списки.

13.  Отредактруйте оставшиеся элементы формы так, чтобы для них отображались русскоязычные названия (замените значения в поле Label для каждого элемента на русскоязычное название):

Если сейчас запустить приложение, то можно обнаружить, что нет возможности просмотреть отчет о работниках, т. к. на Главной странице нет никакой ссылки на страницу Работники. На самом деле, перейти к любой странице можно, введя ее полный адрес в адресной строке браузера, например, адрес Главной страницы может выглядеть следующим образом: http://hostname:8080/apex/f? p=107:1::::::. В этой ссылке особый интерес представляет строка f? p=107:1:[2], в которой 107 – это уникальный идентификатор приложения в APEX, 1 – это номер страницы в приложении, а – идентификатор сессии, автоматически генерируемый APEX. Заменив номер страницы в ссылке, можно перейти к соответствующей странице.

Добавьте на Главной странице ссылку на страницу с отчетом Работники:

14.  Откройте окно редактирования страницы 1 Главная.

15.  В секции Regions щелкните по ссылке List (справа от ссылки Navigation). Откроется страница с элементами листа (List Entries), в котором пока только одна ссылка – на страницу Подразделения.

Обратите внимание на строку breadcrumb вверху страницы (номер приложения может отличаться):

Это означает, что компоненты List являются компонентами, разделяемыми на уровне приложения. Щелкнув по ссылке Lists Вы можете просмотреть все имеющиеся в Вашем приложении списки (на данный момент там должен быть только один автоматически сгенерированный список Navigation, который Вы и собираетесь редактировать).

16.  На странице List Entries щелкните по кнопке Create List Entry >. Отобразится страница создания/редактирования элемента списка (Create / Edit List Entry).

17.  На странице Create / Edit List Entry введите следующее:

а.  Sequence – 20.

б.  List Entry Label – Работники.

в.  Page – выберите страницу 3 Работники.

18.  Щелкните Create. На странице List Entries появится добавленная Вами ссылка.

19.  Запустите Главную страницу:

Обратите внимание, что теперь на Главной странице есть ссылка на страницу Работники.

20.  Протестируйте ссылки на Главной странице.

Соединение отчетов.

Соедините отчеты Работники и Подразделения. Для этого:

21.  Откройте Окно редактирования (Page Definition) для страницы 3 Работники.

Сначала необходимо создать область (Region), в которой будет располагаться поле с выпадающим списком подразделений. Область (Region) – это участок на странице, который выполняет роль контейнера для содержимого страницы. Каждая страница может иметь любое количество областей. Внешний вид области задается с помощью шаблона (region template). Области обычно используются для группировки элементов управления на странице – например, визуальных элементов (items) или кнопок (buttons)[3].

22.  В секции Regions щелкните по иконке Create . Отобразится мастер создания области.

23.  На шаге Region:

а.  определите тип области – оставьте тип по умолчанию – HTML, – и щелкните Next >.

б.  Определите тип HTML контейнера – оставьте HTML и щелкните Next >.

24.  На шаге Display Attributes:

а.  Title – введите Подразделение.

б.  Region Template – выберите No Template. Область будет добавлена без заголовка области.

в.  Sequence – измените на 5. Это необходимо, чтобы создаваемая область отображалась над областью Работники (которая имеет sequence = 10).

г.  Оставьте оставшиеся параметры без изменений и щелкните Next >.

25.  Щелкните Create Region.

Обратите внимание, что в секции Regions теперь отображается область Подразделение, имеющая тип HTML.

Создание элемента (item).

Теперь необходимо создать в области Подразделение визуальный элемент (item), который представляет собой выпадающий список выбора, использующий список значений подразделений.

26.  В секции Items щелкните по иконке Create . Отобразится мастер создания визуальных элементов.

27.  На шаге Item Type:

а.  Выберите тип элемента – Select List – и щелкните Next >.

б.  Выберите тип списка – Select List with Submit – и щелкните Next >. Эта опция означает, что страница будет обновляться каждый раз, когда меняется выбор в поле со списком.

28.  На шаге Display Position and Name:

а.  Item Name – замените на P3_DEPARTMENT_ID.

б.  Sequence – оставьте значение 10.

в.  Region – выберите Подразделение.

г.  Щелкните Next >.

29.  На шаге List of Values:

а.  Named LOV – выберите DEPARTMENTS. Этот список значений Вы создали как компонент, разделяемый на уровне приложения (Shared Component), на предыдущем занятии.

б.  Display Null Option – оставьте значение Yes.

в.  Null Text – введите - нет подразделения-.

г.  Null Value – введите -1. Ввод значений, которые подставляются вместо неопределенного значения (Null Value), позволяет облегчить написание запросов (облегчает проверку на Null). В этом случае, когда пользователь выбирает в списке - нет подразделения-, в элементе устанавливается значение -1, и Вы можете использовать это значение в запросе.

д.  Щелкните Next >.

30.  На шаге Item Attributes замените значение Label на Подразделение и щелкните Next >.

31.  На шаге Source:

а.  В поле Default введите -1.

б.  Оставьте остальные параметры без изменений и щелкните Create Item.

Связывание элемента (item) с отчетом.

Итак, Вы создали элемент, который будет принимать значения идентификатора подразделения, но пока еще не соединили его с отчетом. Чтобы сделать это, необходимо отредактировать SQL-запрос в Region Source, добавив в него предложение WHERE.

32.  Откройте окно редактрования (Region Definition) для области Работники.

33.  В поле Region Source добавьте в запрос после предложения FROM следующий текст:

WHERE (DEPARTMENT_ID = :P3_DEPARTMENT_ID or

(DEPARTMENT_ID is null and nvl(:P3_DEPARTMENT_ID,'-1') = '-1'))

Данное предложение WHERE позволит отображать только работников, принадлежащих выбранному подразделению.

Обратите внимание, что подстановочная строка :P3_DEPARTMENT_ID соответствует созданному ранее элементу.

34.  Примените изменения.

Создание перехода (Branch).

Когда на странице выполняется команда submit, переходы (branches), указанные для страницы, определяют, какая страница должна отобразиться следующей.

В данном случае необходимо, чтобы после команды submit на странице Работники снова отобразилась та же самая страница с отчетом о работниках, поэтому необходимо создать переход на страницу Работники.

35.  В окне редактирования (Page Definition) страницы 3 Работники в колонке Page Processing в секции Branches щелкните по иконке Create . Отобразится мастер создания перехода (Create Branch).

36.  На шаге Point and Type оставьте все как есть.

37.  На шаге Target:

а.  В качестве целевой страницы выберите страницу 3 Работники.

б.  Отметьте флажок reset pagination for this page.

Когда установлена эта опция, приложение отображает первую порцию данных, удовлетворяющих запросу. Когда же эта опция не выбрана, то если пользователь просматривал, например, третью порцию данных и выбрал другое подразделение, то ему будет отображена третья порция нового запроса.

в.  Оставьте все остальные параметры без изменений и создайте переход (нажмите Create Branch на шаге Branch Conditions).

38.  Запустите страницу. Выберите подразделение Executive. Должны отобразиться только работники, относящиеся к этому подразделению.

39.  Посмотрите, какие работники не принадлежат ни к одному из подразделений.

40.  Вернитесь в окно редактирования области Работники страницы Работники. В введенном Вами ранее предложении WHERE есть лишнее действие, связанное с обработкой значения null. Упростите предложение WHERE и проверьте его правильность, применив изменения и запустив страницу – при выборе подразделения - нет подразделения - должны отображаться те же самые работники, что и до упрощения.

Добавление ссылки на другую страницу в столбец отчета Подразделения.

Теперь необходимо добавить на странице отчета Подразделения ссылку на страницу отчета Работники. При этом на странице Работники должно устанавливаться выбранное подразделение. Рациональнее всего это сделать, добавив ссылку в один из столбцов таблицы подразделений на странице Подразделения (подобные действия Вы уже выполняли в предыдущей лабораторной работе).

41.  Добавьте ссылку на страницу Работники в столбец Число работников отчета Подразделения. При этом:

а.  в столбце должно по прежнему отображаться число работников;

б.  значения в столбце должны быть выравнены по правому краю;

в.  при переходе по ссылке на странице Работники должна отображаться первая порция из списка работников соответствующего подразделения;

г.  при наведении указателя мыши на ссылку должна высвечиваться подсказка «показать работников» (для этого при редактировании параметров ссылки введите в поле Link Attributes строку: title="показать работников"[4]).

42.  Запустите страницу и проверьте правильность работы ссылки.

43.  Добавьте возможность сортировки в отчете Подразделения по всем столбцам и в отчете Работники по всем столбцам кроме столбца Изменить. Это можно сделать, поставив флажки Sort в разделе Column Attributes в окне редактирования столбцов соответствующего отчета (Report Attributes).

44.  Запустите приложение и добавьте несколько работников в одно из подразделений (IT Support, IT Helpdesk, Manufacturing, …). Проверте работу сортировки по столбцам.

Обратите внимание, что в отчете Подразделения отображаются не все подразделения. Причина в SQL-запросе, который не возвращает запись о подразделении, если в нем нет работников или менеджера. Чтобы в отчете отображались все подразделения, необходимо модифицировать SQL-запрос.

45.  Замените текст запроса в Region Source для области Подразделения на странице Подразделения на следующий:

SELECT d. department_id "Department ID",

d. department_name "Department Name",

count(e2.employee_id) "Number of Employees",

nvl2(e. employee_id, substr(e. first_name,1,1)||'. '|| e. last_name, '') "Manager Name",

c. country_name "Location"

FROM oehr_departments d left join oehr_employees e on d. manager_id = e. employee_id

left join oehr_locations l on d. location_id = l. location_id

left join oehr_countries c on l. country_id = c. country_id

left join oehr_employees e2 on d. department_id = e2.department_id

WHERE

instr(upper(d. department_name),upper(nvl(:P2_REPORT_SEARCH, d. department_name))) > 0

GROUP BY d. department_id, d. department_name,

nvl2(e. employee_id, substr(e. first_name,1,1)||'. '|| e. last_name, ''),

c. country_name

Обратите внимание на следующие моменты:

·  Функция nvl2 принимает 3 параметра: первый параметр проверяется на значение null, если первый параметр is not null, то функция возвращает значение второго параметра (первую букву имени и фамилию), иначе – значение третьего параметра (пустую строку).

·  В предложении FROM используется левое внешнее соединение (left [outer] join), которое означает, что будут выбираться все записи из левой части выражения, даже если для них нет соответствующих записей в правой части. Столбцы, по которым производится соединение, указываются после ключевого слова on.

46.  Примените изменения и запустите страницу.

Обратите внимание, что теперь отображаются все подразделения, даже те, у которых не указаны менеджеры и в которых нет работников.

Контрольные вопросы:

1.  Что необходимо для создания поля с выпадающим списком выбора?

2.  Для каких столбцов необходимо, чтобы в списке выбора содержалось неопределенное (пустое) значение? Как добавить в список выбора неопределенное значение?

3.  Для чего используются области (region)? Какое количество областей может быть на странице?

4.  Можно ли использовать в SQL-запросе отчета значения элементов? Как?

5.  Для чего необходимы переходы (branch)?

[1] Для уточнения названий столбцов таблиц можно воспользоваться средством для просмотра структуры БД – «браузером объектов» (SQL Workshop>Object Browser), открыв его в отдельной вкладке интернет браузера

[2] Более полную информацию можно найти в главе Understanding URL Syntax руководства Oracle® Application Express Application Builder User’s Guide

[3] Более подробную информацию можно найти в главе 9 Controlling Page Layout (параграф Understanding Regions) руководства Oracle® Application Express Application Builder User’s Guide

[4] title – это атрибут элемента <A> в HTML. Элемент <A> (Anchor) используется для пометки фрагмента текста как начала – ссылки (с атрибутом HREF) или цели – якоря (с атрибутом NAME) гипертекстовой ссылки.