AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.07.2006, 14:08   #1  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
? ограничение мер в кубе OLAP
Добрый день.
Наткнулся на такое ограничение - если в определении куба указать > 10 мер, то при выполнении обработки возникает ошибка:
---------------------------
Microsoft Business Solutions-Axapta Debugger
---------------------------
Ошибка времени выполнения. : Некорректная запись в массиве.
Трассировка стека:

\Classes\OLAPCreateAmount\createAmounts - line 143
....
В итоге выяснелось, что у таблицы, где хранятся расчитанные суммы OLAPAmount есть поле-массив, имеющее тип OLAPAmountArray. А сам массив имеет всего 9 элементов Сумма 2, Сумма 3, ..., Сумма 10. + сам тип 10-й.
Таким образом, получается что куб может иметь не более 10 мер.

Кто нибудь сталкивался с такой проблемой?

заранее спасибо.
Старый 18.07.2006, 14:57   #2  
Hidden is offline
Hidden
Участник
 
199 / 15 (1) ++
Регистрация: 25.03.2004
Адрес: Moscow
Да действительно, сейчас проверил у меня тоже такая проблема проявилась.
Старый 18.07.2006, 15:23   #3  
Viknik is offline
Viknik
Участник
 
23 / 13 (1) ++
Регистрация: 26.11.2005
Добрый день.
Да действительно имеется такой ограничение. Но оно срабататывает когда хотя бы одна мера в кубе типа "AmountCur" или руками поставлена галка "Использование таблицы суммы" в "Экземлярах куба" (когда мера типа AmountCur - эта галочка проставляется автоматически и убрать ее нельзя - используется для пересчета суммы в валюте).
Здесь 2 решения:
1. Увеличить кол-во элементов (Array Elements) в EDT OLAPAmountArray до нужного количества...
2. Прежде чем увеличивать кол-во элементов, я бы на вашем месте проверил сколько на самом деле мер типа "AmountCur", и если оно меньше 10 - то можно сделать как мы, небольшую доработку:
- в методе init класса OLAPCubeMetaData вместо
PHP код:
 ...
        while 
select OLAPMeas order by measName where OLAPMeas.cubeName ==  OLAPCube.cubeName
    
{
        if (
OLAPMeas.isValid())
        {
            
n++;
            
measures[n] = conInsmeasures[n],1,OLAPMeas.measName);
            
measures[n] = conInsmeasures[n],2,OLAPMeas.measAgregate);
            
measures[n] = conInsmeasures[n],3,this.viewName(OLAPMeas.table));
            
measures[n] = conInsmeasures[n],4,OLAPMeas.field);
            
measures[n] = conInsmeasures[n],5,'');
            
measures[n] = conInsmeasures[n],6,OLAPCube.transDate);
            
measures[n] = conInsmeasures[n],7,this.currency());
            
measures[n] = conInsmeasures[n],8,OLAPMeas.amountCur);
            
measures[n] = conInsmeasures[n],9,OLAPMeas.amountMST);

            [
COLOR="DarkRed"]amountNumber++;[/COLOR]

            if (
OLAPMeas.amountCur || OLAPMeas.amountMST)
            {
  ... 
поставить
PHP код:
 ...
         while 
select OLAPMeas order by measName where OLAPMeas.cubeName ==  OLAPCube.cubeName
    
{
        if (
OLAPMeas.isValid())
        {
            
n++;
            
measures[n] = conInsmeasures[n],1,OLAPMeas.measName);
            
measures[n] = conInsmeasures[n],2,OLAPMeas.measAgregate);
            
measures[n] = conInsmeasures[n],3,this.viewName(OLAPMeas.table));
            
measures[n] = conInsmeasures[n],4,OLAPMeas.field);
            
measures[n] = conInsmeasures[n],5,'');
            
measures[n] = conInsmeasures[n],6,OLAPCube.transDate);
            
measures[n] = conInsmeasures[n],7,this.currency());
            
measures[n] = conInsmeasures[n],8,OLAPMeas.amountCur);
            
