На каждой вкладке представлены кнопки с операциями, которые можно совершать над таблицей (например, на вкладке Table: Add Column, Modify Column и т.д.). Изучите содержимое вкладок описания созданной таблицы.


Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«КАЛИНИНГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра систем управления и вычислительной техники
О.М. ТОПОРКОВА
МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНЫМ РАБОТАМ
ПО ИЗУЧЕНИЮ ПАКЕТА РАЗРАБОТКИ СЕТЕВЫХ ПРИЛОЖЕНИЙ ORACLE APEX
для студентов направления обучения по бакалавриату
«Прикладная информатика»
Калининград
2015

Оглавление
TOC \o "1-3" \h \z \u Введение PAGEREF _Toc433278968 \h 3Лабораторная работа №1. Структура APEX и начало работы PAGEREF _Toc433278969 \h 4Лабораторная работа №2. Создание базы данных PAGEREF _Toc433278970 \h 9Лабораторная работа №3. Создание исходного приложения PAGEREF _Toc433278971 \h 19Лабораторная работа № 4. Создание связей между отчетами и таблицами PAGEREF _Toc433278972 \h 28Лабораторная работа № 5. Редактирование отчетов PAGEREF _Toc433278973 \h 37Лабораторная работа № 6. Доработка пользовательского интерфейса PAGEREF _Toc433278974 \h 46Лабораторная работа № 7. Выполнение расчетов в отчетах PAGEREF _Toc433278975 \h 54

ВведениеЛабораторный практикум посвящен изучению инструментария для разработки информационных систем в формате веб-приложений на основе СУБД Oracle – Oracle Application EXpress (APEX). Oracle APEX позволяет создавать информационные системы с использованием веб-браузера (среда разработки представляет собой веб-приложение) и не требует от разработчика большого опыта программирования. Со стороны конечного пользователя приложения требуется только браузер и доступ к БД Oracle, на которой запущен APEX.
Выполнение лабораторных работ осуществляется с помощью демонстрационного облачного сервиса: http://apex.oracle.com/i/index.html.
Для выполнения лабораторного практикума привлекаются следующие инструментальные средства:
СУБД MS Access, которая изучается студентами в параллельном учебном курсе «Базы данных»,
табличный процессор MS Excel, знакомый из учебного курса «Информационные технологии»,
язык PL/SQL, описание которого приведено, в частности, по адресу http://www.firststeps.ru/sql/oracle/oracle1.html (осваивается самостоятельно).
При разработке лабораторного практикума использован материал, опубликованный на сайте http://portal.tpu.ru:7777/SHARED/v/VIKOSI/study/ITS. Оригинальная документация пакета APEX находится по адресу: http://docs.oracle.com/cd/E37097_01/doc/doc.42/e35122/toc.htm.
В подготовке методических материалов принимали участие студенты кафедры систем управления и вычислительной техники ФГБОУ ВПО «ФГБОУ ВПО КГТУ» Н. Васильченко и С. Горбачёв.
Рекомендуется в ходе ознакомления с материалом выполнять приведенные по тексту примеры, а затем приступать к реализации своего задания.

Лабораторная работа №1. Структура APEX и начало работыЗадачи:
Изучить структуру APEX.
Ознакомиться с технологией регистрации и начала работы в APEX.
Структура APEX
Oracle APEX инсталлируется в БД Oracle и представляет собой набор таблиц с данными и PL/SQL код. Запуск приложения, построенного с помощью APEX, аналогичен запуску самой среды разработки APEX и представляет собой следующий процесс: браузер посылает URL запрос, который транслируется в соответствующий PL/SQL-вызов APEX. После того, как БД выполнит PL/SQL код, результаты возвращаются обратно в браузер в виде HTML.
Возможны два варианта архитектуры Oracle APEX, зависящие от версии сервера Oracle:
Версии до 11.1 требуют установки Oracle HTTP Server (Apache) с mod_plsql:

Начиная с версии Oracle Database 11.1 или Oracle Database 10g Express Edition можно заменить Oracle HTTP Server (Apache) встроенным PL/SQL-шлюзом (embedded PL/SQL gateway):

Встроенный PL/SQL шлюз выполняет функции веб-сервера и обеспечивает необходимую инфраструктуру для создания динамических веб-приложений. Использование такого шлюза упрощает архитектуру и устраняет промежуточный слой.
Приложения разрабатываются в рамках рабочих областей. Рабочая область (workspace) – это виртуальная частная база данных, которая позволяет множеству пользователей работать с одной инсталляцией Oracle APEX, обеспечивая при этом приватность пользовательских объектов и приложений:

В Oracle APEX выделяются следующие роли пользователей:
Администраторы рабочих областей – пользователи, которые выполняют задачи, специфичные для управления рабочими областями, – управление учетными записями пользователей, мониторинг активности, просмотр лог-файлов.
Разработчики – пользователи, которые создают и редактируют приложения; могут иметь отдельные рабочие области или разделять общие.
Конечные пользователи – не имеют привилегий разработчиков.
Администраторы Oracle APEX – это суперпользователи, которые управляют всеми ресурсами экземпляра Oracle APEX с помощью сервисов Application Express Administration Services.
Взаимодействие пользователей с APEX показано на рисунке:

