четверг, 26 апреля 2007 г.

Особенности использования "Column Link" в отчетах Application Express.

В отчетах Oracle Application Express есть возможность создавать переходы как на другие страницы приложения, так и на произвольные ресурсы сети. Для этого используется настройка "Column Link" поля отчета. Например, для созданного ранее приложения:

apex report Column Link, target=page Очевидно, что максимальное количество передаваемых параметров - 3. Однако, это не совсем так... Количество передаваемых параметров можно увеличить. Это становиться очевидно, если изменить значение в поле "Target" того же блока "Column Link" на "URL". Вот что мы увидим:

apex report Column Link, target=URLПоля, куда вводились имена параметров и их новые значения, стали недоступными для редактирования, но появилось новое поле "URL", где виден тот URL, который будет использоваться на самом деле. Синтаксис данной строки хорошо описан в документации на OTN.
Таким образом, все передаваемые параметры можно писать именно в строке URL. То есть, если мы захотим передать 4 параметра, то строка будет выглядеть следующим образом:

"f?p=&APP_ID.:1:&SESSION.::&DEBUG.::P1_TYPE,P2_TYPE,P3_TYPE,P4_TYPE:#OBJECT_TYPE#,2,3,4"
,где:

  • "&APP_ID." - идентификатор приложения

  • "&SESSION." - идентификатор сессии

  • "P1_TYPE,P2_TYPE,P3_TYPE,P4_TYPE" - список через запятую тех параметров, которым будет присваиваться новые значения (пробелы не допускаются)

  • "#OBJECT_TYPE#,2,3,4" - список новых значений (пробелы не допускаются)


В итоге переменной "P1_TYPE" будет присвоено значение из колонки #OBJECT_TYPE# текущего отчета. Переменной "P2_TYPE" будет присвоено значение "2", "P3_TYPE" - "3", "P4_TYPE" - "4".
Важна очередность перечисления наименований переменных и их значений.
Вот и вся хитрость.

Подробнее...

вторник, 24 апреля 2007 г.

Особенности работы CHECKBOX в APEX.

Хочу немного рассказать об особенностях работы с CheckBox'ом в отчетах Oracle Application Express, так как для меня логика работы не сразу оказалась очевидной (может быть просто плохо читал документацию :).
Добавить в отчет сам CheckBox очень легко - необходимо просто вызвать функцию APEX_ITEM.CHECKBOX в запросе, на основе которого строится отчет. Например:


Select object_name, object_id, object_type,
created, apex_item.checkbox(10, object_id)
From User_Objects;

Спецификацию данного метода можно посмотреть в документации. В основном, используются первые 3 параметра:

* p_idx - идентификатор глобальной переменной в APEX_APPLICATION
* p_value - значение присваиваемое CheckBox'у (из-за которого-то у меня и возникла путанница)
* p_attributes - HTML атрибуты.

Основная задача, при работе с CheckBox'ом - это обойти их все и получить список либо отмеченных, либо не отмеченных. Вот тут и начинаются вопросы...

Доступ к значению контрола можно получить через список глобальных переменных пакета APEX_APPLICATION. То есть, для запроса, приведенного выше, значение получается через переменную APEX_APPLICATION.g_f10.

Логично было бы предположить, что выбрать все отмеченные чек-боксы можно так:

Begin
For i In 1 .. APEX_APPLICATION.g_f10.Count Loop
If APEX_APPLICATION.g_f10(i) = 1 Then
....
End If;
End Loop;
End;

Ан нет... Чтобы получить все отмеченные чек-боксы, необходим цикл немного проще:

Begin
For i In 1 .. APEX_APPLICATION.g_f10.Count Loop
....
End Loop;
End;

То есть, APEX_APPLICATION.g_f10 содержит ТОЛЬКО ОТМЕЧЕННЫЕ чек-боксы!
Кроме того, параметр p_value содержит не состояние чек-бокса, а именно значение.
За состояние чек-бокса отвечает третий параметр - p_attributes. То есть, для того, чтобы контрол был включен необходимо задавать не "p_value = 1", а "p_attributes='CHECKED' ", например:


