30 авг. 2010 г.

Настройка HSP_PM_STATES

В Planning есть возможность изменить название статусов процесса согласования бюджетных блоков и их цветовое представление.


Пример:

UPDATE "HSP_PM_STATES" SET NAME = 'Не начато' WHERE STATE_ID = 0;
UPDATE "HSP_PM_STATES" SET NAME = 'Подписано', COLOR = 'ORANGE' WHERE STATE_ID = 4;
UPDATE "HSP_PM_STATES" SET NAME = 'Начато' WHERE STATE_ID = 1;
UPDATE "HSP_PM_STATES" SET NAME = 'Отклонено', COLOR = 'RED' WHERE STATE_ID = 5;
UPDATE "HSP_PM_STATES" SET NAME = 'На рассмотрении', COLOR = 'BLUE' WHERE STATE_ID = 2;
UPDATE "HSP_PM_STATES" SET NAME = 'Утверждено', COLOR = 'GREEN' WHERE STATE_ID = 3;

Выглядит этот светофор так:


P.S. дополнительная информация http://www.orahyplabs.com/

19 авг. 2010 г.

Essbase Custom-Defined Macros

Задача:
Существует куб со следующими измерениями:
Account
   Acc1
   Acc2
   Acc3
Period
   YearTotal
     Q1
       Jan
       Feb
       ...
Year
   FY09 
   FY10
   FY11

Необходимо создать функцию XXPRIOR которая умеет "перескакивать" через год т.е.

XXPRIOR(Jan->FY10) = Dec->FY09

Решение:
Создаем макрос в MaxL:
create or replace macro '@XXPRIOR' 
(SINGLE) as 
'( 
  (@ISMBR(Jan) * @@1->Dec->@CURRMBRRANGE("Years", LEV, 0, -1,-1))  
    + (@ISMBR(Feb:Dec) * @PRIOR (@@1)) 
)'

Перестартовываем приложение в Essbase.

Используем макрос в calc-сриптах:
FIX(FY10, Jan:May)
 
    Acc2 = @XXPRIOR(Acc1); /* Macro */
    Acc3 = @PRIOR(Acc1);   /* Standart Function */

ENDFIX

Этот пример показывает результат работы скрипта:
Dec     Jan     Feb     Mar    Apr    May
                FY09    FY10    FY10    FY10   FY10   FY10
                ===     ===     ===     ===    ===    ===                       
Acc1            1100    1200    1000    1300   1300   1400
Acc2            #MI     1100    1200    1000   1300   1300
Acc3            #MI     #MI     1200    1000   1300   1300

Для детального изучения смотрите Technical Reference: Custom-Defined Macros

19 июл. 2010 г.

Оптимизация скриптов Essbase

Алгоритм оптимизации прост:
  • Запускаем расчет
  • Анализируем лог
  • Находим узкое место
  • Оптимизируем :)

1. Запускаем расчет.

Самый удобный лог для анализа - это лог esscmd. С его помощью и будем запускать скрипты. Не забудьте в скипте установить параметр "SET MSG SUMMARY" т.к. без него ничего интересного в логе вы не найдете.

Создаем calc-скрипт PL_Calc.csc, который необходимо анализировать:
SET MSG SUMMARY;
...
A = A + B;
...

Создаем esscmd-скрипт PL_Calc.scr:
output 1 "PL_Calc.log";
login "ess_server" "admin" "password";

updatevariable "vEntity" "ess_server" "PL" "" "EN_Russia";
updatevariable "vYear" "ess_server" "PL" "" "FY10";

select "PL" "PL";

runcalc 2 "PL_Calc";

OUTPUT 3;
exit;

Запускаем esscmd-скрипт и получаем PL_Calc.log:
esscmd PL_Calc.scr

2. Анализируем лог.

Для анализа мне понравился RightLog. Качаем и запускаем вот с такими параметрами:
RightLog.exe -i PL_Calc.log -s ; -t -d EUR -f "1012668|1012555|1012553|1012579|1003052" > PL_Calc.csv
Получили PL_Calc.csv

3. Находим узкое место.

Открываем PL_Calc.csv в Excel делаем расчетную колонку "Время исполнения" - вот и весь поиск.

4. Типовые проблемы производительности и возможные варианты решения.
Долго работает XREF - меняйте на партиции.
Долго считается формула на sparse элементе - используйте FRMLBOTTOMUP ON;
Долго работает агрегация - необходимо настраивать порядок измерений, кэши, использовать параллельные вычисления.