Начало работы
Для начала работы в APEX необходимо зайти на главную страницу сервиса по адресу http://apex.oracle.com/i/index.html, нажать кнопку Get Started и зарегистрироваться через кнопку Free Workspace.
При регистрации нужно указать, что Вы студент и хотите ознакомиться с этим приложением, тогда на указанный адрес электронной почты придет подтверждение в виде идентификатора рабочей области (work space), логина (login или user name) и пароля (password) (поскольку диалог в среде APEX англоязычный, можно пользоваться переводчиком по адресу http://translate.google.ru).
Каждый следующий раз работы в данной среде после входа на главную страницу сервиса надо найти кнопку Sign In и ввести свои данные:

После чего появляется главная страница среды разработки APEX:

Назначение используемых в лабораторном практикуме опций (они дублируются пунктами главного меню вверху):
Application Builder позволяет создавать HTML-интерфейс (или приложение) в дополнение к объектам БД - таблицам и процедурам. Каждое приложение в APEX представляет собой коллекцию страниц (page), связанных друг с другом при помощи вкладок (tabs), кнопок (buttons) или гипертекстовых ссылок (hyper text links). Страница – это основной строительный блок приложения, который содержит также элементы пользовательского интерфейса – вкладки, списки (lists), кнопки, элементы (items) и области (regions). При создании приложения и/или страницы им автоматически присваивается оригинальный номер: номер приложения – целое число, идентифицирующее приложение в системе в целом; номер страницы различает страницы внутри одного приложения и имеет структуру Р?, где ? – целое положительное число. Образование других идентификаторов можно проследить по ходу решения прикладных задач.
SQL Workshop предоставляет инструменты для просмотра и управления объектами БД – таблицами и процедурами:
Object Browser – позволяет просматривать, создавать, изменять, читать содержимое и удалять объекты БД.
SQL Commands – позволяет запускать команды SQL и PL/SQL, скрипты и сохраненные запросы.
SQL Scripts – позволяет создавать, редактировать, просматривать, запускать и удалять файлы скриптов, а также загружать файлы скриптов из и в локальную файловую систему.
Query Builder – позволяет искать и отфильтровывать объекты БД, выбирать объекты и столбцы, создавать связи между объектами, просматривать отформатированные результаты запросов, сохранять запросы. Графический интерфейс построителя позволяет делать это, обладая минимальными знаниями SQL.
Utilities позволяет импортировать и экспортировать данные из БД, генерировать DDL-код, просматривать отчеты, восстанавливать удаленные объекты БД и выполнять другие задачи.
Правый столбик главной страницы среды APEX - вспомогательный.
В середине окна - новости, тут выводятся все сообщения, которые пользователи оставляют друг другу. Для примера можно добавить сообщение о начале работы в проекте.
Две нижних панели - статистика, показывающая, с какими приложениями и кто из пользователей работал в последнее время.
Можно пощелкать по кнопкам и посмотреть, что к чему. Например, можно сменить пароль, выбрав в меню Administration опцию Change My Password.

Задание к работе
Зарегистрироваться в системе:
Имя рабочей области – фамилия студента в транслитерации. Транслитерация здесь и далее – это запись русскоязычного текста латинскими буквами, например, фамилия Иванов запишется как Ivanov.
Логин и пароль – произвольные. Рекомендуется имена рабочей области, логина и пароля записать и сохранить, поскольку они будут использоваться всякий раз при выполнении лабораторных работ.
Зайти в систему и ознакомиться со структурой главной страницы среды APEX.

Лабораторная работа №2. Создание базы данныхЦель работы – получение навыков описания таблиц БД Oracle APEX и заполнения их данными.
Задачи:
Описать структуры простых таблиц БД.
Заполнить таблицы данными.
Создать связи между таблицами.
Для знакомства с технологией APEX в последующих работах решается ряд прикладных задач на БД, описывающей структуру некоторой торговой корпорации. Первоначальная схема БД, полученная с помощью СУБД Access, представлена на рис. 1.1 (некоторые таблицы будут добавляться по ходу выполнения лабораторных работ):

Рисунок 1.1. Логическая схема БД, представленная средствами СУБД Access
БД включает 5 основных таблиц (далее приведены описания этих таблиц в конструкторе СУБД Access):
Countries:

Departments:


Locations:

Employees:

Jobs:

Фрагменты самих таблиц, созданных в СУБД Access, показаны ниже. Они демонстрируют примеры данных, заполняющих БД:
COUNTRIES
country_id country_name
11 Россия
… …
LOCATIONS
location_id city country_id postal_code street_address state_province
123 Калининград 11 123456 Советский пр. Калининградская обл.
… … … … … …
DEPARTMENTS
department_id department_name manager_id location_id
111 Виктория 1 123
… … … …

EMPLOYEES
employee_id first_name last_name hire_date salary commission_pct phone_number job_id department_id
1 Иванов Иван 01.12.1989 12000 15 23-34-56 1 111
… … … … … … … … …
JOBS
job_id job_title
1 управляющий
… …

Между таблицами сформированы связи (показаны на рис. 1.1 стрелками), позволяющие соединить между собой данные в единую систему. Наличие таких связей обеспечивает целостность данных в системе. Так, при попытке удалить родительскую запись выводится диагностическое сообщение о невозможности данной операции, поскольку существуют связанные записи. Таким образом, для удаления родительской записи сначала нужно удалить все подчиненные ей.
Кроме основных таблиц, в схеме представлена вспомогательная таблица Departments_1, которая сформирована самой СУБД для представления связи между основными таблицами (формирование связей рассматривается далее в данной работе).
Создание простых таблиц
Рассмотрим для начала технологию создания простых, не связанных между собой, таблиц в APEX на примере таблиц Countries и Locations:
Запуск мастера создания таблиц:
Откройте SQL Workshop и запустите Object Browser.
Щелкните по кнопке Create в правом верхнем углу страницы. Отобразится список типов объектов БД, которые можно создать.
Щелкните по ссылке Table. Запустится мастер создания таблицы. Вверху в виде линейного графика отражаются шаги создания таблицы. Активный шаг – Columns.
В поле Table Name введите название таблицы - Countries:
Поля Column Name (Имя столбца), Type (Тип Данных), Precision (Точность, Максимальный размер), Scale (Размер, Количество знаков после запятой), Not Null (Обязательное) предназначены для описания столбцов создаваемой таблицы. Добавьте описания следующих столбцов:
Столбец с названием country_id, тип данных – Number(4), обязательный. В этом столбце будет храниться уникальный числовой идентификатор страны.
Столбец с названием country_name, тип данных – Varchar2(20), обязательный. В этом столбце будет храниться название страны.
Нажмите Next>.
На шаге Primary Key:
В поле Primary Key выберите Populated from a new sequence (значения столбца первичного ключа будут браться из нового объекта-последовательности). Последовательность (Sequence) – это объект БД, который используется для генерации уникальных числовых значений.
В полях Primary Key Constraint Name (Название ограничения целостности первичного ключа) и Sequence Name (Название последовательности) оставьте значения по умолчанию, сгенерированные APEX.
В поле Primary Key (Первичный ключ) выберите столбец country_id.
Нажмите Next>.
Шаг Foreign Key (Внешний ключ) пропустите (т.е. нажмите Next>), т.к. в создаваемой таблице пока нет ссылок на другие таблицы.
На шаге Constraints (Ограничения целостности) добавьте уникальный ключ, определенный на столбце country_name:
Выберите радиокнопку Unique (Уникальный ключ).
В появившееся ниже поле-список Key Column(s) (Столбцы ключа) перенесите столбец country_name.
В поле Name должно быть указано название создаваемого ограничения целостности. Это имя должно быть уникальным в БД. Оставьте значение, предлагаемое по умолчанию.
Нажмите кнопку Add, чтобы добавить ограничение в список ограничений целостности создаваемой таблицы.
Нажмите Next>.
На шаге Confirm можно просмотреть сгенерированный мастером SQL-скрипт по созданию таблицы, щелкнув по ссылке . Подтвердите создание таблицы, нажав на кнопку Create Table.
Созданная таблица появится в списке таблиц. Для выбранной таблицы в центральной части Object Browser отображается ее детальное описание, организованное в виде вкладок (Table, Data, Indexes, Model, Constraints, …). На каждой вкладке представлены кнопки с операциями, которые можно совершать над таблицей (например, на вкладке Table: Add Column, Modify Column и т.д.).
Изучите содержимое вкладок описания созданной таблицы.
Найдите и изучите описание созданного объекта-последовательности (Sequences).
Аналогичным образом создайте новую таблицу, предназначенную для хранения сведений о местах размещения отделений торговой корпорации:
Название таблицы - Locations.
В таблице должны быть определены столбцы следующим образом:
location_id - Number(4),обязательный,
city - Varchar2(40),обязательный,
country_id - Number(4),
postal_code – Number(6),
street_address - Varchar2(40),
state_province - Varchar2(40)
Обратите внимание на столбец country_id: при формировании связей между таблицами он будет содержать ссылку на страну (на запись в соответствующей таблице). Поэтому он должен иметь тот же тип данных и размер, что и столбец первичного ключа в созданной ранее таблице countries.
В первичный ключ должен входить столбец location_id, значения для него должны браться из новой последовательности, которая должна быть создана.
Изучите содержимое вкладок описания созданной таблицы. Обратите внимание на вкладку Model. На ней отображаются таблицы, на которые ссылается данная таблица, и которые ссылаются на данную таблицу. Поскольку мы создали простые, не связанные таблицы, в окне показана отдельная таблица.
Ниже в качестве справочного материала приведены некоторые соответствия между типами полей в Access и APEX:
Тип поля Access Тип поля Oracle
Числовой, все форматы, в том числе:
Счетчик, длинное целое,
Действительное
Денежный NUMBER — числовые данные
Текстовое VARCHAR 2 — текстовые строки переменной длины до 4000байт
Поле MEMO LONG - текстовые строки длиной до 2 ГБ
CLOB – тексты длиной до 4 Гб
Дата/время DATE - даты
TIME - время
Заполнение таблиц
Заполнение таблиц Oracle возможно двумя способами: путем импортирования данных из готовых Excel-таблиц (при этом возможно также и создание таблиц); путем добавления данных в таблицы в среде APEX.
Если данными заполняются простые таблицы, проблем нет. При заполнении связанных таблиц надо сначала заполнить родительскую таблицу, а затем - подчиненную.
Импортирование данных из Excel-таблиц
Для применения данной технологии структура таблицы в БД Oracle должна совпадать со структурой таблицы в Excel.
Для импортирования следует выполнить команды:
SQL WorkshopUtilitiesData WorkshopSpredsheet Data.
Далее требуется выбрать, куда (Load to) закачивать данные:
если таблица уже существует в БД Oracle, то выбирается Existing Table.
если таблица отсутствует, создают новую структуру, одновременно заполняя ее данными. Для этого выбирают опцию New Table.
Потом выбирается, откуда загружать данные (Load from). Существуют две возможности:
из файла (Upload file),
копировать через буфер обмена Windows (Copy and paste) (рекомендуется).
Рассмотрим случай, когда данные копируются через буфер обмена:
выбираются соответствующие радиокнопки и нажимается Next>,
в новом окне устанавливается нужное имя таблицы, нажимается Next>,
на следующем шаге импорта мастер предлагает вставить данные из буфера в окошко, расположенное в центре страницы:
открывается таблица в Excel, ее строки копируются в буфер обмена,
мышью щелкается в окошке на странице APEX и нажимается комбинация клавиш CTRL+V (вставить),
в окне появятся данные из таблицы. Рекомендуется проверить самую первую строчку - там должны быть названия столбцов. Если имена полей совпадают в обеих таблицах, нажимается Next>. Если предполагается переименовать поля, то исправляются их названия в окне со вставленными данными, чтобы они совпадали с именами полей в БД APEX,
на следующем шаге мастер выводит всю структуру таблицы и данные. Здесь нужно проверить и исправить тип, длину и имена полей. Если какие-то столбцы не нужны, можно выбрать No в строке Upload,
нажимается кнопка Load Data.
Появляется список всех загруженных таблиц, где можно просмотреть результаты импорта, например, возможные ошибки. Если загрузка данных прошла успешно, то щелкнув по имени таблицы, можно перейти на страницу Object Browser с открытой структурой таблицы. Чтобы увидеть свои данные, надо выбрать Data в списке команд над таблицей.
Теперь можно редактировать данные, щелкнув по значку в столбце Edit в строке, которую нужно изменить. APEX не позволяет изменять данные прямо в табличном формате, как это принято в Access или Excel. Вместо этого он открывает анкетную форму для редактируемой записи.
После внесения изменений в анкетную форму нажать кнопку Apply Changes.
Добавление данных в среде APEX
В среде APEX данные можно вводить через опции меню. Для этого сразу после входа в среду APEX выполнить команды SQL Workshop Object Browser.
Выбрать нужную таблицу в левом столбце, выполнить команду Data. Нажимают кнопку Insert Row и в анкете вводят новые данные, после чего нажимают кнопку Create.
Следует отметить, что APEX-приложение, как правило, имеет специальные формы для пользователя, где последний сможет редактировать данные в таблицах, не обращаясь к среде разработки. Как и в Access, приложение более удобно для пользователя, чем средства, предназначенные для разработчиков.
Создание связей между таблицами
Из схемы БД видно, что между таблицами существуют связи, которые реализуются через соответствующие поля. Эти связи можно формировать как во время создания таблиц, так и после их создания и, возможно, заполнения данными.
Создание связей между простыми таблицами
Рассмотрим формирование связей после создания простых, не связанных между собой, таблиц. Для этого образуем связь подчинения Countries (страны) Locations (местонахождение) (связующими являются поля этих таблиц сountry_id, причем одноименное поле в таблице Locations ссылается на такое же поле в таблице Countries, показывая тем самым, в какой стране находится отделение корпорации):
Откройте вкладку Constraints описания созданной таблицы Locations.
Щелкните по кнопке Create. Отобразится мастер добавления ограничения целостности:
В поле Constraint Name впишите название создаваемого ограничения (оно должно быть уникальным в БД) например, location_con.
В поле Constraint Type выберите Foreign Key и Disallow Delete.
В списке Foreign Key Column(s) выделите столбец country_id.
В поле Reference Table Name (название родительской таблицы) выберите название созданной таблицы Countries.
В списке Reference Table Column (столбцы родительской таблицы, на которые будут ссылаться столбцы внешнего ключа) выберите столбец первичного ключа родительской таблицы – country_id.
Нажмите NEXT>.
Подтвердите создание внешнего ключа, нажав на кнопку Finish. Созданное ограничение целостности отобразится в списке ограничений целостности таблицы.
Откройте вкладку Model для таблицы Locations:

Видно, что теперь таблицы связаны: таблица Locations подчиняется таблице Countries.
Создание связанных таблиц
Можно «закладывать» связь между таблицами уже во время их создания с помощью Object Browser. Рассмотрим эту технологию на примере тех же таблиц в предположении, что мы их создаем заново как связанные таблицы:
Создается таблица Countries по описанной в разделе «Создание простых таблиц» технологии.
Аналогично создается таблица Locations до шага Foreing Key:
На шаге Foreign Key (Внешний ключ) добавляется ограничение ссылочной целостности (внешний ключ) для столбца country_id:
В секции Add Foreign Key (Добавить внешний ключ) в поле Name вписывается название создаваемого ограничения целостности, например, country_con. Необходимо убедиться, что длина названия не превышает 30 символов (ограничение СУБД Oracle на длину идентификаторов объектов). При необходимости надо сократить название.
Из группы радиокнопок {Disallow Delete, Cascade Delete, Set Null on Delete} оставить выбранным Disallow Delete (запрещать удаление родительской записи, если у нее есть дочерние).
В качестве столбца, на который накладывается ограничение целостности (поле со списком Key Column(s)), выбрать столбец country_id.
В качестве родительской таблицы (на которую ссылается столбец country_id) выбрать созданную ранее таблицу Countries.
Для того чтобы появились поля со списками столбцов для родительской таблицы, щелкнуть по иконке справа от поля References Table.
В появившееся ниже поле со списком Referenced Column(s) добавить столбец country_id, на который будет ссылаться столбец country_id.
Нажать кнопку Add, чтобы добавить ограничение целостности в список внешних ключей.
Закончить создание таблицы по описанной ранее технологии.
Задание к работе (работа выполняется группами по 2 человека):
В соответствии с вариантом (табл. 1.1) разработать логическую схему БД, аналогичную рис. 1.1. Состав полей таблиц можно уточнить с преподавателем.
Таблица 1.1
Варианты
Вариант Предметная область, сущности и их атрибуты
1 Обучение в вузе:
Студент (№ зачётки; фамилия; имя; отчество; группа; факультет; специальность; год поступления; дата рождения; адрес проживания; …).
Дисциплина учебного плана (код; название; группа дисциплин {гуманитарные и социально-экономические, математические и естественно-научные, общепрофессиональные, специальные}; число часов аудиторных занятий; число часов самостоятельной работы; семестр, в котором изучается дисциплина; …).
Зачётная книжка (№ зачётки; дисциплина; семестр; вид занятий {лекции, практические, лабораторные}; количество часов; дата сдачи; оценка; ФИО преподавателя; …).
Преподаватель (ФИО, ученая степень {кандидат наук, доктор наук}, научное звание {доцент, профессор}, должность {ассистент, старший преподаватель, доцент, профессор}, контактные данные,…).
2 Автомастерская:
Автомобиль (марка; год выпуска; номер; ФИО хозяина; объём двигателя; цвет; …).
Работник (код; фамилия; имя; отчество; специализация {маляр, слесарь, сварщик, жестянщик, механик}; дата приёма на работу; …).
Ремонт (дата; автомобиль; характер неисправности/повреждения; вид ремонта; работник; стоимость; …).
Автозапчасть (наименование, марка автомобиля, количество на складе, стоимость единицы,…)
3 Гостиница:
Номер (номер; этаж; кол-во мест; класс {стандарт, люкс}; стоимость проживания в сутки; …).
Постоялец (регистрационный номер; фамилия; имя; отчество; номер паспорта; кем выдан паспорт; дата выдачи паспорта; дата рождения; …).
Регистрация (номер постояльца; дата регистрации; предоставленный номер; дата выбытия; ФИО портье; …).
Обслуга (ФИО, контактные данные, должность…).
4 Чемпионат по футболу:
Команда (код; название; город; ФИО тренера; годовой бюджет; …).
Игрок (команда; фамилия; имя; отчество; специализация {вратарь, защитник, полузащитник, нападающий}; дата рождения; гражданство; дата окончания контракта; …).
Встреча (принимающая команда; гостевая команда; дата игры; итоговый счет; главный судья встречи; …).
Стадион (размещение, число мест, категория {закрытый, открытый}…)
5 Спортивный магазин:
Товар (код; наименование; вид спорта; цена; отдел {спорт. инвентарь, одежда, тренажёры, спортивное питание}; количество на складе, …).
Работник (личный номер; фамилия; имя; отчество; дата рождения; должность; отдел; дата приема на работу; …).
Продажа (личный номер работника; дата продажи; товар; количество; итоговая сумма без скидки; % скидки; …).
Поставщик (название предприятия, размещение, ФИО директора, контактные данные…).
6 Склад:
Продукция (наименование продукции, шифр продукции, единица измерения, цена единицы измерения, код поставщика…).
Поставщик (наименование, код, адрес,…).
Получатель (наименование, код, адрес,…) .
Поставка (наименование продукции, шифр продукции, количество в поставке, дата заказа, плановая дата поставки, фактическая дата поставки, размер штрафа за просрочку поставки,…).
7 Штат кафедры:
Сотрудник (ФИО, табельный номер, стаж, должность, оклад, кафедра,…).
Кафедра (название, месторасположение, ФИО заведующего, телефон, факультет,…).
Должность (название, требуемое образование, оклад…)
Факультет (название, аудитория, ФИО декана,…)
8 Перевозки:
Водитель (ФИО водителя, табельный номер водителя, номерной знак его автомобиля,…).
Автопарк (номерной знак автомобиля, марка автомобиля, год выпуска, местонахождение автомобиля {ремонт, рейс, база},…)
Автомобиль (марка автомобиля, грузоподъемность данной марки, средняя скорость данной марки км/час,…)
Поставка (наименование груза, вес груза, отправитель груза, получатель груза, но мерной знак автомобиля-перевозчика груза,…)
9 Библиотека:
Книга (название, автор, инвентарный номер, год выпуска,…).
Читатель (ФИО, адрес, контактные данные, номер читательского билета,…).
Библиотекарь (ФИО, контактные данные,…).
Выдача книги (ФИО библиотекаря, инвентарный номер книги, номер читательского билета, дата выдачи, плановая дата возврата, фактическая дата возврата, штраф за задержку книги,…).
10 Фитнес-клуб:
Клиент (ФИО, контактные данные, возраст, программа занятий,…).
Типовая программа занятий (название, вид упражнения, продолжительность упражнения, стоимость курса занятий,…).
Тренер (ФИО, квалификация, специализация, контактные данные,…).
Занятия клиента (ФИО клиента, ФИО тренера, программа занятий, дата начала занятий, дата окончания занятий,…)
Средствами APEX, следуя описанной технологии, описать таблицы и заполнить их данными. Состав полей может быть изменен по согласованию с преподавателем. В каждую таблицу включить идентификатор экземпляра сущности (поля типа *_id в примере). Связи подчинения между сущностями указать в таблицах с помощью идентификатора (так, например, в таблице EMPLOYEES показаны связи между подразделением и должностью через поля job_id и department_id).
Создать связи между таблицами для поддержания целостности данных.
Показать результаты преподавателю.

Лабораторная работа №3. Создание исходного приложенияЦель работы – получение навыков создания простейших приложений.
Задачи:
Создать простейшее приложение для отчета по таблице DEPARTMENTS.
Дополнить приложение отчетом и формой для таблицы EMPLOYEES.
Очевидно, что непосредственно работать с таблицами для просмотра данных возможно, но затруднительно, особенно для конечного пользователя. Для организации эргономичного интерфейса с целью удобного отображения информации из БД используют отчеты, которые, наряду с другими элементами интерфейса (они будут рассматриваться далее), создаются в рамках приложения пользователя (можно сказать, что это аналог понятия БД в СУБД Access). Такие приложения включают, в общем случае, разное количество форм представления требуемой пользователю информации.
Создание простейшего приложения
Разработка приложения
Для создания приложения активизируют Application Builder. Затем:
Щелкните по кнопке Create>. Появится мастер создания приложения (Create an Application).
Выберите Desktop и нажмите Next>.
На шаге Name:
Schema – выберите схему БД, содержащую объекты, с которыми будет работать приложение.
Name – введите имя торговой корпорации, соответствующее Вашей фамилии в транслитерации (в рассмотренном примере имя приложения - КГТУ).
Application – оставьте автоматически сгенерированное значение (это уникальный идентификатор приложения, с которым работает система и который помогает пользователю сориентироваться).
Выберите тему Theme – 21 (Scarlet) и щелкните Next>.
Далее добавьте страницы в приложение. Для этого:
На шаге Pages:
Удалите страницу Home, нажав на Удаление.
Установите следующее в секции Add Page:
Select Page Type – оставьте значение по умолчанию – Blank.
Page Name – введите Главная. Созданная страница является логической «верхушкой» всех создаваемых далее элементов интерфейса.
Щелкните по кнопке Add Page. Созданная страница появилась в списке страниц приложения в верхней секции.
Затем добавьте страницу с отчетом о подразделениях, основанном на таблице DEPARTMENTS. Для этого в секции Add Page установите следующее:
Select Page Type – выберите Report.
Parent Page– выберите Главная (это необходимо для определения иерархии страниц в приложении).
Page Source – оставьте значение Table.
Table Name – выберите DEPARTMENTS. В списке отображаются все таблицы и представления схемы, с которой ассоциировано приложение.
Report Type – выберите Classic.
Щелкните Add Page. Страницы, перечисленные в секции Create an Application, отображают иерархию страниц в приложении.
Далее измените имя страницы, установленное по умолчанию – Departments, – на Подразделения:
Щелкните по значку у страницы Departments.
В секции New Page Definition измените Page Name на Подразделения.
Щелкните Apply Changes.
В секции Pages щелкните Next>.
После добавления страницы необходимо определить некоторые параметры приложения:
На шаге Shared Components в опции Copy Shared Components from Another Application: оставьте No и щелкните Next>.
На шаге Attributes:
Authentication Scheme оставьте Application Express Accounts.
Language – выберите Russian (ru).
Date Format – выберите маску DD-MON-YYYY, щелкните Next>.
На шаге Confirm проверьте введенные данные и щелкните Create Application.
Две созданные страницы – Главная и Подразделения – по умолчанию отображаются в виде иконок на странице приложения в Application Builder. Обратите внимание, что Oracle APEX автоматически добавил в приложение страницу Login Page.
Таким образом, создано приложение с именем КГТУ, содержащее служебную страницу Главная и страницу с данными из таблицы Departments в виде отчета на странице Подразделения, т.е. первая задача решена.
Разработка навигации по приложению
Для доступа к странице Подразделения отобразим соответствующую ссылку на странице приложения:
На странице приложения нажмите Shared Components:
В разделе Navigation выберите Lists.
Нажмите Create>.
На шаге Source в Create List выберите значение From Scratch. Нажмите Next>.
На шаге Name and Type в опции Name напишите – Navigation, остальные параметры оставьте без изменения, нажмите Next>.
На шаге Query or Static Values в опции List Entry Label напишите –Подразделения, а в опции Target Page ID or custom URL – нажмите на значок и выберите страницу Подразделения. Нажмите Next>.
На шаге Confirm в опции Create List Regions? – выберите значение Create List Region on current page. Появятся дополнительные поля. В поле Region Position выберите - Page Template Body, в опции Region Template выберите – Report List. Нажмите Create List.
Чтобы просмотреть приложение, необходимо запустить его. Тогда APEX на основе данных, сохраненных в БД, динамически визуализирует приложение в виде HTML страниц. Для запуска приложения можно щелкнуть по иконке Run на домашней странице приложения (вкладка Application Builder). После авторизации появится главная страница приложения вида:

Также обратите внимание на панель инструментов разработчика внизу страницы. Данные ссылки появляются, когда приложение запускается в среде разработки.
Перейдите по ссылке Подразделения. Появится страница Подразделения вида:

Видно, что полученный отчет отображает все данные исходной таблицы. Ему соответствует запрос в виде скрипта:
select
"DEPARTMENT_ID",
"DEPARTMENT_NAME",
"MANAGER_ID",
"LOCATION_ID"
from "DEPARTMENTS"
where
(
instr(upper("DEPARTMENT_NAME"),upper(nvl(:P2_REPORT_SEARCH,"DEPARTMENT_NAME"))) > 0
)
Чтобы «добраться» до этого текста, надо сделать следующее:
Откройте определение страницы Подразделения в списке страниц на вкладке, соответствующей идентификатору Вашего приложения. Для выполнения последующих действий при необходимости следует поменять вид интерфейса, нажав на иконку Component view наверху страницы.
В разделе Page Rendering найдите секцию Regions и щелкните по ссылке Подразделения. Откроется окно Identification. Найдите секцию Source – в ней находится представленный текст запроса.
Обратите внимание, что приложение содержит элементы и свойства, которые позволяют быстро выполнять определенные задачи:
Строка навигации отображает иерархию и путь страницы в виде ссылок, по которым можно перемещаться.
Сортировка – чтобы отсортировать данные по столбцу, нужно щелкнуть по заголовку этого столбца.
Search – для поиска записей, содержащих определенные данные, необходимо ввести эти данные (строку поиска) в поле поиска и нажать кнопку Go. Поиск не чувствителен к регистру.
Display – поле со списком позволяет выбрать число записей, которое будет отображаться на странице. Для обновления необходимо нажать кнопку Go.
Spread Sheet – щелчок по этой ссылке вызывает диалог сохранения данных в CSV файле.
Next и Previous – эти ссылки позволяют перемещаться между подмножествами данных (если все записи целиком не помещаются на одной странице, они разбиваются в соответствии со значением параметра Display).
Список подмножеств записей – позволяет выбрать, какое из подмножеств отобразить на странице.
Можно запускать также и отдельные страницы приложения. Для этого нужно нажать на View Report (иконка)и в списке страниц выбрать опцию Run напротив нужной страницы.
В полученном отчете для обозначения названий столбцов используется латиница, что является его недостатком. Технология русификации интерфейса рассматривается далее.
Созданный отчет лишь отображает данные из БД и применим для той информации, которая носит условно-постоянный характер. На практике часто возникает необходимость вносить изменения в отчет и, следовательно, в исходные таблицы. Для этого используется особый вид отчетов – отчеты с формой.
2. Создание отчета и формы для таблицы EMPLOYEES
2.1. Разработка отчета и формы
Для создания отчета о работниках и формы для его редактирования:
Перейдите на домашнюю страницу приложения в Application Builder.
Щелкните по кнопке Create Page>.
На шаге Create a Page:
Выберите Form, затем Form on a Table with Report. Эта опция создает две страницы: отчет и форму, основанные на одной таблице.
На шаге Report Page:
Implementation – выберите Classic.
Breadcrumb – выберите Breadcrumb. Появятся дополнительные свойства Parent Entry и Entry Name.
В Parent Entry выберите ссылку на страницу Главная.
В полях Entry Name, Page Name и Region Title измените значение на Работники, щелкните Next>.
На шаге Data Source:
В поле Table/View Owner оставьте значение по умолчанию.
В поле Table/View Name выберите EMPLOYEES(table)и щелкните Next >.
На шаге Tabs в Tab Options оставьте опцию Do not use tabs и щелкните Next >.
На шаге Report Columns необходимо сформировать список столбцов, которые появятся на странице отчета (напомним, что в предыдущем случае отчет содержал все столбцы исходной таблицы):
В списке Select Column(s) показаны все имеющиеся данные, в правом списке – те, которые следует отображать. С помощью стрелок «>»и «<» сформируйте требуемый список:
EMPLOYEE_ID
FIRST_NAME
LAST_NAME
HIRE_DATE
SALARY
COMMISSION_PCT
Выбранные столбцы появятся на странице отчета. Щелкните Next>.
В Edit Link Image оставьте иконку, выбранную по умолчанию, и щелкните Next>.
На шаге Form Page:
В полях Page Name, Region Title введите Создать/Редактировать Работника. Щелкните Next>.
В поле Primary Key Type выберите Select Primary Key Column(s), а затем в поле Primary Key Column 1 выберите EMPLOYEE_ID и щелкните Next >.
В Source for Primary Key Column 1 выберите Existing sequence, а в появившемся внизу поле Sequence выберите EMPLOYEES_SEQ (EMPLOYEES_SEQ – это объект БД «сиквенс» (последовательность), предназначенный для генерации уникальных числовых значений, которые используются в качестве значений суррогатных идентификаторов). Щелкните Next>.
В списке Select Column(s) выберите все столбцы и щелкните Next>. Эти столбцы появятся в форме Создать/Редактировать Работника.
В следующем блоке оставьте все как есть (значения Yes для операций Insert, Update и Delete) и щелкните Next>. Это позволит пользователям добавлять, изменять и удалять записи о работниках.
На шаге Confirm проверьте выбранные атрибуты страниц формы и отчета и щелкните по кнопке Create.
Запустите созданную страницу. Отобразится отчет Работники:

Обратите внимание на следующие моменты:
Выбранная иконка редактирования появляется в каждой записи. Иконка представляет собой ссылку, щелчок по которой приводит к переходу на страницу формы Создать/Редактировать Работника, в которой можно изменить запись о работнике.
В правом верхнем углу мастером была создана кнопка Create (не видна на рисунке), щелчок по которой также приводит к переходу на страницу формы Создать/Редактировать Работника, на которой можно создать запись о новом работнике в таблице EMPLOYEES.
Отчет Работники включает в себя выбранные столбцы. Oracle APEX на основе этого выбора создал соответствующий SQL-запрос, который возвращает эти данные.
Для того чтобы просмотреть форму для редактирования, которая была создана вместе с отчетом, щелкните по иконке редактирования в какой-либо записи отчета Работники. Появится форма Создать/Редактировать Работника:

Обратите внимание на следующие моменты:
Форма содержит кнопки Cancel, Delete и Apply Changes.
Обязательные столбцы (на которые в БД наложено ограничение целостности Not Null) выделены цветом.
Рядом с полем Hire Date отображается иконка календаря , т.к. тип данных соответствующего столбца – DATE. Щелчок по этой иконке приводит к появлению окна с календарем.
Названия полей формы отображаются на латинице. Технология их русификации рассмотрена в следующей работе.

2.2. Русификация заголовков и форматирование полей в отчете
Установите для каждого столбца страницы Работники в поле Heading русскоязычные названия:

В Column Alignment установите right для столбцов SALARY, COMMISSION_PCT и значение center для всех столбцов в Heading Alignment.
Для того чтобы отредактировать формат столбца SALARY:
Щелкните по иконке слева от него.
На странице редактирования атрибута-столбца SALARY найдите секцию Column Attributes и в поле Number/Date Format выберите из списка 5,234.10. Соответствующая форматная маска будет подставлена в данное поле.
Щелкните по кнопке Apply Changes.
Примените изменения.
Запустите страницу отчета Работники (показан фрагмент отчета):

Обратите внимание на следующие моменты:
Все столбцы отчета имеют русскоязычные заголовки.
Столбец Оклад/Месяц отображается в денежном формате.
Если сейчас запустить приложение, то можно обнаружить, что нет возможности просмотреть отчет о работниках, т.к. на Главной странице нет никакой ссылки на страницу Работники. На самом деле перейти к любой странице можно, введя ее полный адрес в адресной строке браузера, например, адрес Главной страницы может выглядеть следующим образом: https://apex.oracle.com/pls/apex/f?p=58430:1:10680797661828. В этой ссылке особый интерес представляет строка f?p=58430:1:10680797661828, в которой 58430 – это уникальный идентификатор приложения в APEX, 1 – это номер страницы в приложении, а 10680797661828 – идентификатор сессии, автоматически генерируемый APEX. Заменив номер страницы в ссылке, можно перейти к соответствующей странице.
По описанной выше технологии русифицируйте заголовки в отчете Подразделения.
Добавление на Главной странице ссылки на отчет Работники
Поскольку навигационные средства для нашего приложения уже начали разрабатываться в разделе 1.2, технология добавления ссылки на отчет Работники отличается от той, которая рассматривалась в упомянутом разделе:
На странице приложения нажмите Shared Components:
В разделе Navigation щелкните по ссылке Lists. Откроется страница с элементами списка Lists. Перейдите на страницу List Details. В окне List выберите значение Navigation. Появится только одна ссылка – на страницу Подразделение.
На странице List Details щелкните по кнопке Create List Entry>. Отобразится страница создания/редактирования элемента списка (Create/Edit).
На странице Create/Edit введите следующее:
Sequence – 20.
List Entry Label – Работники.
Page – выберите страницу Работники.
Щелкните Create and Create Another.
Запустите Главную страницу:

Обратите внимание, что теперь на Главной странице есть ссылка на страницу Работники.
Протестируйте ссылки на Главной странице.
Задание к работе:
В своей рабочей области создайте приложение с именем, соответствующим своей фамилии в транслитерации.
Для таблицы с условно-постоянной информацией создайте отчет.
Для таблицы с переменной информацией создайте отчет с формой для редактирования.
Включите в стартовую страницу своего приложения ссылки на оба отчета.
Русифицируйте названия полей в обоих отчетах.
Покажите результат преподавателю.
Лабораторная работа № 4. Создание связей между отчетами и таблицамиЦель работы – изучение технологии использования списков выбора для заполнения полей и технологии связывания отчетов и таблиц в одном отчете.
Задачи:
Изменить поля на странице Создать/Редактировать Работника так, чтобы они отображали выпадающие списки выбора (selection lists).
Связать таблицы DEPARTMENTS, EMPLOYEES, LOCATIONS, COUNTRIES в отчете Подразделения.
Связать отчеты Работники и Подразделения.
Создание и использование выпадающих списков выбора
При вводе или редактировании полей формы удобно выбирать значения из выпадающих списков, а не вводить с клавиатуры. Для реализации этой технологии используем списки выбора для должностей (JOBS) и подразделений (DEPARTMENTS).
Создание выпадающих списков выбора производится в два этапа: вначале создаются списки значений (Lists of Values - LOV) для каждого уникального поля; затем поле изменяется так, чтобы оно могло отображать выпадающий список.
Создание списков значений
Для должностей - на странице приложения нажмите Shared Components:
В разделе Other Components щелкните по ссылке Lists of Values. На новой странице щелкните по кнопке Create>:
На шаге Source выберите From Scratch («с нуля»), нажмите Next>.
На шаге Name and Type в поле Name введите JOBS, а в Type выберите Dinamic. Нажмите Next>.
На шаге Query or Static Values замените текст запроса на следующий:
SELECT job_title d, job_id v
FROM jobs
ORDER BY d
Обратите внимание на подсказку, содержащуюся в названии поля: «Query (SELECT DISPLAY_VALUE, RETURN_VALUE FROM...):». Это означает, что важен порядок, в котором возвращаются значения. В первом столбце должно возвращаться отображаемое значение (которое будет видеть пользователь), а во втором – собственно значение, которое будет вставлено в поле таблицы.
Щелкните по кнопке Create List of Values. Созданный список значений отобразится на странице Lists of Values.
Для подразделений (повторяется предыдущий алгоритм):
На странице Lists of Values щелкните по кнопке Create>.
На шаге Source выберите From Scratch. Нажмите Next>.
На шаге Name and Type в поле Name введите DEPARTMENTS, а в Type выберите Dinamic. Нажмите Next>.
На шаге Query or Static Values замените текст запроса на следующий:
SELECT department_name d, department_id v
FROM DEPARTMENTS
ORDER BY d
Щелкните по кнопке Create List of Values.
Для работников (этот список понадобится в следующей работе):
На странице Lists of Values щелкните по кнопке Create>.
На шаге Source выберите From Scratch. Нажмите Next>.
На шаге Name and Type в поле Name введите EMPLOYEES, а в Type выберите Dinamic. Нажмите Next>.
На шаге Query or Static Values замените текст запроса на следующий:
SELECT first_name ||' '|| last_name d, employee_id v
FROM employees
ORDER BY last_name
Обратите внимание на то, что значения в первом столбце представляют собой имя и фамилию работника, разделенные пробелом.
Щелкните по кнопке Create List of Values.
Связывание элементов со списками значений
После создания списков значений необходимо настроить визуальные элементы (items) таким образом, чтобы они отображались как выпадающие списки выбора (select lists) (по умолчанию визуальные элементы отображаются в виде текстовых полей).
Откройте окно редактирования для страницы Создать/Редактировать Работника.
В разделе Rendering найдите секцию Items, подчиненную пункту Создать/Редактировать Работника. В этой секции отображается список всех визуальных элементов страницы.
Чтобы отредактировать визуальный элемент, отображающий должность (P?_JOB_ID):
В секции Items щелкните по ссылке P?_JOB_ID. Справа отобразится страница редактирования элемента.
В секции Identification выберите Select List в поле Display As.
В секции Label измените значение в поле Label на Должность.
В секции List of Values в поле Named LOV выберите список JOBS.
Примените изменения.
Аналогично отредактируйте элемент, отображающий подразделение (P?_DEPARTMENT_ID). В качестве названия элемента должно отображаться Подразделение, для неопределенных значений должно отображаться -нет подразделения-. Для этого в поле Display Null Value выберите Yes (отображать неопределенные значения), а в поле Null display value введите -нет подразделения-. В качестве списка значений выберите DEPARTMENTS.
Запустите страницу. Обратите внимание, что поля Должность и Подразделение теперь отображаются как выпадающие списки:

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

2. Связывание разных таблиц в одном отчете
Недостатком созданного ранее отчета Подразделения является то, что в столбцах Менеджер и Расположение отражаются соответствующие идентификаторы, а не фамилии и имена сотрудников либо указание, например, страны в качестве места размещения подразделения. Изменим запрос для отчета Подразделения так, чтобы он включал данные из некоторых таблиц БД по следующей схеме:
Для получения данных о менеджере выполняется переход по ссылкам manager_id (табл. DEPARTMENTS) – employee_id (табл. EMPLOYEERS), причем при указании имени менеджера ограничиться первой буквой.
Для получения данных о стране размещения выполнить переход по ссылкам location_id (табл. DEPARTMENTS) – country_id (табл. LOCATIONS) - country_id (табл. COUNTRIES).
Для решения задачи:
Откройте определение страницы Подразделения в списке страниц на вкладке, соответствующей идентификатору Вашего приложения. Для выполнения последующих действий при необходимости следует поменять вид интерфейса, нажав на иконку Component view наверху страницы.
В разделе Page Rendering найдите секцию Regions и щелкните по ссылке Подразделения. Откроется окно Identification. Найдите секцию Source и изучите запрос в поле Region Source.
Замените текст запроса в текстовом поле Region Source на следующий:
SELECT d.department_id "Department ID",
d.department_name "Department Name",
substr(e.last_name,1,1)||'. '|| e.first_name "Manager Name",
c.country_name "Location"
FROM departments d,
employees e,
locations l,
countries c,
employees e2
WHERE d.manager_id = e.employee_id
AND d.location_id = l.location_id
AND d.department_id = e2.department_id
AND l.country_id = c.country_id
AND instr(upper(d.department_name),upper(nvl(:P2_REPORT_SEARCH,d.department_name))) > 0
GROUP BY d.department_id, d.department_name,
substr(e.last_name,1,1)||'. '||e.first_name, c.country_name
Изучите текст нового запроса. Обратите внимание на предложение GROUP BY.
Щелкните по кнопке Apply Changes.
Запустите страницу. Отобразится видоизмененный отчет о подразделениях:

Обратите внимание на обновленные столбцы Менеджер (вместо идентификатора теперь отображается первая буква имени и фамилия) и Расположение.
3. Соединение отчетов
Созданные ранее отчеты существуют разрозненно, несмотря на то, что семантически они связаны по некоторым данным. Для создания некой единой схемы соединим отчеты.
Выполним два соединения отчетов: сначала соединим отчеты так, чтобы можно было, выбирая нужное подразделение, получать отчет о соответствующих работниках. Затем в один из столбцов отчета Подразделения добавим ссылку на отчет Работники, которая будет перенаправлять пользователя на соответствующую страницу и устанавливать фокус на выбранном подразделении.
3.1. Первое соединение отчетов
Для выполнения требуемого перехода создадим на отчете Работники область (Regions), в которой будет располагаться поле с выпадающим списком подразделений. Область – это участок на странице, который играет роль контейнера для содержимого страницы. Каждая страница может иметь любое количество областей. Внешний вид области задается с помощью шаблона (region template). Области обычно используются для группировки элементов управления на странице – например, визуальные элементов (items) или кнопок (buttons).
Для создания области:
Откройте окно редактирования для страницы Работники.
На странице определения страницы Работники в секции Regions щелкните по кнопке Create .
Определите тип области – Static Content, и нажмите Next>.
На шаге Display Attributes:
Title – введите Подразделение.
Region Template – выберите No Template. Область будет добавлена без заголовка области.
Sequence – измените на 5. Это необходимо, чтобы создаваемая область отображалась над областью Работники (которая имеет sequence = 10).
Оставьте другие параметры без изменений и щелкните Next>.
На шаге Source никаких изменений нет, сразу нажимайте Next>.
На шаге Settings в опции Output As оставьте значение по умолчанию – HTML и щелкните Next>.
На шаге Conditional Display нажмите Create Region. Обратите внимание, что в секции Regions теперь отображается область Подразделение, имеющая тип – Static Content.
Теперь необходимо создать в полученной области Подразделение визуальный элемент (item), который представляет собой выпадающий список выбора, использующий список значений подразделений:
На странице определения страницы Работники в секции Items щелкните по кнопке Create.
На шаге Item Type в одноименном окне выберите тип элемента – Select List – и щелкните Next>.
На шаге Display Position and Name:
Item Name – замените на P?_DEPARTMENT_ID.
Sequence – поставьте значение 10.
Region – выберите Подразделение. Щелкните Next>.
На шаге Item Attributes замените значение Label на Подразделение и щелкните Next>.
На шаге Settings в поле Page Action on Selection установите Submit Page. Нажмите Next>.
На шаге List of Values:
Named LOV – выберите DEPARTMENTS.
Display Null Value – оставьте значение Yes.
Null Display Value– введите -нет подразделения-.
Null Return Value– введите -1. Ввод значений, которые подставляются вместо неопределенного значения (Null Value), позволяет облегчить написание запросов (облегчает проверку на Null). В этом случае, когда пользователь выбирает в списке -нет подразделения-, в элементе устанавливается значение -1, и Вы можете использовать это значение в запросе.
На шаге Source:
В поле Default Value введите -1.
Оставьте другие параметры без изменений и щелкните Create Item.
В секции Items нажмите на P?_DEPARTMENT_ID и в поле Cascading LOV Parent Item(s) выберите значение P?_DEPARTMENT_ID. Щелкните Apply Changes.
Итак, создан элемент, который будет принимать значения идентификатора подразделения, но пока еще он не соединен с отчетом. Чтобы сделать это, необходимо отредактировать SQL-запрос в Region Source, добавив в него предложение WHERE:
Откройте окно редактирования (Region Definition) для области Работники.
В поле Region Source добавьте в запрос после предложения FROM следующий текст:
WHERE (DEPARTMENT_ID = :P2_DEPARTMENT_ID or
(DEPARTMENT_ID is null and nvl(:P2_DEPARTMENT_ID,'-1') = '-1'))
Данное предложение WHERE позволит отображать только работников, принадлежащих выбранному подразделению. Обратите внимание, что подстановочная строка :P2_DEPARTMENT_ID должна соответствовать созданному ранее элементу.
Примените изменения.
Запустите страницу. Выберите любое подразделение, например, «Вестер». Должны отобразиться только работники, относящиеся к этому подразделению:

Если такого не происходит, то следует настроить механизм смены страниц, что описывается ниже.
Когда на странице выполняется команда Submit, то переходы (branches), указанные для страницы, определяют, какая страница должна отобразиться следующей. В данном случае необходимо, чтобы после команды Submit на странице Работники снова отобразилась та же самая страница с отчетом о работниках, поэтому необходимо создать переход на страницу Работники:
В окне редактирования (Page) страницы Работники в колонке Page Processing выберите опцию Brunches и щелкните по иконке Create. Отобразится мастер создания перехода.
На шаге Branch Attributes в строке Name введите Работники, остальное оставьте как есть. Нажмите Next>.
На шаге Target:
В качестве целевой страницы в окне Page выберите страницу Работники.
Отметьте флажок reset pagination for this page. Когда установлена эта опция, приложение отображает первую порцию данных, удовлетворяющих запросу. Когда же эта опция не выбрана, то если пользователь просматривал, например, третью порцию данных и выбрал другое подразделение, то ему будет отображена третья порция нового запроса.
Оставьте все остальные параметры без изменений и создайте переход (нажмите Create Branch на шаге Branch Conditions).
3.2. Второе соединение отчетов
Теперь необходимо добавить на странице отчета Подразделения ссылку на страницу отчета Работники. Рациональнее всего это сделать, добавив ссылку в один из столбцов таблицы Подразделения, например, в столбец Подразделение. При этом:
на странице Работники должно устанавливаться выбранное подразделение,
в столбце Подразделение по-прежнему должно отображаться название подразделения,
при переходе по ссылке на странице Работники должна отображаться первая порция из списка работников соответствующего подразделения,
при наведении указателя мыши на ссылку должна высвечиваться подсказка «показать работников» (для этого при редактировании параметров ссылки введите в поле Link Attributes строку: title=”показать работников”).
Для решения задач:
Откройте страницу Подразделения для редактирования.
На вкладке Report Attributes войдите в режим редактирования атрибута Department Name:
В окне Link Text выберите Department Name,
В окне Link Attribute sвведите title="показать работников",
В окне Page выберите страницу Работники,
В окне Item 1 в секции Page выберите Подразделения и из списка выберите P?_DEPARTMENT_ID, в окне Value 1 - #DepartmentID#. Примените изменения.
Примените изменения.
Запустите страницу Подразделения и проверьте правильность работы ссылки:

И после перехода по ссылке:

Добавьте возможность сортировки в отчете Подразделения по всем столбцам и в отчете Работники по всем столбцам, кроме столбца Изменить. Это можно сделать, поставив флажки Sort в разделе Column Attributes в окне редактирования столбцов соответствующего отчета (Report Attributes).
Запустите приложение и добавьте несколько работников в одно из подразделений. При этом проверьте работу сортировки по столбцам.
Измените в отчете Подразделения запись об одном из подразделений, удалив в нем сведения о менеджере (это надо сделать через соответствующую таблицу), и запустите это приложение.
Следует отметить, что в созданном отчете Подразделения не отражается информация о тех подразделениях, в которых нет менеджера или работников. Причина в SQL-запросе: чтобы в отчете отображались все подразделения, необходимо его модифицировать:
Замените текст запроса в Region Source для области Подразделения на странице Подразделения на следующий:
SELECT d.department_id "Department ID",
d.department_name "Department Name",
nvl2(e.employee_id, substr(e.last_name,1,1)||'. '|| e.first_name, '') "Manager Name",
c.country_name "Location"
FROM departments d left join employees e on d.manager_id = e.employee_id
left join locations l on d.location_id = l.location_id
left join countries c on l.country_id = c.country_id
left join 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.last_name,1,1)||'. '|| e.first_name, ''),
c.country_name
Обратите внимание на следующие моменты:
Функция nvl2 принимает 3 параметра: первый параметр проверяется на значение null, если первый параметр is not null, то функция возвращает значение второго параметра (первую букву имени и фамилию), иначе – значение третьего параметра (пустую строку).
В предложении FROM используется левое внешнее соединение (left [outer] join), которое означает, что будут выбираться все записи из левой части выражения, даже если для них нет соответствующих записей в правой части. Столбцы, по которым производится соединение, указываются после ключевого слова on.
Примените изменения.
Задание к работе:
В своем приложении на форме, предназначенной для редактирования данных в одном из отчетов, создайте выпадающие списки выбора.
Свяжите ряд таблиц для замены идентификаторов сущностей более информативными данными.
Свяжите отчеты для организации переходов между ними.
Русифицируйте заголовки полей в отчетах и формах.
Покажите результат преподавателю.
Лабораторная работа № 5. Редактирование отчетовЦель работы – изучение технологии редактирования готового отчета.
Задачи:
Добавить на страницу Работники отчет (область), отображающий детали выбранного подразделения. При этом задать условие, по которому детали подразделения отображаются только, если выбрано какое-либо подразделение, если же выбрано -нет подразделения-, то область не должна отображаться.
Создать страницу с формой для создания/редактирования подразделения и соединить ее со страницей Подразделения, добавив в отчет Подразделения ссылку для перехода в режим редактирования (в столбце отчета), а также кнопку Создать для создания нового подразделения.
Редактирование отчета Работники
Некоторой недоработкой отчета Работники является недостаток информации по соответствующему подразделению, название которого в виде небольшого отчета выводится на этой странице. Зададим также вывод дополнительной информации, имеющейся в БД.
Откройте окно редактирования для страницы Работники. В разделе Page Rendering страницы в подразделе Regions щелкните по иконке Create.
В Identify the type of region выберите Report.
С помощью мастера создайте область, задав для нее следующие параметры (для остальных параметров оставьте значения по умолчанию):
Реализация отчета – Classic Report
Название области (Title) – О подразделении
Шаблон области (Region Template) – No Template
Очередность (Sequence) – 7 (это значит, что создаваемая область будет располагаться между областями со значениями sequence 5 и 10). Нажмите Next>.
На шаге Source выберите опцию SQL запрос (SQL Query) и вставьте данный запрос:
SELECT substr(e.last_name,1,1)||'. '|| e.first_name "Manager Name:",
c.country_name "Location:"
FROM departments d
left join employees e on d.manager_id = e.employee_id
left join locations l on d.location_id = l.location_id
left join countries c on l.country_id = c.country_id
left join employees e2 on d.department_id = e2.department_id
WHERE nvl(d.department_id,'-1') = nvl(:P2_DEPARTMENT_ID,'-1')
GROUP BY substr(e.last_name,1,1)||'. '||e.first_name,
c.country_name
В этом запросе:
производится соединение пяти таблиц, при этом используется внутреннее соединение (ключевые слова inner join); условие соединения указывается после ключевого слова on;
таблица EMPLOYEES используется 2 раза (для менеджера подразделения и для работников), поэтому указана дважды в предложении FROM, но с разными синонимами таблицы (e и e2);
substr(e.last_name,1,1)||'. '|| e.first_name – вырезается первый символ из имени работника (менеджера) и соединяется с точкой и пробелом, а затем с фамилией работника (менеджера);
условие, заданное в предложении WHERE, обеспечивает выборку только подразделения, имеющего заданный идентификатор (здесь - параметр:P2_DEPARTMENT_ID);
в предложении GROUP BY перечислены столбцы, к которым не применена групповая функция.
Нажмите Next>.
На шаге Report Attributes измените Шаблон отчета (Report Template) – default: vertical report. Нажмите Next>.
На шаге Conditional Display:
Тип условия (Condition Type) – Value of Item/Column in Expression 1!= Expression 2
Данный тип условия означает, что условие будет истинным, если значение первого выражения не будет равно значению второго выражения.
Expression 1 – введите P?_DEPARTMENT_ID
Expression 2 – введите -1
Заданное условие означает, что данный отчет будет отображаться только тогда, когда значение элемента P?_DEPARTMENT_ID не будет равно -1 (т.е., только если будет выбрано конкретное подразделение).
Нажмите Create Region.
Задайте для столбцов отчета русскоязычные названия:

Обратите внимание, что внизу только что созданного отчета О подразделении отображаются символы 1-1. Это означает, что для данного отчета включена разбивка на страницы. Однако в данном случае она бессмысленна, т.к. отображается всегда только одна запись (о выбранном подразделении).
Для отключения разбивки на страницы:
Откройте окно редактирования для страницы Работники.
Откройте окно редактирования атрибутов отчета О подразделении.
Во вкладке Report Attributes в секции Layout and Pagination в поле Pagination Scheme выберите -No Pagination Selected-.
Примените изменения и запустите страницу. Проверьте правильность работы отчета.
Редактирование отчета Подразделения
Создание формы для создания/редактирования подразделения
В созданном приложении нет возможности редактировать существующие записи о подразделениях и создавать новые. Для получения такой возможности создадим страницу с формой, подобную странице Создать/Редактировать Работника (должна быть создана только одна страница с формой, т.к. отчет уже существует):
На домашней странице своего приложения нажмите Create Page>.
Выберите опцию Form, затем на странице Create Page выберите опцию Form on a Table or View.
На шаге Table/View в поле Table/View Name выберите имя таблицы – Departments, нажмите Next>.
На шаге Page and Region:
В полях Page Name, Region Title введите Создать/Редактировать Подразделение.
В поле Breadcrump установите Breadcrump. Это установит на странице навигационную цепочку. Тогда в поле Entry Name введите название элемента навигационной цепочки – Создать/Редактировать Подразделение.
В секции Parent Entry выберите Подразделения. Нажмите Next>.
На шаге Tabs установите опцию Use an existing tab set and reuse an existing tab within that tab set. В окне Tab Set оставьте (Главная), в окне Use Tab выберите Главная. Нажмите Next>.
На шаге Primary Key в опции Primary Key Type выберите Select Primary Key и в окне Primary Key Column 1 выберите Department_id. Нажмите Next>.
На том же шаге установите опцию Existing sequence и в поле Sequence в качестве источника значений для столбца первичного ключа (DEPARTMENT_ID) укажите последовательность (sequence) DEPARTMENTS_SEQ. Нажмите Next>.
На шаге Columns выберите все поля для отображения в форме и нажмите Next>.
На шаге Buttons установите все стандартные кнопки, которые должны быть на странице. Ярлыки для кнопок должны быть русскоязычными (Отменить, Создать, Применить, Удалить). Нажмите Next>.
На шаге Branching установите переход на страницу Подразделения после отправки страницы (Branch here on Submit) или отмены изменений (Branch here on Cancel). Нажмите Next>.
На шаге Confirm нажмите Create.
Доработайте созданную страницу Создать/Редактировать Подразделение так, чтобы названия полей отображались по-русски.
Модифицируйте форму, чтобы поле для указания менеджера подразделения представлялось как выпадающий список выбора, причем он должен отображать пустые значения в виде -нет менеджера-:
В разделе Page Rendering найдите секцию Items, подчиненную пункту Создать/Редактировать Подразделение.
Чтобы отредактировать визуальный элемент, отображающий менеджера (P?_MANAGER_ID):
В секции Items щелкните по ссылке P?_MANAGER_ID. Отобразится страница редактирования элемента.
В секции Identification выберите Select List в поле Display As.
В секции Label измените значение в поле Label на Менеджер.
В секции List of Values:
В поле Named LOV выберите EMPLOYEES.
Display Null Value выберите значение Yes.
Null Display Value введите -нет менеджера-.
Null Return Value введите -1. Ввод значений, которые подставляются вместо неопределенного значения (Null Value), позволяет облегчить написание запросов (облегчает проверку на Null). В этом случае, когда пользователь выбирает в списке -нет менеджера-, в элементе устанавливается значение -1, и Вы можете использовать это значение в запросе.
Примените изменения.
Для решения аналогичной задачи для поля Расположение необходимо вначале создать список значений, а затем создать собственно список выбора (дополнительно: если расположение не указано, надо отобразить текст -не указано расположение-).
Создание списка LOCATIONS
Так как понятие «расположение» является сложным и включает в себя страну, город, адрес и т.д., то рассмотренная ранее технология создания списка не подходит.
Поскольку ключевым моментом при создании списка значений является определение SQL-запроса, возвращающего множество пар (отображаемое значение, возвращаемое значение), для решения задачи сначала необходимо подготовить соответствующий запрос. Воспользуемся для этого построителем запросов:
Откройте страницу построителя запросов (SQL Workshop> Utilities> Query Builder). Для удобства работы это можно сделать в отдельной вкладке или окне браузера.
В списке в левой части построителя отображаются таблицы, содержащиеся в Вашей схеме. Щелкните по таблицам LOCATIONS и COUNTRIES. Изображения таблиц появятся в центральной части построителя.
Из этих таблиц потребуются столбцы COUNTRY_NAME, CITY, STREET_ADDRESS и LOCATION_ID. Выберите их, установив флажки слева от названий столбцов.
Чтобы для каждого расположения выводилась соответствующая страна, эти таблицы необходимо соединить условием LOCATIONS.COUNTRY_ID = COUNTRIES.COUNTRY_ID. Соедините таблицы, щелкнув по незаполненным клеткам справа от соответствующих названий столбцов:

Обратите внимание на текст SQL-запроса, который автоматически сформировался во вкладке SQL в нижней части построителя. Возможности построителя запросов очень ограничены, однако его можно использовать для формирования черновых заготовок запросов.
Переключившись на вкладку Results (или нажав кнопку Run), Вы увидите результат выполненного запроса:

Полученный запрос еще не пригоден для использования при построении списка значений. Необходимо доработать его так, чтобы компоненты расположения (страна, город и адрес) выводились в одном столбце.
Сохраните полученный запрос под именем, например, lab5_pre_locations. Для этого нажмите кнопку Save в верхней части построителя. Переключившись затем на вкладку Saved SQL, Вы увидите сохраненный запрос.
Откройте страницу SQL Workshop>SQL Commands. Переключитесь на вкладку Saved SQL и щелкните по ссылке lab5_pre_locations. Откроется сохраненный Вами запрос, который теперь можно доработать и проверить.
Объедините в тексте запроса столбцы COUNTRIES.COUNTRY_NAME, LOCATIONS.CITY и LOCATIONS.STREET_ADDRESS строковыми операторами || (две вертикальные черты), удаляя автоматически сформированные в построителе запросов синонимы и добавляя между столбцами строковые константы ', ' (запятая и пробел в одинарных кавычках), как показано на рисунке ниже:

