Как передается контекст параметров в Oracle BI EE+
Достаточно часто возникают вопросы каким-образом работает связка промптов и отчетов или как устроена передача параметров при навигация между отчетами и интерактивными страницами в Oracle Business Intelligence Enterprise Edition+. Данная тема напрямую связана с понятием контекста параметров. Попытаюсь описать основные принципы работы.
За основу контекста в Oracle BI EE+ положена сущность – [Презентационная таблица (Presentation Table)].[Презентационная колонка (Presentation Column)]. Причем именно презентационные таблицы и колонки, а не логические, т.е. те объекты, которые отображаются слева в списке доступных, когда вы работаете в Oracle BI Answers. Название презентационного каталога (Presentation Catalog) не входит в состав контекста. Данный факт имеет как хорошее, так и плохое значение. С одной стороны могут возникнуть проблемы с передачей параметров, если у вас есть 2 два разных презентационных каталогах, в которых присутствуют одинаковые структуры типа [Презентационная таблица].[Презентационной колонка], тем самым может возникнуть путаница. С другой стороны это позволяет настраивать передачу параметров между различными бизнес-областями, для этих целей достаточно иметь одинаковые объекты в двух областях. Таким образом, контекст параметров в Oracle BI – это набор колонок и их значений.
Самым распространенным применением контекста параметров в Oracle BI является связка промтов (Prompt) с отчетами. Промпты и отчеты создаются в инструменте Oracle BI Answers. При этом работа с логической моделью данных строго детерминирована по выбранной бизнес-области (презентационный каталог), т.е. перед тем как построить отчет или фильтр пользователь обязан выбрать бизнес-область, тогда ему становятся доступны структуры логической модели для дальнейшей работы. Промпт в Oracle BI – является визуальным объектом системы, отображающим контекст параметров – набор колонок и область видимости контекста, которая бывает двух типов – только на страницу, где расположен промпт или на весь дэшборд. Для каждой колонки в промпте может указывать дополнительные свойства – тип параметра (одно значение или множество), тип объекта для ввода параметра (edit, combobox, mutli-select), подпись, связь колонки с механизмом переменных и другие.
Также следует отметить, что контекст параметров является частью более общего объекта системы – фильтра. Фильтры – это набор предикатов, основанных тех же сущностях [Презентационная таблица].[Презентационная колонка]. Предикаты бывают разными – равенство, в списке, больше, меньше, между, подстрока, пустое значение и т.д. Таким образом – контекст это частный случай фильтра с предикатами равенства, константы для которых устанавливаются пользователем в онлайне. Для фильтров значения хранятся постоянно, но могу меняться во время работы. Фильтры и промпты хранятся в веб-каталоге (web catalog) системы. Любой объект системы, который обрабатывается презентационным сервером (Presentation Server) представлен в xml-виде. Отчеты, фильтры, промпты, страницы, дэшборды и т.д. – представляются в xml-виде. Следует отметить, что фильтры имеют принципиальное отличие, они привязываются к определенной бизнес-области.
Для полной ясности приведу пример: XML представление сохраненного в веб-каталоге фильтра D2 Market.M04 Region = East:
<?xml version="1.0" encoding="utf-8"?><saw:filter xmlns:saw="com.siebel.analytics.web/report/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sawx="com.siebel.analytics.web/expression/v1" subjectArea=""Sample Sales""><sawx:expr xsi:type="sawx:comparison" op="equal"><sawx:expr xsi:type="sawx:sqlExpression">"D2 Market"."M04 Region"</sawx:expr><sawx:expr xsi:type="xsd:string">East</sawx:expr></sawx:expr></saw:filter>
XML представлении сохранненого в веб-каталоге промта по колонке D2 Market.M04 Region:
<?xml version="1.0" encoding="utf-8"?><saw:view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:saw="com.siebel.analytics.web/report/v1" xsi:type="saw:globalFilterPrompt" rptViewVers="200510010"> <saw:prompt type="columnFilter" formula=""D2 Market"."M04 Region"" subjectArea=""Sample Sales"" eOperator="in" eControl="drop" includeReportDefaults="true" includeAllChoices="true" columnID="c0"><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:special" op="prompted"><sawx:expr xsi:type="sawx:sqlExpression">"D2 Market"."M04 Region"</sawx:expr></sawx:expr></saw:prompt></saw:view>
Теперь рассмотрим каким образом происходит передача выбранного значения из промпта в отчеты, которые расположены рядом с промптом. Работа осуществляется следующим образом – пользователь выбирает значения для параметра (например: D2 Market.M04 Region), а затем нажимает кнопку перейти (Go). После этого запускаются процедуры JavaScript ядра презентационного сервера, которые формируют динамический HTTP POST запрос посредством объекта DOM форма (DOM). Основные параметры указанного запроса это:
- Action = applyfilter;
- Page = [Название страницы] (пример: Page 1);
- PortalPath = [Путь в веб-каталоге к дешборду] (пример: /shared/Samples Sales/_portal/Test);
- P0 = [динамически сформированный фильтр]
В атрибуте P0 содержится самое важное – XML с фильтром, которые формируется на основе контекста параметров промпта и выбранных значений. Пример сформированного XML с выбором D2 Market.M04 Region = North:
<sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:list" op="in" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sawx:expr xsi:type="sawx:sqlExpression">"D2 Market"."M04 Region"</sawx:expr><sawx:expr xsi:type="sawx:untypedLiteral">North</sawx:expr></sawx:expr>
В указанном примере контекст параметров промпта – это объект D2 Market.M04 Region. Далее сервер «просматривает» все отчеты, которые расположены на странице и проверяет их фильтры. Каждый фильтр имеет свой контекст параметров, если происходит совпадение колонок в контексте параметров промпта и фильтра отчета, тогда сервер подставляет в отчет фильтр, который вернул промпт и применяет его. Таким образом проверка идет на совпадение [Презентационная таблица].[Презентационная колонка] в фильтре промпта и фильтре отчета. Поэтому для того, что выбор параметров в промпте передавался в отчет нужно обязательно, чтобы в отчете был фильтр с колонкой, значения для которой фильтруются. Именно для этих целей существует фильтр заглушка – «снабжен подсказкой» (is prompted), который добавляет колонку в контекст параметров с пустым фильтром.
Рассмотрим теперь механизм навигации (Navigate) между отчетами. Механизм детализации (Drill) работает по-другому, здесь я не буду его рассматривать. В любом виде представлений отчетов – Таблица, Кросс-Таблица, Диаграмма, График навигация осуществляется одинаковым образом. Для определенной колонки в критерии отчета указывается свойства навигации (для графиков настраивается отдельно в представлении) и определяется конечный отчет или страница. После указанных действий в исходном отчет появляются активные ссылки на значениях или заголовках (в зависимости от того что настроено), нажимая на которые пользователь переходит в другой отчет. Как и в случае с промптом, в момент когда пользователь нажимает на ссылку (значение справочника или показателя, заголовок, график и т.д.) презентационный сервер формирует динамический XML фильтр с контекстом параметров. Указанный контекст параметров – это точная координата объекта в представлении отчета. Например, если представление – это таблица, то контекст параметров – это все видимые столбцы таблицы со значениями, соответствующими строке, в которой находится объект на котором произведено действие. Если представление – это кросс-таблица, то контекст параметров – это все видимые разрезы и их значений на пересечении которых находится объект. Принцип работы с графиками и диаграммами аналогичен кросс-таблице. Для примера приведу динамический XML фильтр, сформированный при переходе из значения кросс-таблицы с двумя разрезами – D2 Market.M01 Market и D4 Product.P02 Product Type:
<sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="sawx:logical" op="and"><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:comparison" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" op="equal"><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:sqlExpression" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">"D2 Market"."M01 Market"</sawx:expr><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:untypedLiteral" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Market 2</sawx:expr></sawx:expr><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:comparison" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" op="equal"><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:sqlExpression" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">"D4 Product"."P02 Product Type"</sawx:expr><sawx:expr xmlns:sawx="com.siebel.analytics.web/expression/v1" xsi:type="sawx:untypedLiteral" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Type 3</sawx:expr></sawx:expr></sawx:expr>
После этого происходит переход на другой отчет или страницу, где сформированный динамически фильтр применяется. Принцип действия полностью аналогичен промту. Для того, чтобы фильтр сработал надо чтобы контекст параметров фильтра и отчетов где-то совпадали по колонкам.
Дополнительный бонус: Для отладки сложных решений в Oracle BI связанных с навигации, полезным бывает посмотреть какой фильтр формируется при навигации между отчетами. Это можно сделать следующим образом: в ресурсном файле viewhelper.js, расположенном в папке [OBIEE_HOME]/oc4j_bi/j2ee/home/applications/analytics/analytics/res/b_mozilla (для OC4J), надо найти функцию:
function NQNavigateHandler(tInfoBag, target)
Далее в ней найти следующую конструкцию:
if (nVals > 0)
tForm.P0.value = saw.getXmlText(tExpr);
else
tForm.P0.value = "";
И добавить перед if-конструкцией вызов:
alert(saw.getXmlText(tExpr));
Все, после указанных действий при навигации будет появляться окно, содеражащее динамический XML фильтр.
Не забудьте удалить вызов alert после завершения работы.
Любые изменения в коде продукта Oracle Business Intelligence Enterprise Edition+ вы делаете на свой страх и риск и несете полностью отвественность за любые ошибки, проблемы или потери важной информации.




