在 s-s-rS 中,预览上的日期时间参数与部署的报告不匹配
Posted
技术标签:
【中文标题】在 s-s-rS 中,预览上的日期时间参数与部署的报告不匹配【英文标题】:In s-s-rS, a Date Time parameter on Preview is not matching the deployed report 【发布时间】:2019-02-10 14:49:24 【问题描述】:在 s-s-rS 中,预览中的日期时间参数与部署的报告不匹配。这是别人遇到过的吗? RDL 代码是相同的。是不是有时候,本地预览只是功能的模拟?是不是因为预览中的显示有时会用到缓存数据?
我有一个 s-s-rS 报告,当我在本地 Visual Studio 中预览它时,日期显示为 2/10/2019,但当 RDL 代码部署在服务器上时,日期显示为 2/7/2019。 日期时间变量基于报告上的一个参数,称为 rundate,它的默认值为 2/10/2019。 所以我认为在预览模式下本地发生的报表服务器上应该发生同样的事情。
报告有四个数据集,作为测试,我将每四个数据集设置为具有设置 rundate 值的 SQL 行,如下所示: SET @rundate = '2019-02-10' 但是在报表服务器上,当我加载报表时,它会抛出这个错误: 必须声明标量变量“@rundate”。必须声明标量变量“@rundate”。 它位于级联选项卡式错误消息中,如下所示: 客户端渲染期间发生错误。 报告处理过程中发生错误。 数据集“第三数据集”的查询执行失败。 必须声明标量变量“@rundate”。必须声明标量变量“@rundate”。
那么,为什么它在本地运行而不是在服务器上运行? “ThirdDataset”是我在这里给出的假名。实际名称已编辑。但是,我注意到如果它们按字母顺序运行,这将是第一个运行的数据集。所以这让我想到一个问题:为什么报告不承认这是一个参数,为什么它抱怨它没有被声明?
============
更新:
我已将运行日期设置为报表中数据驱动订阅的一部分,如下所示:
SELECT convert (date, DATEADD (DAY, -2 , SYSDATETIME())) 作为运行日期
这是两天前的事。由于今天是 2/11/2019,所以传递给服务器上 s-s-rS 报告的 rundate 参数应该是 2/9/2019。
为了好玩,为了测试这一点,我将默认值 rundate 参数设置为 8/8/2018,希望数据驱动的报告能够正确设置它。
在 Visual Studio 的本地预览模式下,设置为显示 [@rundate] 表达式的文本框显示 8/8/2018,这是我所期望的,但数据集旨在运行此参数。由于 sql 不应该从旧数据库中检索任何内容,因此预览模式下的图形和图表应该完全为空。他们为什么要显示数据?!
接下来,让我们看看电子邮件订阅提醒的内容。它的日期是 2/11/2019 12:00:00 AM。如果数据驱动订阅的运行方式应该是应该运行的,那么它的日期应该是 2019 年 2 月 9 日
SELECT convert (date, DATEADD (DAY, -2 , SYSDATETIME())) 作为运行日期
为什么这不起作用?
在 s-s-rS 服务器上,RDL 文件的参数默认值为 2/11/2019 12:00:00 AM,但为什么报告会得到这个默认值?我做错了什么,我该如何解决?
作为测试,我将此默认日期/时间参数设置为 12:12:34 以查看会发生什么。它透露,是的,这是发送到报告的日期时间戳。所以我取消选中“具有默认值”框
然后,我注意到在数据驱动订阅的第 5 步中,如果不做一点小改动,我就无法进入 Next >:
那么,应该怎么办?它会显示古怪的 8/8/2018 价值吗?会显示两天前的日期吗?
【问题讨论】:
“参数不匹配”是什么意思?如果用户使用部署的报告输入的值与您在开发工具中输入的值不同,那么这些值当然“不匹配”。 您的开发预览中的月份和日期是否反转为已部署的报告? 我已经更新了原帖 @xarzu 你能显示你的Sql语句吗?那里似乎出了点问题 【参考方案1】:报表参数的默认值仅部署到报表服务器一次,然后在后续部署后保持默认值。这样一来,开发中使用的默认参数值就不会覆盖生产服务器上所需的参数默认值。
因此,在首次部署报告时,@rundate 的默认值似乎是 2/7/2019,但后来在本地报告中更改为 2/10/2019。进入您的报表服务器,找到报表并进入报表参数部分以编辑参数并将默认值更改为您想要的值(从报表服务器中删除报表并使用更新的参数重新部署它将具有相同的效果,但请注意该参数将保持该默认值向前)。或者,使用表达式设置报告参数,使其不断更新。
关于使用 SET 语句更新 Sql 语句中的参数值,您实际上不能这样做 - 您需要在报表的参数列表中进行设置,以便 s-s-rS 可以设置参数值。因此,您的数据库服务器抱怨您正在尝试设置尚未在 Sql 语句中定义的局部变量的值,从而引发错误消息。
因此您需要在报表设计器的报表参数部分设置报表参数。然后,您的 Sql 可以像这样引用您的参数:
SELECT * FROM MyTable WHERE SomeDate >= @rundate
参数通常会自动映射到您的数据集,但您可能需要通过进入数据集的参数设置来检查这一点以确保。如果该参数在那里不存在,请设置它。
【讨论】:
我没有意识到您可以(或应该)实际在报表服务器上为报表设置参数,而不仅仅是在 RDL 本身上设置。这改变了游戏规则,让这个问题更加清晰! 还是有问题。我将发布对 OP 的更新。【参考方案2】:经过漫长的反复试验,我发现答案是没有将参数设置为在 s-s-rS 报表服务器上具有默认值。
【讨论】:
以上是关于在 s-s-rS 中,预览上的日期时间参数与部署的报告不匹配的主要内容,如果未能解决你的问题,请参考以下文章
s-s-rS - 用于计算当前日期匹配或(参数选择日期)与其他一些等效列的行的表达式