IcCube — получение вчерашнего члена в запросе MDX

У меня есть измерение даты, выглядящее как [date].[date].[day].[yyyy-MM-dd], и я хотел бы получить элемент, представляющий вчерашний день, т.е. [date].[date].[day].[2016-07-27]. Как я могу это сделать.

В некоторых тредах по MDX, но не конкретно по IcCube, написано так:
1. STRTOMEMBER("[date].[date].[day].["+ FORMAT(NOW()-1,"yyyy-MM-dd") +"]")
2. STRTOMEMBER("[date].[date].[day].["+ VBAMDX.FORMAT(VBAMDX.NOW()-1,"yyyy-MM-dd") +"]")

Первое решение выдает ошибку с указанием «неизвестная функция FORMAT», а ошибка во втором решении гласит: «VBAMDX.NOW()» ожидает один параметр «index». То же самое касается VBAMDX.FORMAT, если я заменю VBAMDX.NOW только NOW. Но все страницы, объясняющие VBAMDX, имеют два параметра для FORMAT и ни одного для NOW...


person UlrichWuenstel    schedule 28.07.2016    source источник
comment
проверьте функцию LookupByKey, которая является лучшей альтернативой   -  person ic3    schedule 29.07.2016


Ответы (2)


Я предполагаю, что это связано с тем, что Excel FORMAT не поддерживается (отчеты об ошибках были улучшены в последней версии icCube). Вместо этого я бы использовал функции, упомянутые на этой странице:

StrToMember( "[Time].[Calendar].[Day].&["+ DateToString( NOW()-1,"yyyy-MM-dd") +"]")

Но в icCube у вас есть функция LookupByKey, которая является более надежным решением, если ваш ключ - дата:

LookupByKey( [Time].[Calendar].[Day],  Now() )

или если вам нужна дата:

LookupByKey( [Time].[Calendar].[Day],  Today() )

Вы можете легко перемещаться по датам с помощью функций (doc).

Надеюсь, это поможет.

person Marc Polizzi    schedule 29.07.2016

Является ли -1 причиной ошибки NOW?

Так что, может быть, сработает следующее, в котором удалено -1 и добавлено одно LAG?

STRTOMEMBER("[date].[date].[day].["+ VBAMDX.FORMAT(VBAMDX.NOW(),"yyyy-MM-dd") +"]").LAG(1)

Я только что заметил, что в вашем коде отсутствует амперсанд перед квадратной скобкой последнего раздела имени члена, поэтому попробуйте одно из следующих действий:

STRTOMEMBER("[date].[date].[day].&["+ FORMAT(NOW()-1,"yyyy-MM-dd") +"]")

or

STRTOMEMBER("[date].[date].[day].&["+ VBAMDX.FORMAT(VBAMDX.NOW()-1,"yyyy-MM-dd") +"]")

Если вы попробуете эти 3 меры, они обе не сработают?

WITH
  MEMBER [Measures].[Today1] AS 
    VBAMDX.NOW() 
  MEMBER [Measures].[Today2] AS 
    VBAMDX.NOW()-1
  MEMBER [Measures].[Today3] AS 
    VBAMDX.FORMAT(VBAMDX.NOW()-1,"yyyy-MM-dd")
...
person whytheq    schedule 28.07.2016
comment
Все та же ошибка: синтаксическая ошибка: неявный вызов функции Item() (применяется к: синтаксическая ошибка: неявный вызов функции Item() (применяется к: VBAMDX.NOW) ожидает одиночный (индексный) параметр: параметр не получен. ) ожидает один (индексный) параметр: параметр не получен. -- И вдобавок, если сегодняшнего участника не существует, lag() не поможет... - person UlrichWuenstel; 28.07.2016
comment
@UlrichWuenstel Я думаю, что в вашем коде может отсутствовать символ & - см. дополнение к моему ответу - person whytheq; 28.07.2016
comment
К сожалению, это не имеет никакого отношения к проблеме. Ошибка гласит, что функции VBAMDX.NOW() нужен параметр, но я не знаю какой. Кажется, это неотъемлемая проблема IcCube. - person UlrichWuenstel; 28.07.2016