【问题标题】:MDX Query in SSRS Shared DataSet giving wrong DatatypeSSRS 共享数据集中的 MDX 查询给出错误的数据类型
【发布时间】:2016-08-09 08:37:42
【问题描述】:

我有一个用于 SSRS 2016 移动报表的共享数据集。该数据集位于 SSAS 数据源上,并且有一个 MDX 查询可以从多维数据集中提取。

从查询中拉回的主键是日期,在 SSAS 中是这样格式化的;但是,当我在 Mobile Report Publisher 中使用数据集时,它不会将其确认为日期数据类型,它认为它是一个字符串。这意味着我不能将数据集用作时间表的主要系列,因为它不认为有任何格式化为日期的内容。

以下是我认为导致问题的 MDX 部分。

SELECT
{
[Unresolved], [Assigned to Provider], [Unresolved past due date], [Other past due date], [Provider past due date], 
[Company past due date], [Provider PDD Daily Change], [Company PDD Daily Change], [Other PDD Daily Change], [Company pre due date], [Company PRDD Daily Change]
} ON COLUMNS,
NONEMPTY(
{
    [Date Snapshot].[Date].[Date]
}) ON ROWS
FROM [Source]
WHERE
( FILTER([Date Snapshot].[YQMD].[Date], [Date Snapshot].[YQMD].CURRENTMEMBER.MEMBER_KEY >= '2015-08-15') )

【问题讨论】:

    标签: reporting-services ssas mdx microsoft-reporting


    【解决方案1】:

    更新:自 SQL Server 2016 SP1 起,下面解释的解决方法is no longer necessary 和日期应该可以正确识别,而无需做任何特别的事情:

    要试用此新功能,请使用查询设计器创建一个简单的 MDX 查询,其中包括数据模型中的日期字段。当您使用 Mobile Report Publisher 使用该共享数据集时,它会正确识别查询中的日期字段,而无需额外的计算度量。

    答案原文如下:

    official Microsoft documentation 中解释了发生这种情况的原因:

    Analysis Services 查询的默认返回类型是字符串。 在 Reporting Services 报表生成器中构建数据集时, 字符串类型受到尊重并保存到服务器。

    但是,当 JSON 表渲染器处理数据集时,它会读取 将列的值作为字符串并呈现字符串。那么当SQL 服务器移动报表发布器获取表,它也只看到 字符串。

    那里也解释了官方的解决方法:

    解决方法是在您 在报表生成器中创建共享数据集。

    这样一个计算成员的例子(取自here):

    cdate(format([Date].[Date].CURRENTMEMBER.MEMBER_VALUE, "yyyy-MM-dd"))
    

    但是这种解决方法(正如 Victor_Rocca 在对 Microsoft 官方文档的评论中指出的那样)有一个大问题:

    这样做的缺点是它会返回所有日期 在您的查询中被选中,而不仅仅是那些有值的 在你的多维数据集中与它相关联(基本上删除了 NON EMPTY MDX 查询中的行为)。在查看大量记录时 时间,这可能会显着影响您的报告性能。

    所以我认为有一个更好的解决方法是在数据集中创建一个计算字段:

    使用这样的表达式(假设您的字段名称是“日期”,并且它返回唯一的名称,例如 [Date Snapshot].[Date].[Date].&[2010-01 -01T00:00:00][日期快照].[Date].[Date].&[2010-12-31T00:00:00]:

    =CDate(mid(Fields!Date("UniqueName"),33,10))
    

    这样您就不必手动编辑您的 MDX 并保留 NON EMPTY 行为。这个新字段在 Mobile Report Publisher 中被正确识别为日期数据类型:

    无论如何,帮助正在进行中,根据 this post 根据上次 Pass 峰会(2016 年 10 月)获得的信息,正在开发以下内容:

    更好地支持生成的 MDX。当前日期的解决方法将不会 不再需要,让每个人的生活更轻松。

    【讨论】:

      【解决方案2】:

      据我了解 - MDX 查询语言不包含数据类型“日期”,因此它将被转换为“字符串”。

      IBM support - MDX Data types

      Wikipedia - MDX Data types

      【讨论】:

      • 好吧,这很令人沮丧,但我可以强制 SSRS 将其转换为日期?
      • 我猜你应该能够在数据集中添加一个计算字段,在其中你有一个公式可以将字符串值转换为日期(?)。
      • 是的,即使是计算出的度量也不会被确认为日期数据类型。
      【解决方案3】:

      我遇到了同样的问题。您可以通过使用 VBA 函数在 MDX 查询级别创建成员来解决此问题:

      有 成员 [日期] AS Cdate([日期快照].[日期].CURRENTMEMBER.Name)

      选择 ...

      您的快照日期需要采用建议的格式之一。如果它确实 cdate() 函数应该可以解决问题。 SSRS Mobile Publisher 会将其识别为日期而不是字符串。

      【讨论】:

        【解决方案4】:

        我在使用这些日期之一之前和在 tablix 单元格中遇到过这种情况,我使用了以下表达式:

        =format(cdate(Fields!Calendar_Day.Value),"dd MMM yy")
        

        【讨论】:

          【解决方案5】:

          我最终使用 OPENQUERY 将 MDX 包装在 T-SQL 查询中。这非常笨拙,尤其是当我需要传递参数时,但它允许我将结果集显式转换为我想要的任何数据类型。呃。

          【讨论】:

          • 我不推荐您的解决方案...查看使用 cdate 函数转换字符串的其他答案。这应该是与 SSRS 一起使用的有效选项,并且不会添加您运行的 sql server 的依赖项。数据还必须从多维数据集传递到 sql server 到运行报告的用户。
          【解决方案6】:

          我设法让 MRP 将我的日期识别为真实日期以过滤低谷时间导航器的唯一方法是添加基于 MemberValueDate Dimension 的计算度量。

          例如:

          WITH MEMBER [Measures].[Date2] AS ([_Reference Period].[Date].CurrentMember.MemberValue) 
          

          然后,将字段 [Measures].[Date2] 添加到查询的度量中:

          SELECT NON EMPTY { [Measures].[Date2] } ON COLUMNS, NON EMPTY { ([_ReferencePeriod].[Date].[Date].ALLMEMBERS * [Companies].[Company].[Company].ALLMEMBERS * [Contract].[Type].[Type].ALLMEMBERS * [Employee].[Gender].[Gender].ALLMEMBERS * [Situation Type].[Situation Type].[Situation Type].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_VALUE, MEMBER_UNIQUE_NAME ON ROWS FROM [SOURCE] CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多