Методические указания по прове- дению практических занятий и

advertisement
МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ»
Ме т о д и ч е ск и е у к а за н и я п о п р о в е д ен и ю п р а к т и ч е ск и х за н я т и й и
са м о ст о я т ел ьн о й р а б о т ы
по дисциплине
Б1.В.ДВ.2.2 Информационные и автоматизированные системы проектирования и управления в экономике
Код и направление
подготовки
09.06.01 – Информатика
и вычислительная техника
Наименование профиля / программы подготовки научнопедагогических кадров в аспирантуре
Квалификация
(степень) выпускника
Математическое моделирование,
численные методы
и комплексы программ
Исследователь. Преподаватель исследователь
Краснодар 2014
Оглавление
Введение ........................................................................................................................................................... 3
Лабораторная работа №1. Структура APEX и начало работы....................................................................... 4
Лабораторная работа №2. Создание базы данных ....................................................................................... 8
Лабораторная работа №3. Создание исходного приложения .................................................................. 17
Лабораторная работа № 4. Создание связей между приложениями ....................................................... 28
Лабораторная работа № 5. Редактирование приложений......................................................................... 35
Лабораторная работа № 6. Доработка пользовательского интерфейса ................................................... 43
Лабораторная работа № 7. Создание табличных форм, параметризованных отчетов и форм
«Главная/Детальная» ..................................................................................................................................... 53
Лабораторная работа № 8. Создание и использование кнопок-флажков (check box) ............................ 62
Лабораторная работа № 9. Самостоятельное создание приложения для выбранной предметной
области ............................................................................................................................................................ 70
ПРИЛОЖЕНИЕ .............................................................................................................................................. 72
Введение
Лабораторный практикум посвящен изучению инструментария для разработки
информационных систем в формате веб-приложений на основе БД Oracle - Oracle APplication EXpress (APEX). Oracle APEX позволяет создавать информационные системы с использованием веб-браузера (среда разработки представляет собой вебприложение) и не требует от разработчика большого опыта программирования. Со
стороны конечного пользователя приложения требуется только браузер и доступ к БД
Oracle, на которой запущен APEX.
Выполнение лабораторных работ осуществляется с помощью демонстрационного облачного сервиса: http://apex.oracle.com/i/index.html.
Для выполнения лабораторного практикума привлекаются следующие инструментальные средства:
1)
СУБД MS Access, которая изучается студентами в параллельном учебном курсе «Базы данных»,
2)
табличный процессор MS Excel, знакомый из учебного курса «Информационные технологии»,
3)
язык 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.
В ходе выполнения работ для контроля их исполнения формируется электронный отчет, в котором фиксируются отдельные этапы решения задач в виде скриншотов, включающих название приложения. Этот отчет дополняет результаты, которые
можно просмотреть непосредственно через интерфейс APEX.
Лабораторная работа №1. Структура APEX и начало работы
Задачи:
1) Изучить структуру APEX.
2) Ознакомиться с технологией регистрации и начала работы в APEX.
1. Структура 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 Application Express, обеспечивая
при этом приватность пользовательских объектов и приложений:
В Oracle Application Express выделяются следующие роли пользователей:
• Администраторы рабочих областей (Workspace administrators) – пользователи, которые выполняют задачи, специфичные для управления рабочими областями, – управление учетными записями пользователей, мониторинг активности, просмотр лог-файлов.
• Разработчики (Developers) – пользователи, которые создают и редактируют
приложения. Разработчики могут иметь отдельные рабочие области или разделять общие.
• Конечные пользователи (Users/Endusers) – не имеют привилегий разработчиков.
• Администраторы Oracle Application Express (Application Express Administrator) – это суперпользователи, которые управляют всеми ресурсами экземпляра
Oracle Application Express с помощью сервисов Application Express
Administration Services.
Взаимодействие пользователей с APEX показано на рисунке:
2. Начало работы
Для начала работы в APEX необходимо зайти на главную страницу сервиса по
адресу http://apex.oracle.com/i/index.html и зарегистрироваться через кнопку Request a
Free Workspace. При регистрации нужно указать, что Вы студент и хотите ознако-
миться с этим приложением, тогда на указанный адрес электронной почты придет
подтверждение в виде идентификатора рабочей области (workspace), логина (login
или username) и пароля (password) (поскольку диалог в среде APEX англоязычный,
можно пользоваться переводчиком по адресу http://translate.google.ru). Каждый следующий раз работы в данной среде после входа на главную страницу сервиса надо
найти блок Already have a workspace?, нажать кнопку Sign In и ввести свои данные:
После чего появляется главная страница среды разработки APEX:
Назначение используемых в лабораторном практикуме опций (они дублируются
пунктами главного меню вверху):
• Application Builder позволяет создавать HTML-интерфейс (или приложение)
в дополнение к объектам БД - таблицам и процедурам. Каждое приложение в
APEX представляет собой коллекцию страниц (page), связанных друг с другом при помощи вкладок (tabs), кнопок (buttons) или гипертекстовых ссылок
(hypertext links). Страница – это основной строительный блок приложения, который содержит также элементы пользовательского интерфейса – вкладки,
списки (lists), кнопки, элементы (items) и области (regions). При создании приложения и/или страницы им автоматически присваивается оригинальный номе: номер приложения – целое число, идентифицирующее приложение в системе в целом; номер страницы различает страницы внутри одного приложения и имеет структуру Р?, где ? – целое положительное число. Образование
других идентификаторов можно проследить по ходу решения прикладных задач.
• SQL Workshop предоставляет инструменты для просмотра и управления объектами БД – таблицами и процедурами:
Object Browser – позволяет просматривать, создавать, изменять, читать содержимое и удалять объекты БД.
SQL Commands – позволяет запускать команды SQL и PL/SQL, скрипты и
сохраненные запросы.
SQL Scripts – позволяет создавать, редактировать, просматривать, запускать и удалять файлы скриптов, а также загружать файлы скриптов из и в
локальную файловую систему.
Query Builder – позволяет искать и отфильтровывать объекты БД, выбирать объекты и столбцы, создавать связи между объектами, просматривать
отформатированные результаты запросов, сохранять запросы. Графический
интерфейс построителя позволяет делать это, обладая минимальными знаниями SQL.
• Utilities позволяет импортировать и экспортировать данные из БД, генерировать DDL-код, просматривать отчеты, восстанавливать удаленные объекты БД
и выполнять другие задачи.
Правый столбик главной страницы среды APEX - вспомогательный.
В середине окна - новости, тут выводятся все сообщения, которые пользователи
оставляют друг другу. Для примера можно добавить сообщение о начале работы в
проекте.
Две нижних панели - статистика, показывающая, с какими приложениями и кто
из пользователей работал в последнее время.
Можно пощелкать по кнопкам и посмотреть, что к чему. Например, можно сменить пароль, выбрав в меню Administration опцию Change Password.
Задание к работе
1. Зарегистрироваться в системе:
• Имя рабочей области – фамилия студента в транслитерации. Транслитерация здесь и далее – это запись русскоязычного текста латинскими буквами,
например, фамилия Иванов запишется как Ivanov.
• Логин и пароль – произвольные. Рекомендуется имена рабочей области, логина и пароля записать и сохранить, поскольку они буду использоваться
всякий раз при выполнении лабораторных работ.
2. Зайти в систему и ознакомиться со структурой главной страницы среды APEX.
Лабораторная работа №2. Создание базы данных
Задачи:
1) Описать структуры простых таблиц БД.
2) Заполнить таблицы данными.
3) Создать связи между таблицами.
Для знакомства с технологией APEX в последующих работах будем решать ряд
прикладных задач на БД, описывающей структуру некоторой торговой корпорации.
Первоначальная схема БД, полученная с помощью СУБД Access, представлена ниже
(некоторые таблицы будут добавляться по ходу выполнения лабораторных работ):
БД включает 4 основные таблицы (далее приведены описания этих таблиц в
конструкторе Access):
1)
Countries:
2)
Departments:
3)
Locations:
4) Employees:
Между таблицами сформированы связи (показаны на схеме стрелками), позволяющие соединить между собой данные в единую систему. Наличие таких связей
обеспечивает целостность данных в системе. Так, при попытке удалить родительскую
запись выводится диагностическое сообщение о невозможности данной операции,
поскольку существуют связанные записи. Таким образом, для удаления родительской
записи сначала нужно удалить все подчиненные ей.
Кроме основных таблиц, в схеме представлена вспомогательная таблица Departments_1, которая сформирована самой СУБД для представления связи между
основными таблицами (формирование связей рассматривается далее в данной работе).
1. Создание простых таблиц
Рассмотрим для начала технологию создания простых, не связанных между собой, таблиц в APEX на примере таблиц Countries и Locations:
1. Запуск мастера создания таблиц:
а. Откройте 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 и т.д.).
2. Изучите содержимое вкладок описания созданной таблицы.
3. Найдите и изучите описание созданного объекта-последовательности (Sequences).
4. Аналогичным образом создайте новую таблицу, предназначенную для хранения сведений о местах размещения отделений торговой корпорации:
а. Название таблицы - 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, значения для
него должны браться из новой последовательности, которая должна быть
создана.
5. Изучите содержимое вкладок описания созданной таблицы. Обратите внимание
на вкладку Model. На ней отображаются таблицы, на которые ссылается данная
таблица, и которые ссылаются на данную таблицу. Поскольку мы создали простые, не связанные таблицы, в окне показана отдельная таблица.
Ниже в качестве справочного материала приведены некоторые соответствия
между типами полей в Access и APEX:
Тип поля Access
Тип поля Oracle
Числовой, все форматы, в том числе:
NUMBER — числовые данные
Счетчик, длинное целое,
Действительное
Денежный
Текстовое
VARCHAR 2 — текстовые строки
переменной длины до 4000 байт.
Поле MEMO
LONG — текстовые строки длиной
до 2 ГБ
CLOB – тексты длиной до 4 Гб
Дата/время
DATE — даты
TIME - время
2. Заполнение таблиц
Заполнение таблиц Oracle возможно двумя способами: путем импортирования
данных из готовых Excel-таблиц (при этом возможно также и создание таблиц); путем
добавления данных в таблицы в среде APEX.
Если данными заполняются простые таблицы, проблем нет. При заполнении
связанных таблиц надо сначала заполнить родительскую таблицу, а затем - подчиненную.
2.1. Импортирование данных из Excel-таблиц
Для применения данной технологии структура таблицы в БД Oracle должна
совпадать со структурой таблицы в Excel.
Для импортирования следует выполнить команды:
SQL Workshop→Utilities→Data Workshop→Spredsheet Data.
Далее требуется выбрать, куда (Load to) закачивать данные:
1) если таблица уже существует в БД Oracle, то выбирается Existing Table.
2) если таблица отсутствует, создают новую структуру, одновременно заполняя ее данными. Для этого выбирают опцию New Table.
Потом выбирается, откуда загружать данные (Load from). Существуют две
возможности:
• из файла (Upload file),
• копировать через буфер обмена Windows (Copy and paste) (рекомендуется).
Рассмотрим случай, когда данные копируются через буфер обмена:
1. выбираются соответствующие радиокнопки и нажимается Next>,
2. в новом окне устанавливается нужное имя таблицы, нажимается Next>,
3. на следующем шаге импорта мастер предлагает вставить данные из буфера в окошко, расположенное в центре страницы:
• открывается таблица в Excel, ее строки копируются в буфер обмена,
• мышью щелкается в окошке на странице APEX и нажимается комбинация клавиш CTRL+V (вставить),
4. в окне появятся данные из таблицы. Рекомендуется проверить самую
первую строчку - там должны быть названия столбцов. Если имена полей совпадают в обеих таблицах, нажимается Next>. Если предполагается переименовать поля, то исправляются их названия в окошке со
вставленными данными, чтобы они совпадали с именами полей в БД
APEX,
5. на следующем шаге мастер выводит всю структуру таблицы и данные.
Здесь нужно проверить и исправить тип, длину и имена полей. Если какие-то столбцы не нужны, можно выбрать No в строке Upload,
6. нажимается кнопка Load Data.
Появляется список всех загруженных таблиц, где можно просмотреть результаты импорта, например, возможные ошибки. Если загрузка данных прошла успешно,
то щелкнув по имени таблицы, можно перейти на страницу Object Browser с открытой структурой таблицы. Чтобы увидеть свои данные, надо выбрать Data в списке
команд над таблицей.
Теперь можно редактировать данные, щелкнув по значку в столбце Edit в
строке, которую нужно изменить. APEX не позволяет изменять данные прямо в табличном формате, как это принято в Access или Excel. Вместо этого он открывает анкетную форму для редактируемой записи.
После внесения изменений в анкетную форму нажать кнопку Apply Changes.
2.2. Добавление данных в среде APEX
В среде APEX данные можно вводить через опции меню. Для этого сразу после входа в среду APEX выполнить команды SQL Workshop→Object Browser.
Выбрать нужную таблицу в левом столбце, выполнить команду Data. Нажимают кнопку Insert Row и в анкете вводят новые данные, после чего нажимают кнопку Create.
Следует отметить, что APEX-приложение, как правило, имеет специальные
формы для пользователя, где последний сможет редактировать данные в таблицах, не
обращаясь к среде разработки. Как и в Access, приложение более удобно для пользователя, чем средства, предназначенные для разработчиков.
3. Создание связей между таблицами
Из схемы БД видно, что между таблицами существуют связи, которые реализуются через соответствующие поля. Эти связи можно формировать как во время создания таблиц, так и после их создания и, возможно, заполнения данными.
3.1. Создание связей между простыми таблицами
Рассмотрим формирование связей после создания простых, не связанных между собой, таблиц. Для этого образуем связь подчинения Countries (страны) → Locations (местонахождение) (связующими являются поля этих таблиц сountry_id, причем одноименное поле в таблице Locations ссылается на такое же
поле в таблице Countries, показывая тем самым, в какой стране находится отделение корпорации):
1. Откройте вкладку Constraints описания созданной таблицы Locations.
2. Щелкните по кнопке Create. Отобразится мастер добавления ограничения
целостности:
• В поле Constraint Name впишите название создаваемого ограничения
(оно должно быть уникальным в БД) например, location_con.
• В поле Constraint Type выберите Foreign Key и Disallow Delete.
• В списке Foreign Key Column(s) выделите столбец country_id.
• В поле Reference Table Name (название родительской таблицы) выберите название созданной таблицы Countries.
• В списке Reference Table Column List (столбцы родительской таблицы,
на которые будут ссылаться столбцы внешнего ключа) выберите столбец первичного ключа родительской таблицы – country_id.
• Нажмите NEXT>.
3. Подтвердите создание внешнего ключа, нажав на кнопку Finish. Созданное ограничение целостности отобразится в списке ограничений целостности таблицы.
4. Откройте вкладку Model для таблицы Locations:
Видно, что теперь таблицы связаны: таблица Locations подчиняется таблице
Countries.
3.2. Создание связанных таблиц
Можно «закладывать» связь между таблицами уже во время их создания с помощью Object Browser. Рассмотрим эту технологию на примере тех же таблиц в
предположении, что мы их создаем заново как связанные таблицы:
1. Создается таблица Countries по описанной в разделе «Создание простых
таблиц» технологии.
2. Аналогично создается таблица 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, чтобы добавить ограничение целостности в список
внешних ключей.
б. Закончить создание таблицы по описанной ранее технологии.
Задание к работе:
1. В своей рабочей области создайте две пустые таблицы – Countries и Locations, проделав все действия по описанной технологии. Эти таблицы будут использованы в следующих работах.
2. Заполните данными таблицы Countries и Locations, используя технологию копирования данных через буфер обмена. Предварительно создайте
соответствующие таблицы в Excel (можно использовать данные, приведенные ниже):
COUNTRIES
country_id country_name
11 Россия
22 Литва
location_id
123
234
345
456
567
LOCATIONS
city
country_id postal_code
Калининград
11 123456
Нида
22 456789
Калининград
11 236001
Неман
11 236748
Гусев
11 123489
street_address
Советский пр.
Гедеминаса
Советская
Свободы
Центральная
state_province
Калининградская обл.
Запад
Калининградская обл.
Калининградская обл.
Калининградская обл.
3. Создайте таблицы Employees и Departments, используя технологию копирования данных в новые таблицы. Предварительно создайте соответствующие таблицы в Excel (можно использовать данные, приведенные ниже):
department_id
111
222
333
444
555
DEPARTMENTS
department_name
manager_id location_id
Виктория
1
123
Вестер
2
234
Седьмой континент
3
345
Семья
4
456
Копейка
5
567
Иван
Семен
Петр
Виктор
Борис
Иван
Семен
Петр
Виктор
Борис
Иван
Семен
Петр
Виктор
Борис
15
12
13
16
10
6
5
7
12
12
11
3
4
2
5
23-34-56
12-23-34
45-56-67
11-22-33
22-33-44
33-44-55
44-55-66
55-66-77
77-88-99
88-99-00
99-00-88
88-00-99
45-23-63
67-34-00
33-24-63
department_id
job_id
12000
12001
12002
12003
12004
12005
12006
12007
12008
12009
12010
12011
12012
12013
12014
phone_number
01.12.1989
02.12.1989
03.12.1989
04.12.1989
05.12.1989
06.12.1989
07.12.1989
08.12.1989
09.12.1989
10.12.1989
11.12.1989
12.12.1989
13.12.1989
14.12.1989
15.12.1989
commission_pct
salary
Иванов
Сидоров
Петров
Волков
Бажов
Смирнов
Холодов
Ушков
Сафронов
Томашевич
Исаевич
Круглов
Кузнецов
Сакуров
Лапшин
hire_date
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
last_name
first_name
employee_id
EMPLOYEES
111
222
333
444
555
111
222
333
444
555
111
222
333
444
555
4. В таблицу Employees введите строку с данными о себе, используя технологию добавления данных в среде APEX.
5. С помощью опции Model просмотрите описание совокупности сформированных таблиц на предмет наличия связей между ними. Полученную схему через
кнопку PrintScreen скопируйте в файл для электронного отчета по работе.
6. Сформируйте оставшиеся связи между таблицами:
• для таблицы Departments внешний ключ (Foreing Key) для поля location_id взять из таблицы Locations, поле location_id;а внешний ключ
для поля manager_id взять из таблицы Employees, поле employee_id;
• для таблицы Employees внешний ключ (Foreing Key) для поля department_id взять из таблицы Departments, поле department_id.
7. Просмотрите новый результат через опцию Model. Полученную схему также
скопируйте в файл электронного отчета.
8. Покажите результаты преподавателю.
Лабораторная работа №3. Создание исходного приложения
Задачи:
1) Создать простейшее приложение-отчет.
2) Связать две таблицы в одном отчете.
3) Создать отчет и форму для таблицы EMPLOYEES.
4) Выполнить расчеты в отчете.
1. Создание простейшего приложения
Для создания приложения активизируют Application Builder. Затем:
1. Щелкните по кнопке Create >. Появится мастер создания приложения
(Create Application).
2. На шаге Method оставьте Database и щелкните Next>.
3. На шаге Name:
а. Name – введите имя торговой корпорации, соответствующее Вашей фамилии в транслитерации (в рассмотренном примере имя приложения КГТУ).
б. Application – оставьте автоматически сгенерированное значение (это уникальный идентификатор приложения, с которым работает система и который помогает пользователю сориентироваться).
в. Create Options – выберите Start from scratch (с нуля).
г. Schema – выберите схему БД, содержащую объекты, с которыми будет
работать приложение. Щелкните Next>.
Далее добавьте страницы в приложение. Для этого:
1. На шаге Pages установите следующее в секции Add Page:
а. Select Page Type – оставьте значение по умолчанию – Blank.
б. Page Name – введите Главная.
в. Щелкните по кнопке Add Page. Созданная страница появилась в списке страниц приложения в верхней секции (Create Application).
2. Затем добавьте страницу с отчетом о подразделениях, основанном на таблице
DEPARTMENTS. Для этого в секции Add Page установите следующее:
а. Select Page Type – выберите Report.
б. Subordinate to Page – выберите Главная (это необходимо для определения иерархии страниц в приложении).
в. Page Source – оставьте значение Table.
г. Table Name – выберите DEPARTMENTS. В списке отображаются все
таблицы и представления схемы, с которой ассоциировано приложение.
д. Implementation – выберите Classic.
е. Щелкните Add Page. Страницы, перечисленные в секции Create
Application, отображают иерархию страниц в приложении.
Далее измените имя страницы, установленное по умолчанию – Departments,
– на Подразделения:
а. Щелкните по ссылке Departments.
б. В секции Page Definition измените Page Name на Подразделения.
в. Щелкните Apply Changes.
г. В секции Create Application щелкните Next >.
После добавления страниц необходимо определить некоторые параметры уровня
приложения:
1. На шаге Shared Components оставьте No и щелкните Next>.
2. На шаге Attributes:
а. Authentication Scheme оставьте Application Express.
б. Language – выберите Russian (ru).
в. Date Format – введите маску DD.MON.YYYY,щелкните Next>.
3. На шаге User Interface Theme выберите тему Theme 21 и щелкните Next>.
4. На шаге Confirm проверьте введенные данные и щелкните Create Application.
Две созданные страницы – Главная и Подразделения – по умолчанию отображаются в виде иконок на странице приложения в Application Builder. Обратите внимание, что Oracle APEX автоматически добавил в приложение страницу
Login.
Чтобы просмотреть приложение, необходимо запустить его. 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
)
Обратите внимание, что приложение содержит элементы и свойства, которые
позволяют быстро выполнять определенные задачи:
• Breadcrumbs – отображают иерархию и путь страницы в виде ссылок.
Щелкая по ссылкам, можно перемещаться по иерархии:
• Сортировка – чтобы отсортировать данные по столбцу, нужно щелкнуть
по заголовку этого столбца.
• Search – для поиска записей, содержащих определенные данные, необходимо ввести эти данные (строку поиска) в поле поиска и нажать кнопку
Go. Поиск не чувствителен к регистру.
• Display – поле со списком позволяет выбрать число записей, которое будет отображаться на странице. Для обновления необходимо нажать кнопку Go.
• Spread Sheet – щелчок по этой ссылке вызывает диалог сохранения данных в CSV файле.
• Next и Previous – эти ссылки позволяют перемещаться между подмножествами данных (если все записи целиком не помещаются на одной странице, они разбиваются в соответствии со значением параметра Display).
• Список подмножеств записей – позволяет выбрать, какое из подмножеств
отобразить на странице.
Можно запускать также и отдельные страницы приложения. Для этого в списке
страниц выбрать опцию Run напротив нужного приложения.
2. Связывание разных таблиц в одном отчете
Изменим запрос для отчета Подразделения так, чтобы он включал данные из
таблицы EMPLOYEES:
1. Откройте определение страницы Подразделения в списке страниц на
вкладке, соответствующей идентификатору Вашего приложения.
2. В разделе Page Rendering обратите внимание на секцию Items. В ней перечислены элементы управления, содержащиеся на странице.
3. В этом же разделе найдите секцию Regions и щелкните по ссылке Подразделения. Откроется окно Identification. Найдите секцию Source и изучите
запрос в поле Region Source.
4. Замените текст запроса в текстовом поле Region Source на следующий:
SELECT d.department_id "Department ID",
d.department_name "Department Name",
count('x') "Number of Employees",
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
5. Изучите текст нового запроса. Обратите внимание на использование групповой функции count() и предложение GROUP BY.
6. Щелкните по кнопке Apply Changes.
7. Запустите страницу. Отобразится видоизмененный отчет о подразделениях:
Обратите внимание на 3 новых столбца: Number Of Employees, Manager Name (вместо идентификатора теперь отображается первая буква имени и
фамилия) и Location.
3. Создание отчета и формы для таблицы EMPLOYEES
Для создания отчета о работниках и формы для редактирования:
1. Перейдите на домашнюю страницу приложения в Application Builder.
2. Щелкните по кнопке Create Page >.
3. На шаге Create Page:
а. Выберите Form и щелкните Next >.
б. Выберите Form on a Table with Report и щелкните Next >. Эта опция
создает две страницы: отчет и форму, основанные на одной таблице
или представлении.
4. На шаге Report Page:
а. Implementation – выберите Classic.
б. Breadcrumb – выберите Breadcrumb. Появится секция Create
Breadcrumb Entry.
в. В Select Parent Entry выберите ссылку на страницу Главная.
г. В полях Entry Name, Page Name и Region Title измените значение на
Работники, щелкните Next >.
5. На шаге Data Source:
а. В поле Table/View Owner оставьте значение по умолчанию.
б. В поле Table/View Name выберите EMPLOYEES и щелкните Next >.
в. На шаге Tabs в Tab Options оставьте опцию Do not use tabs и щелкните Next >.
6. На шаге Report Columns:
а. В списке Select Column(s), нажав и удерживая клавишу Ctrl выберите
следующие столбцы:
• EMPLOYEE_ID
• FIRST_NAME
• LAST_NAME
• HIRE_DATE
• SALARY
• COMMISSION_PCT
Выбранные столбцы появятся на странице отчета. Щелкните Next >.
б. В Edit Link Image оставьте иконку, выбранную по умолчанию, и
щелкните Next >.
7. На шаге Form Page:
а. В
полях
Page
Name,
Region
Title
введите
Создать/Редактировать Работника. Щелкните Next >.
б. В поле Primary Key Type выберите Select Primary Key Column(s), а
затем в поле Primary Key Column 1 выберите EMPLOYEE_ID и щелкните Next >.
в. В Define the source for the primary key columns выберите Existing Sequence, а в появившемся внизу поле Sequence выберите EMPLOYEES_SEQ (EMPLOYEES_SEQ – это объект БД «сиквенс» (последовательность), предназначенный для генерации уникальных числовых
значений, которые используются в качестве значений суррогатных
идентификаторов). Щелкните Next >.
г. В списке Select Column(s) выберите все столбцы и щелкните Next >.
Эти
столбцы
появятся
в
форме
Создать/Редактировать Работника.
д. В блоке Identify Process Options оставьте все как есть (значения Yes
для операций Insert, Update и Delete) и щелкните Next >. Это позволит
пользователям добавлять, изменять и удалять записи о работниках.
8. На шаге Confirm проверьте выбранные атрибуты страниц формы и отчета и
щелкните по кнопке Create.
9. Запустите созданную страницу. Отобразится отчет Работники:
Обратите внимание на следующие моменты:
• Выбранная иконка редактирования появляется в каждой записи. Иконка
представляет собой ссылку, щелчок по которой приводит к переходу на
страницу формы Создать/Редактировать Работника, в которой
можно изменить запись о работнике.
• В правом верхнем углу мастером была создана кнопка Create (не видна на
рисунке), щелчок по которой также приводит к переходу на страницу
формы Создать/Редактировать Работника, на которой можно создать запись о новом работнике в таблице EMPLOYEES.
• Отчет Работники включает в себя выбранные столбцы. Oracle APEX на
основе этого выбора создал соответствующий SQL-запрос, который возвращает эти данные.
10. Для того чтобы просмотреть форму для редактирования, которая была создана вместе с отчетом, щелкните по иконке редактирования в какой-либо записи отчета Работники. Появится форма Создать/Редактировать Работника:
Обратите внимание на следующие моменты:
• Форма содержит кнопки Cancel, Delete и Apply Changes (на рисунке не
показаны).
• Обязательные столбцы (на которые в БД наложено ограничение целостности Not Null) выделены цветом (это видно, когда структура таблиц БД создается в APEX).
• Рядом с полем Hire Date отображается иконка календаря , т.к. тип данных соответствующего столбца – DATE. Щелчок по этой иконке приводит
к появлению окна с календарем.
1)
2)
3)
4)
4. Выполнение расчетов в отчете
Далее выполним модификацию отчета о работниках:
создадим PL/SQL функцию, которая вычисляет зарплату работника;
добавим столбец «Зарплата/Год» для отображения результатов этих вычислений в отчете о работниках,
восстановим в столбце иконку редактирования и ссылку на страницу Создать/Редактировать Работника,
назначим всем столбцам русскоязычные заголовки и изменим формат вывода
числовых столбцов.
4.1. Вычисление зарплаты работника
1. Перейдите на домашнюю страницу приложения и щелкните по иконке SQL
Workshop, а затем SQL Commands. Появится окно, в котором Вы можете
запускать SQL и PL/SQL код в БД.
2. Введите следующий скрипт:
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.
3. Щелкните по кнопке Run. В окне Results отобразится сообщение
«Function created.»
4.2. Добавление столбца с годовой зарплатой
1. Откройте страницу Page Rendering для страницы Работники:
а. В секции Regions щелкните по ссылке Работники. Появится раздел
Region Definition.
б. В секции Source проанализируйте имеющийся там автоматически сгенерированный код:
select "EMPLOYEE_ID",
"FIRST_NAME",
"LAST_NAME",
"HIRE_DATE",
"SALARY",
"COMMISSION_PCT"
from "#OWNER#"."EMPLOYEES"
Обратите внимание на следующие моменты:
• В запрос включены столбцы, выбранные при создании отчета с помощью мастера.
• #OWNER# – подстановочная строка (substitution string), представляющая имя схемы, с которой ассоциировано приложение и в которой содержатся необходимые таблицы.
2. Замените код запроса на следующий:
SELECT "EMPLOYEE_ID" "Emp_Id",
"FIRST_NAME",
"LAST_NAME",
"HIRE_DATE",
"SALARY",
"COMMISSION_PCT",
calc_remuneration(salary,commission_pct) "Зарплата/год"
FROM "#OWNER#"."EMPLOYEES"
Обратите внимание на следующие моменты:
• В
запрос
добавился
вызов
созданной
ранее
функции
calc_remuneration, которой передаются значения столбцов SALARY
и COMMISSION_PCT.
• Для столбца EMPLOYEE_ID и столбца с функцией calc_remuneration
установлены синонимы, соответственно, «Emp_Id» и «Зарплата/год» .
3. Щелкните Apply Changes.
4. Чтобы просмотреть новую страницу отчета Работники, щелкните иконку
Run в правом верхнем углу:
Обратите внимание на следующие моменты:
• Появился новый столбец Зарплата/год.
• Пропала
иконка
со
ссылкой
на
страницу
Создать/Редактировать Работника. Это произошло потому, что
изменилось название столбца, с которым была ассоциирована ссылка
на страницу редактирования записи о работнике (мы установили синоним Emp_Id для столбца EMPLOYEE_ID).
• Столбцы отчета имеют англоязычные названия (кроме Зарплата/Год, которому мы установили русскоязычный синоним в запросе).
• Столбец со значением идентификатора работника отображается предпоследним в отчете.
4.3. Восстановление иконки редактирования
Теперь восстановим в столбце Emp_Id иконку и ссылку на страницу
Создать/Редактировать Работника:
1. На странице определения страницы Работники в секции Regions щелкните
по ссылке Работники. Откроется новое окно, в котором выберите опцию
Report Attributes.
2. В секции Column Attributes найдите атрибут Emp_Id и с помощью кнопки
переместите его в начало списка.
3. У атрибута Emp_Id щелкните по иконке
слева. Откроется страница редактирования атрибута-столбца Emp_Id.
4. В секции Column Link:
а. В поле Link Text установите текст, представляющий собой html-тэг для
отображения необходимой иконки (щелкните по ссылке [Icon 5]);
б. В поле Page из выпадающего списка выберите страницу Создать/Редактировать Работника. Соответствующий номер страницы автоматически установится в поле;
в. В списке параметров ссылки для параметра Item 1 установите следующие
значения: в поле Name – P?_EMPLOYEE_ID (напомним, что ? – номер
страницы в приложении), в поле Value - #Emp_id#. Сделать это лучше,
щелкнув по иконкам-ссылкам Find Item
и Pick Column
и выбрав
необходимые значения из списков. Значение P?_EMPLOYEE_ID – это имя
скрытого поля (item) на странице ?_Создать/Редактировать Работника, представляющего идентификатор работника. Значение
#Emp_Id# – это подстановочная строка, вместо которой APEX подставит
выбранное пользователем значение столбца Emp_Id (в котором содержится идентификатор работника) из отчета Работники.
5. Щелкните по кнопке Apply Changes в верхней части страницы. Вы вернетесь
на страницу Report Attributes. Обратите внимание, что в списке столбцов
отчета у столбца Emp_Id появилась пометка Link, которая говорит о том,
что с этим столбцом ассоциирована ссылка.
4.4. Русификация заголовков и форматирование полей
1. Установите для каждого столбца в поле Heading русскоязычные названия:
2. В Column Alignment установите right для столбцов SALARY, COMMISSION_PCT и Зарплата/год.
3. Для того чтобы отредактировать формат столбца SALARY:
а. Щелкните по иконке
слева от него.
б. На странице редактирования атрибута-столбца SALARY найдите секцию Column Attributes и в поле Number/Date Format выберите из
списка 5,234.10. Соответствующая форматная маска будет подставлена в данное поле.
в. Щелкните по кнопке Apply Changes.
4. Повторите предыдущий шаг для столбца Зарплата/Год.
5. Примените изменения.
6. Запустите страницу отчета Работники:
Обратите внимание на следующие моменты:
• Восстановлена иконка со ссылкой на страницу Создать/Редактировать
Работника.
• Все столбцы отчета имеют русскоязычные заголовки.
• Столбцы Оклад/Месяц и Зарплата/Год отображаются в денежном формате.
7. Установите русскоязычные названия столбцов (в поле Heading) для страницы Подразделение.
Задание к работе:
1. Создайте приложение с именем, соответствующим своей фамилии в транслитерации.
2. Проделайте все описанные действия со своими данными. При этом все промежуточные результаты через кнопку PrintScreen сохранять в отдельном
файле:
• Результат решения задачи 1.
• Видоизмененный отчет о подразделениях из задачи 2.
• Отчет о работниках и форма из задачи 3.
• Отчет о работниках с зарплатой за год – из задачи 4.
3. Покажите результат преподавателю.
Лабораторная работа № 4. Создание связей между приложениями
Задачи:
1) Изменить поля на странице Создать/Редактировать Работника так,
чтобы они отображали выпадающие списки выбора (selection lists).
2) Добавить на Главной странице ссылку на страницу отчета Работники.
3) Соединить отчеты Работники и Подразделения.
1. Создание и использование выпадающих списков выбора
Создание выпадающих списков выбора производится в два этапа: вначале создаются списки значений (Lists of Values - LOV) для каждого уникального поля; затем
поле изменяется так, чтобы оно могло отображать выпадающий список.
Для решения задачи потребуется таблица JOBS вида:
JOB_ID
1
2
3
4
5
6
JOB_TITLE
управляющий
директор
уборщик
секретарь
программист
стажёр
Создайте эту таблицу (первичный ключ – JOB_ID) (можно использовать данные
из таблицы).
1.1. Создание списков значений
1. Откройте свое приложение в Application Builder для редактирования.
2. Щелкните по иконке Shared Components.
3. На странице Shared Components в секции User Interface щелкните по ссылке Lists of Values.
4. Создайте список значений для должностей (JOBS):
а. На странице Lists of Values щелкните по кнопке Create >.
б. На шаге Source выберите From Scratch («с нуля»), нажмите Next>.
в. На шаге Name and Type в поле Name введите JOBS, а в Type выберите
Dinamic. Нажмите Next>.
г. На шаге Query or Static Values замените текст запроса на следующий1:
SELECT job_title d, job_id v
FROM jobs
ORDER BY d
Обратите внимание на подсказку, содержащуюся в названии поля:
«Query (SELECT DISPLAY_VALUE, RETURN_VALUE FROM...):»
Это означает, что важен порядок, в котором возвращаются значения. В
первом столбце должно возвращаться отображаемое значение (которое
будет видеть пользователь), а во втором – собственно значение, которое
будет вставлено в поле таблицы.
1
Для уточнения названий столбцов таблиц можно воспользоваться средством для просмотра структуры БД – «браузером объектов» (SQL
Workshop>Object Browser), открыв его в отдельной вкладке интернет-браузера
д. Щелкните по кнопке Create List of Values. Созданный список значений
отобразится на странице Lists of Values.
5. Создайте список значений для работников (EMPLOYEES):
а. На странице 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. Созданный список значений
отобразится на странице Lists of Values.
6. Подобным образом создайте список значений для подразделений
(DEPARTMENTS). Значения должны выбираться из таблицы DEPARTMENTS.
Роль отображаемого значения должны играть значения столбца department_name, а роль возвращаемого значения – значения столбца
department_id.
1.2. Связывание элементов со списками значений
После создания списков значений необходимо настроить визуальные элементы
(items) таким образом, чтобы они отображались как выпадающие списки выбора (select lists). По умолчанию визуальные элементы отображаются в виде текстовых полей.
1. Откройте окно редактирования для страницы Создать/Редактировать
Работника.
2. В разделе Page Rendering найдите секцию Items, подчиненную пункту Создать/Редактировать Работника. В этой секции отображается список всех
визуальных элементов страницы.
3. Чтобы отредактировать визуальный элемент, отображающий должность
(P?_JOB_ID):
а. В секции Items щелкните по ссылке P?_JOB_ID. Отобразится страница
редактирования элемента.
б. В секции Identification выберите Select List в поле Display As.
в. В секции Label измените значение в поле Label на Должность.
г. В секции List of Values в поле Named LOV выберите JOBS.
д. Примените изменения.
4. Аналогично отредактируйте элемент, отображающий подразделение
(P?_DEPARTMENT_ID). В качестве названия элемента должно отображаться
Подразделение, для неопределенных значений должно отображаться нет подразделения-. Для этого в поле Display Null Value выберите Yes
(отображать неопределенные значения), а в поле Null display value введите
-нет подразделения-. В качестве списка значений выберите
DEPARTMENTS.
5. Запустите страницу. Обратите внимание, что поля Должность и Подразделение теперь отображаются как выпадающие списки:
6. Отредактируйте оставшиеся элементы формы так, чтобы для них отображались русскоязычные названия (замените значения в поле Label для каждого
элемента на русскоязычное название):
Если сейчас запустить приложение, то можно обнаружить, что нет возможности просмотреть отчет о работниках, т.к. на Главной странице нет никакой ссылки
на страницу Работники. На самом деле, перейти к любой странице можно, введя ее
полный адрес в адресной строке браузера, например, адрес Главной страницы может
выглядеть следующим образом: https://apex.oracle.com/pls/apex/f?p=58430:1:10680797661828.
В
этой
ссылке
особый
интерес
представляет
строка
f?p=58430:1:10680797661828, в которой 58430 – это уникальный идентификатор приложения в APEX, 1 – это номер страницы в приложении, а 10680797661828
– идентификатор сессии, автоматически генерируемый APEX. Заменив номер страницы в ссылке, можно перейти к соответствующей странице.
2.
1.
2.
3.
Добавление на Главной странице ссылки на отчет Работники
Откройте свое приложение в Application Builder для редактирования.
Щелкните по иконке Shared Components.
В секции Navigation щелкните по ссылке Lists. Откроется страница с элементами листа Lists, в которой щелкните по иконке Navigation. Откроется
страница List Details, в которой пока только одна ссылка – на страницу Подразделения.
4. На странице List Details щелкните по кнопке Create List Entry >. Отобразится страница создания/редактирования элемента списка (Create/Edit).
5. На странице Create/Edit введите следующее:
а. Sequence – 20.
б. List Entry Label – Работники.
в. Page – выберите страницу Работники.
6. Щелкните Create and Create Another. В меню List Entries (см. справа) появится добавленная ссылка.
7. Запустите Главную страницу:
Обратите внимание, что теперь на Главной странице есть ссылка на страницу
Работники.
8. Протестируйте ссылки на Главной странице.
3. Соединение отчетов
Соединим отчеты так, чтобы можно было, выбирая нужное подразделение, получать отчет о соответствующих работниках.
Для выполнения требуемого перехода создадим на отчете Работники область
(Region), в которой будет располагаться поле с выпадающим списком подразделений.
Область – это участок на странице, который играет роль контейнера для содержимого
страницы. Каждая страница может иметь любое количество областей. Внешний вид
области задается с помощью шаблона (region template). Области обычно используются для группировки элементов управления на странице – например, визуальные элементов (items) или кнопок (buttons).
Для создания области:
1. Откройте окно редактирования для страницы Работники.
2. Щелкните по кнопке Create
. Отобразится мастер создания области. Выберите опцию Region on this page. Нажмите Next>.
3. На шаге Region:
а. Определите тип области – оставьте тип по умолчанию – HTML, – и щелкните Next >.
б. Определите тип HTML контейнера – оставьте HTML и щелкните Next >.
4. На шаге Display Attributes:
а. Title – введите Подразделение.
б. Region Template – выберите No Template. Область будет добавлена без
заголовка области.
в. Sequence – измените на 5. Это необходимо, чтобы создаваемая область
отображалась над областью Работники (которая имеет sequence = 10).
г. Оставьте другие параметры без изменений и щелкните Next >.
5. Щелкните Create Region. Обратите внимание, что в секции Regions теперь
отображается область Подразделение, имеющая тип HTML.
Теперь необходимо создать в области Подразделение визуальный элемент
(item), который представляет собой выпадающий список выбора, использующий список значений подразделений:
1. Щелкните по кнопке Create
и выберите опцию Page control on this page.
Нажмите Next>. Отобразится мастер создания визуальных элементов.
2. На шаге Create Page Component выберите опцию Item, нажмите Next>;
3. На шаге Item Type выберите тип элемента – Select List – и щелкните Next >.
4. На шаге Display Position and Name:
а. Item Name – замените на P?_DEPARTMENT_ID.
б. Sequence – поставьте значение 10.
в. Region – выберите Подразделение. Щелкните Next >.
5. На шаге Item Attributes замените значение Label на Подразделение и
щелкните Next >.
6. На шаге Settings в поле Page Action When Value Changed установите Submit Page. Нажмите Next>.
7. На шаге List of Values:
а. Named LOV – выберите DEPARTMENTS. Этот список создан как компонент, разделяемый на уровне приложения (Shared Component), в предыдущей работе.
б. Display Null Value – оставьте значение Yes.
в. Null Display Value – введите -нет подразделения-.
г. Null Return Value – введите -1. Ввод значений, которые подставляются
вместо неопределенного значения (Null Value), позволяет облегчить написание запросов (облегчает проверку на Null). В этом случае, когда пользователь выбирает в списке -нет подразделения-, в элементе устанавливается значение -1, и Вы можете использовать это значение в запросе. Щелкните Next >.
8. На шаге Source:
а. В поле Default введите -1.
б. Оставьте другие параметры без изменений и щелкните Create Item.
Итак, создан элемент, который будет принимать значения идентификатора
подразделения, но пока еще он не соединен с отчетом. Чтобы сделать это, необходимо отредактировать SQL-запрос в Region Source, добавив в него предложение
WHERE:
1. Откройте окно редактирования (Region Definition) для области Работники.
2. В поле 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 соответствует созданному ранее элементу.
3. Примените изменения.
Когда на странице выполняется команда Submit, то переходы (branches), указанные для страницы, определяют, какая страница должна отобразиться следующей.
В данном случае необходимо, чтобы после команды Submit на странице Работники
снова отобразилась та же самая страница с отчетом о работниках, поэтому необходимо создать переход на страницу Работники:
1. В окне редактирования (Page) страницы Работники в колонке Page
Processing выберите опцию After Submit и щелкните по иконке Create
.
Отобразится мастер создания перехода. Выберите опцию Branch и щелкните
Next>.
2. На шаге Branch Attributes в строке Name введите Работники, остальное
оставьте как есть. Нажмите Next>.
3. На шаге Target:
а. В качестве целевой страницы в окне Page выберите страницу Работники.
б. Отметьте флажок reset pagination for this page. Когда установлена эта опция, приложение отображает первую порцию данных, удовлетворяющих
запросу. Когда же эта опция не выбрана, то если пользователь просматривал, например, третью порцию данных и выбрал другое подразделение, то
ему будет отображена третья порция нового запроса.
в. Оставьте все остальные параметры без изменений и создайте переход
(нажмите Create Branch на шаге Branch Conditions).
4. Запустите страницу. Выберите любое подразделение, например, «Вестер».
Должны отобразиться только работники, относящиеся к этому подразделению:
5. Добавьте возможность сортировки в отчете Подразделения по всем
столбцам и в отчете Работники по всем столбцам, кроме столбца Изменить. Это можно сделать, поставив флажки Sort в разделе Column
Attributes в окне редактирования столбцов соответствующего отчета (Report
Attributes).
6. Запустите приложение и добавьте несколько работников в одно из подразделений. При этом проверьте работу сортировки по столбцам.
7. Измените в отчете Подразделения запись об одном из подразделений,
удалив в нем сведения о менеджере (это надо сделать через соответствующую таблицу), и запустите это приложение.
Обратите внимание, что в отчете Подразделения исчезла запись о соответствующем подразделении. Причина в SQL-запросе, который не возвращает запись о
подразделении, если в нем нет работников или менеджера. Чтобы в отчете отображались все подразделения, необходимо модифицировать SQL-запрос:
1. Замените текст запроса в 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.last_name,1,1)||'. '|| e.first_name,
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
'')
"Manager
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.
2. Примените изменения и запустите страницу:
Обратите внимание, что теперь отображаются все подразделения, даже те, у которых не указаны менеджеры (и в которых нет работников).
Задание к работе:
1. Проделайте все описанные действия со своими данными. При этом все промежуточные результаты через кнопку PrintScreen сохраняйте в отдельном
файле:
• Результат решения задачи 1.
• Результат решения задачи 2.
• Результат решения задачи 3.1.
• Результат решения задачи 3.2.
2. Покажите результат преподавателю.
Лабораторная работа № 5. Редактирование приложений
Задачи:
1) Добавить на страницу Работники отчет (область), отображающий детали
выбранного подразделения. Задать условие (condition), по которому детали
подразделения отображаются только, если выбрано какое-либо подразделение, если же выбрано -нет подразделения-, то область не должна отображаться.
2) Создать страницу с формой для создания/редактирования подразделения.
3) Создать список значений LOCATIONS с использованием построителя запросов.
4) Соединить форму Создать/Редактировать Подразделение со страницей Подразделения, добавив в отчет Подразделения ссылку для перехода в режим редактирования (в столбце отчета), а также кнопку Создать
для создания нового подразделения.
1. Создание отчета и условия
1. Откройте свое приложение в Application Builder.
2. Откройте окно редактирования для страницы Работники. В разделе Page
Rendering щелкните по иконке Create
.
3. На странице New Component выберите опцию Region on this page. Нажмите
Next>.
4. С помощью мастера создайте область, задав для нее следующие параметры
(для остальных параметров оставьте значения по умолчанию):
а. Тип области – Report
б. Реализация отчета – Classic Report
в. Название области (Title) – О подразделении
г. Шаблон области (Region Template) – No Template
д. Очередность (Sequence) – 7 (это значит, что создаваемая область будет
располагаться между областями со значениями sequence 5 и 10)
е. SQL запрос (SQL Query) :
SELECT count(e2.employee_id) "Number of Employees:",
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);
• count(*) – групповая функция, которая подсчитывает количество записей в группе (а каждая запись в группе соответствует в данном запросе работнику указанного подразделения);
• substr(e.last_name,1,1)||'. '|| e.first_name – вырезается первый символ из имени работника (менеджера) и соединяется с
точкой и пробелом, а затем фамилией работника (менеджера);
• условие, заданное в предложении WHERE, обеспечивает выборку только подразделения, имеющего заданный идентификатор (параметр
:P2_DEPARTMENT_ID);
• в предложении GROUP BY перечислены столбцы, к которым не применена групповая функция.
ж. Шаблон отчета (Report Template) –
default: vertical report, look 1 (include null columns)
На шаге Условное отображение (Conditional Display):
з. Тип условия (Condition Type) – Value of Item in Expression 1
!= Expression 2
Данный тип условия означает, что условие будет истинным, если значение
первого выражения не будет равно значению второго выражения.
и. Expression 1 – введите P?_DEPARTMENT_ID
к. Expression 2 – введите -1
Заданное условие означает, что данный отчет будет отображаться только тогда, когда значение элемента P?_DEPARTMENT_ID не будет равно -1 (т.е.,
только если будет выбрано конкретное подразделение).
5. Задайте для столбцов отчета русскоязычные названия:
Обратите внимание, что внизу только что созданного отчета отображаются
символы 1-1. Это означает, что для данного отчета включена разбивка на страницы
(pagination). Однако в данном случае она бессмысленна, т.к. отображается всегда
только одна запись (о выбранном подразделении).
Для отключения разбивки на страницы:
1. Откройте окно редактирования для страницы Работники.
2. Откройте окно редактирования атрибутов отчета О подразделении.
3. Во вкладке Report Attributes в секции Layout and Pagination в поле Pagination Scheme выберите -No Pagination Selected-.
4. Примените изменения и запустите страницу. Проверьте правильность работы
отчета.
2. Создание формы для создания/редактирования подразделения
В нашем приложении нет возможности редактировать существующие записи о
подразделениях и создавать новые. Для получения такой возможности создайте страницу с формой для создания и редактирования сведений о подразделениях, подобную
странице Создать/Редактировать Работника (должна быть создана только
одна страница с формой):
1. На домашней странице своего приложения нажмите Create Page>.
2. Выберите опцию Form, нажмите Next>.
3. Выберите опцию Form on Table or View и нажмите Next>.
4. В поле Table/View Name выберите имя таблицы – Departments,
нажмите Next>.
5. В полях Page Name, Region Title введите Создать/Редактировать
Подразделение.
6. В поле Breadcrump установите Breadcrump. Это установит на странице
навигационную цепочку. Тогда в поле Entry Name введите название элемента навигационной цепочки – Создать/Редактировать Подразделение.
7. В секции Select Patern Entry выберите Подразделения. Нажмите
Next>.
8. Установите опцию Use an existing tab set and reuse an existing tab within that
tab set. В окне Tab Set оставьте (Главная, Подразделение), в окне Use Tab
выберите Подразделение. Нажмите Next>.
9. Установите опцию Select Primary Key и в окне Primary Key Column 1
выберите Department_id. Нажмите Next>.
10. Установите опцию Existing sequence и в поле Sequence в качестве источника значений для столбца первичного ключа (DEPARTMENT_ID)
укажите последовательность (sequence) DEPARTMENTS_SEQ. Нажмите
Next>.
11. Выберите нужные поля для отображения в форме.
12. Все стандартные кнопки должны быть представлены на странице. Ярлыки для кнопок должны быть русскоязычными (Отменить, Применить,
Удалить).
13. После отправки страницы (submit) или отмены изменений должен производиться переход на страницу Подразделения.
14. Доработайте созданную страницу Создать/Редактировать Подразделение так, чтобы названия полей отображались по-русски.
15. Модифицируйте форму, чтобы поле для указания менеджера подразделения представлялось как выпадающий список выбора, причем он должен
отображать пустые значения в виде -нет менеджера-:
а. В разделе Page Rendering найдите секцию Items, подчиненную пункту
Создать/Редактировать Подразделение.
б. Чтобы отредактировать визуальный элемент, отображающий менеджера (P?_MANAGER_ID):
• В секции Items щелкните по ссылке P?_MANAGER_ID. Отобразится
страница редактирования элемента.
• В секции Identification выберите Select List в поле Display As.
• В секции Label измените значение в поле Label на Менеджер.
• В секции List of Values в поле Named LOV выберите EMPLOYEES.
• В нужном поле введите текст –нет менеджера- (выполнить самостоятельно).
• Примените изменения.
Решите аналогичную задачу для поля Расположение, причем если расположение не указано, надо отобразить текст -не указано расположение-.
Очевидно, для создания списка выбора для поля Расположение (Location
Id) не хватает подходящего списка значений (List of Values). Необходимо создать список значений, а затем доделать задание.
3. Создание списка LOCATIONS
Ключевым моментом при создании списка значений является определение
SQL-запроса, возвращающего множество пар (отображаемое значение, возвращаемое
значение). Так как понятие «расположение» является сложным и включает в себя
страну, город, адрес и т.д., сначала необходимо подготовить соответствующий запрос. Воспользуемся для этого построителем запросов:
1. Откройте
страницу
построителя
запросов
(Home>SQL Workshop>Utilities>Query Builder). Для удобства работы это
можно сделать в отдельной вкладке или окне браузера.
2. В списке в левой части построителя отображаются таблицы, содержащиеся в
Вашей схеме. Щелкните по таблицам LOCATIONS и COUNTRIES. Изображения таблиц появятся в центральной части построителя.
3. Из этих таблиц потребуются столбцы COUNTRY_NAME, CITY,
STREET_ADDRESS и LOCATION_ID. Выберите их, установив флажки слева
от названий столбцов.
4. Чтобы для каждого расположения выводилась соответствующая страна, эти
таблицы
необходимо
соединить
условием
LOCATIONS.COUNTRY_ID=COUNTRIES.COUNTRY_ID. Соедините таблицы, щелкнув по незаполненным клеткам справа от соответствующих названий столбцов:
Обратите внимание на текст SQL-запроса, который автоматически сформировался во вкладке SQL в нижней части построителя. Возможности построителя запро-
сов очень ограничены, однако его можно использовать для формирования черновых
заготовок запросов.
Переключившись на вкладку Results (или нажав кнопку Run), Вы увидите результат выполненного запроса:
Полученный запрос еще не пригоден для использования при построении
списка значений. Необходимо доработать его так, чтобы компоненты расположения (страна, город и адрес) выводились в одном столбце.
5. Сохраните
полученный
запрос
под
именем,
например,
lab5_pre_locations. Для этого нажмите кнопку Save в верхней части
построителя. Переключившись затем на вкладку Saved SQL, Вы увидите сохраненный запрос.
6. Откройте страницу Home>SQL Workshop>SQL Commands. Переключитесь
на вкладку Saved SQL и щелкните по ссылке lab5_pre_locations. Откроется сохраненный Вами запрос, который теперь можно доработать и проверить.
7. Объедините в тексте запроса столбцы COUNTRIES.COUNTRY_NAME, LOCATIONS.CITY и LOCATIONS.STREET_ADDRESS строковыми операторами || (две вертикальные черты), удаляя автоматически сформированные
в построителе запросов синонимы и добавляя между столбцами строковые
константы ', ' (запятая и пробел в одинарных кавычках), как показано на
рисунке ниже:
8. Выполните запрос, нажав на кнопку Run. Если запрос написан корректно, во
вкладке Results отобразятся записи, организованные в 2 столбца:
9. Сохраните скорректированный запрос под именем lab5_locations. Теперь Вы готовы создать список значений для расположений (LOCATIONS).
10. Скопируйте текст запроса в буфер обмена.
11. Создайте список значений с именем LOCATIONS, причем в поле с текстом
запроса вставьте подготовленный запрос из буфера обмена:
а. Откройте свое приложение в Application Builder для редактирования.
б. Щелкните по иконке Shared Components.
в. На странице Shared Components в секции User Interface щелкните по
ссылке 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.
12. Доделайте выпадающий список выбора для поля Расположение (самостоятельно).
13. Запустите страницу Создать/Редактировать Подразделение и проверьте ее работу.
4. Соединение страниц Подразделения и Создать/Редактировать
Подразделение
1. Добавьте в столбец с идентификатором подразделения на странице Подразделения ссылку на страницу Создать/Редактировать Подразделение аналогично тому, как это делалось для страницы Работники в лабораторной работе 2. При этом вместо идентификатора подразделения должна
отображаться иконка; в названии столбца должно отображаться Изменить;
при переходе по ссылке на странице Создать/Редактировать Подразделение должно отображаться редактируемое подразделение. Для этого:
а. На странице определения страницы Подразделения в секции Regions
щелкните по ссылке Подразделения. Откроется новое окно, в котором
выберите опцию Report Attributes.
б. В секции Column Attributes у атрибута Department_Id щелкните по
иконке
слева. Откроется страница редактирования атрибута-столбца.
в. В секции Column Link:
• В поле Link Text установите текст, представляющий собой html-тэг для
отображения необходимой иконки (щелкните по ссылке [Icon 5]);
• В поле Page из выпадающего списка выберите страницу Создать/Редактировать Подразделение. Соответствующий номер
страницы автоматически установится в поле;
• В списке параметров ссылки для параметра Item 1 установите следующие значения: в поле Name – P?_DEPARTMENT_ID (напомним, что ?
– конкретный номер страницы в приложении), в поле Value - #DEPARTMENT id#. Сделать это лучше, щелкнув по иконкам-ссылкам Find
Item
и Pick Column
и выбрав необходимые значения из списков.
г. Щелкните по кнопке Apply Changes в верхней части страницы. Вы вернетесь на страницу Report Attributes.
д. Запустите приложение Подразделения и проверьте результаты:
2. Добавьте на странице Подразделения кнопку Создать для создания нового подразделения. Для этого:
а. Зайдите в режим редактирования страницы Подразделения.
б. В секции Page Rendering в опции Region Buttons щелкните по кнопке
Create. Откроется страница редактирования соответствующей кнопки на
странице Подразделения.
в. В окне Text label/Alt введите название кнопки – Создать.
г. В окне Button Position выберите опцию Region Template Position
#Create#.
д. В окне Action выберите опцию Redirect to Page in this Application.
е. В окне Page установите нужную страницу для перехода – Создать/Редактировать Подразделение.
ж. В
окне
Clear
Cache
установите
номер
страницы
Создать/Редактировать Подразделение в Вашем приложении.
Этот позволит при переходе по ссылке на страницу
Создать/Редактировать Подразделение отображать незаполненные
поля и кнопки Отменить и Создать (при переходе все элементы этой
страницы примут значения Null).
Теперь есть возможность создавать новые и редактировать существующие подразделения. Расположение подразделения можно выбирать из списка ранее определенных местоположений.
Задание к работе:
1. Проделайте все описанные действия со своими таблицами. При этом все
промежуточные результаты через кнопку PrintScreen сохраняйте в отдельном
файле для показа преподавателю:
• Результат решения задачи 1.
• Результат решения задачи 2.
• Результат решения задачи 3.
• Результат решения задачи 4.
2. Покажите результат преподавателю.
Лабораторная работа № 6. Доработка пользовательского интерфейса
Задачи:
1) Создать отчет для просмотра и форму для редактирования местоположений
(таблица LOCATIONS). Разместить на главной странице ссылку на страницу
созданного отчета о местоположениях. Соединить страницу с формой редактирования подразделений со страницей с формой редактирования местоположений так, чтобы при редактировании данных о подразделении была возможность отредактировать существующее местоположение или создать запись о новом.
2) Доработать пользовательский интерфейс: добавить название приложения на
отображаемые страницы, изменить тему, дооформить главную страницу.
3) Изучить основные этапы развертывания приложения. Экспортировать приложение в виде текстового файла. Создать учетную запись для конечного
пользователя приложения. Научиться определять URL приложения.
В предыдущей лабораторной работе в приложение была добавлена возможность создавать новые и редактировать существующие подразделения. Однако расположение подразделения можно выбирать только из уже существующих. Для того чтобы была возможность создавать новые и редактировать существующие местоположения, необходимо создать пару страниц: с отчетом по всем местоположениям и с формой для редактирования и создания местоположений.
1. Создание отчета и формы для просмотра и редактирования местоположений
Подобная задача решалась ранее:
1. Откройте свое приложение в Application Builder.
2. Создайте форму для редактирования местоположений (таблица LOCATIONS)
с отчетом о существующих местоположениях:
а. Используйте мастер создания страниц Create Page > Form > Form on
a Table with Report.
б. Название страницы отчета (Page Name) – Местоположения
в. Реализация отчета (Implementation) – Classic
г. Название формы для редактирования – Создать/Редактировать Местоположение
д. Навигационная
цепочка
для
страницы
отчета
–
Главная>Местоположения
е. Навигационная цепочка для формы для редактирования –
Главная>Местоположения>Создать/Редактировать Местоположение
3. Доработайте страницу отчета Местоположения:
а. Русифицируйте заголовки столбцов отчета и кнопку Create.
б. Задайте логичную последовательность столбцов в отчете
в. Добавьте возможность сортировки
4. Доработайте форму Создать/Редактировать Местоположение:
а. Русифицируйте ярлыки элементов формы и все кнопки
б. Задайте логичную последовательность элементов на форме (это можно сделать в секции Page Rendering для страницы Создать/Редактировать Местоположение, перетаскивая мышью
идентификаторы полей формы)
в. Поле с кодом страны представьте как выпадающий список выбора (см.
ранее)
5. Добавьте на главную страницу ссылку на страницу с отчетом о местоположениях (см. ранее):
6. Добавьте на страницу Создать/Редактировать Подразделение
кнопку Редактировать расположение для редактирования местоположения. Причем при нажатии кнопки должен производиться переход на страницу Создать/Редактировать Местоположение. При этом в полях
формы должны отображаться данные о редактируемом местоположении (при
переходе в элемент с идентификатором местоположения должен передаваться идентификатор текущего местоположения):
а. Войдите в режим редактирования страницы Создать/Редактировать
Подразделение.
б. Нажмите кнопку Create в правом верхнем углу и выберите опцию
Page control on this page, затем выберите опцию Button.
Нажмите Next>.
в. На шаге Button position выберите опцию Create a bottom in
a region position. Нажмите Next>.
г. На шаге Button Attributes введите:
а. Имя кнопки (Button Name) – EDIT_LOCATION
б. Ярлык (Label) – Редактировать расположение
в. Стиль кнопки (Button Style) – Template Based Button.
г. Button Template – Button, нажмите Next>.
д. На шаге Action When Clicked:
• в поле Action выберите Redirect to Page in this Application,
• в поле Page выберите страницу Создать/Редактировать Местоположение,
• в поле Set This Items установите идентификатор поля
P?_LOCATION_ID, в поле With These Values – идентификатор
поля P??_LOCATION_ID, где ? - номер страницы в Вашем приложении, куда выполняется переход, ?? – номер текущей страницы (обозначения страниц выбираются с помощью кнопки
).
7. Добавьте на странице Создать/Редактировать Подразделение
кнопку Новое расположение для создания нового местоположения при
выполнении условий: имя кнопки – NEW_LOCATION, ярлык (Label) – Новое расположение, при нажатии кнопки должен производиться переход
на страницу Создать/Редактировать Местоположение, причем поля формы должны отображаться незаполненными (для этого при переходе
необходимо очистить кэш целевой страницы):
а. Войдите в режим редактирования страницы Создать/Редактировать
Подразделение.
б. Нажмите кнопку Create в правом верхнем углу и выберите опцию
Page control on this page, затем выберите опцию Button.
Нажмите Next>.
в. На шаге Button position выберите опцию Create a bottom in
a region position.Нажмите Next>.
г. На шаге Button Attributes введите:
д. Имя кнопки (Button Name) – NEW_LOCATION
е. Ярлык (Label) – Новое расположение
ж. Стиль кнопки (Button Style) – Template Based Button.
з. Button Template – Button, нажмите Next>.
д. На шаге Action When Clicked:
• в поле Action выберите Redirect to Page in this Application,
• в поле Page выберите страницу Создать/Редактировать Местоположение,
• в поле Clear Cache установите идентификатор страницы, совпадающий с тем, который высветился в поле Page.
е. Кнопкой Create Button завершите создание кнопки.
8. Протестируйте созданные страницы и переходы по ссылкам.
Итак, к этому моменту Вы создали простое (!!) приложение по работе с подразделениями и работниками. Но перед тем как развернуть созданное приложение и открыть к нему доступ пользователям, имеет смысл доработать пользовательский интерфейс.
2. Доработка пользовательского интерфейса
2.1. Добавление названия приложения
Можно добавить в приложение графический логотип или текст, так что он будет отображаться на каждой странице приложения. Позиция, в которой отображается
логотип/текст, определяется шаблоном страницы.
1. Добавьте название приложения на каждую страницу. Для этого:
а. В Shared Components щелкните по User Interface Attributes в секции User Interface.
б. В секции Logo выберите в Logo Type – Text, в поле Logo впишите название приложения (например, «учебная задача»), в Logo Attributes выберите
Black Text.
Обратите внимание, что после выбора в Logo Attributes появилась строка,
представляющая собой фрагмент HTML кода, задающего стиль отображаемого текста:
Вы можете редактировать эту строку, устанавливая собственные значения атрибутов (фонт, цвет текста, размер шрифта, начертание и т.д.).
2. Запустите приложение. Обратите внимание на левый верхний угол, в котором теперь отображается текст, введенный на предыдущем шаге. Этот текст
отображается на каждой странице приложения:
2.2. Изменение темы пользовательского интерфейса
Тема (theme) – это коллекция шаблонов, которые определяют визуальное
представление пользовательского интерфейса. Каждая тема содержит шаблоны для
каждого компонента и элемента управления, включая страницы (pages), области (regions), отчеты (reports), списки (lists), ярлыки (labels), меню (menus), кнопки (buttons)
и списки значений (list of values).
В Oracle APEX прикладная логика (application logic) отделена от представления
(presentation). Вы можете разрабатывать приложение в одной теме, затем заменить ее
другой предустановленной темой, либо создать и использовать свою собственную тему. Такое отделение прикладной логики (запросов, процессов, переходов и т.д.) от
HTML-визуализации (rendering) позволяет изменять внешний вид приложения, не изменяя его код.
1. Измените тему своего приложения. Для этого:
а. В Shared Components щелкните по Themes в секции User Interface. Откроется страница с темами приложения.
б. На странице с темами запустите мастера создания темы (щелкнув по кнопке Create>).
в. На шаге Method выберите From the Repository (т.к. мы хотим выбрать
уже готовую тему из репозитария APEX).
г. На шаге Identify Theme выберите понравившуюся Вам тему (например,
Cloudy-24).
д. На шаге Confirm подтвердите свой выбор, щелкнув по кнопке Create. Новая тема отобразится на странице с темами Вашего приложения:
е. Щелкните по кнопке Switch Theme (справа вверху).
ж. На шаге Identify Theme выберите добавленную ранее тему.
з. На шаге Verify Compatibility просмотрите информацию, оставьте все как
есть.
Мастер проверяет, есть ли в новой теме соответствующие шаблоны для
каждого шаблона из текущей схемы, установленной в приложении. Если
шаблон отстутствует, в столбце Status отображается предупреждение
(Warning).
и. На шаге Confirm Switch подтвердите свой выбор, щелкнув по кнопке
Switch Theme.
2. Запустите приложение. Обратите внимание на изменения, которые произошли в цветовой схеме и компоновке страниц приложения.
2.3. Оформление главной страницы
Главная страница приложения выглядит недооформленной.
1. Дополните пункты навигационного списка на главной странице графическими иконками:
а. Откройте окно редактирования элементов навигационного списка (зайдите
в режим редактирования страницы Главная, в разделе Shared Components выберите опции Lists - Navigation):
б. Для каждого элемента списка:
• Откройте страницу редактирования Create / Edit двойным щелчком ЛКМ и щелкните по кнопке
рядом с полем Image в секции Entry.
Откроется страница со списком доступных иконок.
Иконки организованы в три основные группы «Standard Images» (стандартные изображения), «Workspace Images» (изображения рабочей области), «Application Images» (изображения приложения). Стандартные
изображения разделены на группы, соответствующие размерам (16x16,
20x20, 32x32, 64x64, 128x128, 140x90).
• Выберите подходящую иконку, щелкнув по ней. В поле Image на странице редактирования будет вписан относительный путь к выбранной
иконке.
2. Запустите главную страницу приложения. Обратите внимание, что она выглядит так же, как и до назначения иконок пунктам навигационного списка.
Причина этого заключается в том, что текущий шаблон списка не позволяет
отображать иконки пунктов списка.
3. Установите шаблон оформления навигационного списка, предполагающий
отображение иконок:
а. Откройте страницу редактирования области навигационного списка, войдя
сначала в режим редактирования страницы Главная, затем дважды
щелкнув по опции Navigation.
б. В секции Source в поле List Template Override выберите шаблон Horizontal Images with Label List.
4. Запустите главную страницу приложения. Обратите внимание на изменения
в представлении списка:
Название области (Navigation) выглядит лишним.
5. Откройте страницу редактирования области навигационного списка и в секции User Interface в поле Template установите No Template.
6. Запустите главную страницу и оцените изменения:
3. Развертывание приложения
После того, как Вы создали приложение в своей среде разработки, обычно требуется подготовить его к использованию конечными пользователями. Этот процесс
называется развертыванием приложения. То есть, необходимо скопировать приложение из Вашей инсталляции Oracle Application Express в инсталляцию заказчика. Очевидно, что у заказчика должен быть установлен сервер БД Oracle, в которой установлена та же версия Oracle Application Express, что и в Вашей среде разработки.
Для того чтобы перенести приложение из одной среды APEX в другую, требуется перенести как метаданные приложения (приложение представляет собой совокупность метаданных в репозитарии APEX), так и все вспомогательные объекты, используемые приложением (объекты БД, изображения, файлы, темы и т.д.). Этот процесс может оказаться достаточно сложным. Создание пакетного приложения (packaged application) позволяет значительно упростить процесс развертывания приложения.
Процесс развертывания приложения состоит из следующих этапов:
1) Экспорт пакетного приложения.
2) Импорт2 и инсталляция3 экспортированных файлов (в работе не выполняется).
2
3
См. «Importing Export Files» в руководстве «Oracle Application Express Application Builder User’s Guide».
См. «Installing Export Files» в руководстве «Oracle Application Express Application Builder User’s Guide».
Практическая апробация технологии развертывания приложений в APEX в
полном объеме выходит за рамки нашего курса и является предметом самостоятельного изучения.
3.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. Приложение будет экспортировано с
поддержкой отладки.
з. В поле Exporting Supporting Object Definitions выберите No. Если выбрать Yes, то приложение будет экспортировано вместе с определениями
вспомогательных объектов (пакетное приложение).
и. В поле Export Developer Comments выберите Yes. Вместе с приложением
будут выгружены комментарии разработчика4.
к. Поле As of оставьте пустым. Это поле позволяет экспортировать приложение по состоянию на указанное количество минут в прошлом.
л. Щелкните по кнопке Export Application. Файл с именем f<номер Вашего
приложения>.sql сохраняется, как правило, в папке <имя диска>\Мои документы\downloads, что можно уточнить, вызвав контекстное меню для
вкладки, соответствующей сохраненному файлу (внизу слева в окне), и затем опцию Показать в папке.
3.2. Создание учетных записей конечных пользователей
После того, как приложение развернуто, необходимо создать учетные записи
для всех конечных пользователей приложения.
1. Создайте учетную запись для конечного пользователя Вашего приложения5.
а. Откройте домашнюю страницу (вкладка Home) Вашей рабочей области.
4
5
См. «Adding Developer Comments» в руководстве «Oracle Application Express Administration Guide»
Более подробно см. «Managing Application Express Users» в руководстве «Oracle Application Express Administration Guide»
б. Зайдите в опцию 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, если Вы не хотите, чтобы от пользователя требовалось изменить пароль при первом
входе в систему.
ж. В секции User Groups Вы можете выбрать группы пользователей, в которые будет входить данный пользователь. Группы пользователей позволяют разработчикам управлять доступом к специальным возможностям и
функциям приложения на уровне групп. Эта возможность не обладает переносимостью между различными схемами аутентификации и полезна,
только когда используется внутренняя аутентификация.
з. Подтвердите создание пользовательской учетной записи, щелкнув по
кнопке Create User.
3.3. Определение URL приложения
Для того чтобы конечные пользователи могли использовать Ваше приложение,
они должны знать его URL. Для этого:
а. Откройте свое приложение в Application Builder.
б. На домашней странице приложения наведите курсор мыши на иконку Run
Application. Обратите внимание на URL, который отображается в статусной панели в нижней части окна браузера. Например:
https://apex.oracle.com/pls/apex/f?p=58430::116390431163533:::::,
где:
• apex.oracle.com – URL сервера
• pls – индикатор того, что нужно использовать mod_plsql картридж
• apex – имя database access descriptor (DAD).
• f?p= – это префикс, используемый Oracle Application Express
• 58430 – это идентификатор вызываемого приложения
• 116390431163533 – номер сессии
Чтобы запустить приложение, пользователь должен перейти в браузере по следующему URL (для заданного примера):
https://apex.oracle.com/pls/apex/f?p=58430
Запустите свое приложение, используя полученный URL и созданную ранее
учетную запись конечного пользователя:
Обратите внимание, что конечному пользователю недоступно меню разработчика, которое обычно располагается в нижней части страницы.
Задание к работе:
1. Проделайте все описанные действия со своими таблицами. При этом все
промежуточные результаты через кнопку PrintScreen сохраняйте в отдельном
файле для показа преподавателю.
2. Покажите результат преподавателю.
Лабораторная работа № 7. Создание табличных форм, параметризованных
отчетов и форм «Главная/Детальная»
Задачи:
1) Создать приложение
2) Создать табличную форму
3) Создать параметризованный отчет
4) Создать форму «Главная/Детальная»
1. Создание приложения
1. Создайте в Application Builder новое приложение с помощью мастера:
а. Название приложения – ЛБ_7<фамилия в транслитерации>
б. Способ создания – «с нуля» (Start from scratch)
в. Добавьте в создаваемое приложение одну пустую (blank) страницу
г. Не копируйте разделяемые компоненты из другого приложения (Copy
Shared Components from Another Application: No)
д. На шаге Attributes в окне Tabs выберите One Level of Tabs.
е. Схема аутентификации – Application Express.
ж. Язык – Russian (ru)
з. Формат даты – DD.MON.YYYY
и. Тема – Theme 21.
2. Создание табличной формы
Мастер создания табличной формы позволяет создать форму для выполнения
операций обновления, вставки и удаления над множеством записей в таблице БД. Дополнительно мастер создает процесс обновления над множеством записей, который
проверяет значения контрольных сумм (сгенерированных по алгоритму MD5) перед
выполнением процесса для того, чтобы предотвратить потерю обновлений.
1. Создайте страницу:
а. Тип страницы – Form
б. Тип формы – Tabular Form (Табличная форма)
в. Таблица, на которой основана форма, – EMPLOYEES
г. В качестве отображаемых столбцов выберите все столбцы, кроме EMPLOYEE_ID, PHONE_NUMBER и COMMISSION_PCT
д. Разрешенные операции (Allowed Operations): вставка, обновление, удаление (Update, Insert, Delete)
е. Первичный ключ – EMPLOYEE_ID
ж. В качестве источника значений первичного ключа выберите существующий объект-последовательность (Existing sequence) EMPLOYEES_SEQ
з. В качестве обновляемых столбцов выберите все столбцы формы
и. Название страницы (Page Name) и название области (Region Title) –
Табличная форма "Работники"
к. На шаге Tab Options выберите опцию Use an existing tab set and create
a new tab within the existing tab set (Использовать существующий набор
вкладок и создать новую вкладку в существующем наборе вкладок), в
поле New Tab Label впишите Табличная форма ‘Работники’6
6
В названии вкладки нельзя использовать символ двойных кавычек
л. Для кнопок задайте русскоязычные ярлыки (Отменить, Отправить,
Удалить, Добавить запись)
м. В окнах Branch to Page оставьте значения по умолчанию.
2. Запустите приложение. Обратите внимание на вкладки в верхнем правом углу страницы:
Табличная форма позволяет добавлять, редактировать и удалять сразу несколько
записей.
3. Поля в столбце Hire Date дополните возможностью выбора даты из календаря:
а. Откройте страницу редактирования столбца Hire Date (Column
Attributes: HIRE_DATE).
б. В поле Display As выберите Date Picker
в. В поле Number/Date Format выберите DD.MON.YYYY
4. В столбцах Job Id и Department Id добавьте возможность выбора соответственно должности и подразделения из выпадающего списка:
а. Создайте необходимые списки значений, скопировав их из Вашего предыдущего приложения:
• Начните создание списков значений (см. ранее) и на шаге Source выберите As a Copy of an Existing List of Values.
• На шаге Copy From выберите Ваше приложение, в котором уже созданы требуемые списки значений.
• На шаге New Lists of Values в столбце To Name укажите названия создаваемых списков (DEPARTMENTS, JOBS), а в столбце Copy? – выберите Yes для копируемых списков.
• Нажмите кнопку Copy List of Values.
б. Свяжите столбцы Job Id и Department Id с соответствующими
списками значений (см. ранее).
в. В столбце Department Id должна быть возможность выбирать и отображать пустое значение.
г. Должны отображаться только значения из списка (в поле Display Extra
Values должно быть выбрано No).
5. Добавьте возможность сортировки по столбцам.
6. Протестируйте форму: создайте 2-3 записи, измените их, а затем удалите.
Обратите внимание, что операции создания и изменения записей должны заканчиваться отправкой страницы на сервер (нажатием на кнопку Отправить), а для удаления записей сначала необходимо их отметить, поставив
флажок в крайнем левом столбце, а затем нажать кнопку Удалить:
Замечание: не изменяйте предложение SELECT (список выбираемых столбцов)
в запросе, на котором основана табличная форма, после ее генерации. Это может
привести к ошибке в контрольной сумме при попытке отправить измененные с
помощью формы данные.
Например: нельзя изменять запрос SELECT last_name FROM employees
следующим образом: SELECT lower(last_name) FROM employees
3. Создание параметризованного отчета
В приложениях Oracle Application Express отчет – это отформатированный результат выполнения SQL-запроса. Параметризованный отчет – это отчет, в котором
результат запроса зависит от данных, введенных на форме пользователем.
1. Создайте новую страницу для параметризованного отчета:
а. Тип страницы – Blank Page
б. Название и ярлык страницы – Параметризованный отчет "Работники".
в. Для создаваемой страницы должна быть создана новая вкладка в существующем наборе вкладок
г. Название (ярлык) вкладки – Параметризованный отчет ‘Работники’
На созданной странице необходимо создать 2 области: область для размещения
элементов, представляющих критерии отбора (параметры отчета) и область для отображения результатов запроса.
2. Создайте на странице Параметризованный отчет "Работники" область для размещения элементов, представляющих критерии отбора:
а. Тип области – HTML
б. Тип контейнера HTML области – HTML
в. Заголовок области (Title) – Критерии отбора
г. В остальных полях оставьте значения по умолчанию.
3. Создайте на странице Параметризованный отчет "Работники" область для отображения результатов запроса:
а. Тип области – Report
б. Реализация отчета (Report Implementation) – Classic Report
в. Заголовок области (Title) – Работники&P3_TEXT.7. &P3_TEXT. – это
подстановочная строка, которая будет определять содержание заголовка.
Вы создадите соответствующий элемент чуть позже.
г. На шаге Источник (Source) введите следующий SQL запрос:
SELECT
EMPLOYEES.EMPLOYEE_ID EMPLOYEE_ID,
EMPLOYEES.FIRST_NAME FIRST_NAME,
EMPLOYEES.LAST_NAME LAST_NAME,
EMPLOYEES.PHONE_NUMBER PHONE_NUMBER,
EMPLOYEES.HIRE_DATE HIRE_DATE,
EMPLOYEES.JOB_ID JOB_ID,
EMPLOYEES.SALARY SALARY,
EMPLOYEES.COMMISSION_PCT COMMISSION_PCT,
EMPLOYEES.DEPARTMENT_ID DEPARTMENT_ID
FROM
#OWNER#.EMPLOYEES EMPLOYEES
WHERE
(lower(first_name) like '%' || lower(:P3_NAME) || '%' OR
lower(last_name) like '%' || lower(:P3_NAME) || '%')
AND nvl(department_id, -1) =
decode(:P3_DEPT,
-1,
nvl(department_id,
:P3_DEPT)
-1),
Обратите внимание:
• В предложении WHERE с помощью функции lower() производится
приведение значений столбцов и соответствующих критериев отбора к
нижнему регистру. Это делает поиск не чувствительным к регистру.
• Групповой символ % соответствует любому символу или группе символов
• Функция decode() имеет следующий синтаксис:
DECODE(expr, search, result [, search, result ]...
[, default ])
Функция последовательно сравнивает значение expr с каждым значением search. Если значение expr равно значению search, возвращается
соответствующее значение result. Если совпадений не обнаружено,
возвращается значение default. Если значение default не указано,
возвращается null.
д. Остальные параметры оставьте со значениями по умолчанию.
Теперь необходимо создать элементы, на которые есть ссылки в заголовке области и в запросе: P3_NAME, P3_DEPT, P3_MGR и P3_TEXT:
1. Создайте в области Критерии отбора текстовое поле для ввода строки
поиска работника по имени и фамилии:
а. Тип элемента – Page Control on this Page - Item
б. Тип отображения текстового элемента – Text Field
7
Предполагается, что параметризованный отчет создается на странице с номером 3.
в. Название элемента – P3_NAME
г. Область – Критерии отбора
д. Ярлык для поля – Искать работника
е. Остальные параметры оставьте со значениями по умолчанию
2. Аналогичным образом в области Работники&P3_TEXT. создайте скрытое
поле (Hidden) с именем P3_TEXT.
3. Создайте в области Критерии отбора поле с выпадающим списком выбора (Item - Select List):
а. Имя элемента – P3_DEPT
б. Значения должны браться из скопированного Вами ранее списка значений
для подразделений (DEPARTMENTS)
в. Для неопределенных (Null) значений должен выводиться текст -Все- и
возвращаться значение -1
г. Ярлык для поля – Подразделение
д. Остальные параметры оставьте со значениями по умолчанию
После того, как пользователь введет критерии отбора в созданные Вами поля,
страница должна быть отправлена на сервер для того, чтобы запрос отчета выполнился с новыми параметрами:
1. Создайте на странице Параметризованный отчет "Работники" в
области Критерии отбора кнопку для отправки (submit) страницы на сервер:
а. При определении позиции кнопки укажите Create a button displayed among this region's items.
б. Имя кнопки – P3_GO
в. Ярлык (Label) – Выполнить
г. Стиль кнопки (Button Style) – Template Based Button
д. Шаблон (Template) – Button
2. Запустите страницу и протестируйте ее работу следующим образом:
а. Очистите поля с критериями отбора и нажмите кнопку Выполнить.
Отобразятся записи обо всех работниках.
б. Используя навигационную ссылку
в правом нижнем углу отчета,
пролистайте 1-2 порции (страниц) записей.
в. Введите в поле Искать работника строку ров и нажмите кнопку Выполнить. По идее, должны были отобразиться записи о работниках, в чьих
именах и фамилиях встречается заданная строка. Однако вместо этого может выводиться сообщение следующего вида:
Если отображается подобное сообщение об ошибке, то причина этого заключается в том, что при отправке запроса не была сброшена разбивка на
страницы, в то время как результат запроса помещается на одной странице. Поэтому Вы фактически запросили 2-ю или 3-ю страницу отчета, состоящего только из одной страницы. Щелчок по ссылке
reset pagination позволит корректно отобразить результат выполнения запроса.
Для исправления такого некорректного поведения необходимо сбрасывать
разбивку на страницы при отправке страницы на сервер.
3. Отредактируйте переход (branch) Page на странице Параметризованный
отчет "Работники", установив флажок reset pagination for
this
page: Page
Processing
+
Branch
–
Page=”Параметризованный отчет “Работники””.
4. Протестируйте работу страницы, комбинируя различные критерии выбора
записей.
Далее необходимо создать процесс, который устанавливает значение скрытого
элемента P3_TEXT. Значение P3_TEXT используется в заголовке области, в которой
отображаются сведения о работниках. В результате выполнения процесса заголовок
должен принимать вид Работники <название подразделения>:
1. Создайте на странице Параметризованный отчет "Работники" процесс, устанавливающий значение скрытого элемента P3_TEXT:
а. В определении страницы в столбце Page Processing щелкните по иконке
Create
и выберите Process.
б. На шаге Process Type выберите тип процесса – PL/SQL.
в. На шаге Process Attributes установите название процесса (Name) – Получить данные для заголовка. Остальные параметры оставьте без
изменения.
г. На шаге Process в поле Enter PL/SQL Page Process введите следующий
текст, представляющий собой анонимный PL/SQL блок:
DECLARE
l_dept varchar2(100);
BEGIN
:P3_TEXT := null;
IF :P3_DEPT != -1
THEN SELECT department_name
INTO l_dept
FROM departments
WHERE department_id = :P3_DEPT;
:P3_TEXT := :P3_TEXT || ' подразделения ' || l_dept;
END IF;
END;
д. В остальных полях оставьте значения по умолчанию.
2. Протестируйте работу формы:
4. Создание формы «Главная/Детальная» (Master/Detail)
Форма «Главная/Детальная» отражает отношение «один-ко-многим» между
двумя таблицами в БД. Обычно такая форма отображает запись из главной таблицы и
множество соответствующих ей записей из детальной (подчиненной) таблицы на одной HTML странице. С помощью этой формы пользователи могут вставлять, изменять и удалять записи в обеих таблицах.
1. Создайте страницу с формой «Главная/Детальная» для редактирования подразделения и его работников:
а. Тип страницы – Form (Master Detail Form)
б. На шаге Master Table and Columns:
• Имя таблицы (Table / View Name) – DEPARTMENTS
• Добавьте все столбцы таблицы в список отображаемых
в. На шаге Detail Table and Columns:
• Имя таблицы (Table / View Name) – EMPLOYEES
• Добавьте все столбцы таблицы в список отображаемых
г. На шаге Define Primary Key в качестве источников значений столбцов
первичных ключей для главной и детальной таблиц выберите соответственно существующие последовательности (Existing sequence) DEPARTMENTS_SEQ и EMPLOYEES_SEQ
д. На шаге Master Options:
• Оставьте выбранной опцию включить в форму элементы навигации по
записям главной таблицы (Include master row navigation? – Yes)
• Установите порядок перехода по записям (Master Row Navigation
Order) в соответствие co значением столбца DEPARTMENT_NAME
• Оставьте выбранной опцию создания отчета по главной таблице
(Include master report? – Yes). Она означает, что в дополнение к форме
будет создана страница с отчетом о подразделениях, содержащая ссылки на форму
е. На шаге Layout выберите вариант создания формы с возможностью редактирования детальной таблицы на той же странице (Edit detail as
tabular form on same page)
ж. На шаге Page Attributes:
• Заголовок страницы с отчетом (Master) – Подразделения
• Заголовок страницы с формой (Detail) –
Главная/Детальная форма 'Подразделения/Работники'
• Выберите опцию не добавлять на страницу область цепочки ссылок (do not add breadcrumb region to page -)
з. На шаге Tab Options выберите опцию Use an existing tab set and create a
new tab within the existing tab set (Использовать существующий набор
вкладок и создать новую вкладку в существующем наборе вкладок) и для
уже существующего набора вкладок в поле New Tab Label впишите
Главная/Детальная форма ‘Подразделение/Работники’
2. Запустите приложение. Обратите внимание, что на вкладке Главная/Детальная форма ‘Подразделение/Работники’ отображается
страница отчета о подразделениях:
Щелчок по иконке редактирования около нужного подразделения приводит к
переходу
на
страницу
Главная/Детальная форма 'Подразделения/Работники'. При этом в
«главной» форме отображается выбранное на странице отчета подразделение:
3. На
странице
Главная/Детальная форма 'Подразделения/Работники' доработайте
поля Manager Id и Location Id в области Departments и столбец
Job Id в области Employees так, чтобы значения в них можно было выбирать с помощью выпадающих списков выбора (Select List):
4. Запустите приложение и протестируйте работу формы и переходы с использованием вкладок.
Задание к работе (все промежуточные результаты через кнопку PrintScreen сохранять в отдельном файле для показа преподавателю):
1. Проделайте все описанные действия.
2. Покажите результат преподавателю.
Лабораторная работа № 8. Создание и использование кнопок-флажков
(check box)
Задачи:
1) Создать приложение с формой и отчетом.
2) Создать кнопку-флажок в виде элемента на форме.
3) Создать многозначную кнопку-флажок и обеспечить возможность фильтрации записей.
4) Отобразить содержимое столбца с URL в виде HTML-ссылки.
1. Создание приложения
1. Создайте в Application Builder новое приложение с помощью мастера:
а. Название приложения – ЛБ_8<фамилия в транслитерации>
б. Способ создания – «с нуля» (From scratch)
в. Добавьте в создаваемое приложение классический (Implementation –
Classic) отчет с формой (Report and Form), основанный на таблице
PRODUCT_INFORMATION. Измените названия добавленных страниц отчета и формы на Отчет Product Information и Форма Product Information соответственно.
г. На шаге Shared Components не копируйте разделяемые компоненты из
другого приложения (Copy Shared Components from Another Application: No)
д. На шаге Attributes:
• выберите One Level of Tabs.
• Схема аутентификации – Application Express.
• Язык – Russian (ru)
• Формат даты – DD.MON.YYYY
е. Тема – Theme 21.
2. Запустите созданное приложение постранично:
3. Скройте на странице Форма Product Information элемент Warranty
Period, установив для него тип Hidden:
2. Создание кнопки-флажка в виде элемента на форме
В Oracle Application Express можно создавать кнопки-флажки (check boxes) или в
виде отдельных элементов (items), или в столбцах отчета. Кнопки-флажки на форме
работают подобно спискам значений. Когда Вы определяете элемент как кнопкуфлажок, Вы должны указать значение в секции List of Values на странице редактирования элемента (Item Attributes). Внутри отчета кнопки-флажки создаются с помощью
функции APEX_ITEM.CHECKBOX.
Необходимо создать на странице Форма Product Information кнопкуфлажок, которая автоматически устанавливает значение минимальной цены для продукта как 75% от прейскурантной цены:
1. Для начала создайте на странице Форма Product Information элемент
типа радиогруппа (radio group, позднее Вы измените его тип на check
box):
а. Create – Page control on this page – Item – Radio
Group
б. Название элемента – P2_SET_MIN_PRICE (предполагается, что работа
идет со страницей 2)
в. Порядковый номер (Sequence) – 9.5 (этот номер соответствует позиции
ниже элемента P2_MIN_PRICE, но выше элемента P2_CATALOG_URL)
г. Область – Форма Product Information
д. На шаге List of Values:
• Щелкните по ссылке Create or edit static List of Values
(создать или редактировать статический список значений)
• На открывшейся странице введите следующие значения и нажмите Apply:
Обратите внимание на текст, который появился в поле List of Values
Query:
В этом выражении:
∗ Слово STATIC2 соответствует названию статического списка значений
∗ Пары Да;Д и Нет;Н представляют собой пары <отображаемое значение>;<возвращаемое значение>
∗ Пары значений отделяются друг от друга запятой.
• Выберите опцию Display Null Value – No, чтобы не отображать неопределенные значения
е. На шаге Source:
• Тип источника значений элемента (Source Type) – SQL Query (return single value)
• В поле Item Source Value or expression введите следующий запрос:
SELECT 'Д'
FROM DUAL
WHERE :P2_LIST_PRICE * 0.75 = :P2_MIN_PRICE
Обратите внимание: DUAL – это системная таблица, состоящая из одного
столбца DUMMY строкового типа размера 1 и одной записи, содержащей в
этом столбце значение 'X'. Эта таблица используется для выполнения SQL
команд, не связанных с выборкой данных из реальных таблиц. Такая таб-
лица необходима, т.к. команда SELECT предполагает обязательное наличие предложения FROM.
2. Создайте на странице Форма Product Information процесс, который
устанавливает минимальную цену с 25% скидкой от прейскурантной цены
(Create – Page control on this page - Process):
а. Тип процесса (шаг Process Type) – PL/SQL
б. Название (Name) – Update Min Price
в. Точка выполнения (Point) – On Submit - After Computations
and Validataions (при отправке – после вычислений и проверок)
г. В поле Enter PL/SQL Page Process введите следующий SQL запрос:
UPDATE product_information
SET MIN_PRICE=(:P2_LIST_PRICE*0.75)
WHERE PRODUCT_ID=:P2_PRODUCT_ID;
д. В поле Success Message (сообщение об успешном выполнении) впишите
Запись о продукте успешно обновлена
е. В поле Error Message (сообщение об ошибке) впишите
Невозможно обновить запись
ж. На шаге Process Conditions:
• В поле Condition Type выберите Value of Item/Column in Expression 1 = Expression 2 (значение элемента в выражении 1 =
выражению 2)
• В поле Expression 1 (выражение 1) введите: P2_SET_MIN_PRICE
• В поле Expression 2 (выражение 2) введите: Д
3. Протестируйте работу приложения.
4. Измените элемент P2_SET_MIN_PRICE так, чтобы он отображался не в виде радиогруппы, а в виде кнопки-флажка:
а. Откройте страницу редактирования элемента P2_SET_MIN_PRICE
б. В поле Display As выберите Checkbox
в. В поле Default value (значение по умолчанию) введите Н (что соответствует значению Нет)
г. В секции List of Values:
• В поле List of values definition введите следующее:
STATIC:Установить минимальную цену (25% скидка от прейскурантной цены);Д
5. Протестируйте
работу
кнопки-флажка
на
странице
Форма Product Information.
6. Создайте динамический список значений возможных статусов продуктов:
а. Название – STATUSES
б. Таблица-источник – PRODUCT_INFORMATION
в. В качестве отображаемого и возвращаемого значений должны выбираться
значения из столбца PRODUCT_STATUS (т.к. там хранятся не кодированные значения)
г. Каждый из статусов должен быть представлен в списке в единственном
числе (в запросе необходимо использовать ключевое слово DISTINCT после SELECT).
7. Измените
элемент
P2_PRODUCT_STATUS
на
странице
Форма Product Information так, чтобы он отображался в виде списка выбора:
а. Используйте список значений STATUSES
б. Запретите отображение неопределенных значений
8. Протестируйте форму:
3. Создание многозначной кнопки-флажка для обеспечения возможности
фильтрации записей
Необходимо, чтобы в дополнение к полю поиска на странице Отчет
Product Information отображались кнопки-флажки, позволяющие фильтровать
записи о продуктах по их статусам (устаревший, заказ, запланированный, в
стадии разработки):
1. Создайте на странице Отчет Product Information элемент, отображающий для каждого статуса продукта отдельную кнопку-флажок (многозначную кнопку-флажок, которая позволяет возвращать более одного значения):
а. Create – Page control on this page – Item
б. Тип элемента – Checkbox
в. Название элемента – P1_STATUS_FILTER (предполагается, что работа
идет со страницей 1)
г. Порядковый номер (Sequence)– 15 (для того, чтобы элемент отображался
сразу под полем поиска)
д. В качестве списка значений выберите созданный ранее список STATUSES.
е. Display Null Option – No
ж. Ярлык – Статус продукта
з. Источник значений – Static Assignment (value equals source
attribute)
Особенность многозначной кнопки-флажка в том, что с одной стороны это
один элемент, а с другой стороны – визуально он представляется множеством незави-
симых кнопок-флажков. Как же в одном элементе сохраняется множество значений?
Ответ – значения объединены в одну строку, но отделяются друг от друга двоеточием
(“:”). Например, представленный ниже выбор пользователя сохраняется в элементе в
виде значения устаревший:заказ:запланированный
Теперь для того, чтобы отображаемые кнопки-флажки можно было использовать для фильтрации записей, необходимо модифицировать запрос отчета, добавив в
предложение WHERE соответствующее условие:
1. Добавьте
в
запрос
отчета
условие:
(instr(:P1_STATUS_FILTER,product_status)>0
OR
:P1_STATUS_FILTER IS NULL AND PRODUCT_STATUS IS NULL),
объединив его с имеющимся условием оператором AND:
where
(
(
instr(upper("PRODUCT_NAME"),upper(nvl(:P1_REPORT_SEARCH,"PRODUCT_NAME"
))) > 0
or
instr(upper("PRODUCT_DESCRIPTION"),upper(nvl(:P1_REPORT_SEARCH,"PRODUC
T_DESCRIPTION"))) > 0
or
instr(upper("WARRANTY_PERIOD"),upper(nvl(:P1_REPORT_SEARCH,"WARRANTY_P
ERIOD"))) > 0
or
instr(upper("PRODUCT_STATUS"),upper(nvl(:P1_REPORT_SEARCH,"PRODUCT_STA
TUS"))) > 0
)
and
(instr(:P1_STATUS_FILTER,PRODUCT_STATUS)>0 OR :P1_STATUS_FILTER IS
NULL AND PRODUCT_STATUS IS NULL)
)
Обратите внимание:
∗ Функция instr(строка, подстрока, начальная позиция, №
вхождения) ищет №-ое вхождение указанной подстроки в
строке начиная с начальной позиции и возвращает позицию первого символа найденного вхождения. По умолчанию начальная позиция = 1 и № вхождения = 1. Если подстрока не входит в строку, возвращается 0.
∗ В данном случае условие проверяет, содержится ли статус продукта в
маске фильтра (позиция вхождения статуса в маске фильтра > 0), или,
если маска фильтра пуста, статус продукта также не определен. Если
условие не выполняется, запись отбрасывается.
∗ Вторая часть условия OR :P1_STATUS_FILTER IS NULL AND
PRODUCT_STATUS IS NULL необходима для того, чтобы отображать
записи о продуктах, имеющих неопределенный статус (Null). Если же
столбец PRODUCT_STATUS сделать обязательным (Not Null), то
необходимость в такой проверке отпадет.
2. Протестируйте работу фильтра на странице Отчет
Product
Information, комбинируя различные значения фильтра и используя кнопку Go для отправки страницы на сервер:
Обратите внимание, что, если снять выделение со всех кнопок-флажков, то не
отображается ни одной записи, т.к. для всех записей указан определенный статус (это
справедливо, если не было введено записей с неопределенным статусом). Если имеет
место такая ситуация, то имеет смысл в этом случае выводить записи с любыми статусами (для этого можно, например, сделать пустую маску эквивалентной маске заказ:устаревший:запланированный:в стадии разработки8):
1. Установите для элемента P1_STATUS_FILTER значение по умолчанию, соответствующее значению фильтра, когда выбраны все статусы (заказ:устаревший:запланированный:в стадии разработки). Для
этого используйте окно Default.
2. Проверьте работу фильтра. Снимите выделение со всех кнопок-флажков
фильтра и нажмите Go. Должны отобразиться все записи (имеющие определенное значение статуса продукта), а кнопки-флажки должны автоматически
выделиться.
Отображение кнопок-флажков в одну колонку не очень удачно с точки зрения
использования пространства страницы. Кроме того, имеет смысл отображать подписи
к
кнопкам-флажкам
в
полужирном
начертании.
Измените
элемент
P1_STATUS_FILTER таким образом, чтобы кнопки-флажки выводились в 4 колонки,
а подписи к ним были выделены полужирным начертанием:
1. Откройте страницу редактирования элемента P1_STATUS_FILTER
2. В секции Settings установите в поле Number of Checkbox Columns значение
4
3. В секции Element в поле Form Element Option Attributes введите
class="fielddatabold". Это поле используется исключительно для
кнопок-флажков и радио-кнопок и влияет на то, как APEX визуализирует индивидуальные опции элемента:
8
Использование статической маски имеет смысл, если список возможных значений не изменяется (является постоянным и небольшим)
4. Отображение содержимого столбца в виде HTML ссылки
На странице Отчет Product Information столбец CATALOG_URL содержит URL адрес. Было бы логично отображать этот адрес как ссылку.
1. Добавьте в столбец CATALOG_URL ссылку на URL, указанный в этом столбце:
а. Откройте страницу редактирования столбца CATALOG_URL области отчета на странице Отчет Product Information
б. В секции Column Link:
• В поле Link Text должно отображаться значение столбца
• В качестве цели (Target) должно быть выбрано URL
• В качестве URL также должно использоваться значение столбца (поле
URL = #CATALOG_URL#)
2. Протестируйте работу ссылок в столбце CATALOG_URL:
а. Отредактируйте запись о каком-либо продукте, введя в поле CATALOG_URL реальный полный URL (например, http://www.mail.ru)
б. Проверьте ссылку.
Задание к работе:
1. Проделайте все описанные действия со своими данными. При этом все промежуточные результаты через кнопку PrintScreen сохранять в отдельном
файле.
2. Покажите результат преподавателю.
Лабораторная работа № 9. Самостоятельное создание приложения для выбранной предметной области
Задание к работе:
1) В соответствии с вариантом (см. приложение), выданным преподавателем,
проанализировать информационные потребности для соответствующей
предметной области (ПрО) и построить инфологическую модель ПрО в виде
сущностей, их атрибутов и связей между ними. Для изображения информационной модели использовать нотацию ER-диаграмм.
2) Создать для ПрО таблицы БД, необходимые для реализации информационных потребностей.
3) Создать веб-приложение по актуализации данных ПрО.
Алгоритм решения задач и дополнительные требования
1. На основе информационных потребностей (исходных данных) ПрО проектируется инфологическая модель ПрО. Для этого выделяется несколько (минимум три) основных взаимосвязанных сущностей, каждая из которых должна
содержать:
• атрибуты – основные характеристики-свойства сущности с указанием
домена (типа данных) и обязательности значений на основе анализа возможных значений. Например, для сущности СТУДЕНТ существует атрибут ФИО_студента.
• ключ (первичный) – уникальный идентификатор сущности, состоящий
из существующих атрибутов сущности или одного искусственно добавленного атрибута id. Например, для сущности СТУДЕНТ первичным ключом является атрибут номер_зачетки.
• ключи (внешние) – связи с другими сущностями, представляющими собой атрибут(ы) текущей сущности, содержащий(-е) значение из идентификатора связанной другой сущности. Например, для сущности СТУДЕНТ
внешним ключом является атрибут номер_группы, который связывает эту
сущность с сущностью ГРУППА по атрибуту номер_группы.
2. На основе инфологической модели создается БД, позволяющая связно хранить требуемые сведения об указанных объектах и фактах:
а. Таблицы БД должны удовлетворять 3НФ.
б. Каждая таблица должна иметь название, отражающее смысл содержащихся в ней данных и соответствующее следующему шаблону:
<фамилия в транслитерации>_<смысловое название таблицы>. Название
таблицы не должно превышать 30 символов.
в. Для каждого столбца таблицы в соответствии с потребностями должны
быть определены название (в транслитерации, не более 30 символов), тип,
размер, обязательность.
г. В каждой таблице должен быть определен первичный ключ (Primary Key).
д. Названия объектов-последовательностей (Sequence), создаваемых для генерации значений первичного ключа, должны удовлетворять следующему
шаблону:
<фамилия
в
транслитерации>_<смысловое
название
таблицы>_SEQ и не должны превышать 30 символов.
е. Если первичный ключ определен на суррогатном столбце (значения которого генерируются автоматически, например, с помощью объектапоследовательности Sequence), то в таблице должен быть дополнительно
определен уникальный ключ (Unique).
ж. Для столбцов-ссылок должны быть определены ограничения ссылочной
целостности – внешние ключи (Foreign Key).
3. Создаётся приложение, основанное на созданных таблицах:
а. Приложение должно представлять собой логически организованную совокупность взаимосвязанных страниц, обеспечивающих:
• просмотр и поиск записей во всех созданных таблицах;
• редактирование (создание, изменение, удаление) записей во всех созданных таблицах;
• редактирование полей-ссылок с помощью списков выбора;
• отображение практически полезных в выбранной ПрО отчетов;
• навигацию по страницам при помощи цепочек ссылок (breadcrumbs);
• навигацию между ключевыми страницами при помощи вкладок (tabs);
• русскоязычный интерфейс пользователя (заголовки страниц, областей,
столбцов отчетов, кнопок, вкладок и т.п. должны быть русскоязычными);
• тему интерфейса и логотип, соответствующие тематике ПрО.
б. Приложение должно включать в себя:
• главную страницу, содержащую ссылки на ключевые страницы (которые в свою очередь содержат ссылки на дополнительные страницы
форм и отчетов);
• хотя бы одну табличную форму;
• хотя бы один параметризованный отчет;
• кнопки-флажки (check boxes);
в. Взаимосвязи между страницами приложения должны быть реализованы с
помощью ссылок (link), переходов (branch), перенаправлений (redirect), организующих страницы приложения в единую, логически непротиворечивую многоуровневую структуру. Например, с главной страницы можно
перейти к ключевым страницам отчетов, а с ключевых страниц можно перейти на страницы форм редактирования и дополнительных отчетов. При
этом для каждой страницы неявные обратные переходы и перенаправления (которые не выбирает сам пользователь) осуществляются именно на те
страницы, с которых был произведен переход на данную страницу (если
это не противоречит логике).
4. Тестируется работа созданного приложения.
ПРИЛОЖЕНИЕ
Предлагаемые предметные области и информационные потребности9:
1. Обучение в вузе:
Студент (№ зачётки; фамилия; имя; отчество; группа; факультет; специальность; год
поступления; дата рождения; адрес проживания; …).
Дисциплина учебного плана (код; название; группа дисциплин {гуманитарные и социально-экономические, математические и естественно-научные, общепрофессиональные, специальные}; число часов аудиторных занятий; число часов самостоятельной
работы; семестр, в котором изучается дисциплина; …).
Строка зачётной книжки (№ зачётки; дисциплина; семестр; вид занятий {лекции,
практические, лабораторные}; количество часов; дата сдачи; оценка; ФИО преподавателя; …).
Преподаватель (ФИО, ученая степень {кандидат наук, доктор наук}, научное звание
{доцент, профессор}, должность {ассистент, старший преподаватель, доцент, профессор}, контактные данные,…).
2. Автомастерская:
Автомобиль (марка; год выпуска; номер; ФИО хозяина; объём двигателя; цвет; …).
Работник (код; фамилия; имя; отчество; специализация {маляр, слесарь, сварщик,
жестянщик, механик}; дата приёма на работу; …).
Ремонт (дата; автомобиль; характер неисправности/повреждения; вид ремонта; работник; стоимость; …).
Автозапчасть (наименование, марка автомобиля, количество на складе, стоимость
единицы,…)
3. Гостиница:
Номер (номер; этаж; кол-во мест; класс {стандарт, люкс}; стоимость проживания в
сутки; …).
Постоялец (регистрационный номер; фамилия; имя; отчество; номер паспорта; кем
выдан паспорт; дата выдачи паспорта; дата рождения; …).
Регистрация (номер постояльца; дата регистрации; предоставленный номер; дата выбытия; ФИО портье; …).
4. Чемпионат по футболу:
Команда (код; название; город; ФИО тренера; годовой бюджет; …).
Игрок (команда; фамилия; имя; отчество; специализация {вратарь, защитник, полузащитник, нападающий}; дата рождения; гражданство; дата окончания контракта; …).
Встреча (принимающая команда; гостевая команда; дата игры; итоговый счет; главный судья встречи; …).
5. Спортивный магазин:
9
Информационные потребности (исходные данные) каждой предметной области представлены набором типов сущностей, каждый из
которых представлен следующим образом: Сущность (атрибут1; атрибут2{возможные значения атрибута};… атрибутN).
Товар (код; наименование; вид спорта; цена; отдел {спорт. инвентарь, одежда, тренажёры, спортивное питание}; количество на складе, …).
Работник (личный номер; фамилия; имя; отчество; дата рождения; должность; отдел;
дата приема на работу; …).
Продажа (личный номер работника; дата продажи; товар; количество; итоговая сумма без скидки; % скидки; …).
6. Склад:
Продукция (наименование продукции, шифр продукции, единица измерения, цена
единицы измерения, код поставщика…).
Поставщик (наименование, код, адрес,…).
Получатель (наименование, код, адрес,…) .
Поставка (наименование продукции, шифр продукции, количество в поставке, дата
заказа, плановая дата поставки, фактическая дата поставки, размер штрафа за просрочку поставки,…).
7. Штат:
Сотрудник (ФИО, табельный номер, стаж, должность, оклад, отдел работы,…).
Отдел (название, месторасположение, ФИО начальника, телефон,…).
8. Перевозки:
Водитель (ФИО водителя, табельный номер водителя, номерной знак его автомобиля,…).
Автопарк (номерной знак автомобиля, марка автомобиля, год выпуска, местонахождение автомобиля {ремонт, рейс, база},…).
Автомобиль (марка автомобиля, грузоподъемность данной марки, средняя скорость
данной марки км/час,…)
Поставка (наименование груза, вес груза, отправитель груза, получатель груза, номерной знак автомобиля-перевозчика груза,…).
9. Библиотека:
Книга (название, автор, инвентарный номер, год выпуска,…).
Читатель (ФИО, адрес, контактные данные, номер читательского билета,…).
Библиотекарь (ФИО, контактные данные,…).
Выдача книги (ФИО библиотекаря, инвентарный номер книги, номер читательского
билета, дата выдачи, плановая дата возврата, фактическая дата возврата, штраф за задержку книги,…).
10. Фитнес-клуб
Клиент (ФИО, контактные данные, возраст, программа занятий,…).
Типовая программа занятий (название, вид упражнения, продолжительность упражнения,…).
Тренер (ФИО, квалификация, специализация, контактные данные,…).
Занятия клиента (ФИО клиента, ФИО тренера, программа занятий, дата начала занятий, дата окончания занятий,…)
Download