Октябрь 15, 2009 в 11:08
Какая-то копипастная путаница в третьем абзаце. Статья интересная.
[Ответить]
Октябрь 19, 2009 в 12:50
@Евгений, да, действительно была путаница в третьем абзаце, исправил, спасибо
[Ответить]
Ноябрь 12, 2009 в 22:28
Антон, здравствуйте!
Спасибо за интересный блог и эту статью
Заметил для себя странную особенность промптов в отчете – похоже в списке полей, для которых можно сделать промпт, появляются только те поля, которые перечислены в фильтре (с типом is prompted) или столбцах отчета.
Причем они там остаются после удаления фильтра
Но вот беда – если поле типа дата не вынесено в перечень колонок в отчете, промпт по нему не работает (нажимаю кнопку, ничего не происходит). Со строками все работает.
Попробую ваш способ отладки, может что-то прояснится…
[Ответить]
Февраль 12, 2010 в 10:09
Спасибо, очень полезная информация, помогла в работе.
[Ответить]
Апрель 2, 2010 в 14:46
Добрый день!
Спасибо большое за статью!
Я только начинаю заниматься Oracle Bi было очень полезно почитать.
Не могли бы вы подсказать, как можно использовать аналитические ф-ии oracle при построении отчета – например как сформировать такой запрос
select T33542.C_LOAN_NUMBER as c1,
max(T33542.C_DATE_OUT) Keep (DENSE_RANK LAST ORDER BY T33542.C_DATE_OUT) as c5,
max(T33542.C_CAUSE_OUT) Keep (DENSE_RANK LAST ORDER BY T33542.C_DATE_OUT) as c3,
max(T33542.C_CURRENT_ON_SS) Keep (DENSE_RANK LAST ORDER BY T33542.C_DATE_OUT) as c4
from SSR_OUT T33542
group by T33542.C_LOAN_NUMBER –, T33542.C_CURRENT_ON_SS
order by c1
Заранее благодарю
С Уважением,
Александра
[Ответить]