Выполните запрос, нажав на кнопку Run. Если запрос написан корректно, во вкладке Results отобразятся записи, организованные в 2 столбца:

Сохраните скорректированный запрос под именем, например, lab5_locations. Теперь Вы готовы создать список значений для расположений (LOCATIONS).
Скопируйте текст запроса в буфер обмена.
Создайте список значений с именем LOCATIONS, причем в поле с текстом запроса вставьте подготовленный запрос из буфера обмена:
Откройте свое приложение в Application Builder для редактирования.
Щелкните по иконке Shared Components.
На странице Shared Components в секции Other Components щелкните по ссылке Lists of Values.
На странице Lists of Values щелкните по кнопке Create>.
На шаге Source выберите From Scratch. Нажмите Next>.
На шаге Name and Type в поле Name введите LOCATIONS, а в Type выберите Dinamic. Нажмите Next>.
На шаге Query or Static Values замените текст запроса на тот, который был скопирован в буфер обмена:
select COUNTRIES.COUNTRY_NAME ||', '||
LOCATIONS.CITY ||', '||
LOCATIONS.STREET_ADDRESS location,
LOCATIONS.LOCATION_ID as LOCATION_ID
from LOCATIONS LOCATIONS,
COUNTRIES COUNTRIES
where COUNTRIES.COUNTRY_ID=LOCATIONS.COUNTRY_ID
Щелкните по кнопке Create List of Values. Созданный список значений отобразится на странице Lists of Values.
Доделайте выпадающий список выбора для поля Расположение (самостоятельно, по аналогии с рассмотренной выше задачей).
Запустите страницу Создать/Редактировать Подразделение и проверьте ее работу.
2.3. Соединение страниц Подразделения и Создать/Редактировать Подразделение
Добавьте в столбец с идентификатором подразделения на странице Подразделения ссылку на страницу Создать/Редактировать Подразделение аналогично тому, как это делалось для страницы Работники в лабораторной работе 2. При этом вместо идентификатора подразделения должна отображаться иконка; в названии столбца должно отображаться Изменить; при переходе по ссылке на странице Создать/Редактировать Подразделение должно отображаться редактируемое подразделение. Для этого:
На странице определения страницы Подразделения в секции Regions щелкните по ссылке Подразделения. Откроется новое окно, в котором выберите опцию Report Attributes.
В секции Column Attributes у атрибута Department_Id щелкните по иконке слева. Откроется страница редактирования атрибута-столбца.
В секции Column Link:
В поле Link Text установите текст, представляющий собой html-тэг для отображения необходимой иконки (щелкните по ссылке [Icon 5]);
В поле Page из выпадающего списка выберите страницу Создать/Редактировать Подразделение. Соответствующий номер страницы автоматически установится в поле;
В списке параметров ссылки для параметра Item 1 установите следующие значения: в поле Name – P?_DEPARTMENT_ID (напомним, что ? – конкретный номер страницы в приложении), в поле Value 1 - #DEPARTMENT ID#.
Щелкните по кнопке Apply Changes в верхней части страницы. Вы вернетесь на страницу Report Attributes.
Запустите приложение Подразделения и проверьте результаты:

