SSRS共享数据集中的MDX查询提供了错误的数据类型

时间:2016-08-09 08:37:42

标签: reporting-services ssas mdx microsoft-reporting

我在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') )

6 个答案:

答案 0 :(得分:2)

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

  

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

答案的原始文本如下:

official Microsoft documentation

解释了为什么会发生这种情况的原因
  

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

     

但是,当JSON表呈现器处理数据集时,它会读取   列的值作为字符串并呈现字符串。然后当SQL   Server Mobile Report Publisher提取表,它也只能看到   字符串。

官方解决方法也在那里解释:

  

解决方法是在您使用时添加计算成员   在报表生成器中创建共享数据集。

此类计算成员的示例(取自here):

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

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

  

这样做的缺点是它将返回所有日期   已在您的查询中选择,而不仅仅是具有值的查询   在你的立方体中与它相关联(基本上删除了NON EMPTY   来自MDX查询的行为)。当看到很多记录时   时间,这可能会对您的报告绩效产生重大影响。

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

new dataset calculated field

表达此类表达式(假设您的字段名称为“日期”,并返回唯一名称,例如 [日期快照]。[日期]。[日期]。& [2010- 01-01T00:00:00] [日期快照]。[日期]。[日期]。& [2010-12-31T00:00:00]

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

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

date datatype

无论如何,根据this post根据最后一次Pass Summit(2016年10月)获得的信息,帮助即将开始,以下内容正在制定中:

  

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

答案 1 :(得分:1)

据我所知 - MDX查询语言不包含数据类型“Date”,因此它将被转换为“String”。

IBM support - MDX Data types

Wikipedia - MDX Data types

答案 2 :(得分:1)

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

使用  会员[日期]为圆顶([日期快照]。[日期] .CURRENTMEMBER.Name)

选择......

您的快照日期需要具有一种建议的格式。如果它确实cdate()函数应该做的伎俩。 SSRS Mobile Publisher会将其识别为日期而非字符串。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我最终使用OPENQUERY将MDX包装在T-SQL查询中。这很笨拙,特别是当我需要传递一个参数时,它允许我显式地将结果集转换为我想要的任何数据类型。 Urgh。

答案 5 :(得分:0)

我设法让MRP将我的日期识别为过滤时间导航器的实际日期的唯一方法是根据MemberValue的{​​{1}}添加计算度量。

E.g:

Date Dimension

然后,将字段WITH MEMBER [Measures].[Date2] AS ([_Reference Period].[Date].CurrentMember.MemberValue) 添加到查询的度量中:

  

SELECT NON EMPTY {[Measures]。[Date2]} ON COLUMNS,NON EMPTY {([_ ReferencePeriod]。[Date]。[Date] .ALLMEMBERS * [Companies]。[Company]。[Company] .ALLMEMBERS * [合同]。[类型]。[类型] .ALLMEMBERS * [员工]。[性别]。[性别] .ALLMEMBERS * [情境类型]。[情境类型]。[情境类型] .ALLMEMBERS)}维度属性MEMBER_CAPTION, MEMBER_VALUE,MEMBER_UNIQUE_NAME来自[来源] CELL PROPERTIES VALUE,BACK_COLOR,FORE_COLOR,FORMATTED_VALUE,FORMAT_STRING,FONT_NAME,FONT_SIZE,FONT_FLAGS