Показаны сообщения с ярлыком Формы. Показать все сообщения
Показаны сообщения с ярлыком Формы. Показать все сообщения

28 августа 2012

SQL запросы для получения информации о формах в Planning

Можно потратить много времени, чтобы получить информацию о формах данных в Planning: папка формы, бизнес-правила, меню и др. Можно упростить это процесс. Подробнее

26 марта 2012

Скользкие формы Planning

Встала передо мной задача: построить формы в Planning таким образом, чтобы на форме был текущий месяц (Period Dim) и пару месяцев назад. Естественно, каждый раз перестраивать ручками формы лень, а есть ситуации, когда нужно "заглянуть" на 1-2 мес в прошлый год. Вот и получаются у нас "скользящие" формы.
К сожалению, сами формы данных, в отличие от отчетов FinReporting, построить с использование ссылающихся функций (вроде Prior) нельзя. Ответ нашелся на форуме: https://forums.oracle.com/forums/thread.jspa?messageID=9454665 Да, и так понятно, что это единственный вариант - через переменные подстановки в Essbase. Прекрасно, приступим к реализации:
  1. Определяемся с набором переменных. Для каждого "специфического" периода может быть нужен свой год. Например, в моем случае: в январе текущего понадобятся еще ноябрь и декабрь прошлого года, а в феврале - только декабрь прошлого года и январь нынешнего:
    • CurrYearFor - текущий год
    • CurrPerFor - текущий период для Прогнозирования
    • Prev1PerFormFor - предыдущий период
    • Prev1YearFormFor - год для предыдущего периода (Prev1PerFormFor)
    • Prev2PerFormFor - пред-пердыдущий период
    • Prev2YearFormFor - год для пред-предыдущего периода (Prev2PerFormFor)
  2. Создаем эти переменные подстановки в кубе приложения Essbase. Либо ручками (операция по сути - разовая), либо MaxL-скриптиком с использованием команд на нужной БД (кубе) Essbase:
    alter database sample.basic add variable CurMnth 'Jan';
    таким синтаксисом мы создаем переменную для куба приложения. Есть еще варианты для одного приложения:

    alter application sample add variable CurMnth 'Jan';

    или инстанса Essbase:
    alter system add variable CurMnth 'Jan';
  3. Настраиваем формы данных на использование этих переменных. Здесь придется отказаться от выбора года и периода в срезе, потому что придется эти измерения "зашивать" в таблицы данных.
  4. Готовим скрипт (bat для Windows env.) для обновления переменных по мере необходимости:
    @echo off
    setlocal
    cls

    Rem Set Variables
    SET ESSSETENV=F:\Oracle\Middleware\user_projects\epmsystem1\EssbaseServer\essbaseserver1\bin\setEssbaseEnv.bat
    SET SERVER=epm_server_name
    SET USER=ess_admin
    SET PASSWORD=ess_password
    Ниже укзаываются Public Key for Encryption и Private Key for Decryption. Это необходимо для шифрования учетных записей пользователя для исполнения MaxL скрипта. Подробности
    SET PKE=
    SET PKD=
    SET App=AppName
    SET Cube=PlanName
    SET OuputMaxl=EssVarsUpdate.maxl
    В EssVarsUpdate_AutoExec.log будем сохранять лог основных операций, а в %LogDate%_EssVarsUpdate.log исполняемый MaxL.
    SET EXECLOG=EssVarsGenerator_Auto.log
    SET CurrDir=%CD%
    SET LogSubDir=%CurrDir%\LOGS
    SET CurrYear=%date:~12%
    SET /A PrevYear=%CurrYear% - 1
    SET Day=%date:~7,2%
    SET Month=%date:~4,2%
    SET LogDate=%CurrYear%-%Month%-%Day%
    if '%Month:~0,1%'=='0' set Month=%Month:~1,1%

    Не забудьте проверить значения переменных CurrYear, Month. Зависят от используемой на сервере локали.
    Rem LOG
    echo Генератор переменных БД Essbase по Прогозу для построения "скользящих" форм >> %LogSubDir%\%EXECLOG%
    echo Started: %date% @ %time% >> %LogSubDir%\%EXECLOG%
    echo Params: CurrMonth:%Month%; CurrYear:%CurrYear%; PrevYear:%PrevYear% >> %LogSubDir%\%EXECLOG%

    Rem Checkin' Input Parameter
    IF %Month% LSS 1 GOTO :error
    IF %Month% GTR 12 GOTO :error 
    Ниже - список базовых элементов измерения Period
    Rem Input Parameter Converter
    IF %Month%==1 SET TempMonth='January'
    IF %Month%==2 SET TempMonth='February'
    IF %Month%==3 SET TempMonth='March'
    IF %Month%==4 SET TempMonth='April'
    IF %Month%==5 SET TempMonth='May'
    IF %Month%==6 SET TempMonth='June'
    IF %Month%==7 SET TempMonth='July'
    IF %Month%==8 SET TempMonth='August'
    IF %Month%==9 SET TempMonth='September'
    IF %Month%==10 SET TempMonth='October'
    IF %Month%==11 SET TempMonth='November'
    IF %Month%==12 SET TempMonth='December'

    Rem Create MAXL script
    echo spool on to '%LogSubDir%\%LogDate%_EssVarsUpdate.log'; > %CurrDir%\%OuputMaxl%
    echo login '%USER%' '%PASSWORD%' on '%SERVER%'; >> %CurrDir%\%OuputMaxl%

    Rem Set Current Period and Year, Start Period for Forecast calculations
    echo alter database '%App%'.'%Cube%' set variable 'CurrYearFor' 'FY%CurrYear%'; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'CurrPerFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'StartPerFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%

    Rem Set Previous Period and Year
    SET /A Mon = 100%Month% %% 100
    SET /A PriorMonth=%Mon% - 1
    SET Prev1YearFormFor='FY%CurrYear%'
    IF %PriorMonth% == 0 SET Prev1YearFormFor='FY%PrevYear%'
    IF %PriorMonth% == 0 SET PriorMonth=12
    IF %PriorMonth%==1 SET TempMonth='January'
    IF %PriorMonth%==2 SET TempMonth='February'
    IF %PriorMonth%==3 SET TempMonth='March'
    IF %PriorMonth%==4 SET TempMonth='April'
    IF %PriorMonth%==5 SET TempMonth='May'
    IF %PriorMonth%==6 SET TempMonth='June'
    IF %PriorMonth%==7 SET TempMonth='July'
    IF %PriorMonth%==8 SET TempMonth='August'
    IF %PriorMonth%==9 SET TempMonth='September'
    IF %PriorMonth%==10 SET TempMonth='October'
    IF %PriorMonth%==11 SET TempMonth='November'
    IF %PriorMonth%==12 SET TempMonth='December'
    echo alter database '%App%'.'%Cube%' set variable 'Prev1PerFormFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'Prev1YearFormFor' %Prev1YearFormFor%; >> %CurrDir%\%OuputMaxl%

    Rem Set Pre-Previous Period and Year
    SET /A PriorMonth=%Mon% - 2
    SET Prev2YearFormFor='FY%CurrYear%'
    IF %PriorMonth% == 0 SET Prev2YearFormFor='FY%PrevYear%'
    IF %PriorMonth% == -1 SET Prev2YearFormFor='FY%PrevYear%'
    IF %PriorMonth% == 0 SET PriorMonth=12
    IF %PriorMonth% == -1 SET PriorMonth=11
    IF %PriorMonth%==1 SET TempMonth='January'
    IF %PriorMonth%==2 SET TempMonth='February'
    IF %PriorMonth%==3 SET TempMonth='March'
    IF %PriorMonth%==4 SET TempMonth='April'
    IF %PriorMonth%==5 SET TempMonth='May'
    IF %PriorMonth%==6 SET TempMonth='June'
    IF %PriorMonth%==7 SET TempMonth='July'
    IF %PriorMonth%==8 SET TempMonth='August'
    IF %PriorMonth%==9 SET TempMonth='September'
    IF %PriorMonth%==10 SET TempMonth='October'
    IF %PriorMonth%==11 SET TempMonth='November'
    IF %PriorMonth%==12 SET TempMonth='December'
    echo alter database '%App%'.'%Cube%' set variable 'Prev2PerFormFor' %TempMonth%; >> %CurrDir%\%OuputMaxl%
    echo alter database '%App%'.'%Cube%' set variable 'Prev2YearFormFor' %Prev2YearFormFor%; >> %CurrDir%\%OuputMaxl%
    echo logout; >> %CurrDir%\%OuputMaxl%
    echo spool off; >> %CurrDir%\%OuputMaxl%
    echo exit; >> %CurrDir%\%OuputMaxl%

    Rem Set Essbase Env
    call %ESSSETENV%
    Rem Encrypt MaxL Script
    essmsh -E %CurrDir%\%OuputMaxl% %PKE% > nul
    Rem Del Original MaxL Script
    del %CurrDir%\%OuputMaxl% >> %LogSubDir%\%EXECLOG%
    Rem Run Encrypted MaxL Script
    essmsh -D %CurrDir%\%OuputMaxl%s %PKD% > nul
    Rem Del Encrypted MaxL Script
    del %CurrDir%\%OuputMaxl%s >> %LogSubDir%\%EXECLOG%

    echo MaxL log U can find here: %LogSubDir%\%LogDate%_EssVarsUpdate.log >> %LogSubDir%\%EXECLOG%
    GOTO :fine

    :error
    set ERRORLEVEL=-1
    echo Wrong input parameter '%Month%' (Num. of month) :( >> %LogSubDir%\%EXECLOG%
    echo Input value must be in range [1..12] >> %LogSubDir%\%EXECLOG%
    GOTO :end

    :fine
    set ERRORLEVEL=0
    echo Essbase Variables has been updated successfully =) >> %LogSubDir%\%EXECLOG%
    GOTO :end

    :end
    echo Finished: %date% @ %time% >> %LogSubDir%\%EXECLOG%
    echo ... >> %LogSubDir%\%EXECLOG%
  5. Автоматизируем запуск этого файла, вставляя задачу в Task Scheduler. Сначала я готовил батничек для ручного режима с менюшкой для ответственного пользователя, но пришел к выводу, что могу автоматизировать процесс такого обновления переменных: я знаю, что пользователи полезут в систему к 1-му числу, значит числа 25 могу смело обновлять переменные. 
