我在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') )
答案 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查询的行为)。当看到很多记录时 时间,这可能会对您的报告绩效产生重大影响。
所以我认为有一个更好的解决方法是在数据集中创建一个计算字段:
表达此类表达式(假设您的字段名称为“日期”,并返回唯一名称,例如 [日期快照]。[日期]。[日期]。& [2010- 01-01T00:00:00] 和 [日期快照]。[日期]。[日期]。& [2010-12-31T00:00:00] :
=CDate(mid(Fields!Date("UniqueName"),33,10))
这样您就不必手动编辑MDX,并且保留了NON EMPTY行为。此新字段在Mobile Report Publisher中正确标识为日期数据类型:
无论如何,根据this post根据最后一次Pass Summit(2016年10月)获得的信息,帮助即将开始,以下内容正在制定中:
更好地支持生成的MDX。当前日期解决方法将不会 需要更长时间,让每个人的生活更轻松。
答案 1 :(得分:1)
据我所知 - MDX查询语言不包含数据类型“Date”,因此它将被转换为“String”。
答案 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