Select object_name, object_id,
object_type, created,
apex_item.checkbox(10, object_id,
DECODE( mod(object_id, 10),
1,
'CHECKED',
null
)
)
From User_Objects;


Вот так...

Подробнее...

суббота, 21 апреля 2007 г.

APEX. Добавляем ссылки (URL) в приложение.

В этом примере будет продемонстрирована возможность добавления ссылок (URL) в APEX приложение, а так же подход к созданию элементов GUI, доступных во всех страницах приложения.
Как уже было отмечено ранее, Oracle Application Express позволяет добавить страницу в приложение, которая будет отображаться одновременно со всеми остальными. Отличительной особенностью этой страницы является лишь ее номер - "0".
Итак, начнем.... сначала добавим в приложение страницу с номером "0", а потом разместим на ней ссылку на блог :). Добавление нулевой страницы проходит по обычному сценарию, поэтому ограничимся лишь снимками:

apex. start to add page
apex. adding page 1
apex. adding page 2
apex. adding page 3
apex. adding page 4
apex. adding page 5После этого, переходим к редактированию только что добавленной страницы:

apex. edit new pageДля того, чтобы добавлять на страницу какие-либо элементы управления, необходимо добавить на нее регион:
apex. add region to the page
Добавляем пустой регион:
apex. add region to the page 1
apex. add region to the page 2
Чтобы не было видно названия региона, не выбираем какого-либо шаблона, то есть, выбираем "No Template". Кроме того, чтобы страница выводилась вверху, выбираем Display Point - "After Header":
apex. add region to the page 3
Источник региона оставляем пустым, условия для отражения не накладываются.
После того, как был добавлен регион, в него можно начать добавлять элементы управления:
apex. add region to the page 5
Добавим простой текст, который будет содержать текст URL - сылки:
apex. add element to the region 1
apex. add element to the region 2
apex. add element to the region 3
Названия для элемента не указываем, чтобы оно не отражалось на странице и выбираем соответствующий label template - "No Label":
apex. add element to the region 4
apex. add element to the region 5
apex. add element to the region 6
После этого переходим к описанию только что созданного элемента, и добавляем непосредственно текст ссылки на блог:
apex.edit element at the region
Теперь страница работающего приложения будет выглядеть следующим образом:
apex.run new application
Чтобы ссылка на блог "висела"в правом углу, а не в левом, просто указываем ширину элемента:
apex.set width at element
Работу приложения, как всегда, можно посмотреть на apex.oracle.com.

Подробнее...

воскресенье, 15 апреля 2007 г.

Apex. Добавялем возможность экспорта... CSV, XML

Продолжаем серию статей, демонстрирующую на примерах процесс создания приложений в Oracle Application Express, и сегодня будем развивать приложение, созданное ранее.
Одним из наиболее часто встречающихся требований для приложений является возможность вывода информации в различные форматы электронных документов. В этом примере постараемся добавить возможность экспорта данных в CSV и XML форматы.

Сначала попытаемся экспортировать данные в CSV. Есть несколько вариантов реализации, например:

  • использование стандартной опции "Enable CSV output"
  • использование типа отчета "export: CSV"
Сначала, воспользуемся стандартной опцией. Для этого необходимо зайти в определение страницы:

APEX page definition
После чего - в описание отчета:

APEX report definition
и изменить следующие настройки в разделе "Report Export":

Apex option Report ExportНазначение этих настроек следующее:
  • "Enable CSV output" - задает непосредственную возможность экспорта в CSV
  • "Separator" - задает разделитель значений колонок. Если не задавать значения, то будет использоваться либо запятая, либо точка с запятой в зависимости от текущих NLS настроек.
  • "Enclosed By" - символ, обозначающий начало и конец значения колонки. Если не задан, то используются двойные кавычки.
  • "Link Label" - текст для ссылки, которая будет вызывать диалог для сохранения CSV файла.
  • "Filename" - задает имя для экспортируемого файла. Если не задается, то используется имя региона отчета.
После чего, запустив приложение, можно будет заметить появление нового элемента в отчете "Типы объектов" - "Экспорт в CSV":

