2015-11-12 1 views
0

У меня есть два временных измерения, период производства и отчетный период и мера, которую я хочу объединить с любым измерением, но не с обоими, когда пользователи запрашивают куб от excel. Для этого я создал меру флага, чтобы проверить, если оба измерения используютсяИзменение контекста с помощью Subselect MDX из клиента Excel

CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS 
    IIF (
     [DIM Accounting Period].[Accounting Period Hierarchy].CURRENTMEMBER.level.ordinal <> 0 and 
      [DIM Production Period].[Production Month Hierarchy].currentmember.level.ordinal = 0 , 
     1, 
IIF ([DIM Production Period].[Production Month Hierarchy].currentmember.level.ordinal <> 0 and 
     [DIM Accounting Period].[Accounting Period Hierarchy].currentmember.level.ordinal = 0 , 
     2, 
     3 
    ) 
), VISIBLE =0; 

Затем я использую этот флаг, чтобы создать свою меру в качестве такого

CREATE MEMBER CURRENTCUBE.[Measures].[Sales/day] AS 

    IIF([Measures].[AcctProdFlag] = 1 , 
     ([Measures].[Sales]/[Measures].[Accounting Period Day Count]), 
    IIF([Measures].[AcctProdFlag] = 2, 
     ([Measures].[Sales]/[Measures].[Production Period Day Count]), 
     "NA")), 
VISIBLE = 1, DISPLAY_FOLDER = 'Sales\Daily' , FORMAT_STRING = "#,###"; 

Когда я использую этот запрос от студии управления, она работает и возвращает «NA», как и ожидалось, поскольку оба измерения используются

SELECT {[Measures].[Sales/day]} ON COLUMNS , 
     [DIM Production Period].[Production Month].MEMBERS ON ROWS 
FROM [My Cube] 
WHERE {[DIM Accounting Period].[Accounting Year].[2014], 
     [DIM Accounting Period].[Accounting Year].[2015]}; 

Но когда я добавляю учет год для фильтрации в Excel и добавить период производства в строках, мера шоу (он не должен соответствовать логике), когда я выбираю несколько отчетных лет, но показывает «NA» (как ожидалось), когда я выбираю один отчетный год. Оказывается, что при выборе нескольких лет, первенствует отправить следующий запрос к SSAS, заставляя его потерять контексте

SELECT {[Measures].[Sales/day]} ON COLUMNS , 
     [DIM Production Period].[Production Month].MEMBERS ON ROWS 
FROM (SELECT (
       {[DIM Accounting Period].[Accounting Year].[2014],[DIM Accounting Period].[Accounting Year].[2015]} 
      ) ON COLUMNS 
     FROM [My Cube] 
    ) 

Что я могу сделать, чтобы это исправить ?. Я использую SSAS для SQL Server 2008 R2 и Excel 2013.

ответ

1

Поэтому я решил сделать следующее, чтобы решить проблему. Я создал две меры как NULL в представлении источника данных и вызвал их; [Measures].[Prod Months Used] и [Measures].[Acct Months Used] Я также создал расчетных членов для подсчета всех производственных месяцев и всех отчетных месяцев. Те работал такой - Эта мера создана для подсчета количества производственных месяцев в кубе

CREATE MEMBER CURRENTCUBE.[Measures].[AllProdMonths] AS 

    SUM(
     DESCENDANTS(
        [DIM Production Period].[Production Month Hierarchy].[All], 
        [DIM Production Period].[Production Month Hierarchy].[Production Month], SELF 
        ) 
     , 1 
     ), VISIBLE=0 ; 

-- This measure is created to count the number of accounting months in the cube 
CREATE MEMBER CURRENTCUBE.[Measures].[AllAcctMonths] AS 

    SUM(
     DESCENDANTS(
        [DIM Accounting Period].[Accounting Period Hierarchy].[All], 
        [DIM Accounting Period].[Accounting Period Hierarchy].[Accounting Month], SELF 
        ) 
     , 1 
     ), VISIBLE =0; 

Наконец, чтобы подсчитать количество используемых бухгалтерских месяцев и производственных месяцев я сделал следующее:

-- This measure is scoped to count the number of used Production months in excel (including filters) 
-- It does that by overwritting all values except the All member. 
SCOPE (
      ([Measures].[Prod Months Used], 
      [DIM Production Period].[Production Month Hierarchy].[Production Month].MEMBERS) 
     ); 
SCOPE DESCENDANTS(
        [DIM Production Period].[Production Month Hierarchy].[All],, AFTER 
       ); 

     THIS = 1; 
      END SCOPE; 
END SCOPE; 



-- This measure is scoped to count the number of used Accounting months in excel (including filters) 
-- It does that by overwritting all values except the All member. 
SCOPE (
      ([Measures].[Acct Months Used], 
      [DIM Accounting Period].[Accounting Period Hierarchy].[Accounting Month].MEMBERS) 
     ); 
SCOPE DESCENDANTS(
        [DIM Accounting Period].[Accounting Period Hierarchy].[All],, AFTER 
       ); 

     THIS = 1; 
      END SCOPE; 
END SCOPE; 

и мой флаг будет оцениваться в соответствии со следующим выражением:

CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS 

    IIF (
      [Measures].[Acct Months Used] < [Measures].[AllAcctMonths] AND 
      [Measures].[Prod Months Used] = [Measures].[AllProdMonths], 
     1, 
IIF ([Measures].[Acct Months Used] = [Measures].[AllAcctMonths] AND 
      [Measures].[Prod Months Used] < [Measures].[AllProdMonths] , 
     2, 
     3 
    ) 
), VISIBLE =0; 

Это решение прекрасно работает и производительность в реальном Хорошо.

2

Один из способов сделать это динамический набор именованных, как описано в этом post, в разделе «Использование динамических наборов для определения подселектов».

Другой способ - создать группу мер на вершине DimAccountingPeriod, подключенную только к одному измерению, и построить меру подсчета. Затем, чтобы проверить, если нет фильтров на Dim Accounting Период:

IIf(
[Measures].[Accounting Period Count] = ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) 
,1 
,0 
) 

Для дальнейшего расширения того, как вы будете использовать, что:

CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS 
    IIF (
     [Measures].[Accounting Period Count] < ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) and 
      [Measures].[Production Period Count] = ([Measures].[Production Period Count], [DIM Production Period].[Production Month Hierarchy].[All]) , 
     1, 
IIF ([Measures].[Production Period Count] < ([Measures].[Production Period Count], [DIM Production Period].[Production Month Hierarchy].[All]) and 
     [Measures].[Accounting Period Count] = ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) , 
     2, 
     3 
    ) 
), VISIBLE =0; 

Вы можете попробовать динамический множественный подход, но меры приближения выполнить Лучший.

+0

Спасибо @GregGalloway, я испытываю искушение попробовать второе решение, но мне не кажется, что синтаксис верен. Выражаемое выражение всегда будет иметь значение true. Это вне контекста того, что было выбрано. Не могли бы вы подробнее рассказать о том, как выглядит выражение? – BICube

+0

Кроме того, я попробовал решение динамического набора, и оно не сработало. – BICube

+0

@Ala Я отредактировал свой ответ, чтобы сделать его более ясным. – GregGalloway

Смежные вопросы