11 сент. 2010 г.

Выгрузка/загрузка в многопользовательской среде (shell)

С какими проблемами можно столкнуться при запуске Essbase calc-скриптов при большом количестве пользователей:
  • невозможно использовать переменные подстановки (Substitution varaibles) т.к. изменение переменной одним пользователем, может отразиться в расчете другого пользователя
  • необходимо дополнительно создавать имена файлов выгрузок с уникальными именами

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

Для это нам надо создать шаблон MaxL скрипта, который будет выполнять выгрузку/загрузку и shell-скрипт, который будет создавать копию MaxL c уникальным именем, выставлять необходимые переменные и запускать его.

Шаблон MaxL-скрипта Export.mxl
login user identified by 'password' on localhost;

/* Export data from cube1 */
execute calculation '
FIX (
     "VR_Work",
     "ACT",
     @RELATIVE("&vEntity",0)
    )
    DATAEXPORT "File" " " "./export_data_&file_id.txt" "#MI";  
ENDFIX' on Test.Cube1;

/* Clear data to Cube2 */
execute calculation '
FIX (
    "ACT",
     @RELATIVE("&vEntity",0)
    )
    CLEARDATA "VR_Work";
ENDFIX' on TEST.Cube2;

/* Import data to Cube2 */
import database TEST.Cube2 data
from  data_file   "./export_data_&file_id.txt"
/*using rules_file  "some_rule_if_necessary"*/
on error write to "./export_data_&file_id.err";

exit;

Shell-скрипт Export.sh
#!/bin/bash

#Создаем переменные
R=$RANDOM
#уникальный идентификатор файлов (можно в конец добавить $R)
file_id=`date '+%Y%m%d_%H%M%S'`

#создаем Maxl-скрипт из шаблона и проставляем переменые
sed -e 's/&file_id/'${file_id}'/' ./export.mxl | sed -e 's/&vEntity/'$1'/'  > ./export_${file_id}.mxl

#запускаем MaxL
./startMax.sh ./export_${file_id}.mxl

Запускаем скрипт c параметром филиал:
./Export.sh EN_RUSSIA

У нас появятся файлы
  • Export_20110909_180650.mxl (MaxL, все переменные уже проставлены)
  • Export_20110909_180650.log
  • Export_data_20110909_180650.txt - файл с данными
Все подстановки помогает выполнить команда sed. Делает она следующее
  • открывает ./export.mxl
  • заменяет &file_id на ${file_id} (в нашем случае 20110909_180650)
  • заменяет &vEntity на $1 (в нашем случае EN_RUSSIA)
  • записывает изменения в ./export_${file_id}.mxl 

Листинг Export_20110909_180650.mxl
login user identified by 'password' on localhost;

/* Export data from cube1 */
execute calculation '
FIX (
     "VR_Work",
     "ACT",
     @RELATIVE("EN_RUSSIA",0)
    )
    DATAEXPORT "File" " " "./export_data_20110909_180650.txt" "#MI";  
ENDFIX' on Test.Cube1;

/* Clear data to Cube2 */
execute calculation '
FIX (
    "ACT",
     @RELATIVE("EN_RUSSIA",0)
    )
    CLEARDATA "VR_Work";
ENDFIX' on TEST.Cube2;

/* Import data to Cube2 */
import database TEST.Cube2 data
from  data_file   "./export_data_20110909_180650.txt"
/*using rules_file  "some_rule_if_necessary"*/
on error write to "./export_data_20110909_180650.err";

exit;

P.S. Как запустить shell-скрипт из бизнес-правила читай CDF