Добавьте на странице Подразделения кнопку Создать для создания нового подразделения. Для этого:
Зайдите в режим редактирования страницы Подразделения.
В секции Page Rendering в опции Buttons щелкните по кнопке Create. Откроется страница создания кнопки Create Button.
На шаге Button Region выберите значение Подразделения. Нажмите Next>.
На шаге Button Position в окне Position выберите опцию Create a button in a region position. Нажмите Next>.
На шаге Button Attributes в поле Button Name введите – Create, а в поле Label – Создать. Нажмите Next>.
На шаге Display Properties в поле Position выберете значение Region Template Position #Create#. Нажмите Next>.
На шаге Action When Clicked в поле Action выберите значение Redirect to Page in this Application.
Затем в поле Page установите нужную страницу для перехода – Создать/Редактировать Подразделение, а в поле Clear Cache установите номер страницы Создать/Редактировать Подразделение в Вашем приложении. Этот позволит при переходе по ссылке на страницу Создать/Редактировать Подразделение отображать незаполненные поля и кнопки Отменить и Создать (при переходе все элементы этой страницы примут значения Null). Нажмите Next>.
и. В следующем окне ничего не меняйте и нажмите Create Button.
Теперь есть возможность создавать новые и редактировать существующие подразделения. Расположение подразделения можно выбирать из списка ранее определенных местоположений.
Задание к работе:
В своем приложении на странице, соответствующей подчиненной сущности (в примере - Работники), добавьте отчет (область), отображающую детали описания родительской сущности (в примере - Подразделения).
Создать страницу для создания/редактирования страницы с условно-постоянной информацией.
Добавить в страницу с условно-постоянной информацией ссылку для перехода в режим редактирования, а также кнопку Создать для создания нового экземпляра сущности.
Покажите результат преподавателю.

