1

我有一个用于 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') )
4

6 回答 6

2

更新:由于 SQL Server 2016 SP1不再需要下面解释的解决方法,并且应该正确识别日期而不做任何特别的事情:

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

答案原文如下:

发生这种情况的原因在Microsoft 官方文档中进行了解释:

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

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

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

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

这种计算成员的示例(取自此处):

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

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

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

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

新数据集计算字段

使用诸如此类的表达式(假设您的字段名称为“日期”,并且它返回唯一名称,例如[日期快照].[日期].[日期].&[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 中被正确识别为日期数据类型:

日期数据类型

无论如何,帮助正在路上,根据这篇基于上次 Pass 峰会(2016 年 10 月)获得的信息的帖子,正在开发以下内容:

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

于 2016-11-10T07:54:59.960 回答
1

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

WITH MEMBER [Date] AS Cdate([Date Snapshot].[Date].CURRENTMEMBER.Name)

选择 ...

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

于 2016-10-17T08:17:38.303 回答
1

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

IBM 支持 - MDX 数据类型

维基百科 - MDX 数据类型

于 2016-08-09T12:15:46.463 回答
0

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

=format(cdate(Fields!Calendar_Day.Value),"dd MMM yy")
于 2016-08-10T09:40:49.777 回答
0

我设法让 MRP 将我的日期识别为过滤低谷时间导航器的真实日期的唯一方法是添加基于MemberValue.Date 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在来自 [SOURCE] 单元格属性值、BACK_COLOR、FORE_COLOR、FORMATTED_VALUE、FORMAT_STRING、FONT_NAME、FONT_SIZE、FONT_FLAGS 的行上

于 2017-02-28T09:48:05.287 回答
0

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

于 2016-09-12T13:16:30.910 回答