【问题标题】:SSRS: Showing the correct execution time on a two page report?SSRS:在两页报告上显示正确的执行时间?
【发布时间】:2011-12-13 01:46:58
【问题描述】:

我只是想知道如何在报告中显示正确的执行时间?

直到最近,我一直在报告的页脚中使用以下内容作为标签表达式:

="Execution Time: " +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 seconds", 
(
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours & " hour(s), ", "") +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds & " second(s)", ""))
)

不幸的是(正如预期的那样),每当我浏览到报告的第二页或导出为 PDF 时,此值都会重新计算(因此,如果我在 1 秒内呈现报告,等待 30 秒然后导出为 pdf,则会显示执行时间31s)。

不使用上述信息显示报表执行时间的最佳方法是什么?

编辑(回答,因为我无法发布具有

我实际上对此采取了不同的方法,因为直到现在我才注意到这里有任何回复。也许不如上述答案好,但我会说一个简单的解决方案,可以在没有执行替代解决方案的技能的情况下实施:

如前所述,我有以下几点:

="Execution Time: " +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 seconds", 
(
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours & " hour(s), ", "") +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") +
IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds & " second(s)", ""))
)

当您有一个两页的报告或将报告导出为 PDF 时,这个问题就会出现。如果您要生成一个执行时间为 5 秒的报告,然后等待 30 秒导出为 PDF,则导出报告页脚中的执行时间显示为 35 秒。同样,如果您在报告的第一页并等待 30 秒导航到第二页。这是因为执行时间是使用 System.DateTime.Now 在每次渲染(新页面或 PDF 导出)上计算的。

为避免这种情况,需要将生成报告的时间存储在变量中(我最初打算将整个字符串存储在上面,但是执行时间似乎不适用于报告变量表达式,因为我是假设它们在完成之前被初始化)。为此,首先转到报告属性并添加一个新变量。对于这个例子,我将变量命名为 GroupExecutionTime

将以下表达式添加到变量中,以便使用当前系统时间(将是执行时间)对其进行初始化:

=System.DateTime.Now

完成此操作后,我们需要更新页脚标签以使用变量值而不是当前系统时间(报告变量不会在每次新页面渲染或导出时重新计算页脚标签表达式所在的位置)。

="Execution Time: " +
IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 seconds", 
(
IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Hours > 0, Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Hours & " hour(s), ", "") +
IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Minutes > 0, Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") +
IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Seconds > 0, Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Seconds & " second(s)", ""))
)

【问题讨论】:

    标签: reporting ssrs-2008 reportingservices-2005 reporting-services


    【解决方案1】:

    我实际上对此采取了不同的方法,因为直到现在我才注意到这里有任何回复。也许现在和上面一样最好,但我会说一个简单的解决方案,可以在没有执行替代解决方案的技能的情况下实施:

    如前所述,我有以下几点:

    ="Execution Time: " +
    IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 seconds", 
    (
    IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours & " hour(s), ", "") +
    IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") +
    IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds & " second(s)", ""))
    )
    

    当您有一个两页报告或将报告导出为 PDF 时,这个问题就会出现。如果您要生成一个执行时间为 5 秒的报告,然后等待 30 秒导出为 PDF,则导出报告页脚中的执行时间显示为 35 秒。同样,如果您在报告的第一页并等待 30 秒导航到第二页。这是因为执行时间是使用 System.DateTime.Now 在每次渲染(新页面或 PDF 导出)上计算的。

    为避免这种情况,需要将生成报告的时间存储在变量中(我最初打算将整个字符串存储在上面,但是执行时间似乎不适用于报告变量表达式,因为我是假设它们在完成之前被初始化)。为此,首先转到报告属性并添加一个新变量。对于这个示例,我将变量命名为 GroupExecutionTime

    将以下表达式添加到变量中,以便使用当前系统时间(将是执行时间)对其进行初始化:

    =System.DateTime.Now
    

    完成此操作后,我们需要更新页脚标签以使用变量值而不是当前系统时间(报告变量不会在每次新页面渲染或导出时重新计算页脚标签表达式所在的位置)。

    ="Execution Time: " +
    IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "0 seconds", 
    (
    IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Hours > 0, Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Hours & " hour(s), ", "") +
    IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Minutes > 0, Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") +
    IIf(Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Seconds > 0, Variables!GroupExecutionTime.Value.Subtract(Globals!ExecutionTime).Seconds & " second(s)", ""))
    )
    

    【讨论】:

    • 建议的增强功能:将IIf 代码的全部 移动到您的报告属性中,这样就不必在每个页面中重复。
    【解决方案2】:

    我会使用自定义代码构建它:

    Public Dim ExecText As String
    
    Public Function ExecTime() As String
        If (ExecText = "") Then
            ExecText = // Calculate execution time here
        End If
    
        ExecTime = "Execution Time: " + ExecText
    End Function
    

    然后在你的页脚文本框中放

    =Code!ExecTime()
    

    您的执行时间将只计算第一个页脚的一次,之后将返回之前计算的结果。

    【讨论】:

      【解决方案3】:

      我正在慢慢地将执行时间作为字段添加到报告的数据集中。这在使用缓存数据集时特别有用:报表的执行时间并不是用户真正想要的;他们想知道数据的最新时间。

      SELECT
         GetDate() AS ExecTime,
         ...other SQL...
      ...
      

      【讨论】:

      • 取决于您的情况 - 我在办公室,我希望显示两组信息
      【解决方案4】:

      您可以使用以下方法以毫秒为单位跟踪持续时间:

      ="Execution Time: " + CStr(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalMilliseconds) + "Milliseconds(s)"
      

      【讨论】:

      • 请查看我的编辑 - 每当您更改页面或 PDF 时,都会重新计算。我已经在原帖(编辑)中回答了这个问题
      【解决方案5】:

      执行此操作的最有效方法是创建一个用户定义的变量,该变量将值保存在内存中,然后每次在您的文本框中调用它。

      1. 右键单击报表设计窗格(空白处)> 报表属性。
      2. 点击变量。
      3. 添加新变量 > 例如vReportExecDuration。
      4. 添加表达式...

      =IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours & " hours(s), ", "") + IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") + IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds & "second(s)", "")) )

      1. 确定保存状态。
      2. 在页眉/页脚的文本框中,添加 =Variables!vReportExecDuration.Value,这将在每个报告页面上保持静态。

      【讨论】:

      • 这是公认的答案(四年前回答)已经在做的事情。
      • 我只是在顶部有一个标题(文本框)(即没有页脚),这种方法对我有用。
      【解决方案6】:

      你可以试试这个。

      =IIF(Sum(Fields!inb_insug_cnt.Value) = 0 , "-",FLOOR(Sum(Fields!inb_insug_duration.Value)/3600) & ":" & IIF( Sum(Fields!inb_insug_duration.Value) > 3600,RIGHT("0" & FLOOR((Sum(Fields!inb_insug_duration.Value) MOD 3600)/60),2),RIGHT("0" & FLOOR(Sum(Fields!inb_insug_duration.Value)/60),2 )) & ":" & RIGHT("0" & (Sum(Fields!inb_insug_duration.Value) MOD 60), 2))

      【讨论】:

      • 这似乎比我采用的方法更糟糕?我错过了什么吗?当您更改页面或导出到 excel 时,这也会重新计算 - 所以它实际上不起作用
      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多