Показать сообщение отдельно
Старый 17.07.2012, 17:10   #1  
vazerdim is offline
vazerdim
Участник
 
77 / 40 (2) +++
Регистрация: 06.09.2008
Ошибки в ГФО DAX2009
Наткнулся на баг в функционале ГФО:

Класс: LedgerRRGOperationParm_RU
X++:
private void loadDimensionList(Common _record)
{
    LedgerRRGDimensionInterval_RU   dimensionInterval;
    str                             dimensionFilter;
    int                             dimensionIdx;
    ;

    select dimensionInterval
        where dimensionInterval.DimTableID == _record.TableId &&
              dimensionInterval.DimRecID   == _record.RecId;

    //if (dimensionInterval) // исправление ошибки фильтра по аналитикам
    {
        dimensionFilterMap = new Map(Types::Integer, Types::String);
    }

    while (dimensionInterval)
    {
        dimensionIdx    = Dimensions::code2ArrayIdx(dimensionInterval.DimensionCode);
        dimensionFilter = this.filterValue(dimensionInterval.FromDimNum, dimensionInterval.ToDimNum);
        if (dimensionFilterMap.exists(dimensionIdx))
        {
            dimensionFilter = dimensionFilterMap.lookup(dimensionIdx)  + #comma + dimensionFilter;
        }

        dimensionFilterMap.insert(dimensionIdx, dimensionFilter);
        next dimensionInterval;
    }
}
Если у нас есть две строки в настройке отчета, первая строка имеет фильтр по аналитикам, а вторая нет. То при формировании отчета фильтр из первой строки настройки будет действовать и на вторую.

Так как есть ещё следующий код:
X++:
if (!dimensionFilterMap)
    {
        dimensionFilterMap = _parm.dimensionFilterMap();
    }
Если у нас не инициализирован map, то мы берем предыдущий, что не верно.

Если же строки поменять местами, то результат получается верным.
Для себя решил просто убрать if. Теперь все корректно формируется.

DAX 2009 RU5
За это сообщение автора поблагодарили: mnt_dx (3).