SSRS:在两页报告中显示正确的执行时间?

时间:2011-12-13 01:46:59

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

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

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

="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)。

在不使用上述信息的情况下显示报告执行时间的最佳方法是什么?

编辑(因为我不能发布一个&lt; 100声誉的答案):

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

如前所述,我有以下内容:

="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)", ""))
)

6 个答案:

答案 0 :(得分:7)

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

如前所述,我有以下内容:

="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)", ""))
)

答案 1 :(得分:3)

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

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()

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

您可以使用以下内容跟踪持续时间(以毫秒为单位):

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

答案 4 :(得分:-1)

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

  1. 右键单击报表设计窗格(空白区域)&gt; 报告属性
  2. 点击变量
  3. 添加新变量&gt;例如的 vReportExecDuration 即可。
  4. 添加表达式...
  5. = IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds&lt; 1,&#34; 0秒&#34;, ( IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours&gt; 0,System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours&amp;&#34; hour(s),&#34;, &#34;&#34;)+ IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes&gt; 0,System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes&amp;&#34; minute(s),&#34;, &#34;&#34;)+ IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds&gt; 0,System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds&amp;&#34; second(s)&#34;,& #34;&#34)) )

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

答案 5 :(得分:-2)

你可以试试这个。

  

= IIF(Sum(Fields!inb_insug_cnt.Value)= 0,“ - ”,FLOOR(Sum(Fields!inb_insug_duration.Value)/ 3600)&amp;“:”&amp; IIF(Sum(Fields!inb_insug_duration.Value) )&gt; 3600,右(“0”&amp; FLOOR((Sum(Fields!inb_insug_duration.Value)MOD 3600)/ 60),2),RIGHT(“0”&amp; FLOOR(Sum(Fields!inb_insug_duration.Value)) / 60),2))&amp;“:”&amp; RIGHT(“0”&amp;(Sum(Fields!inb_insug_duration.Value)MOD 60),2))