Лабораторная работа № 6. Доработка пользовательского интерфейсаЦель работы – изучение технологии доработки интерфейса пользователя.
Задачи:
Доработать пользовательский интерфейс: добавить название приложения на отображаемые страницы, изменить тему, дооформить главную страницу.
Изучить основные этапы развертывания приложения. Экспортировать приложение в виде текстового файла. Создать учетную запись для конечного пользователя приложения. Научиться определять URL приложения.
Доработка пользовательского интерфейса
1.1. Добавление названия приложения
Можно добавить в приложение графический логотип или текст, так что он будет отображаться на каждой странице приложения. Позиция, в которой отображается логотип/текст, определяется шаблоном страницы.
Добавьте название приложения на каждую страницу. Для этого:
В Shared Components щелкните по User Interface Attributes в секции User Interface.
В секции Logo выберите в Logo Type – Text, в поле Logo впишите название приложения (например, «Учебная задача»), в Logo Attributes выберите Black Text.
Обратите внимание, что после выбора в Logo Attributes появилась строка, представляющая собой фрагмент HTML кода, задающего стиль отображаемого текста:

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

1.2. Изменение темы пользовательского интерфейса
Тема (theme) – это коллекция шаблонов, которые определяют визуальное представление пользовательского интерфейса. Каждая тема содержит шаблоны для каждого компонента и элемента управления, включая страницы (pages), области (regions), отчеты (reports), списки (lists), ярлыки (labels), меню (menus), кнопки (buttons) и списки значений (list of values).
В Oracle APEX прикладная логика (application logic) отделена от представления (presentation). Вы можете разрабатывать приложение в одной теме, затем заменить ее другой предустановленной темой либо создать и использовать свою собственную тему. Такое отделение прикладной логики (запросов, процессов, переходов и т.д.) от HTML-визуализации (rendering) позволяет изменять внешний вид приложения, не изменяя его код.
Измените тему своего приложения. Для этого:
В Shared Components щелкните по Themes в секции User Interface. Откроется страница с темами приложения.
На странице с темами запустите мастера создания темы (щелкнув по кнопке Create>).
На шаге Method выберите From the Repository (т.к. мы хотим выбрать уже готовую тему из репозитория APEX).
На шаге User Interface оставьте значение по умолчанию – Desktop.
На шаге Identify Theme выберите понравившуюся Вам тему (например, Cloudy (Theme24)).
На шаге Confirm подтвердите свой выбор, щелкнув по кнопке Create. Новая тема отобразится на странице с темами Вашего приложения:

Щелкните по кнопке Switch Theme (справа вверху).
На шаге Identify Theme выберите добавленную ранее тему. Для этого в опции Currently Active Theme выберите активную тему, а в опции Switch to Theme – выберите созданную тему.
На шаге Verify Compatibility просмотрите информацию, оставьте все как есть.
Мастер проверяет, есть ли в новой теме соответствующие шаблоны для каждого шаблона из текущей схемы, установленной в приложении. Если шаблон отсутствует, в столбце Status отображается предупреждение (Warning).
На шаге Confirm Switch подтвердите свой выбор, щелкнув по кнопке Switch Theme.
Запустите приложение. Обратите внимание на изменения, которые произошли в цветовой схеме и компоновке страниц приложения.
1.3. Оформление главной страницы
Главная страница приложения выглядит недооформленной:
Дополните пункты навигационного списка на главной странице графическими иконками:
Откройте окно редактирования элементов навигационного списка (зайдите в режим редактирования страницы Главная, в разделе Shared Components - Navigation выберите опции Lists - Navigation):

Для каждого элемента списка:
Откройте страницу редактирования Create/Edit двойным щелчком ЛКМ и щелкните по кнопке рядом с полем Image/Class в секции Entry. Откроется страница со списком доступных иконок:


Иконки организованы в три основные группы «Standard Images» (стандартные изображения), «Workspace Images» (изображения рабочей области), «Application Images» (изображения приложения). Стандартные изображения разделены на группы, соответствующие размерам (16x16, 20x20, 32x32, 64x64, 128x128, 140x90).
Выберите подходящую иконку, щелкнув по ней. В поле Image/Class на странице редактирования будет вписан относительный путь к выбранной иконке.
Запустите главную страницу приложения. Обратите внимание, что она выглядит так же, как и до назначения иконок пунктам навигационного списка. Причина этого заключается в том, что текущий шаблон списка не позволяет отображать иконки пунктов списка.
Установите шаблон оформления навигационного списка, предполагающий отображение иконок:
Откройте страницу редактирования области навигационного списка, войдя сначала в режим редактирования страницы Главная, затем щелкнув по опции Navigation в секции Regions.
В секции Source в поле List Template выберите шаблон Horizontal Images with Label List.
Запустите главную страницу приложения. Обратите внимание на изменения в представлении списка:

Название области (Navigation) выглядит лишним.
Откройте страницу редактирования области навигационного списка и в секции User Interface в поле Template установите No Template.
Запустите главную страницу и оцените изменения:

2. Развертывание приложения
После того, как создано приложение в среде разработчика, обычно требуется подготовить его к использованию конечными пользователями. Этот процесс называется развертыванием приложения. То есть, необходимо скопировать приложение из инсталляции Oracle APEX разработчика в инсталляцию заказчика. Очевидно, что у заказчика должен быть установлен сервер БД Oracle, в которой установлена та же версия Oracle APEX, что и в среде разработчика.
Для того чтобы перенести приложение из одной среды APEX в другую, требуется перенести как метаданные приложения (приложение представляет собой совокупность метаданных в репозитории APEX), так и все вспомогательные объекты, используемые приложением (объекты БД, изображения, файлы, темы и т.д.). Этот процесс может оказаться достаточно сложным. Создание пакетного приложения (packaged application) позволяет значительно упростить процесс развертывания приложения.
Процесс развертывания приложения состоит из следующих этапов:
Экспорт пакетного приложения.
Импорт и инсталляция экспортированных файлов (в работе не выполняется).
Практическая апробация технологии развертывания приложений в APEX в полном объеме выходит за рамки нашего курса и является предметом самостоятельного изучения.
2.1. Экспорт приложения
Экспортируйте Ваше приложение, сгенерировав текстовый файл, содержащий последовательность команд PL/SQL. Этот файл можно использовать также и как резервную копию Вашего приложения:
В Application Builder на домашней странице Вашего приложения щелкните по иконке Export/Import.
На странице Export/Import, выберите Export.
В поле Application выберите Ваше приложение.
В поле File Format выберите UNIX. Это поле определяет, как будут отформатированы строки в экспортном файле: например, UNIX – строки будут разделены символом «перевод строки» (LF – line feed).
Поле Owner Override оставьте пустым.
В поле Build Status Override выберите Run and Build Application. Это поле позволяет защитить приложение от модификаций со стороны других пользователей:
Run Application Only – разработчики могут только запускать приложение.
Run and Build Application – разработчики могут как запускать, так и редактировать приложение.
В поле Debugging выберите Yes. Приложение будет экспортировано с поддержкой отладки.
В поле Export Supporting Object выберите No. Если выбрать Yes, то приложение будет экспортировано вместе с определениями вспомогательных объектов (пакетное приложение).
В поле Export Developer Comments выберите Yes. Вместе с приложением будут выгружены комментарии разработчика.
Поле As of оставьте пустым. Это поле позволяет экспортировать приложение по состоянию на указанное количество минут в прошлом.
Щелкните по кнопке Export. Файл с именем f<номер Вашего приложения>.sql сохраняется, как правило, в папке <имя диска>\Мои документы\downloads, что можно уточнить, вызвав контекстное меню для вкладки, соответствующей сохраненному файлу (внизу слева в окне), и затем опцию Показать в папке.
2.2. Создание учетных записей конечных пользователей
После того, как приложение развернуто, необходимо создать учетные записи для всех конечных пользователей приложения.
Создайте учетную запись для конечного пользователя Вашего приложения.
Откройте домашнюю страницу Вашей рабочей области.