По настройке оптимизации предлагаю почитать "Optimizing Calc Scripts" by Edward Roske

P.S. Если необходимо просматривать информацию о кол-ве обработаных блоков
RightLog.exe -i PL_Calc.log -s ; -t -d EUR -f "1012668|1012555|1012553|1012579|1003052|Calculations:|Block Created|1012574|1017018" > PL_Calc.csv

18 июл. 2010 г.

PREVSIBLING vs CURRMBRRANGE

Хочу поделиться наблюдением.

Передо мной стояла задача создать динамическую статью Acc01_PrevYear, которая равняется статье Acc01 за прошлый год.

Вот такая формула работает 1 сек:
Acc01_PrevYear = Acc01->@PREVSIBLING(@CURRMBR("Years"))

Вот такая формула работает 0.01 сек:
Acc01_PrevYear = Acc01->@CURRMBRRANGE("Years", Lev, 0, -1, -1)

4 июл. 2010 г.

Essbase Integration Services VS Studio

В версии 11.1.1.0 появился новый продукт Essbase Studio, который пришел на замену Essbase Integration Services (EIS)

Чего пока что не может Studio 11.1.1.3:
- нельзя добавить колонку в таблицу источник, если эта таблица уже добавлена в Studio
- проблемы с загрузкой данных, если измерение создано вручную
- проблемы с cозданием drill-through отчетов для ненулевого уровня

Что понравилось:
+ удобный интерфейс
+ удобное управление подключениями
+ добавлены новые источники данных (EPM, Oracle BI)

В версии Studio 11.1.2 кое-что поправили, но с drill-through сложность так и осталась.

Выводы: до промышленной экплуатации Studio еще далеко, но знакомится с продуктом надо обязательно т.к. возможно скоро Studio заменит и EAS Console

P.S. Вот неплохой tutorial по Studio

28 июн. 2010 г.

Использование CDF (часть II)

Как передать в CDF значение переменной бизнес-правила?

К сожелению Java-класс, описаный в первой части, имеет ряд ограничений:
  • Невозможно передать значение переменной бизнес-правила
  • Нельзя использовать внутри FIX, получать код возврата

Что нужно сделать, чтобы CDF работала:
  • Настроить Essbase (см. часть I)
  • Создать и скомпилировать Java-класс
  • Настроить безопасность
  • Зарегистрировать Java-функцию в Essbase

1. Настраиваем Essbase.

см. часть I

2. Создаем и компилируем Java-класс.

2.1. Создаем файл ARBORPATH/java/udf/RunCmd.java
import java.util.*;
import java.io.*;

public class EssbaseRuRunTime {
public static void main(com.hyperion.essbase.calculator.Context ctx, String[] args)
{
int i,  n = args.length;
String Str = args[0];

for (i=1; i
Str = Str + " " + args[i];
}

try {Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(Str);
int exitVal = proc.waitFor();
System.out.println(args[0]+" ExitValue: " + exitVal);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.out.println(args[0]);
}

}
}
2.2 Компилируем класс из каталога, где он расположен
javac RunCmd.java
jar cf RunCmd.jar RunCmd.class
Примечание: компилировать версией Java, которая инсталирована с Essbase

3. Настраиваем безопасность

3.1. В файл ARBORPATH/java/udf.policy добавляем следующие строки:
grant codeBase "file:${java.home}/udf/RunCmd.jar" {
        permission java.security.AllPermission;
};

4. Регистрируем Java-функцию в Essbase

4.1. Выполняем слудующий MaxL скрипт
create function '@jRunCmd'
as 'RunCmd.jRun'
spec '@jRunCmd(arg1, arg2); @jRunCmd(arg1, @List(arg2, arg3,...));'
comment 'Execute shell command';

4.2. Перегружаем Essbase

Пример запуска CDF из бизнес-правила
Текст правила
VAR vA;
FIX(Act, BegBalance…..)
"FY10"
          (
           vA = @jRunCmd(
                          "../java/udf/scripts/alter_sub_var.sh"
                        , @LIST ("Cons_Scenario", @Name({vScenario}))
                        );      
           );
ENDFIX

Текст ALTER_SUB_VAR.SH:
./startMaxl.sh ../java/udf/scripts/alter_sub_var.mxl $1 $2

Текст ALTER_SUB_VAR.MXL:
login LOGINNAME identified by PASSWORD on SERVER;

alter system set variable $1 $2;

exit;


Полезные ресурсы
Документация Developing defined calculation functions
Блог hack4essbase.wordpress.com
Блог essbaselabs.blogspot.com