portando o SSAS multidimensional para o ICCube. Escopo () equivalente? outras lacunas / questões?

Alguém já portou um cubo multidimensional ssas complexo para o iccube? e tem algum conselho para oferecer sobre as lições aprendidas / lacunas entre as duas ferramentas, etc?

O principal que eu posso ver é scope (). Qual é o equivalente no iccube? instruções if / case aninhadas?

Eu tenho uma lista aqui. Algo mais?

        function        |          SSAS          |         iccube     
------------------------|------------------------|------------------------
multi threaded calcs    | no                     | yes
------------------------|------------------------|------------------------
fix/scope block code    | SCOPE()                | ??
------------------------|------------------------|------------------------
custom functions        | clr.net but it's slow  | mdx+
------------------------|------------------------|------------------------
generic date utility    | third-party code that  | ??
dimensions (eg generic  | uses scope() eg        |
prior period/prior      | datetool               | 
corresponding period)   |                        |
------------------------|------------------------|------------------------

Temos um cubo pesado de cálculo de script mdx, e a natureza de thread único do mecanismo de cálculo do SSAS é um gargalo real. Nenhuma das outras ferramentas olap que examinamos foi rápida o suficiente ou tinha uma linguagem suficientemente rica

Usamos dimensões de utilitário desconectadas para impulsionar a funcionalidade e precisamos ter uma dimensão de utilitário de data (usamos uma versão destehttp://sqlmag.com/sql-server-analysis-services/optimizing-time-based-calculations-ssas), use o AXIS () extensivamente e tenha um produto de soma recursiva entre descendentes de uma hierarquia para uma medida não aditiva.

Nosso cubo não é um cubo de relatório de autoatendimento. É um mecanismo de cálculo multidimensional para o nosso aplicativo com um esquema genérico fixo

Atualização 1: Um exemplo mais simples de como usamos o escopo. ic, Você mencionou soluções alternativas 'robustas'. O que eles seriam para código como este?

// Assumes the date utility dim has been setup as with the priorperiod function as [Dim Date Calculations].[Date Calculations].[Prior Period]

// DimBenchmark is a single attribute disconnected utility dimension. The initial/default value is DimBenchmark.Benchmark.None ie do nothing. The remainder are dynamically set based on code. hardcoded below for simplicity
Scope(DimBenchmark.BenchMark.PriorPeriod);
    THIS = [Dim Date Calculations].[Date Calculations].[Prior Period]; // assign the value of some physical and utility dim members to new benchmark attributes. Allows us to only refer to dimbenchmark in subsequent code, irrespective of number of benchmarks or the src dimension.attribute
END SCOPE;

SCOPE(DimBenchmark.BenchMark.Budget);
    THIS = DimScenario.Scenario.Budget; //we also have a budget
END SCOPE;
.... // any number of other benchmarks

Create measure currentcube.measures.ComplexCalc as NULL;

SCOPE (measures.ComplexCalc); // this code will only change how complex calc behaves
    SCOPE (DimBenchmark.Benchmark.All - DimBenchmark.Benchmark.None); // this will only change the ComplexCalc when the active benchmark selection is not "none"
        this= (some measure,Complex subcube etc);
    End Scope;
End Scope;

o benefício disso é que complexcalc é nulo por padrão. ele só obtém um valor quando atende a condições específicas. a principal razão para usar o escopo é a velocidade. Muito mais rápido que os blocos if / case (e o entendimento mais simples), não preciso definir explicitamente quais benchmarks são válidos, apenas qual benchmark não é.

e abaixo está como implementamos a dimensão do utilitário de data. Ele nos permite fazer algo como (medida, [Dim Data Calculations]. [Date Calculations]. [Period Period]) e fornece o período de medida anterior para o membro atual da dim date (o mês remonta a 1 mês, trimestre remonta 3 meses, semestre remonta 6 meses, ano remonta 12 meses). É muito limpo, preciso e muito rápido.

-- Fiscal Month
Scope( [Dim Date].[Month Key].[Month Key].members);        
    -- Prior Period
    Scope([Dim Date Calculations].[Date Calculations].[Prior Period]);        
        this  =    
        ( [Dim Date].[Month Key].CurrentMember.PrevMember
         ,[Dim Date Calculations].[Date Calculations].[Current]
        );        
    END scope;                                       
End Scope;        


-- Fiscal Quarter
Scope( [Dim Date].[Fiscal Quarter].[Fiscal Quarter].members);        
    -- Prior Period
    SCOPE( [Dim Date Calculations].[Date Calculations].[Prior Period]);        
        THIS = ( [Dim Date].[Fiscal Quarter].CurrentMember.PrevMember
         ,[Dim Date Calculations].[Date Calculations].[Current]
        );        
    END SCOPE;                      
END SCOPE;        

-- Fiscal Semester
Scope( [Dim Date].[Fiscal Semester].[Fiscal Semester].members);        
    -- Prior Period
    SCOPE( [Dim Date Calculations].[Date Calculations].[Prior Period]);        
        THIS = ( [Dim Date].[Fiscal Semester].CurrentMember.PrevMember
         ,[Dim Date Calculations].[Date Calculations].[Current]
        );        
    END SCOPE;                                 
End Scope;        

-- Fiscal Year
Scope( [Dim Date].[Fiscal Year].[Fiscal Year].members);                     
    -- Prior Period
    SCOPE( [Dim Date Calculations].[Date Calculations].[Prior Period]);        
        THIS =    
        ( [Dim Date].[Fiscal Year].CurrentMember.PrevMember
         ,[Dim Date Calculations].[Date Calculations].[Current]
        );        
    END SCOPE;                  
End Scope;

questionAnswers(1)

yourAnswerToTheQuestion