2 February 2015

APEX: Почему использование HTML в составе SQL-запросов для Interactive Report может быть опасно?

Oracle
Translation
Original author: Pavel G
Почему использование HTML в составе SQL-запросов для Interactive Report может быть опасно? Посмотрите на скриншоты! Неострожное использование HTML может повлечь за собой неочевидные на первый взгляд проблемы:



Проблема 1: С точки зрения бизнес-пользователя отфильтрованные строки не содержат слова «default» (это слово содержится внутри HTML-тега)
Проблема 2: При фильтрации по статусу вместо понятного пользователю текста он получает HTML-выражение, которое выглядит для него как абракадабра



Экспорт тоже выглядит ужасно.
Как лучше все поправить?


Сначала следует обратить внимание на разделение слоя бизнес-логики и слоя представления (presentation tier). В слое бизнес-логики не должно быть ничего относящегося к отображению информации, особенно HTML.

Сначала взглянем на исходный запрос в Interactive Report.



Представление “v_cost_report” возвращает столбец status в виде HTML. Использование HTML в представлениях(view) является плохой практикой, так как это значительно затрудняет дальнейшее использование представления в других представлениях и PL/SQL процедурах, особенно при попытке выборки или связывания с другими таблицами с использованием этого столбца.
Для корректного разделение логики на слои необходимо вынести выражение, возвращающее HTML, на уровень Апекса.

До
CREATE OR REPLACE FORCE VIEW v_cost_report AS
SELECT  p.id,
        p.project,
        p.task_name,
        ‘<img class=”default_report_img” src=”/i/’||
decode(p.status_no,1,’wwv_help3’,
2,’wwv_light’,
3,’wwv_logout’,
4,’wwv_notes’,
null)||’.gif”/>’ status,
        p.assigned_to,
        p.status as status_desc,  
        p.cost,
        p.BUDGET
FROM eba_demo_ir_projects p;

После
CREATE OR REPLACE FORCE VIEW v_cost_report AS
SELECT  p.id,
        p.project,
        p.task_name,
        p.status_no status,
        p.assigned_to,
        p.status as status_desc,  
        p.cost,
        p.BUDGET
FROM eba_demo_ir_projects p;



Апекс относится к слою представления (presentation tier), поэтому на этом уровне нет подобных строгих ограничений. HTML в SQL-запросах может ограниченно использоваться, однако, лучше всего избегать непосредственного использования подобных возвращающих HTML столбцов в Interactive Reports. Эти столбцы должны быть скрыты, а возвращаемые ими результаты должны быть показаны не напрямую, а с использованием свойства “HTML Expression” в других столбцах.
Это означает, что нам нужно 2 столбца вместо одного, первый для HTML и второй для текстового описания.



В нашем примере столбец “Status” возвращает номер (ID), который идентифицирует соответствующий статус. Мы используем LOV (список значений), чтобы вместо ID показать текстовое описание, которое будет использоваться для поиска, фильтрации и экспорта.
Другой столбец, “STAT_IMAGE”, будет использоваться для соответствующей каждому статусу картинки.
Мы можем просто использовать DECODE или CASE в SQL для выбора нужного изображения, но более корректным является использование статического списка (Static LOV), особенно при большом возможном количестве значений. С помощью удобного табличного редактора списков (Grid Edit) их создание и редактирование значительно упрощается.



Другое преимущество при использовании статических списков проявляется в возможности использования функции подписки (Subscribe), которое является вариантом наследования и позволяет легко синхронизировать изменения между веб-приложениями.
В нашем примере статический список STATUS_IMAGES состоит из 4-хэлементов.
Для использования списка значений мы добавим в SQL-запрос вызов функции APEX_ITEM.TEXT_FROM_LOV.



Теперь нужно установить необходимые свойства столбца “STAT_IMAGE”.
Сначала необходимо изменить свойство Display Type столбца на Hidden. Таким образом, тот столбец не будет выводиться на экран или экспортироваться. Поиск по значению этого столбца теперь тоже запрещён.



Теперь поработаем над со столбцом “Status”.
Этот столбец должен выводиться на экран. Для того, чтобы вместо кода статуса выводилось текстовое описание, изменим Display Type столбца на Display as Text (based on LOV, escape special characters).
Список значений STATUS_DESCRIPTION содержит следующие статусы:



Теперь столбец показывает текстовые описания статусов, но нам-то вместо этого нужны картинки. Воспользуемся замечательной функциональностью HTML Expression, которая появилась в Апекс 4.1. Мы можем использовать шаблон #ИМЯ_СТОЛЦА# для показа значений как текущего так и других столбцов в HTML-выражении.



Здесь в примере мы используем HTML Expression для показа в столбце значения другого столбца, “STAT_IMAGE”. Дополнительный тег title нужен для отображения всплывающей подсказки с описанием статуса.
Чистый HTML и #COLUMN#-синтаксис выглядит и читается гораздо лучше чем при использовании внутри SQL, кроме того, отпадает нужда в дополнительном экранировании кавычек.
HTML Expression используется только для вывода текста и HTML в браузер. Для поиска, фильтрации в выпадающих списках используются оригинальные значения столбца.



Экспорт также выполняется корректно.



Итог: корректный дизайн WEB-приложений, разделение между слоями и корректное использование функциональностей Апекса позволяет улучшить жизнь разработчику и избежать множества скрытых потенциальных ошибок при поиске, экспорте, фильтрации и т.д. Делайте всё сразу правильно, и это вам зачтётся….
Tags:oracleapexirinteractive report
Hubs: Oracle
+4
7.6k 12
Leave a comment