【问题标题】:SSRS - Next/Previous Record Button Based on DateSSRS - 基于日期的下一个/上一个记录按钮
【发布时间】:2020-05-13 17:43:44
【问题描述】:

我在 SSRS 中有一份报告,其中显示了基于日期参数的各种 tablix。用户将选择一个日期,报告将根据该日期填充。这工作正常。但是,我还希望用户能够单击“下一条记录”按钮(和“上一条记录”按钮),并且参数(和报告)将根据数据库中的下一个日期进行更改。

我通常会通过创建一个带有操作的文本框来完成此操作。例如,我将创建一个文本框“下一条记录”,进入文本框属性 > 操作 > 转到报告 >,然后发送一个通常类似于 Parameters!survey_id.Value + 1 的新参数。如果我想将数字 ID 增加一个静态数字(即增加 1),这很有效。如果我想将日期增加 1 天,我认为它也适用于日期;但是如果下一条记录不是一天,我该怎么做呢?

我认为可行的一种方法是在数据集中创建一个 row_number 字段,为参数提供值。代码如下:

select distinct sm.survey_date
,row_number() Over (order by survey_date) as increment
from survey_main as sm
group by sm.survey_date --sometimes there are multiple surveys in one day
order by sm.survey_date desc

给出结果

survey_date         increment
2019-09-16          194
2019-08-24          193
2019-01-14          192

我的想法是我可以使用文本框操作中的增量字段来查找下一个调查日期,但我无法弄清楚代码(或者如果可能的话)。

有没有办法让它发挥作用?您还有其他可以想到的建议或解决方法吗?

谢谢!

【问题讨论】:

    标签: sql-server reporting-services ssrs-tablix ssrs-2017


    【解决方案1】:

    有几种方法可以做到这一点,但这是我的方法。

    如果报告数据集是这样的(这可以重构,但这样更容易消化)

    DECLARE @nextDate date
    
    SELECT @nextDate = MIN(sm.survey_date) 
        FROM survey_main sm 
        WHERE sm.survey_date >= @reportParameterDate -- this is the date passed in from the report
    
    SELECT * 
        FROM survey_main sm
        WHERE sm.survey_date = @nextDate
    

    因此,第一次运行报告时,如果您在 2019 年 8 月 24 日通过,那么您将获得该日期的数据,如果您在 2019 年 8 月 25 日通过,您将获得 2019 年 9 月 16 日的数据

    然后在文本框“按钮”的操作上,日期参数将是和表达式类似

    =DATEADD("d", 1, FIRST(Fields.survey_date.Value, "myDatasetName"))
    

    这将为数据集中的survey_date 加1(这些都应该相同,因此可以使用FIRST())。

    回到第一次运行,我们将参数正常设置为 2019-08-24 并获取该日期的数据,现在当我们单击“下一个记录”按钮时,它将采用 FIRST 调查日期(即 2019 -08-24) 并添加 1 天并通过操作将其传递给报告。所以我们将通过 201-08-25。报告数据集将获取 >= 我们传入的日期的 MIN 调查日期,在本例中为 2019-08-25,并返回 2019-09-16,我们将其粘贴在 @nextDate 中,随后过滤返回的数据。

    希望这是有道理的。

    【讨论】:

    • 感谢您的回复,哇,我还有很多东西要学!我做了你所说的一切,这很有意义(至少在理论上,但我还有更多要学的东西),但它并不完全有效。它在下一个日期提前 1 天时有效,但如果提前 2 天以上,它仍然不高兴。对我来说,似乎当您单击“下一条记录”按钮时,它会从旧数据集中获取日期,然后添加一天;而不是将“survey_date + 1”值传递给新运行的数据集。如果这有意义的话。
    • 我都是凭记忆做的,所以它可能不是 100% 准确的。首先要做的是在 SSMS 中使用各种日期运行数据集查询,并检查您是否获得了正确的结果。因此,在该日期有实际数据的几个日期运行它,然后在特定日期没有数据的几个日期运行它,以确保它获得下一个可用数据。 (如果我理解您的理解,每个报告执行应该只返回一天的数据。)让我知道检查是如何进行的。
    • 晚了几个星期才回来,再次感谢您的帮助。该查询在 SSMS 中运行良好,当我在查询中传递任何日期时,它会正确地为我提供正确的下一个日期(即使它不是第二天)。当我在 SSRS 中运行报告时,它仅在“下一个日期”是确切的第二天时才能正常工作。同样,在我看来,当我单击“文本框操作按钮”时,它会绕过查询/数据集并将“第二天”值直接推送到报告中。您确定按下操作按钮会将参数发送回查询/数据集吗?
    • 所以,我实际上想出了如何自己做(在你的帮助下)。我基本上使用了两种不同的查找函数。我首先使用查找函数将参数日期与查询的“增量”字段匹配。然后我使用另一个查找函数对同一查询进行“增量值加一”,然后通过“操作按钮”传递该结果。再次感谢您的帮助!
    • 很高兴你让它工作,但我确实测试了我的方法,它按预期工作,所以我不确定有什么不同。无论如何,如果这回答了您的问题,请将其标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多