Reporting services 级联文本参数,允许选择日期时间日历或预填充字段

Reporting services 级联文本参数,允许选择日期时间日历或预填充字段,reporting-services,ssrs-2012,Reporting Services,Ssrs 2012,好的,这是一个有趣的例子,也是我迄今为止所做的工作的一部分。到目前为止,一些人声称这是无法做到的,因为SSRS处理默认值的默认行为。然而,我已经走得很远了,我很好奇我是否能一直做到 问题:我想做的是让用户在诸如“This Month”、“LastMonth”等语句之间进行预定义。。。然后,这将使用该字符串引用的日期时间填充变量,但用户可以稍后对其进行更改,并应根据父字符串进行刷新,或者让用户在单个日期时间参数上选择不同的日期时间。 首先,让我们研究哪些可行,哪些不可行: I.我将数据集绑定到此,

好的,这是一个有趣的例子,也是我迄今为止所做的工作的一部分。到目前为止,一些人声称这是无法做到的,因为SSRS处理默认值的默认行为。然而,我已经走得很远了,我很好奇我是否能一直做到

问题:我想做的是让用户在诸如“This Month”、“LastMonth”等语句之间进行预定义。。。然后,这将使用该字符串引用的日期时间填充变量,但用户可以稍后对其进行更改,并应根据父字符串进行刷新,或者让用户在单个日期时间参数上选择不同的日期时间。

首先,让我们研究哪些可行,哪些不可行:

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

select 
'Today' as Description
,   DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) BegDt
union
select 
    'ThisMonth'
,   Dateadd(month, Datediff(month, 0, getdate()), 0) 
二,。然后我设置了一个名为“DatesPeriod”的参数,然后在选择“从查询获取值”时添加“Description”作为参数的字段和标签。用户现在可以从下拉列表中选择“今天”或“本月”

三、 我现在设置了另一个数据集,并将其标记为“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变量也将更改。我已经将一个文本选项本质上绑定到一个datetime变量,该变量现在的作用域仅限于描述的可用和默认值。这将范围限制为1,强制传递默认值

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

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

 Select isnull(@UserStart, @Start) as Choice
七,。我创建了一个表对象,并将其放在我的报告中,然后放在上面列出的单个单元格中,以查看当用户用自己的选择(从SSRS提供的日历显示)覆盖默认“开始”值时,它将显示

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

任何帮助都将不胜感激。

根据不刷新默认参数的能力,“按设计”

“如上所述,这不是一个bug。我们不会重新计算后续参数的默认值,除非所选值不再在“有效值”列表中。我们不知道当前值是由用户特别请求的,还是因为默认值而存在。你可以通过某种属性来控制这种行为,但它目前正在按设计工作

建议的解决方法:

我已经玩了一段时间了,我能看到的唯一解决方案是改变用户使用报告的方式

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

where Table.DateStart < isnull(@UserStart, @Start)
where Table.DateStart
这允许用户选择
DatePeriod
运行报告或使用自己的自定义日期范围进行更新

样本:


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

  • 添加文本参数“DateRange”。设置可用值,如:
  • 选择日期:选择

    今年:今年

    去年:去年

    全部:全部

    将DefaultValue设置为None

  • 创建存储过程“GetDateRangeFromDesc”,如下所示:
  • 创建过程[dbo]。[GetDateRangeFromDesc]

    @量程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
    
  • 添加数据集“DateRangeValues”
  • 选择存储过程“GetDateRangeFRomDesc”

    字段应为Date1和Date2

    参数应为@Range:[@DateRange]

  • 添加日期/时间参数“StartDate”。将AvailableValue和DefaultValue设置为:
  • 从查询中获取值。数据集:DateRangeValues;值/标签字段:Date1

  • 添加日期/时间参数“EndDate”。将AvailableValue和DefaultValue设置为:
  • 获得价值