4

好的,这是一个有趣的部分,也是我到目前为止所做的工作的一部分,到目前为止,有些人声称由于 SSRS 处理默认值的默认行为而无法做到这一点。但是我已经走了很远,我很好奇我是否可以一路走下去。

问题:我想要做的是让用户在“本月”、“上个月”等语句之间获得 PRE DEFINED ......然后使用该字符串引用的 DateTime 填充变量,但用户可以更改它稍后,它应该根据父字符串刷新,否则让用户在 SINGLE DATETIME PARAMETER 上选择不同的字符串。

首先,让我们来看看什么可行,什么不可行:

I. 我将数据集绑定到此,缩写形式为:

select 
'Today' as Description
,   DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) BegDt
union
select 
    'ThisMonth'
,   Dateadd(month, Datediff(month, 0, getdate()), 0) 

二、然后我设置了一个名为“DatesPeriod”的参数,然后在选择“从查询中获取值”时添加“描述”作为参数的字段和标签。用户现在可以从下拉列表中选择“今天”或“本月”。

三、我现在设置另一个数据集并将其标记为“DatesSelected”。出于解释的目的,我将保持简单,只嵌套第一部分的数据集,但列出一个 where 子句。本质上,我再次使用相同的数据集,但一次强制返回一行。

select *
from 
    (
    select 
        'Today' as Description
    ,   DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) BegDt
    union
    select 
        'ThisMonth'
    ,   Dateadd(month, Datediff(month, 0, getdate()), 0) 
    ) as x
where x.Description = @DatesPeriod

四。我定义了另一个名为“Start”的参数,它是 DateTime,并从上面的数据集中获取它的值以及它的默认值。现在,当用户更改第一个文本变量时,相关的 DateTime 变量也会更改。我已将文本选择本质上绑定到一个日期时间变量,该变量现在的范围仅限于描述的可用值和默认值。这将范围限制为一个,强制传递默认值。

V. 这还不够,我希望用户能够随意选择免费日期范围。当前设置不允许使用此日期选择器,因为范围受 AVAILABLE VALUES 限制。但是,需要这样做才能将文本传递给将按需刷新的日期时间变量(当它在运行报表时更改时,而不仅仅是第一次)。因此,我创建了另一个 DateTime 参数并将其命名为“UserStart”,并将默认值设为“[@Start]”以将其默认值作为“Start”的依赖项。

六、我现在创建了一个名为“Choice”的测试数据集,以直观地看到我的数据也按照我的意愿呈现。

 Select isnull(@UserStart, @Start) as Choice

七。我创建了一个表格对象并将其放在我的报告中并放入我上面列出的单个单元格中,以查看当用户用他们自己的选择(来自 SSRS 提供的日历显示)覆盖默认的“开始”值时,它将展示。

因此,此时一切都需要注意。您需要显示两个日期时间参数,以允许最终用户选择默认设置或选择他们自己的设置。如果我尝试隐藏第二个参数“开始”,它只会在第一次运行报告时设置默认值,每次更改第一个参数时我都想要它。如果它是可见的,它工作正常,但对于功能,我不希望用户看到就他们而言是相同的两个报告参数。我尝试了自定义代码来返回“开始”参数,创建另一个数据集,但据我所知,SSRS 对于默认刷新或您想要选择的任何日期都不灵活。如果你想刷新一个参数并让它从另一个变量在屏幕上这样做,你需要告诉它' s 可用值和默认值已更改。但是,这摆脱了日历选项,因此您需要将参数传递给另一个参数。但是,如果您隐藏第二个参数,它将不会传递该值。

任何帮助将非常感激。

4

2 回答 2

0

经过大量研究,以上提供了解决方案的最终线索。有许多步骤,但它确实允许用户选择预定义的日期范围或输入自己的日期。

  1. 添加文本参数“DateRange”。设置 AvailableValues 如下:

选择日期:选择

今年:今年

去年:去年

全部:全部

将默认值设置为无

  1. 创建一个存储过程“GetDateRangeFromDesc”,如下所示:

创建过程 [dbo].[GetDateRangeFromDesc]

@Range varchar(50)

作为

开始

设置无计数;

SELECT
    CASE 
WHEN @Range = 'Choose' THEN NULL
WHEN @Range = 'ThisYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
WHEN @Range = 'LastYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()) - 1, 0)
WHEN @Range = 'All' THEN Convert(DATE, '1/1/1900') END AS Date1,
CASE
WHEN @Range = 'Choose' THEN NULL
WHEN @Range = 'ThisYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, 0)
WHEN @Range = 'LastYear' THEN DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
WHEN @Range = 'All' THEN Convert(DATE, '12/31/2099') END AS Date2

END
GO
  1. 添加数据集“DateRangeValues”

选择存储过程“GetDateRangeFRomDesc”

字段应为 Date1 和 Date2

参数应该是@Range:[@DateRange]

  1. 添加日期/时间参数“StartDate”。将 AvailableValues 和 DefaultValues 设置为:

从查询中获取值。数据集:日期范围值;值/标签字段:Date1

  1. 添加日期/时间参数“EndDate”。将 AvailableValues 和 DefaultValues 设置为:

从查询中获取值。数据集:日期范围值;值/标签字段:Date2

当您运行报告时,开始和结束日期将按照存储过程中的确定进行填充。根据需要添加尽可能多的日期范围。只需选择一个返回 NULL 的选项,这样用户就可以输入自己的值。

**对不起,但我在完全测试之前发布了。当您选择选择,然后输入日期时,一切都会刷新并且日期会消失。:) 也许有人可以添加允许它工作的最后一块。

另一个更新:当DateRange参数在导致刷新的最后一个参数之后时有效!

于 2015-04-17T19:14:24.857 回答
0

根据Microsoft Connect,不刷新默认参数的能力是“设计使然”

“如上所述,这不是错误。除非所选值不再在有效值列表中,否则我们不会重新评估后续参数的默认值。我们不知道当前值是否是用户特别要求的或者它因为默认而存在。你可以通过某种属性来控制这种行为,但它目前正在按设计工作。- 微软

建议的解决方法:

玩这个已经有一段时间了,我能看到的唯一解决方案是改变你打算让用户如何使用报告。

而不是UserStart显示查询计算的日期,而是将其用作覆盖日期,并允许它接受空值并将空值设置为默认值。然后在查询中使用类似的东西:

where Table.DateStart < isnull(@UserStart, @Start)

这允许用户选择DatePeriod运行报告或使用自己的自定义日期范围进行更新。

样本:

ssrs 样本

于 2013-07-26T15:53:21.867 回答