measures[n] = conInsmeasures[n],9,OLAPMeas.amountMST);

            if (
OLAPMeas.amountCur || OLAPMeas.amountMST)
            {
            [
COLOR="DarkRed"]amountNumber++;[/COLOR]
  ... 
- в методе createAmounts класса OLAPCreateAmount
вместо
PHP код:
...
             
// find the currency
        
rowCurrencyCode factTableRecord.(idxCurField);
        
// find the date
        
transDAte factTableRecord.(cubeTable.TransDateFieldId);
        
// loop over all measures
        
0;
        while 
select measTmp
        where measTmp
.cubename == cubeTable.CubeName
        
{
            [
COLOR="Red"]i++;[/COLOR]
            
// get amount
            
amount factTableRecord.(measTmp.measFieldId);

            
// if amount field
            
if ((measTmp.AmountCur == noyes::Yes) || (measTmp.AmountMST == noyes::Yes))
            {

                if (
measTmp.AmountMST == Noyes::Yes)
                {
                    
measCurrencyCode companyCurrencyCode;
                    
// translate if needed
                    
if (this.isSpecialMSTAmount(measTmp.measTableId,measTmp.measFieldId))
                    {
                        
amount this.specialMSTAmount(factTableRecordmeasTmp.measFieldId,dictTable);
                    }
                }
                if (
measTmp.AmountCur == noyes::Yes)
                {
                    
measCurrencyCode rowCurrencyCode ;
                }
                if (
measCurrencyCode != cubeInstance.currency)
                {
                    if (
cubeInstance.currency == companyCurrencyCode)
                    {
                        
amount Currency::mstAmount(amount,measCurrencyCode,transDate);
                    }
                    else
                    {
                        
amount Currency::curAmount2CurAmount(amount,measCurrencyCode,cubeinstance.currency,transDate);
                    }
                }
                }
         
olapAmount.OLAPAmount[i] = amount;
         
// end loop measures  
... 
поставить
PHP код:
 ...
        
// find the currency
        
rowCurrencyCode factTableRecord.(idxCurField);
        
// find the date
        
transDAte factTableRecord.(cubeTable.TransDateFieldId);
        
// loop over all measures
        
0;
        while 
select measTmp
        where measTmp
.cubename == cubeTable.CubeName
        
{
            
// get amount
            
amount factTableRecord.(measTmp.measFieldId);

            
// if amount field
            
if ((measTmp.AmountCur == noyes::Yes) || (measTmp.AmountMST == noyes::Yes))
            {

                if (
measTmp.AmountMST == Noyes::Yes)
                {
                    
measCurrencyCode companyCurrencyCode;
                    
// translate if needed
                    
if (this.isSpecialMSTAmount(measTmp.measTableId,measTmp.measFieldId))
                    {
                        
amount this.specialMSTAmount(factTableRecordmeasTmp.measFieldId,dictTable);
                    }
                }
                if (
measTmp.AmountCur == noyes::Yes)
                {
                    
measCurrencyCode rowCurrencyCode ;
                }
                if (
measCurrencyCode != cubeInstance.currency)
                {
                    if (
cubeInstance.currency == companyCurrencyCode)
                    {
                        
amount Currency::mstAmount(amount,measCurrencyCode,transDate);
                    }
                    else
                    {
                        
amount Currency::curAmount2CurAmount(amount,measCurrencyCode,cubeinstance.currency,transDate);
                    }
                }
                }
        [
COLOR="red"]if( cubeInstance.UseAmountTable )
                    if( (
measTmp.AmountCur == noyes::Yes) ||
                        (
measTmp.AmountMST == noyes::Yes) )
                    {    
                        
i++ ;
                        
olapAmount.OLAPAmount[i] = amount;
                    } [/
COLOR]
         
// end loop measures  
... 
Старый 18.07.2006, 15:31   #4  
Viknik is offline
Viknik
Участник
 
23 / 13 (1) ++
Регистрация: 26.11.2005
PHP код:
  Где [color="..."] ... [/color] - попытался текст выделить другим цветом... 
Старый 18.07.2006, 16:30   #5  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
короче понятно - надо програмить. Спасибо Viknik.
просто так увеличить количесво элементов в массиве не получится, там начинается другая ошибка в классе OLAPDatabaseCubeControlDSO методе processCube
(process COM объекта _cube).
А задача просто в том что бы обычный пользователь смог сам себе настраивать кубы на основании подговленных заранее запросов. но с таким ограничениеми в 10 мер это просто невозможно.
Теги
ax3.0, olap, ошибка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX UK: Repairing the AX 2009 OLAP Cubes where License/Config keys are switched off Blog bot DAX Blogs 0 03.12.2008 19:05
Почему не могут зайти пользователи Excel 2003 на OLAP 2005? mazzy DAX: Администрирование 4 30.08.2007 10:35
ALEG: Olap. Что нам стоит куб настроить Blog bot DAX Blogs 4 05.12.2006 17:16
Опять про OLAP и Enum mit DAX: Программирование 6 05.04.2004 11:06
Проблема с подключением к OLAP серверу Andrew Besedin DAX: Администрирование 0 20.03.2002 12:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:09.