APEX witn export to csv

Теперь же, попробуем реализовать экспорт данных отчета через настройку "Report Template" секции "Layout and Pagination" описания отчета. Для того, чтобы отчет экспортировался в CSV, необходимо просто выставить "Report Template" = "export: CSV".

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

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

APEX create new page

Выбираем следующие свойства новой страницы:
  • "page type" = "Blank Page"
  • "name" = "MainReportExport"
  • "title" = "MainReportExport"
  • "Breadcrumb" = "- do not use breadcrumbs on page -"
  • "Use Tabs" = "No"
Сразу переходим к редактированию страницы, и добавляем в нее новый регион:

APEX add new region to page

Выбираем следующие свойства региона:
  • "Region Type" = "Report"
  • "Report Implementation" = "SQL Report"
  • "Title" = "Object_Types"
  • "Region Template" = "Reports region"
  • "Display Point" = "Page Template Body (3. items above region content)"
  • "Source":
Select Object_Type, Count(*)
From User_Objects
Group By Object_Type
  • "Report Template" = "export: CSV"

Теперь приложение состоит из двух основных форм "Main", "MainReportExport":

APEX application pagesОсталось только добавить на первую страницу ("Main") средство перехода на только что созданную страницу. Для этого переходим в описание исходной страницы и добавляем в нее кнопку:
  • "region for the button" = ""
  • "position" = ""
  • "button name" = "EXPORT2CSV"
  • "label" = "Экспртировать в CSV"
  • "position" = "Bottom of Region"
  • "alignment" = "left"
  • "branch to page(when button pressed)" = "2" (выбираем из списка созданную ранее страницу)
Результат:

APEX application with export to csv abilityТеперь при нажатии кнопки будет так же формироваться отчет в CSV.

Аналогичным же образом реализуется экспорт и в XML. Необходимо добавить на страницу "MainReportExport" еще один регион, аналогичный тому, который уже был добавлен ранее, за исключением опции "Report Template", которую необходимо будет задать в "export: XML":


Таким образом, мы имеем на одной странице два экспортируемых отчета и нам необходимо иметь возможность запускать какой-то один из них. Для этого добавляем на страницу "MainReportExport" невидимый элемент, задавая который при переходе, мы будем в состоянии регулировать запуск того или иного отчета, расположенного на странице. Задаем элементу следующие параметры:
  • "Item type" = ""
  • "Item name" = "P2_EXP_TYPE"
Корректируем регион экспорта в CSV - "Object_Types" в секции "Conditional Display":
  • "Condition Type" = "Value of Item in Expression 1 = Expression 2"
  • "Expression 1" = "P2_EXP_TYPE"
  • "Expression 2" = "CSV"
Корректируем регион экспорта в XML - "Object_Types_Xml" в секции "Conditional Display":
  • "Condition Type" = "Value of Item in Expression 1 = Expression 2"
  • "Expression 1" = "P2_EXP_TYPE"
  • "Expression 2" = "XML"
Осталось только реализовать заполнение поля P2_EXP_TYPE. Для этого в странице "Main" редактируем описание имеющейся кнопки:


Изменяем следующие свойства:


То есть, при переходе по этой кнопке в страницу отчетов будет отрабатывать CSV отчет. Для XML добавляем еще одну кнопку:
  • "region for the button" = ""
  • "position" = ""
  • "button name" = "EXPORT2XML"
  • "label" = "Экспртировать в XML"
  • "position" = "Bottom of Region"
  • "alignment" = "left"
  • "branch to page(when button pressed)" = "2"
После чего в описании новой кнопки выставляем следующие свойства:


То есть, при переходе через эту кнопку будет отрабатывать экспорт отчета в XML. Главная страница, при этом, примет следующий вид:

APEX application example

Вот, собственно и все. Проверить приложение в работе можно на apex.oracle.com.

Подробнее...

среда, 11 апреля 2007 г.

Наиболее часто встречающиеся проблемы в APEX 3.0 / FAQ