UPD: Макс, спасибо за помощь в вопросах корректного запуска essmsh и шифрования учетных данных!

14 сентября 2010

Поменяем по-быстрому?!

Привет,

Работая с Hyperion Planning 3.5 столкнулся с банальнейшей на первый взгляд задачей – массово заменить в формах некоторые элементы. Проблемы:
1. При выгрузке форм через FormDefUtil оказалось, что 3.5 не умеет выгружать переменные подстановки. Вместо таких элементов подставляются верхние элементы измерений. Никак не лечится для версии 3.x. Можно заменить на нужные элементы и, заранее создав отдельную папку форм в приложении Planning, массово изменить расположение форм на эту папку.
2. Вместо элементов измерений из Point of View подставляются алиасы верхних элементов измерений. Это лечится патчем Planning 3.5.1.8 и выше.
3. Результаты выгрузки – файлы XML. Но при открытии в умном текстовом редакторе они определяются в кодировке ANSI/Win. Хотя сам формат файла XML UTF-8. Вероятно это проблема того, что я использую Windows c дефолтовой страницей ANSI. После преобразований в редакторе (Notepad++) массово перекодировать файлы не получилось. Лечится использованием портированой на win-платформу утилитой iconv. Для ее использования нужно скачать саму библиотеку iconv и среду исполнения gettext-runtime.

