|
23.06.2009, 12:08 | #1 |
Участник
|
OLAP: проблема с программным процессингом измерений SSAS 2005
Коллеги, необходима ваша помощь в решении проблемы - при процессинге куба процессинг измерений не производится, если я не ошибаюсь
Исходные данные: SSAS = 2005 DataSource = Oracle 10 Настроен reference на Microsoft.AnalysisServices.dll Цель: для определенного куба программно запроцессить все его измерения Ограничение: 1) по возможности, обойтись без XMLA, Command и т.д. 2) пока не предлагать пересоздание измерений Проблема: Cтрока процессинга измерения приводит к исключению: cubeDim.Process( Microsoft.AnalysisServices.ProcessType::ProcessUpdate ); //Эта строка приводит к исключению. Причем, метод cubeDim.Process() пробовал использовать с различными параметрами ProcessType, так и без них - результат одинаково плачевный. X++: void processCubeDimensions() { Microsoft.AnalysisServices.Server svr ; Microsoft.AnalysisServices.DatabaseCollection dbc; Microsoft.AnalysisServices.Database db ; Microsoft.AnalysisServices.DimensionCollection dimCollection ; Microsoft.AnalysisServices.Dimension dim ; Microsoft.AnalysisServices.DataSourceCollection dsc; Microsoft.AnalysisServices.DataSource ds; Microsoft.AnalysisServices.CubeCollection cubeCollection; Microsoft.AnalysisServices.Cube maCube; Microsoft.AnalysisServices.CubeDimensionCollection cubeDimCollection; Microsoft.AnalysisServices.Dimension cubeDim; System.Collections.IEnumerator ie; ; try { svr = new Microsoft.AnalysisServices.Server(); svr. Connect("Srv106"); svr.BeginTransaction(); if (svr !=null && svr.get_Connected()) { dbc = svr.get_Databases(); if (dbc) { db = dbc.Find("Axapta BAS dat"); dimCollection = db.get_Dimensions(); } } dsc = db.get_DataSources(); ds = dsc.FindByName("TestOLAPFunc"); cubeCollection = db.get_Cubes(); maCube = cubeCollection. FindByName("TestOLAPFunc"); cubeDimCollection = maCube.get_Dimensions(); ie = cubeDimCollection.GetEnumerator(); while (ie.MoveNext()) { cubeDim = ie.get_Current(); info(cubeDim.get_Name()); cubeDim.Process( Microsoft.AnalysisServices.ProcessType::ProcessUpdate ); svr.CommitTransaction(); } } catch { svr.RollbackTransaction(); } } Инициализация всех объектов в коде происходит без ошибок. Исключение возникает только при попытка запроцессить измерение. Думал, что проблема в правах доступа, но пролистав роли X++: rc = svr.get_Roles();
ie = rc.GetEnumerator();
while (ie.MoveNext())
{
r = ie.get_Current();
info(r.get_Name());
} получил Administrators Обновление измерений через интерфейс SQL BI Dev Studio производится без проблем. |
|
23.06.2009, 12:27 | #2 |
Участник
|
В цикле while() стоит svr.CommitTransaction(), но нет вызова BeginTransaction() после этого.
Может, в первый раз выполняется, а следующие итерации уже вылетаюти из-за транзакции?
__________________
Axapta v.3.0 sp5 kr2 |
|
23.06.2009, 12:33 | #3 |
Участник
|
Хм, поспешил и ошибся при форматировании кода
- в оригинале так : X++: try { svr.BeginTransaction(); // ................... while (ie.MoveNext()) { cubeDim = ie.get_Current(); info(cubeDim.get_Name()); cubeDim.Process( Microsoft.AnalysisServices.ProcessType::ProcessUpdate ); } svr.CommitTransaction(); } catch { svr.RollbackTransaction(); } |
|
23.06.2009, 12:51 | #4 |
Участник
|
Немного переписал cacth для работы с CLR-исключениями :
X++: System.Exception ex; str excMsg; //............................................................. atch (Exception::CLRError) { ex = ClrInterop::getLastException(); if (ex) { excMsg = ex.get_Message(); info(excMsg); } svr.RollbackTransaction(); } Process is not a member of CubeDimension Странно, а я ожидал объекты класса Dimension а не CubeDimension! |
|
23.06.2009, 13:01 | #5 |
Участник
|
Вот так код заработал:
X++: void CopyOfprocessCubeDimensions() { Microsoft.AnalysisServices.Server svr ; Microsoft.AnalysisServices.DatabaseCollection dbc; Microsoft.AnalysisServices.Database db ; Microsoft.AnalysisServices.DimensionCollection dimCollection ; Microsoft.AnalysisServices.Dimension dim ; Microsoft.AnalysisServices.DataSourceCollection dsc; Microsoft.AnalysisServices.DataSource ds; Microsoft.AnalysisServices.CubeCollection cubeCollection; Microsoft.AnalysisServices.Cube maCube; Microsoft.AnalysisServices.CubeDimensionCollection cubeDimCollection; Microsoft.AnalysisServices.CubeDimension cubeDim; System.Collections.IEnumerator ie; System.Exception ex; str excMsg; ; try { svr = new Microsoft.AnalysisServices.Server(); svr. Connect("Srv106"); svr.BeginTransaction(); if (svr !=null && svr.get_Connected()) { dbc = svr.get_Databases(); if (dbc) { db = dbc.Find("Axapta BAS dat"); dimCollection = db.get_Dimensions(); } } dsc = db.get_DataSources(); ds = dsc.FindByName("TestOLAPFunc"); cubeCollection = db.get_Cubes(); maCube = cubeCollection. FindByName("TestOLAPFunc"); cubeDimCollection = maCube.get_Dimensions(); ie = cubeDimCollection.GetEnumerator(); while (ie.MoveNext()) { cubeDim = ie.get_Current(); dim = cubeDim.get_Dimension(); dim.Process( Microsoft.AnalysisServices.ProcessType::ProcessUpdate ); } svr.CommitTransaction(); } catch (Exception::CLRError) { ex = ClrInterop::getLastException(); if (ex) { excMsg = ex.get_Message(); info(excMsg); } svr.RollbackTransaction(); } } |
|
23.06.2009, 14:44 | #6 |
Модератор
|
Если нет предубеждений к использованию SSIS, можно адаптировать этот package
Я так и сделал Но конечно гораздо кошернее будет, если заработает непосредственно из DAX
__________________
-ТСЯ или -ТЬСЯ ? |
|
23.06.2009, 16:40 | #7 |
Участник
|
Цитата:
Сообщение от Vadik
Если нет предубеждений к использованию SSIS, можно адаптировать этот package
Я так и сделал Но конечно гораздо кошернее будет, если заработает непосредственно из DAX Прикольно - пересчитывается и измерения и куб. |
|