Прошло совсем немного времени с момента выхода Oracle Application Express 3.0, но уже сейчас можно составить список наиболее часто встречающихся проблем. Пока их менее 10 :) :

  1. Отсутствие описания страниц в Application Builder:

  2. Если описание страниц не содержит никаких элементов, просто обновите страницу (Shift + Ctrl + R). После этого Application Builder полностью перерисует страницу и покажет ее описание. Обновление необходимо для того, чтобы очистить кэш браузера и скачать последние версии CSS и JavaScript'ов, от которых зависит интерфейc.

    Пример проблемной страницы:



  3. Появление фраз, наподобие 'not found', вместо иконок:

  4. Во время выполнения пост - инсталляционных действий (post-installation task) необходимо обновить директорию, где находятся изображения. Эта директория содержит новые файлы, которые необходимы для APEX 3.0: иконки, CSS, JavaScript и т.д.

  5. Появление HTML тэгов и разметки на страницах приложения:

  6. Необходимо убедиться, что установлен PL/SQL Web Toolkit версии 10.1.2.0.6 или выше. Если версия оказалась ниже, то необходимо ознакомиться с инструкцией по установке, расположенной в apex/owa/README.txt.

    (сейчас работаю с площадками, где запрос "select owa_util.get_version from dual" возвращает "10.1.2.0.5" и пока никаких проблем не было. Oracle - 10.2.0.3.0)

  7. Появление искаженных букв или знаков вопроса на страницах приложения:

  8. Необходимо убедиться, что составляющая параметра PlsqlNLSLanguage, отвечающая за кодировку, в Database Access Descriptor (DAD) установлена AL32UTF8.

  9. Проблемы при просмотре дневных и недельных расписаний, добавленных в существующее приложение:

  10. Проблема возникает в случае, если приложение было создано в APEX 2.2 или ранее: в нем отсутствуют атрибуты нового шаблона календаря, необходимые для отражения еженедельных и ежедневных отчетов. Есть два варианта решения проблемы:
    1. вручную обновить шаблон календаря, используемый приложением
    2. создать новую тему из репозитария и перевести приложение на эту тему. Новая тема будет содержать все необходимые шаблоны, используемые в Application Express 3.0.


  11. Обрыв инсталляции APEX 3.0 с ошибкой ORA-06502:

  12. Если инсталяция обрывается с ошибкой:
    ...PAGE 124: Subscribed Templates
    Error creating button name="REFRESH" id="181590632003554484" ORA-06502: PL/SQL:
    numeric or value error: character string buffer too small
    ORA-06512: at
    "FLOWS_030000.WWV_BIU_STEP_BUTTONS", line 24
    ORA-04088: error during execution of trigger 'FLOWS_030000

    Необходимо проверить параметр базы данных NLS_LENGTH_SEMANTICS. Если он равен CHAR, то:
    1. необходимо выполнить шаги, описанные в главе "Cleaning Up After a Failed Installation" документации. После чего выполнить:
      DROP user FLOWS_030000 CASCADE;
    2. начать снова инсталляцию, но перед выполнением скрипта apexins.sql, выполнить:
      ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE;
    3. выполнить скрипт apexins.sql


  13. Появление ошибки ERR-3331 при попытке сохранить изменения в Application Builder:

  14. Если во время разработки приложения, после попытки сохранить изменения, появилась ошибка:
    ERR-3331 This page was already submitted and can not be re-submitted. 
    Необходимо вернуться на страницу, где выполнялось редактирование, и обновить страницу (Shift + Ctrl + R). После чего сохранение изменений должно выполниться без проблем.

  15. Application Express и встроенный PL/SQL шлюз:

  16. Oracle Application Express в Oracle 11g будет использовать встроенный PL/SQL шлюз в качестве Web-сервера по умолчанию. Конфигурация с Oracle HTTP Server и modplsql будет по-прежнему поддерживаться. До выхода Oracle 11g Oracle Application Express со встроенным PL/SQL шлюзом является не поддерживаемой конфигурацией.

  17. Возможность поворота только ASCII текста в Flash диаграммах:

  18. Flash диаграммы позволяют вращать только ASCII текст. Это является ограничением Flash, который способен поворачивать текст только используя встроенный шрифт. При попытке поворота не ASCII текста, последний не будет отображаться.

    Если диаграмма все таки содержит не ASCII символы, то есть несколько вариантов, чтобы избежать дублирования текста. Например, использовать горизонтальные, а не вертикальные, столбце диаграммы. Или использовать атрибут "Omit Label Interval ", чтобы сократить объем текста, выводимого на диаграмме. С другой стороны, можно увеличить общую площадь диаграммы, увеличив ее ширину и высоту.