Ниже приведен простейший пример использования для группы файлов.
Чтобы узнать полный список кодировок/их внутренние наименования, наберите:
iconv.exe -l


1251_utf8.cmd (пакетная обработка 1251->UTF8)

for %%i in (*.*); do f:\iconv\bin\iconv.exe -f cp1251 -t utf-8 "%%i" >tmp && move /y tmp "%%i"

Запуск (batch для всех файлов xml)
rem - в папку с формами
cd f:\iconv\forms
rem - обработка
f:\iconv\cp1251_utf8.cmd *.xml

Кроме того, для ускорения процесса замен рекомендую использовать on-line сервисные редакторы RegEx. Например: http://gskinner.com/

22 сентября 2009

Создание динамических переменных для использования на форме

Создание динамических переменных для использования на форме Oracle EPM System - Planning, например для выбора части продукции (ТМЦ) из полного ее списка. Удобно использовать для больших справочников, когда на форме хотелось бы отображать только их часть. Работает в версиях 9.3, 11.1. В таком случае, пользователь сам управляет набором элементов измерения необходимым в данный момент.
Что нужно сделать:
  1. Создать переменную: Administration -> Manage User Variables.
  2. Указать ее использование для Planning: File -> Preferences -> Planning -> User Variable Options и задать созданной в п.1 переменной какой-нибудь (верхний) элемент.
  3. В настройках формы для табличного измерения, к которому привязана переменная в п.1 в поле выбора элементов выбрать использование элемента-переменной (например, IDescandants(&Var)).
  4. В настройках формы на вкладке внетабличных элементов разрешить использование динамических переменных (Enable Dynamic User Variables) и выбрать для использования созданную переменную в п.1.
Таким образом, на форме во внетабличной части формы появится элемент, ткнув мышкой на который, можно задавать значение переменной. И в таблице будет отображаться только потомки, включая сам выбранный элемент (результат работы функции из п.3).
Понятно, что настраивает это администратор. Но при входе в Систему пользователю необходимо установить начальное значение этой переменной (п.2), иначе при входе на форму, на которой сделана такая "хитрость", он получит ошибку. Для ее устранения и необходимо задать значение созданной переменной индивидуально каждому пользователю.