How to build a dynamic MDX formula for a calculated member? - dynamic

I am trying to create a Calculated Member to get a sum up to last week.
No problem to get the week value (I need it to be two digits i.e. '05', so adding 100-1 )
with
Member [Measures].Week as
'right(str(int(99+datepart ( ''ww'', Now()))),2)'
-- That works as expected
member [Measures].SalesUpToWeek as
'strtomember(
"aggregate(periodstodate([Dim].[2015],[Dim].[2015].[" + ([Measures].Week) + "]),[Measures].[Sales])")'
I get the literal value
aggregate(
periodstodate([Dim].[2015],[Dim].[2015].[25])
,[Measures].[Sales]
)
What I need is the value of this MDX calculation.
All other attempts end up with a syntax error. Just as an example
member [Measures].SumToWeek as
'aggregate(
periodstodate(
[Dim].[2015],[Dim].[2015].[' + strtomember([Measures].Week) + '])
,[Measures].[Sales])'
Error
Lexical error at line 2, column 0. Encountered: after : "[\n"
Any idea?

[Measures].Week is already a string entity. You don't need to put StrToMember around it. Instead you should have it outside the string you dynamically defined.
with
Member [Measures].Week as
"right(str(int(99+datepart ( ''ww'', Now()))),2)"
member [Measures].SumToWeek as
aggregate(
periodstodate(
[Dim].[2015],
StrToMember("[Dim].[2015].[" + [Measures].Week + "]")
)
,
[Measures].[Sales]
)

This is your error:
strtomember([Measures].Week)
Let us say that [Measures].Week is equal to 15 then you are trying to do this:
strtomember(15)
So there are two errors in the above:
You're feeding a numeric into a functions that converts Strings to Memebers
You need to feed in the full string representation of the member i.e."[Dim].[2015].[15]"
Maybe try putting the strToMember function around the string that is the representation of the member:
MEMBER[Measures].SumToWeek AS
'aggregate(
periodstodate(
[Dim].[2015],
strtomember('[Dim].[2015].[' + [Measures].Week + ']', constrained)
)
,[Measures].[Sales])'
Here is the MSDN reference for the function strtomember:
https://msdn.microsoft.com/en-us/library/ms146022.aspx?f=255&MSPPError=-2147217396
Edit
Looking at this previous post: (StrToMember does not accept calculated measure (mdx))
...you need to create the member before feeding it into the new measure, so:
WITH
MEMBER [Measures].[Week] AS
Right
(
Str(Int(99 + Datepart('ww',Now())))
,2
)
MEMBER [Dim].[2015].[TargetWeek] AS
StrToMember
(
'[Dim].[2015].[' + [Measures].Week + ']'
,constrained
)
MEMBER [Measures].SumToWeek AS
Aggregate
(
PeriodsToDate
(
[Dim].[2015]
,[Dim].[2015].[TargetWeek]
)
,[Measures].[Sales]
)
Edit2
Ok if you wish to use PeriodsToDate then we need to use StrToSet and then use the member in this set inside the function. This is because custom members lose their family ties and are therefore useless inside some mdx functions.
Here is a working script in AdvWrks illustrating the approach I'm suggesting:
WITH
MEMBER [Measures].[Wk] AS
Right
(
Str(Int(99 + Datepart('ww',Now())))
,2
)
SET [TargetWeek] AS
StrToSet
(
'[Date].[Calendar Weeks].[Calendar Week].[Week ' + cstr([Measures].[Wk]) + ' CY 2007]'
)
MEMBER [Measures].[SumToWeek] AS
Aggregate
(
PeriodsToDate
(
[Date].[Calendar Weeks].[Calendar Year]
,[TargetWeek].item(0).item(0)
)
,([Measures].[Internet Sales Amount])
)
SELECT
{[Measures].[SumToWeek]} ON 0,
[Product].[Product Categories].[All] ON 1
FROM [Adventure Works];