С оригинальным текстом описания проблем APEX 3.0 можно ознакомиться на сайте OTN.
Надеюсь, что дальше список расти не будет :).

Подробнее...

понедельник, 9 апреля 2007 г.

Apex. Создаем Master - Detail страницу.

Классическим примером для любого средства разработки интерфейса к БД является отражение связи "родитель-потомок" (Mater-Detail). Не будем нарушать традиций и попробуем реализовать данную функциональность в Oracle Application Express.


Для примера будем использовать системную таблицу - Object_Type. Суть приложения будет заключаться в том, чтобы в главной части формы выводить типы имеющихся в БД объектов, а в подчиненной - названия объектов выбранного типа.

Для начала необходимо создать новое приложение. Для этого, выбрать "Application Builder -> Create Application -> Create Application" на главной странице Oracle Application Express:



Далее, указать название приложения ("MasterDetail"), выбрать новую модель ("From scratch") и название Oracle схемы:



Следующим шагом будет добавление новой (пустой) страницы в приложение. Назовем ее "Main":



После этого, решаем, нужны ли закладки в приложении - не нужны:

На следующем шаге мастера построения приложений, указываем, что никаких компонент из других приложений копировать не надо:


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


На следующем шаге создания приложения выбираем схему оформления (выбрали 17ую схему) и на последнем шаге подтверждаем создание приложения.

Следующим шагом в создании Master-Detail формы будет уже непосредственно редактирование графического интерфейса и добавление небольшой логики в приложение. Сразу после создания приложения, описание первой страницы выглядит следующим образом:



Добавляем следующие элементы графического интерфейса на первую страницу:

  • Создаем регион, в котором будут выводиться все типы объектов, имеющиеся в схеме:

    • Region type: "Report"
    • Report Implementation: "SQL Report"
    • Title: "Типы объектов"
    • Region Template: "Reports Region"
    • Display Point: "Page Template Body (3. items above region content)"
    • Source:
Select Object_Type, Count(*)
From User_Objects
Group By Object_Type

  • Добавляем невидимый элемент управления, который будет хранить название типа, для которого необходимо отразить объекты в подчиненной части страницы:
    • Item Type: "Hidden"
    • Item Name: "P1_TYPE"
    • Region: "Типы объектов"
    • Item Source: "- Not Computed -"
  • Создаем еще один регион, который будет выводить названия объектов, которые имеют заданный в главной части страницы тип. Указываем следующие атрибуты:
    • Region type: "Report"
    • Report Implementation: "SQL Report"
    • Title: "Названия объектов"
    • Region Template: "Reports Region"
    • Display Point: "Page Template Body (3. items above region content)"
    • Source:
Select object_name, created, status
From User_Objects
Where Object_Type = :P1_TYPE


    • Condition Type: "Value of Item in Expression 1 Is Not NULL"
    • Expression 1: "P1_TYPE"
Таким образом, на странице будут работать 2 отчета. Первый будет показывать все типы объектов схемы ("Типы объектов"). А второй ("Названия объектов") будет показывать все объекты заданного типа. Кроме того, второй отчет будет виден на странице только если есть значение в элементе P1_TYPE.

И последний штрих - добавим небольшой функционал в главную часть страницы - отчет
"Типы объектов": возможность выбора типа объекта. Для этого: переходим на страницу описания главного отчета:

Далее переходим к описанию столбца "COUNT(*)":

И в разделе "
Column Link" выставляем следующие значения для "Link Text", "Page", "Item Name", "Item Value":


Вот и все! Итоговая master-detail страничка должны выглядеть следующим образом:

Посмотреть приложение в работе можно на apex.oracle.com.

Подробнее...