<?xml version="1.0" encoding="cp1251"?>
<!-- generator="wordpress/2.1.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>demyanov.ru</title>
	<link>http://demyanov.ru</link>
	<description>&#1047;&#1072;&#1087;&#1080;&#1089;&#1082;&#1080; &#1086;&#1088;&#1072;&#1082;&#1083;&#1086;&#1074;&#1086;&#1075;&#1086; &#1082;&#1086;&#1085;&#1089;&#1091;&#1083;&#1100;&#1090;&#1072;&#1085;&#1090;&#1072;</description>
	<pubDate>Fri, 23 May 2008 09:48:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.2</generator>
	<language>en</language>
			<item>
		<title>Нестандартные элементы в dashboard-prompt</title>
		<link>http://demyanov.ru/?p=93</link>
		<comments>http://demyanov.ru/?p=93#comments</comments>
		<pubDate>Fri, 23 May 2008 09:48:51 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle BI Suite]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=93</guid>
		<description><![CDATA[Несколько последних дней я работал совместно с разработчиками заказчика над созданием нестандартных дэшбордов. Основным требованием заказчика было создание prompt’ов в виде чекбоксов. В результате у нас получились такие вот симпатичные дэшборды, как на скриншоте внизу.

Расскажу в двух словах, как это реализовано. 
То, что на скриншоте справа – это обычный prompt. Помимо трех видимых комбо-боксов, там [...]]]></description>
			<content:encoded><![CDATA[<p>Несколько последних дней я работал совместно с разработчиками заказчика над созданием нестандартных дэшбордов. Основным требованием заказчика было создание prompt’ов в виде чекбоксов. В результате у нас получились такие вот симпатичные дэшборды, как на скриншоте внизу.</p>
<p><img src='http://demyanov.ru/wp-content/uploads/2008/05/pic3.png' alt='pic3.png' /></p>
<p>Расскажу в двух словах, как это реализовано. </p>
<p>То, что на скриншоте справа – это обычный prompt. Помимо трех видимых комбо-боксов, там есть еще один невидимый мультиселект для валюты, условно назовем его HIDDEN_CURRENCY ( о том, как его спрятать, будет ниже). Чекбоксы слева – это обычные чекбоксы, создаваемые html-тэгом &lt;input type=”checkbox”&gt;. Фрагмент макета дэшборда при этом выглядит следующим образом:</p>
<p><img src='http://demyanov.ru/wp-content/uploads/2008/05/pic2.png' alt='pic2.png' /></p>
<p>Элемент под названием «Javascript валюты» - это Static Text с включенным свойством Contains HTML-markup. В этом элементе создаются сами чекбоксы, а также опеределения следующих java-script функций:</p>
<ul>
<li>getCurrencyString - функция на базе текущего состояния чекбоксов строки вида формирует и возвращает строку вида ’RUR’,’USD’, содержащую коды отмеченных валют.</li>
<li>setPromptValue – функция находит на странице элемент &lt;input&gt;, соответствующий prompt’у HIDDEN_CURRENCY и устанавливает ему value = getCurrencyString(). Затем надо вызвать у HIDDEN_CURRENCY обработчик onChange, т.к. в prompt’е Банки и Счета должны подрезаться при выборе валюты (для этого в prompt’e, напомню, используется галочка Constrain). На эту функцию устанавливается обработчик onClick для чекбоксов.</li>
<li>initCurrencyChk – функция инициализирует значения чекбоксов на основании значения prompt’а HIDDEN_CURRENCY</li>
</ul>
<p>Теперь немного о том, как сделать элемент HIDDEN_CURRENCY спрятанным. Для этого была написана javascript-функция hideElements, которая ищет на странице элементы &lt;input&gt;, и у которых в innerHTML элемента parentNode.previousSibling.previousSibling содержит подстроку HIDDEN. Т.е. ищутся input’ы, лежащие рядом с заголовками, которые мы специально помечаем префиксом HIDDEN в названии. У найденных элементов в стили дописывается display:none. Вызов этой функции нужно вставить в файл ajax.js в самый конец обработчика sawr.iFrameConnection._onLoad. Файл этот лежит на сервере, путь к нему зависит от того, используется ли OC4J или AS. На моем лэптопе этот файл лежит в папках c:\oracle\biee\oc4j_bi\j2ee\home\applications\analytics\analytics\res\b_mozilla\common\ и c:\oracle\biee\web\app\res\b_mozilla\common\.</p>
<p>Наконец, на дэшбород положен Static Text под названием Hide, в котором однократно вызываются функции initCurrencyChk и hideElements.</p>
<p>Вот собственно и все. Не самый простой путь, требующий неплохого знания html и javascript, но игра часто стоит свеч.</p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=93</wfw:commentRss>
		</item>
		<item>
		<title>Пара ссылок по Oracle Data Mining</title>
		<link>http://demyanov.ru/?p=92</link>
		<comments>http://demyanov.ru/?p=92#comments</comments>
		<pubDate>Wed, 14 May 2008 15:56:14 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle Data Mining]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=92</guid>
		<description><![CDATA[Сегодня был в Оракл на семинаре, посвященном Oracle Data Mining. В принципе семинар достаточно общий, помогает войти в курс дела тем, кто про эти технологии ничего не знает. Тем не менее Ольга Горчинская рассказывала очень хорошо и интересно.
На семинаре демонстрировался Oracle Data Miner - инструмент аналитика для подготовки данных, разработки моделей (классификации, кластеризации и т.п.), [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня был в Оракл на семинаре, посвященном Oracle Data Mining. В принципе семинар достаточно общий, помогает войти в курс дела тем, кто про эти технологии ничего не знает. Тем не менее Ольга Горчинская рассказывала очень хорошо и интересно.</p>
<p>На семинаре демонстрировался Oracle Data Miner - инструмент аналитика для подготовки данных, разработки моделей (классификации, кластеризации и т.п.), оценки качества построенных моделей и применения моделей. Конкретно применения построенных моделей вызвало у слушателей большой вопрос. Дело в том, что сам Data Miner - это именно рабочее место аналитика, в нем модель можно применить только пакетно к какой-то таблице и на выходе получить другую таблицу. Понятно, что это не очень технологично.</p>
<p>А как сделать real-time скоринг и встроить его в какую-то систему (например в те же отчеты Oracle BI)? Здесь уже придется использовать API для java или для SQL. Есть специальное расширение ораклового SQL для применения моделей ODM&#8217;а, включающее такие функции как PREDICTION, PREDICTION_PROBABILITY и другие. Много примеров есть <a href="http://oracledmt.blogspot.com/2006/05/sql-of-analytics-1-data-mining.html">здесь</a>. И есть интересная <a href="http://oracledmt.blogspot.com/2006/02/real-time-scoring-model-management-1.html"> статья </a> из трех частей о построении скоринговой системы на базе Oracle Data Mining. </p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=92</wfw:commentRss>
		</item>
		<item>
		<title>Бага с Event Polling table в BI Server</title>
		<link>http://demyanov.ru/?p=91</link>
		<comments>http://demyanov.ru/?p=91#comments</comments>
		<pubDate>Wed, 05 Mar 2008 15:37:19 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle BI Suite]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=91</guid>
		<description><![CDATA[Я как-то писал&#160;о том, что в BI Server имеется механизм очистки кэша по добавлению записей в специальную таблицу, так называемую Event Polling table (EPT). Сегодня на релизе 10.1.3.3 было обнаружено что-то похожее на баг.
Дело в следующем. Если создать EPT с помощью приведенного в документации скрипта, то опрос этой таблицы BI Server не выполняет, а в [...]]]></description>
			<content:encoded><![CDATA[<p>Я как-то <a href="http://demyanov.ru/?p=44" target="_blank">писал</a>&nbsp;о том, что в BI Server имеется механизм очистки кэша по добавлению записей в специальную таблицу, так называемую Event Polling table (EPT). Сегодня на релизе 10.1.3.3 было обнаружено что-то похожее на баг.</p>
<p>Дело в следующем. Если создать EPT с помощью приведенного в документации скрипта, то опрос этой таблицы BI Server не выполняет, а в NQServer.log пишется сообщение об ошибке [56001] The cache polling event table &#8230; has an incorrect schema. Похоже при проверке структуры таблицы используются не названия столбцов, а их номера по порядку. А порядок в скрипте и на физическом уровне метаслоя разный - в метаслое столбцы отсортированы по алфавиту.</p>
<p>Проблема решается, если создавать EPT с помощью немного модифицированного скрипта. Например, так:</p>
<p><code>create table EPT<br />(<br />&nbsp; f1_UpdateType Integer not null,<br />&nbsp; f2_UpdateTime date default sysdate not null,<br />&nbsp; f3_DBName char(40) null,<br />&nbsp; f4_CatalogName varchar(40) null,<br />&nbsp; f5_SchemaName varchar(40) null,<br />&nbsp; f6_TableName varchar(40) not null,<br />&nbsp; f7_Other varchar(80) default null<br />);</code></p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=91</wfw:commentRss>
		</item>
		<item>
		<title>OMB скрипт</title>
		<link>http://demyanov.ru/?p=90</link>
		<comments>http://demyanov.ru/?p=90#comments</comments>
		<pubDate>Tue, 04 Mar 2008 12:20:31 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[OWB]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=90</guid>
		<description><![CDATA[Продолжу полезное начинание на http://molapist.blog.com&#160;по публикации полезных OMB скриптов. Выкладываю скрипт для вставки оператора FILTER в мэппинг после указанного оператора. Все исходящие соединения из указанного оператора пропускаются через FILTER. Скрипту на вход дается название мэппинга, название оператора, после которого нужно вставить фильтр, название для фильтра, и, опционально, условие фильтрации. Например:
OMB+&#62; source c:\\oracle\\owb_scripts\\insert_filter.tclOMB+&#62; OMBCC &#8216;/MY_PROJECT/SH2&#8242;Context changed.OMB+&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжу полезное начинание на <a href="http://molapist.blog.com " target="_blank">http://molapist.blog.com</a>&nbsp;по публикации полезных OMB скриптов. Выкладываю скрипт для вставки оператора FILTER в мэппинг после указанного оператора. Все исходящие соединения из указанного оператора пропускаются через FILTER. Скрипту на вход дается название мэппинга, название оператора, после которого нужно вставить фильтр, название для фильтра, и, опционально, условие фильтрации. Например:</p>
<p><code>OMB+&gt; source c:\\oracle\\owb_scripts\\insert_filter.tcl<br />OMB+&gt; OMBCC &#8216;/MY_PROJECT/SH2&#8242;<br />Context changed.<br />OMB+&gt; insert_filter MAPPING LOAD_SALES SALES FLT<br />OMB+&gt; OMBCOMMIT<br />Commit complete.<br /></code></p>
<p> Далее сам скрипт:
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 15px 10px; overflow: auto; border-left: gray 1px solid; width: 93%; cursor: text; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; max-height: 100px">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">proc insert_filter {map_type map_name src_op_name flt_op_name {flt_cond <span style="color: #006080">&#8220;&#8221;</span>}} {

    <span style="color: #008000"># создаем фильтр</span>
    OMBALTER $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> ADD FILTER OPERATOR <span style="color: #006080">&#8216;$flt_op_name&#8217;</span>

    <span style="color: #0000ff">if</span> {$flt_cond != <span style="color: #006080">&#8220;&#8221;</span>} {
        OMBALTER $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> MODIFY OPERATOR <span style="color: #006080">&#8216;$flt_op_name&#8217;</span> SET PROPERTIES (FILTER_CONDITION) VALUES ($flt_cond)
    }

    <span style="color: #008000"># ищем в операторе src_op_name  исходящую группу и копируем её атрибуты в фильтр</span>
    set l_groups [OMBRETRIEVE $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span> GET GROUPS]
    <span style="color: #0000ff">foreach</span> g $l_groups {

        set grp_direction [OMBRETRIEVE $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span>
                             GROUP <span style="color: #006080">&#8216;$g&#8217;</span> GET PROPERTIES (DIRECTION)]
        <span style="color: #0000ff">if</span> {$grp_direction == 1} {
            <span style="color: #0000ff">continue</span>
        }

        set l_atts [OMBRETRIEVE $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span> GROUP <span style="color: #006080">&#8216;$g&#8217;</span> GET ATTRIBUTES]
        OMBALTER $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> ADD CONNECTION 
            FROM GROUP <span style="color: #006080">&#8216;$g&#8217;</span> OF OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span> TO GROUP <span style="color: #006080">&#8216;INOUTGRP1&#8242;</span> OF OPERATOR <span style="color: #006080">&#8216;$flt_op_name&#8217;</span> COPY ALL
        <span style="color: #0000ff">break</span>
    }

    <span style="color: #008000"># цикл по всем операторам, подключенные к src_op_name</span>
    set l_trg_ops [OMBRETRIEVE $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> GET OPERATORS CONNECTED FROM OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span>]
    <span style="color: #0000ff">foreach</span> trg_op $l_trg_ops {
        <span style="color: #0000ff">if</span> {$trg_op == $flt_op_name} {
            <span style="color: #0000ff">continue</span>
        }

        <span style="color: #008000"># цикл по всем группам оператора</span>
        set l_trg_groups [OMBRETRIEVE $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> OPERATOR <span style="color: #006080">&#8216;$trg_op&#8217;</span> GET GROUPS]
        <span style="color: #0000ff">foreach</span> trg_grp $l_trg_groups {

            set l_src_attrs []
            set l_trg_attrs []

            <span style="color: #008000"># запоминаем все соединения между оператором src_op_name и текущей группой текущего оператора</span>
            <span style="color: #0000ff">foreach</span> a $l_atts {
                set l_connected [OMBRETRIEVE $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> OPERATOR <span style="color: #006080">&#8216;$trg_op&#8217;</span> GROUP <span style="color: #006080">&#8216;$trg_grp&#8217;</span>
                                     GET ATTRIBUTES CONNECTED FROM ATTRIBUTE <span style="color: #006080">&#8216;$a&#8217;</span> OF GROUP <span style="color: #006080">&#8216;$g&#8217;</span> OF OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span>]
                <span style="color: #0000ff">foreach</span> conn $l_connected {
                        lappend l_src_attrs $a
                        lappend l_trg_attrs $conn
                }
            }

            <span style="color: #008000"># удаляем соединения из исходного оператора к текущему</span>
            <span style="color: #0000ff">for</span> {set i 0} {$i &lt; [llength $l_src_attrs]} {incr i} {
                OMBALTER $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> DELETE CONNECTION
                        FROM ATTRIBUTE <span style="color: #006080">&#8216;[lindex $l_src_attrs $i]&#8217;</span> OF GROUP <span style="color: #006080">&#8216;$g&#8217;</span> OF OPERATOR <span style="color: #006080">&#8216;$src_op_name&#8217;</span>
                        TO ATTRIBUTE <span style="color: #006080">&#8216;[lindex $l_trg_attrs $i]&#8217;</span> OF GROUP <span style="color: #006080">&#8216;$trg_grp&#8217;</span> OF OPERATOR <span style="color: #006080">&#8216;$trg_op&#8217;</span>
            }

            <span style="color: #008000"># создаем аналогичные соединения из фильтра</span>
            <span style="color: #0000ff">for</span> {set i 0} {$i &lt; [llength $l_src_attrs]} {incr i} {
                OMBALTER $map_type <span style="color: #006080">&#8216;$map_name&#8217;</span> ADD CONNECTION
                        FROM ATTRIBUTE <span style="color: #006080">&#8216;[lindex $l_src_attrs $i]&#8217;</span> OF GROUP <span style="color: #006080">&#8216;INOUTGRP1&#8242;</span> OF OPERATOR <span style="color: #006080">&#8216;$flt_op_name&#8217;</span>
                        TO ATTRIBUTE <span style="color: #006080">&#8216;[lindex $l_trg_attrs $i]&#8217;</span> OF GROUP <span style="color: #006080">&#8216;$trg_grp&#8217;</span> OF OPERATOR <span style="color: #006080">&#8216;$trg_op&#8217;</span>
            }

        <span style="color: #008000"># конец цикла по группам оператора</span>
        }

    <span style="color: #008000"># конец цикла по операторам    </span>
    }

}
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=90</wfw:commentRss>
		</item>
		<item>
		<title>23 Февраля</title>
		<link>http://demyanov.ru/?p=87</link>
		<comments>http://demyanov.ru/?p=87#comments</comments>
		<pubDate>Fri, 22 Feb 2008 15:41:37 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=87</guid>
		<description><![CDATA[Не могу удержаться от того, чтобы похвастаться, какие открытки нам подарили девушки на День Защитника Отечества!
Им спасибо, а всех с праздником!

]]></description>
			<content:encoded><![CDATA[<p>Не могу удержаться от того, чтобы похвастаться, какие открытки нам подарили девушки на День Защитника Отечества!<br />
Им спасибо, а всех с праздником!</p>
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/borlas_230208.jpg' alt='Открытка' /></p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=87</wfw:commentRss>
		</item>
		<item>
		<title>Правила агрегации в OBI</title>
		<link>http://demyanov.ru/?p=76</link>
		<comments>http://demyanov.ru/?p=76#comments</comments>
		<pubDate>Mon, 11 Feb 2008 16:24:58 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle BI Suite]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=76</guid>
		<description><![CDATA[Давно уже собирался написать про некоторые моменты настройки в OBI различных правил агрегации по разным измерениям. Я приведу пару примеров из реальных задач, а также укажу на некоторые ошибки в OBI.
Итак, случай первый. Пару месяцев назад я делал демонстрационный пример для одной компании: мне нужно было настроить в OBI модель с замерами различных показателей нефтяных [...]]]></description>
			<content:encoded><![CDATA[<p>Давно уже собирался написать про некоторые моменты настройки в OBI различных правил агрегации по разным измерениям. Я приведу пару примеров из реальных задач, а также укажу на некоторые ошибки в OBI.</p>
<p>Итак, случай первый. Пару месяцев назад я делал демонстрационный пример для одной компании: мне нужно было настроить в OBI модель с замерами различных показателей нефтяных скважин (дебет жидкости, обводненность и т.д.) Я построил на логическом уровне таблицу фактов MEASUREMENTS c одним показателем Qp (дебет жидкости), образмерил её таблицами DM_TIME и DM_WELL (скважины). Затем я наполнил таблицы тестовыми данными:
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic1.gif' alt='pic1.gif' /></p>
<p>Замеры по одной и той же скважине за разные дни должны усредняться. Замеры, проведенные в один и тот же день для разных скважин, должны суммироваться. Для настройки правил агрегации я открываю в BI Administration Tool свойства логической колонки Qp, на вкладке Aggregation устанавливаю галочку Based on dimensions, и устанавливаю правило агрегации AVG для измерения DM_WELLDim, и SUM для DM_TIMEDim.
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic2.gif' alt='pic2.gif' /></p>
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic3.gif' alt='pic3.gif' /></p>
<p>Для вычисления общего итога по всем скважинам за месяц необходимо сперва вычислить средний дебет жидкости по каждой скважине, а затем просуммировать получившиеся значения. Здесь важен порядок, в котором указаны измерения. Но если попытаться вывести в отчет одновременно оба итога, то мы увидим ошибочный результат.
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic4.gif' alt='pic4.gif' /></p>
<p>Здесь итоги по дням (значения в нижей строчке) считаются верно. Также правильно посчитан общий итог (правая нижняя ячейка): 374 = AVG(250+230+240) + AVG(130+138)=240+134=374. А вот итог по скважинам (правый столбец) посчитан неправильно - выводится сумма вместо среднего. В других подобных экспериментах я получал подобные некорректные результаты, вплоть до ошибки [nQSError: 46036] Internal Assertion.</p>
<p>Для решения этой проблемы можно использовать следующий обходной маневр. Дело в том, что BI Server пускает один SQL-запрос к базе данных, которым получаются как детальные значения отчета, так и вычисляются итоги, и именно этот запрос генерируется неправильно. Можно в Administration Tool открыть на физическом уровне свойства базы данных, и снять опцию SUBTOTALLING_SUPPORTED. И тогда для вычисления итогов BI Server будет пускать к базе данных отдельный запрос, что легко проверить посмотрев в NQQuery.log.
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic5.gif' alt='pic5.gif' /></p>
<p>В итоге после отключения опции мы получаем верный отчет.
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic6.gif' alt='pic6.gif' /></p>
<p>Теперь о другом примере. Представим себе таблицу транзакций по переводу сумм со счета на счет. Так же представим, что транзакции возникают не сами по себе, а порождаются документами. Один документ может породить несколько транзакций, и все транзакции одного документа имеют одинаковые суммы. Таблица фактов создается следующим скриптом:</p>
<p>create table TRANSACTIONS<br />
(<br />
  DOCUMENT_IS     INTEGER,<br />
  ACCOUNT_ID_FROM INTEGER,<br />
  ACCOUNT_ID_TO   INTEGER,<br />
  AMOUNT          INTEGER<br />
); </p>
<p>Рассмотрим следующие детальные данные:
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic10.gif' alt='pic10.gif' /></p>
<p>Предположим, что в отчетах требуется для определенного счета получать два показателя - &#8220;Сумма по транзакциям&#8221; и &#8220;Сумма по документам&#8221;. Сумму по транзакциям нужно вычислять как сумму всех транзакций, в которых участвовал счет. Сумму по документам нужно вычислять аналогично, но при этом брать сумму для каждого документа только один раз. Например в приведенных данных для счета 100 сумма по транзакциям должна составлять 190, а сумма по документам 120. </p>
<p>Для удовлетворения описанных требований поступим следующим образом. Для логической колонки AMOUNT установим правило агрегации SUM - это будет наша &#8220;Сумма по транзакциям&#8221;. Затем продублируем колонку AMOUNT (Right Click -> Duplicate), назовем новую колонку AMOUNT_BY_DOCUMENT, и для неё установим правило агрегации как MIN по всем измерениям, за исключением SUM по документам:
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic11.gif' alt='pic11.gif' /></p>
<p>В результате мы получаем два показателя, которые агрегируются нужным способом.
<p align=center><img src='http://demyanov.ru/wp-content/uploads/2008/02/pic12.gif' alt='pic12.gif' /></p>
<p>PS Все описанное проверялось на OBI 10.1.3.3.1 и Oracle Database 10.2.0.1</p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=76</wfw:commentRss>
		</item>
		<item>
		<title>Про ведение пользователей OBI в OID</title>
		<link>http://demyanov.ru/?p=75</link>
		<comments>http://demyanov.ru/?p=75#comments</comments>
		<pubDate>Wed, 12 Dec 2007 11:33:51 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle BI Suite]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=75</guid>
		<description><![CDATA[Есть у одного нашего заказчика инстанс OBI, интегрированный с OID и SSO. Забавный случай произошел сегодня, когда я добавлял в OID нового пользователя.
Итак, по-порядку. Я создал в OID нового пользователя, допустим Vasya. Пытаюсь зайти под этим пользователем в BI Presentation Services и&#160; получаю отлуп: выводится сообщения You are not currently logged in to the Oracle [...]]]></description>
			<content:encoded><![CDATA[<p>Есть у одного нашего заказчика инстанс OBI, интегрированный с OID и SSO. Забавный случай произошел сегодня, когда я добавлял в OID нового пользователя.</p>
<p>Итак, по-порядку. Я создал в OID нового пользователя, допустим Vasya. Пытаюсь зайти под этим пользователем в BI Presentation Services и&nbsp; получаю отлуп: выводится сообщения You are not currently logged in to the Oracle BI Server. Смотрю в NQServer.log и вижу сообщение типа Initialization block &#8220;Authentication&#8221; has failed. И никакого описания почему он failed. Запускаю Administration Tool, открываю этот init-block, нажимаю кнопку Test - блок отрабатывает нормально,&nbsp;атрибуты пользователя из OID вытаскиваются. У меня ступор и разглядывание экрана на 10 минут.</p>
<p>Потом оказалось, что в самом репозитории уже имелcя пользователь Vasya, что и вызывало ошибку. Пользователь там появился для целей тестирования, когда репозиторий еще был на этапе разработки. А при переносе на боевой сервер забыли почистить лишнее.</p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=75</wfw:commentRss>
		</item>
		<item>
		<title>Про один проект</title>
		<link>http://demyanov.ru/?p=74</link>
		<comments>http://demyanov.ru/?p=74#comments</comments>
		<pubDate>Thu, 22 Nov 2007 16:58:20 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[О работе]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=74</guid>
		<description><![CDATA[Не так давно (весной-летом сего года)&#160;я участвовал в проекте по созданию ХД и системы отчетности,&#160;реализованном&#160;консультантами Борласа&#160;для компании CamelActive. А сегодня вижу вот такой интересный пресс-релиз Oracle BI для СМБ: первое внедрение в российском ритейле. Приятно осознавать, что в чем-то был первым, будет что рассказать детям! Шучу, конечно.
]]></description>
			<content:encoded><![CDATA[<p>Не так давно (весной-летом сего года)&nbsp;я участвовал в проекте по созданию ХД и системы отчетности,&nbsp;реализованном&nbsp;консультантами <a href="http://www.borlas.ru">Борласа</a>&nbsp;для компании CamelActive. А сегодня вижу вот такой интересный пресс-релиз <a href="http://www.cnews.ru/reviews/index.shtml?2007/11/22/276195">Oracle BI для СМБ: первое внедрение в российском ритейле</a>. Приятно осознавать, что в чем-то был первым, будет что рассказать детям! Шучу, конечно.</p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=74</wfw:commentRss>
		</item>
		<item>
		<title>Интеграция Oracle BI и Oracle SSO</title>
		<link>http://demyanov.ru/?p=73</link>
		<comments>http://demyanov.ru/?p=73#comments</comments>
		<pubDate>Thu, 15 Nov 2007 15:25:12 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle BI Suite]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=73</guid>
		<description><![CDATA[Для одного нашего заказчика сейчас реализуется проект, в котором разрабатывается приложение на Oracle Portal и отчеты на Oracle BI EE.&#160;Встал вопрос об интеграции&#160;BI с SSO, дабы конечный&#160;пользователь, зарегистрировавшись в портале, мог затем свободно перейти на дэшбороды, или вызвать&#160;отчет из BI Publisher напрямую, без повторного ввода пароля.&#160;
В принципе сам процесс настройки описан в документации (Deployment Guide [...]]]></description>
			<content:encoded><![CDATA[<p>Для одного нашего заказчика сейчас реализуется проект, в котором разрабатывается приложение на Oracle Portal и отчеты на Oracle BI EE.&nbsp;Встал вопрос об интеграции&nbsp;BI с SSO, дабы конечный&nbsp;пользователь, зарегистрировавшись в портале, мог затем свободно перейти на дэшбороды, или вызвать&nbsp;отчет из BI Publisher напрямую, без повторного ввода пароля.&nbsp;</p>
<p>В принципе сам процесс настройки описан в документации (Deployment Guide и Publisher User Guide). Я расскажу лишь о некоторых затруднительных моментах (хотя может это только меня они на некоторое время вводили в ступор).</p>
<p>Итак, начну с того, что для интеграции в SSO нужно разворачивать BI не в Standalone OC4J, а в Application Server. Для этого нужно установить на машине Oracle AS версии 10.1.3.1 или выше, а затем в процессе инсталляции выбрать Advanced Installation и указать путь к AS. После установки оказалось, что в AS задеплоились все компоненты, кроме паблишера. Нужно зайти в Enterprise Manager и задеплоить xmlpserver.ear ручками. Не всегда это может получиться - на одной машине процесс деплоя зависал, а в логах в <em>%AS_HOME%\opmn\logs\</em> и <em>%AS_HOME%\j2ee\&lt;OC4J_name&gt;\log\</em> можно было видеть сообщения об ошибках, какие-то конфликты имен классов, и прочее. Пришлось поиграть с настройками Deployment Plan&nbsp;в разделе&nbsp;Configure Class Loading. После того, как паблишер задеплоен, то при попытке логина может происходить ошибка, при которой вываливается сообщение <em>oracle.apps.xdo.servlet.resources.ResourceNotFoundException:</em> <em>%s_Reports_Path%/Admin/Security/principals.xml.</em> Для того чтобы это исправить, надо найти конфигурационный файл, в котором присутствует строка <em>s_Reports_Path</em> и подправить её на правильный путь к каталогу паблишера.</p>
<p>Далее интеграция с OID и SSO была настроена по документации, без особых проблем. Случилась только одна пакость. Когда я создавал пользователя Impersonator, я задал ему пароль secret на первое время (собственно, как в доке). Но при установке BI в режиме Advanced Installation в файле NQSConfig.ini устанавливается настройка MINIMUM_PASSWORD_LENGTH&nbsp;=&nbsp;8. Пользователя-то я создал, но вот позже происходила ошибка, когда PresentationServer коннектился к BI Server от имени этого пользователя. Внешне это выглядело следующим образом: я открывал браузер, заходил в дэшборды, появлялся logon-экран SSO, я вводил логин/пароль, и меня сразу перекидывало на страничку с сообщением You are not currently logged in to the Oracle BI Server.</p>
<p>Надеюсь, кому-нибудь это сэкономит время.</p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=73</wfw:commentRss>
		</item>
		<item>
		<title>Развертывание нескольких BI Presentation Services на одной windows-машине</title>
		<link>http://demyanov.ru/?p=70</link>
		<comments>http://demyanov.ru/?p=70#comments</comments>
		<pubDate>Wed, 17 Oct 2007 13:48:42 +0000</pubDate>
		<dc:creator>Егор Демьянов</dc:creator>
		
		<category><![CDATA[Oracle BI Suite]]></category>

		<guid isPermaLink="false">http://demyanov.ru/?p=70</guid>
		<description><![CDATA[Сегодня занимался развертыванием у себя на ноутбуке нескольких BI Presentation Services. Поясню для чего это нужно. Как известно, BI Server умеет работать с нескольким репозиториями (rpd-файлами) одновременно (см. NQSConfig.ini).&#160;BI Presentation Services коннектиться к BI Server&#8217;у через ODBC, указанный в instanceconfig.xml. В свою очередь в ODBC можно указать какой rpd подключать, либо не указывать, и тогда [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня занимался развертыванием у себя на ноутбуке нескольких BI Presentation Services. Поясню для чего это нужно. Как известно, BI Server умеет работать с нескольким репозиториями (rpd-файлами) одновременно (см. NQSConfig.ini).&nbsp;BI Presentation Services коннектиться к BI Server&#8217;у через ODBC, указанный в instanceconfig.xml. В свою очередь в ODBC можно указать какой rpd подключать, либо не указывать, и тогда будет использоваться rpd с пометкой default.&nbsp;Таким образом, Presentation Services работает фактически только с одним репозиторием.</p>
<p>На практике может возникнуть (и возникла) ситуация, когда на одном сервере ведется разработка двух проектов. Таким образом можно под каждый проект создать по rpd-файлу, а также поднять два презентационных сервера на каждый проект. Некоторые товарищи уже пробовали провернуть подобное под unix <a title="http://www.be-ice.eu/2007/09/11/managing-multiple-presentation-services-on-the-same-unix-box/#comments" href="http://www.be-ice.eu/2007/09/11/managing-multiple-presentation-services-on-the-same-unix-box/#comments">http://www.be-ice.eu/2007/09/11/managing-multiple-presentation-services-on-the-same-unix-box/#comments</a>. У меня возникла задача провернуть подобное под Windows.</p>
<p>Presentation Services состоит из основного процесса (sawserver.exe) и плагина Presentation Services Plug-in, который суть джава сервлет. Основной процесс и плагин общаются между собой по TCP по порту 9710. У меня в результате установки, очевидно, уже был установлен сервлет, а основной процесс запускался в виде сервиса. Нужно было поднять аналогичную конструкцию по другому порту.&nbsp;Для этого я подправил в файле %SAROOTDIR%\web\app\WEB-INF\web.xml параметр oracle.bi.presentation.sawserver.Port на значение 9711. Затем, находясь в папке %SAROOTDIR%\web я выполнил команду &#8220;jar -cf analytics.war -C app .&#8221;, с помощью которой пересоздал файл analytics.war. Потом я зашел в веб-консоль&nbsp;OC4J и задеплоил свежесгенерированный war-файл, установив Context Root=analytics1.</p>
<p align=center><a href='http://demyanov.ru/wp-content/uploads/2007/10/clipboard01.gif' title='clipboard01.gif'><img src='http://demyanov.ru/wp-content/uploads/2007/10/clipboard01.thumbnail.gif' alt='clipboard01.gif' /></a></p>
<p>Затем в папке %SAROOTDIR%\server\Repository я создал два репозитория с названиями&nbsp;paint1.rpd и paint2.rpd. Оба репозитория я подключил в NQSConfig.ini:</p>
<p><code>[ REPOSITORY ] <br />Star1&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; paint1.rpd, DEFAULT;<br />Star2&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp; paint2.rpd; </code></p>
<p>Потом я перезапустил BI Server.</p>
<p>Далее, я создал два odbc-источника, назвал их AnalyticsWeb1 и AnalyticsWeb2, в настройках указал соответствующие репозитории:</p>
<p align=center><a href='http://demyanov.ru/wp-content/uploads/2007/10/clipboard02.gif' title='clipboard02.gif'><img src='http://demyanov.ru/wp-content/uploads/2007/10/clipboard02.thumbnail.gif' alt='clipboard02.gif' /></a></p>
<p>Далее, в папке %SADATADIR%\web я создал две папки для веб-каталогов с навзаниями catalog1&nbsp;и catalog2&nbsp;- каждый Presentation Services должен иметь свой веб-каталог для хранения описания дэшбордов и отчетов. Затем в %SADATADIR%\web\config я откопировал файл instanceconfig.xml два раза, назвав&nbsp;их instanceconfig1.xml и instanceconfig2.xml. Начало&nbsp;первого файла я отредактировал&nbsp;следующим образом:</p>
<p><code>&lt;WebConfig&gt;<br />&nbsp;&nbsp; &lt;ServerInstance&gt;<br />&nbsp;&nbsp; &lt;DSN&gt;AnalyticsWeb1&lt;/DSN&gt;<br />&nbsp;&nbsp; &lt;Listener port=&#8221;9710&#8243; /&gt;<br />&nbsp;&nbsp; &lt;JavaHome&gt;C:\Program Files\Java\jdk1.5.0_05&lt;/JavaHome&gt;<br />&nbsp;&nbsp; &lt;CatalogPath&gt;C:/oracle/OracleBIData/web/catalog1/paint&lt;/CatalogPath&gt; </code>
<p>Второй начинался так:
<p><code>&lt;WebConfig&gt;<br />&nbsp;&nbsp; &lt;ServerInstance&gt;<br />&nbsp;&nbsp; &lt;DSN&gt;AnalyticsWeb2&lt;/DSN&gt;<br />&nbsp;&nbsp; &lt;Listener port=&#8221;9711&#8243; /&gt;<br />&nbsp;&nbsp; &lt;JavaHome&gt;C:\Program Files\Java\jdk1.5.0_05&lt;/JavaHome&gt;<br />&nbsp;&nbsp; &lt;CatalogPath&gt;C:/oracle/OracleBIData/web/catalog2/paint&lt;/CatalogPath&gt; </code></p>
<p>В этих файлах я указал путь к веб-каталогу, odbc-источник, а так же порт, по которому сервер слушает запросы от плагина. Основной процесс sawserver я запустил не в виде сервиса, а просто как приложение из командной строки. Первый я запускал так:
<p><code>copy c:\oracle\OracleBIData\web\config\instanceconfig1.xml c:\oracle\OracleBIData\web\config\instanceconfig.xml <br />c:\oracle\oraclebi\web\bin\sawserver.exe </code></p>
<p>Второй соответственно:
<p><code>copy c:\oracle\OracleBIData\web\config\instanceconfig2.xml c:\oracle\OracleBIData\web\config\instanceconfig.xml <br />c:\oracle\oraclebi\web\bin\sawserver.exe</code></p>
<p>В итоге я добился того, что по адресу <a href="http://edemyanov:9704/analytics/">http://edemyanov:9704/analytics/</a> я получал доступ к презентационному серверу, работающему с репозиторием paint1.rpd, а по адресу <a href="http://edemyanov:9704/analytics1/">http://edemyanov:9704/analytics1/</a>&nbsp;я работал с репозиторием paint2.rpd.</p>
]]></content:encoded>
			<wfw:commentRss>http://demyanov.ru/?feed=rss2&amp;p=70</wfw:commentRss>
		</item>
	</channel>
</rss>
