2013-12-02 3 views
0

Я хотел бы найти количество дней от currentmember от иерархии [Date - Calendar Month].Найти количество дней в месяце текущего участника

Это моя попытка - мой пользовательский мер NumDaysInMonth не работает в течение текущего месяца - см. Экран-печать - поскольку он просто подсчитывает количество прошедших дней. У меня есть ощущение, что функция CLOSINGPERIOD может помочь, но не знаете, как использовать его:

WITH  
MEMBER [Measures].[NumDaysInMonth] AS 
    COUNT(
     DESCENDANTS(
      [Date].[Date - Calendar Month].CURRENTMEMBER.PARENT, 
      [Date].[Date - Calendar Month].[Calendar Day] 
     ) 
    ) 
MEMBER [Measures].[LastDay] as 
    CLOSINGPERIOD(
     [Date].[Date - Calendar Month].[Calendar Day], 
     [Date].[Date - Calendar Month].CURRENTMEMBER 
     ) 
SELECT 
    NON EMPTY 
     TAIL(
     [Date].[Date - Calendar Month].[Calendar Day], 
     15) 
    ON ROWS, 
    NON EMPTY 
    { 
     [Measures].[NumDaysInMonth], 
     [Measures].[LastDay] 
    } 
    ON COLUMNS 
FROM [ourCube] 

enter image description here


EDIT

Я создал эту уродливую функцию VBA решение - это должно быть возможно избежать этого?

WITH  
MEMBER [Measures].[NumDaysInMonth] AS 
    COUNT(
     DESCENDANTS(
      [Date].[Date - Calendar Month].CURRENTMEMBER.PARENT, 
      [Date].[Date - Calendar Month].[Calendar Day] 
     ) 
    ) 
MEMBER [Measures].[LastDay] as 
    DATEPART(
     "D", 
     DATEADD(
      "M", 
      1, 
      CDATE(
       CSTR(vba!Month([Date].[Date - Calendar Month].CURRENTMEMBER.name)) 
       +"-01-" 
       +CSTR(vba!Year([Date].[Date - Calendar Month].CURRENTMEMBER.name)) 
       ) 
      )-1 
     ) 
SELECT 
    NON EMPTY 
     TAIL(
     [Date].[Date - Calendar Month].[Calendar Day], 
     15) 
    ON ROWS, 
    NON EMPTY 
    { 
     [Measures].[NumDaysInMonth], 
     [Measures].[LastDay] 
    } 
    ON COLUMNS 
FROM [ourCube] 

ответ

1

Если у вас нет всех дней месяца в вашем кубе, то решение, подобное вашему вычислению VBA, будет способом. MDX не имеет собственной логики расчета даты, встроенной для любых дат, не входящих в куб. Он может использовать только те элементы, которые уже доступны в кубе. Другим способом было бы загрузить все куски месяца - даже в будущем - в куб. Но это может смутить пользователей. И, конечно же, вы можете рассчитать последний день месяца при загрузке куба в DSV или таблице/представлении, которое вы используете для загрузки вашего измерения времени. Затем вы добавите свою таблицу измерения времени в качестве другой группы мер, содержащей эту меру, которая не будет использовать sum, но e. г. max как функция агрегации.

В стороне: Ваше решение будет работать, только если вы уверены, что CurrentMember - это день, а не месяц или год. Вы могли бы улучшить, что с помощью

IIF(
[Date].[Date - Calendar Month].CurrentMember.Level IS [Date].[Date - Calendar Month].[Calendar Day], 
<your calculation>, 
NULL 
) 

или все, что вы хотите использовать в случае, если что-то не день является CurrentMember.

+0

+1 прекрасное дополнение Frank '.Level IS' – whytheq

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