Зайдите в опцию Administration. Для этого нажмите на значок иконки.
В списке ссылок на задачи администрирования Administration, который находится в окне, щелкните по ссылке Create User. Отобразится страница Create User.
Заполните поля в секции User Identification:
User Name – введите имя пользователя (например, testuser), удовлетворяющее следующим ограничениям: максимальная длина - 100 символов, пробелы недопустимы, из специальных символов допускаются только @ и точка (.).
Email Address – введите адрес электронной почты, на который будет высылаться корреспонденция общего характера, уведомления о смене пароля и т.д.
В секции Account Privileges:
Default Schema – оставьте значение по умолчанию. Эта схема используется по умолчанию при просмотре данных, создании приложений, выполнении SQL-запросов.
Accessible Schemas (null for all) – оставьте это поле пустым, чтобы позволить конечному пользователю иметь доступ ко всем приложениям в рабочей области. Ввод разделенных двоеточиями названий схем позволяет ограничить доступ пользователя только теми приложениями, которые построены на этих схемах. Если пользователь не имеет доступ к схеме, на которой построено приложение, он также не имеет доступа и к самому приложению.
User is a workspace administrator – выберите No (пользователь не должен обладать правами администратора рабочей области). Выбирая No, Вы ограничиваете права пользователя, позволяя ему только запускать и использовать приложение, но не изменять его.
User is a developer – выберите No (создаваемый конечный пользователь не должен иметь возможность выступать в роли разработчика).
Set Account Availability – выберите Unlocked.
В секции Password:
Password и Confirm Password – введите пароль для этой учетной записи (пароль чувствителен к регистру).
Require Change of Password On First Use выберите No, если Вы не хотите, чтобы от пользователя требовалось изменить пароль при первом входе в систему.
В секции Group Assignments Вы можете выбрать группы пользователей, в которые будет входить данный пользователь. Группы пользователей позволяют разработчикам управлять доступом к специальным возможностям и функциям приложения на уровне групп. Эта возможность не обладает переносимостью между различными схемами аутентификации и полезна, только когда используется внутренняя аутентификация.
Подтвердите создание пользовательской учетной записи, щелкнув по кнопке Create User.
Определение URL приложения
Для того чтобы конечные пользователи могли использовать Ваше приложение, они должны знать его URL. Для этого:
Откройте свое приложение в Application Builder.
На домашней странице приложения наведите курсор мыши на иконку Run Application. Обратите внимание на URL, который отображается в статусной панели в нижней части окна браузера. Например:
https://apex.oracle.com/pls/apex/f?p=54506:1:1431153116390:::::,
где:
apex.oracle.com – URL сервера
pls – индикатор того, что нужно использовать mod_plsql картридж
apex – имя database access descriptor (DAD).
f?p= – это префикс, используемый Oracle APEX
54506– это идентификатор вызываемого приложения
1431153116390 – номер сессии
Чтобы запустить приложение, пользователь должен перейти в браузере по следующему URL (для заданного примера): https://apex.oracle.com/pls/apex/f?p=54506Запустите свое приложение, используя полученный URL и созданную ранее учетную запись конечного пользователя:

Задание к работе:
Доработайте пользовательский интерфейс аналогично рассмотренному примеру, выбирая, возможно, свои варианты оформления.
Создайте еще одну рабочую область и экспортируйте в нее свое приложение.
В новой рабочей области создайте учетные записи для нескольких конечных пользователей.
Покажите результат преподавателю.
Лабораторная работа № 7. Выполнение расчетов в отчетахЦель работы – изучение технологии программирования расчетов в отчетах.
Задачи:
Выполнить расчет годовой зарплаты работников в отчете Работники и разместить результаты в новом столбце.
Выполнить расчет числа работников по каждому подразделению в отчете Подразделения и разместить результаты в новом столбце.
Расчет годовой зарплаты работников
Для решения задачи:
создадим PL/SQL функцию, которая вычисляет зарплату работника;
добавим столбец «Зарплата/Год» для отображения результатов этих вычислений в отчете о работниках,
1.1. Вычисление зарплаты работника
Перейдите на домашнюю страницу приложения и щелкните по опции SQL Workshop, а затем SQL Commands. Появится окно, в котором Вы можете запускать SQL и PL/SQL код в БД.
Введите следующий скрипт:
CREATE OR REPLACE FUNCTION calc_remuneration(
salary IN number, commission_pct IN number) RETURN NUMBER IS
BEGIN
RETURN ((salary*12) + (salary * 12 * nvl(commission_pct,0)));
END;
/
Этот PL/SQL код создает функцию calc_remuneration, принимающую входные (IN) числовые (number) параметры salary (размер месячного оклада) и commission_pct (комиссионный процент) и возвращающую число. Функция вычисляет размер годового вознаграждения работника с учетом процентов.
Обратите внимание на функцию nvl, которая проверяет значение первого параметра на null и в случае, если первый параметр равен null, возвращает значение второго параметра. Это важно, т.к. результатом любых арифметических операций со значением null является null. А в данном случае, используя nvl, мы интерпретируем неопределенное значение комиссионного процента (отсутствие комиссионного процента у работника) как значение = 0.
Щелкните по кнопке Run (справа вверху). В окне Results отобразится сообщение «Function created.»
1.2. Добавление столбца с годовой зарплатой
Откройте страницу Page Rendering для страницы Работники:
В секции Regions щелкните по ссылке Работники.
В секции Source проанализируйте имеющийся там автоматически сгенерированный код:
select "EMPLOYEE_ID",
"FIRST_NAME",
"LAST_NAME",
"HIRE_DATE",
"SALARY",
"COMMISSION_PCT"
from "#OWNER#"."EMPLOYEES"
WHERE (DEPARTMENT_ID = :P3_DEPARTMENT_ID or
(DEPARTMENT_ID is null and nvl(:P3_DEPARTMENT_ID,'-1') = '-1'))
Обратите внимание на следующие моменты:
В запрос включены столбцы, выбранные при создании отчета с помощью мастера.
#OWNER# – подстановочная строка (substitution string), представляющая имя схемы, с которой ассоциировано приложение и в которой содержатся необходимые таблицы.
Замените код запроса на следующий:
SELECT "EMPLOYEE_ID" "Emp_Id",
"FIRST_NAME",
"LAST_NAME",
"HIRE_DATE",
"SALARY",
"COMMISSION_PCT",
calc_remuneration(salary,commission_pct) "Зарплата/Год"
from "#OWNER#"."EMPLOYEES"
WHERE (DEPARTMENT_ID = :P3_DEPARTMENT_ID or
(DEPARTMENT_ID is null and nvl(:P3_DEPARTMENT_ID,'-1') = '-1'))
Обратите внимание на следующие моменты:
В запрос добавился вызов созданной ранее функции calc_remuneration, которой передаются значения столбцов SALARY и COMMISSION_PCT.
Для столбца EMPLOYEE_ID и столбца с функцией calc_remuneration установлены синонимы, соответственно, «Emp_Id» и «Зарплата/год».
Примените изменения и запустите страницу Работники:

Обратите внимание на следующие моменты:
Появился новый столбец Зарплата/Год.
Пропала иконка со ссылкой на страницу Создать/Редактировать Работника. Это произошло потому, что изменилось название столбца, с которым была ассоциирована ссылка на страницу редактирования записи о работнике (мы установили синоним Emp_Id для столбца EMPLOYEE_ID).
Столбцы отчета имеют англоязычные названия (кроме Зарплата/Год, которому мы установили русскоязычный синоним в запросе).
Для восстановления в столбце Emp_Id иконки редактирования и ссылки на страницу Создать/Редактировать Работника выполним следующее:
На странице определения страницы Работники в секции Regions щелкните по ссылке Работники. Откроется новое окно, в котором выберите опцию Report Attributes.
В секции Column Attributes у атрибута Emp_Id щелкните по иконке слева. Откроется страница редактирования атрибута-столбца Emp_Id.
В секции Column Link:
В поле Link Text установите текст, представляющий собой html-тэг для отображения необходимой иконки (щелкните по ссылке [Icon 5]);
В поле Page из выпадающего списка выберите страницу Создать/Редактировать Работника. Соответствующий номер страницы автоматически установится в поле;
В списке параметров ссылки для параметра Item 1 установите следующие значения: в поле Name – P?_EMPLOYEE_ID (напомним, что ? – номер страницы в приложении), в поле Value 1 - #Emp_id# (сделать это лучше, щелкнув по иконке ): значение P?_EMPLOYEE_ID – это имя скрытого поля (item) на странице ?_Создать/Редактировать Работника, представляющего идентификатор работника; значение #Emp_Id# – это подстановочная строка, вместо которой APEX подставит выбранное пользователем значение столбца Emp_Id (в котором содержится идентификатор работника) из отчета Работники.
Щелкните по кнопке Apply Changes в верхней части страницы. Вы вернетесь на страницу Report Attributes. Обратите внимание, что в списке столбцов отчета у столбца Emp_Id появилась пометка Link, которая говорит о том, что с этим столбцом ассоциирована ссылка.
Находясь на странице Report Attributes, русифицируйте заголовки отчета:

Расчет числа работников в подразделении
Для решения задачи:
Откройте определение страницы Подразделения.
В разделе Page Rendering найдите секцию Regions и щелкните по ссылке Подразделения. Найдите секцию Source и замените текст запроса в текстовом поле Region Source на следующий:
SELECT d.department_id "Department ID",
d.department_name "Department Name",
count('x') "Number of Employees",
nvl2(e.employee_id, substr(e.last_name,1,1)||'. '|| e.first_name, '') "Manager Name",
c.country_name "Location"
FROM departments d left join employees e on d.manager_id = e.employee_id
left join locations l on d.location_id = l.location_id
left join countries c on l.country_id = c.country_id
left join 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.last_name,1,1)||'. '|| e.first_name, ''),
c.country_name
Обратите внимание на использование групповой функции count().
Щелкните по кнопке Apply Changes и запустите страницу:

Обратите внимание на столбец Число работников.
Задание к работе:
В соответствии с семантикой предметной области выполните расчеты, аналогичные приведенным в работе.
Покажите результат преподавателю.

Приложенные файлы

  • docx 7066461
    Размер файла: 1 MB Загрузок: 0

Добавить комментарий