Dynamic 如何为计算成员构建动态MDX公式?

Dynamic 如何为计算成员构建动态MDX公式?,dynamic,mdx,Dynamic,Mdx,我正在尝试创建一个计算过的成员,以获得截至上周的总结。 获取周值没有问题(我需要它是两位数字,即“05”,因此添加100-1) --这是意料之中的事 member [Measures].SalesUpToWeek as 'strtomember( "aggregate(periodstodate([Dim].[2015],[Dim].[2015].[" + ([Measures].Week) + "]),[Measures].[Sales])")' 我得到了文本值 aggrega

我正在尝试创建一个计算过的成员,以获得截至上周的总结。 获取周值没有问题(我需要它是两位数字,即“05”,因此添加100-1)

--这是意料之中的事

member [Measures].SalesUpToWeek as
  'strtomember(
     "aggregate(periodstodate([Dim].[2015],[Dim].[2015].[" + ([Measures].Week) + "]),[Measures].[Sales])")'
我得到了文本值

aggregate(
    periodstodate([Dim].[2015],[Dim].[2015].[25])
   ,[Measures].[Sales]
)
我需要的是这个
MDX
计算的值

所有其他尝试最终都会出现语法错误。举个例子

member [Measures].SumToWeek as 
 'aggregate(
     periodstodate(
       [Dim].[2015],[Dim].[2015].[' + strtomember([Measures].Week) + '])
   ,[Measures].[Sales])'   
错误

第2行第0列出现词法错误。遇到:在“[\n”之后

有什么想法吗?

这是你的错误:

strtomember([Measures].Week)
假设
[Measures].Week
等于15,则您尝试执行以下操作:

strtomember(15)
因此,上面有两个错误:

  • 您正在将一个数值输入一个函数,该函数将字符串转换为Memebers
  • 您需要输入成员的完整字符串表示形式,即“[Dim].[2015].[15]”
  • 可以尝试将
    strotmember
    函数放在表示该成员的字符串周围:

    MEMBER[Measures].SumToWeek AS
     'aggregate(
         periodstodate(
           [Dim].[2015],
           strtomember('[Dim].[2015].[' + [Measures].Week + ']', constrained)
         )
       ,[Measures].[Sales])'
    
    以下是函数strotmember的MSDN参考:
    strotmember


    编辑

    查看前一篇帖子:()
    …在将成员输入新度量值之前,您需要创建该成员,因此:

    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

    好的,如果您希望使用
    PeriodsToDate
    ,那么我们需要使用
    stroset
    ,然后在函数中使用此集合中的成员。这是因为自定义成员失去了家庭关系,因此在某些
    mdx
    函数中没有用处。 以下是
    AdvWrks
    中的工作脚本,说明了我建议的方法:

    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];
    
    这是您的错误:

    strtomember([Measures].Week)
    
    假设
    [Measures].Week
    等于15,则您尝试执行以下操作:

    strtomember(15)
    
    因此,上面有两个错误:

  • 您正在将一个数值输入一个函数,该函数将字符串转换为Memebers
  • 您需要输入成员的完整字符串表示形式,即“[Dim].[2015].[15]”
  • 可以尝试将
    strotmember
    函数放在表示该成员的字符串周围:

    MEMBER[Measures].SumToWeek AS
     'aggregate(
         periodstodate(
           [Dim].[2015],
           strtomember('[Dim].[2015].[' + [Measures].Week + ']', constrained)
         )
       ,[Measures].[Sales])'
    
    以下是函数strotmember的MSDN参考:
    strotmember


    编辑

    查看前一篇帖子:()
    …在将成员输入新度量值之前,您需要创建该成员,因此:

    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

    好的,如果您希望使用
    PeriodsToDate
    ,那么我们需要使用
    stroset
    ,然后在函数中使用此集合中的成员。这是因为自定义成员失去了家庭关系,因此在某些
    mdx
    函数中没有用处。 以下是
    AdvWrks
    中的工作脚本,说明了我建议的方法:

    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];
    

    [Measures].Week
    已经是一个字符串实体。您不需要在其周围放置
    strotmember
    。相反,您应该将其置于动态定义的字符串之外

    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]
             )
    

    [Measures].Week
    已经是一个字符串实体。您不需要在其周围放置
    strotmember
    。相反,您应该将其置于动态定义的字符串之外

    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]
             )
    

    我在Pentaho论坛上得到了一个有趣的建议,建议我写一篇很好的博客文章,可以写一个优雅的解决方案:


    Thks

    我在Pentaho论坛上得到了一个有趣的建议,建议我写一篇很好的博客文章,可以写一个优雅的解决方案:


    Thks

    我在发布之前已经尝试了这两个建议:)Whytheq:语法错误Sourav_Agasti:没有函数匹配签名“+”,我在发布之前已经尝试了这两个建议:)Whytheq:语法错误Sourav_Agasti:没有函数匹配签名“+”,Hi Sourav-这将不起作用。我将在今天晚些时候添加一个完整的编辑到我的帖子中-使用explanation and working
    AdvWrks
    示例。嗨,苏拉夫-这不起作用。我今天晚些时候会在我的帖子中添加完整的编辑内容,包括解释和工作
    AdvWrks
    示例。我会很快在我的答案中添加
    Edit2
    ,因为我想我现在知道发生了什么:这是一个有趣的案例。我会很快在m中添加
    Edit2
    我想我现在知道发生了什么,所以我回答:这是一个有趣的案例。非常好-羞耻
    currentdatemember
    仅是
    mondrian
    而已。非常好-羞耻
    currentdatemember
    仅是
    mondrian
    而已。