I got an interesting suggestion on Pentaho forums that pointed me to a nice blog post which allowed to write an elegant solution:
http://diethardsteiner.blogspot.com.es/2009/10/current-date-function-on-mondrian.html
with
member [Measures].sm as aggregate(
periodstodate(
currentdatemember([Dim],'["Dim"]\.[yyyy]'), -- current year
currentdatemember([Dim],'["Dim"]\.[yyyy]\.[ww]').lag(1) -- previous week
),
[Measures].[Sales])
Thks

Related

How to tuple with Member_Key MDX SSAS?

I want to tuple using member key of [Dim].[Country]
{[Dim].[Country].CurrentMember.Member_Key},
STRTOSET("[User].[ID].&[" + mid(username, instr(username, "\")+1) + "]")
But when I use CurrentMember.Member_Key function I get the following error:
The function expects a tuple set expression for the 1 argument. A string or numeric expression was used.
If I write it like this using "members" is works. But then it will tuple with the full name (100 - Norway) but my goal is to tuple it with just the key part e.g "100"
{[Dim].[Country].members},
STRTOSET("[User].[ID].&[" + mid(username, instr(username, "\")+1) + "]")
Best regards,
Rubrix
Instead of [Dim].[Country].CurrentMember.Member_Key you should do something like this:
with member [Measures].CountryKey as [Dim].[Country].CurrentMember.Member_Key
So something like this could work (on Adventure Works):
with member [Measures].CountryKey as [Geography].[Country].CurrentMember.Member_Key
SELECT ([Measures].CountryKey, StrToSet ('[Geography].[State-Province].Members') )
ON 0
FROM [Adventure Works]

How to pass a parameter in mdx?

I have a parameter value 'SF - LYON' while trying to pass in where condition:
MEMBER [Measures].[ParameterCaption] AS [Organization].[Organization].CURRENTMEMBER.MEMBER_CAPTION
MEMBER [Measures].[Parametervalue] AS [Organization].[Organization].CurrentMember.UNIQUENAME
MEMBER [Measures].[ParameterLevel] AS [Organization].[Organization].CurrentMember.LEVEL.ORDINAL
SELECT non empty {[Measures].[ParameterCaption]
, [Measures].[ParameterValue]
, [Measures].[ParameterLevel] } ON COLUMNS
FROM [IRIS]
WHERE STRTomember('SF - LYON', CONSTRAINED) //#parameter=SF - LYON`
But I am getting this error:
Query (10, 1) The restrictions imposed by the CONSTRAINED flag in the STRTOMEMBER function were violated.
When I try it like this:
WHERE STRTomember('[SF - LYON]', CONSTRAINED) //#parameter=SF - LYON
it is working.
So my question is: How do I pass the square brackets [] through a parameter to get the desired result?
You can build up the parameter string with square brackets before passing it to the strToMember function

Mondrain MDX for records between date range where start and end date being separate columns

I want to search date between two columns of same dimension. Columns name is start date and end date. I tried every thing, following query give me this error : Mondrian Error:Internal error: Cannot deduce type of call to function ':'
MDX query :
WITH
SET [~ROWS] AS
Hierarchize
(
{
{[Location_Cluster.default].[All Location_Cluster.defaults]}
,{[Location_Cluster.default].[Location_Cluster].MEMBERS}
}
)
MEMBER [Measures].[QTY Percent] AS
[Measures].[Total_Quantity]
/
(
[Measures].[Total_Quantity]
,[Location_Cluster.default].[All Location_Cluster.defaults]
)
,format_string = '0.00%'
MEMBER [Measures].[Revenue Percent] AS
[Measures].[Total_Revenue]
/
(
[Measures].[Total_Revenue]
,[Location_Cluster.default].[All Location_Cluster.defaults]
)
,format_string = '0.00%'
MEMBER [Measures].[Margin Percent] AS
[Measures].[Total_Margin]
/
(
[Measures].[Total_Margin]
,[Location_Cluster.default].[All Location_Cluster.defaults]
)
,format_string = '0.00%'
SELECT
NON EMPTY
{
[Measures].[Sku_Count]
,[Measures].[Total_Quantity]
,[Measures].[QTY Percent]
,[Measures].[Total_Revenue]
,[Measures].[Revenue Percent]
,[Measures].[Total_Margin]
,[Measures].[Margin Percent]
} ON COLUMNS
,NON EMPTY
[~ROWS] ON ROWS
FROM [APCS_SALES_CUBE]
WHERE
(
{[Date].[Start_Date].&[2017-01-01] : NULL}
,{NULL : [Date].[End_Date].&[2017-03-01]}
,[Cluster.Cluster_Id].[2]
,[Taxonomy.default].[Taxonomy_ID].[3]
,[Company.Company_Name].[Compnay_Name].[1]
);
I followed following links to resolve this issue. But don't know how to apply specify function in Mondrian MDX
https://ask.sqlservercentral.com/questions/95478/mdx-for-records-between-date-range-where-start-and.html#answer-142811
https://www.purplefrogsystems.com/blog/2013/04/mdx-between-start-date-and-end-date/#comment-1981
Your query is not well formed. You need to make set out of the range you want to slice. Here is an example:
WITH SET [~ROWS] AS
(${dateFromParameter} : ${dateToParameter})
MEMBER Measures.[number] as
FORMAT([date].[godina].CurrentMember.PROPERTIES("datum"), "dd.mm.yyyy")
SET [ROOT] AS
FILTER([ORG].[org_id].Members, [ORG].[org_id].currentmember.parent.parent=[ORG].[org_id].currentmember.parent)
SELECT
NON EMPTY {[Measures].[total], Measures.[number]} ON COLUMNS,
NON EMPTY [ROOT] * [~ROWS] ON ROWS
FROM [svcs]

MDX currentMember get me error

This MDX function raise error :
with member measures.x as
(
[Date].[Date].[Date].&[20160101] : [Date].[Date].[Date].currentmember.value
,
[Measures].[current balance]
)
select measures.x on columns,
[Branch].[HeadOffice Branch].[Head Office Code] on rows
from MyCube
Error is :
The CURRENTMEMBER function expects a hierarchy expression for the 1 argument. A member expression was used.
But when I use
[Date].[Date].[Date].&[20160101] : [Date].[Date].[Date].&[20160131]
It works good
why?
This is valid mdx:
[Date].[Date].[Date].&[20160101] : [Date].[Date].currentmember
Although this is not:
WITH member measures.x AS
(
[Date].[Date].[Date].&[20160101] : [Date].[Date].currentmember
,
[Measures].[current balance]
)
It is not valid because round braces (...) signify a tuple but a tuple requires exact co-ordinates so the first argument cannot be a set.
You could add an aggregation such as SUM:
WITH member measures.x AS
SUM
(
[Date].[Date].[Date].&[20160101] : [Date].[Date].currentmember
,
[Measures].[current balance]
)
This is valid mdx but if you do not have [Date].[Date] in context i.e. in the WHERE or SELECT clause then all it is returning is the All member.
Why are you using [Date].[Date].currentmember ?
CURRENTMEMBER works on an attribute hierarchy (in your case [Date].[Date]). So [Date].[Date].CURRENTMEMBER will work.
Also you will need to take out the value selector, as your expression returns a set of dates (member : member returns a set of all the members between those two members).

MDX CREATE MEMBER SYNTAX ERROR?

I'm very new to MDX, so sorry if this is a stupid question.
I'm creating a new calculated member
I'm getting a syntax error on Line 2 "AS SELECT NON EMPTY"?
CREATE MEMBER CURRENTCUBE.[Measures].FCR
AS SELECT NON EMPTY { [Measures].[Total Incident Count] } ON COLUMNS
FROM ( SELECT ( { [DIM INCIDENT].[First Call Resolution].&[Yes] } ) ON COLUMNS
FROM [ITSM Incident DM])
WHERE ( [DIM INCIDENT].[First Call Resolution].&[Yes] ),
FORMAT_STRING = "Standard",
VISIBLE = 1 ;
Thanks in advance for any assistance.
You cannot put a Select statement in the expression of a calculated member.
You can fine more information on this MSDN page.