SSRS: показывает правильное время выполнения в двухстраничном отчете? - PullRequest
7 голосов
/ 13 декабря 2011

Мне просто интересно, как я могу показать правильное время выполнения в отчете?

До недавнего времени в нижнем колонтитуле моих отчетов использовалось следующее в качестве выражения метки:

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

Каков наилучший метод для отображения времени выполнения отчета без использования вышеуказанной информации?

Изменить (ответьте, поскольку я не могу опубликовать сообщение с репутацией <100): </strong>

Я действительно использовал другой подход к этому, поскольку я не заметил здесь никаких ответов до сих пор. Возможно, не так хорошо, как приведенные выше ответы, но я бы сказал, что простое решение, которое может быть реализовано, когда умение делать альтернативные решения недоступно:

Как упоминалось ранее, у меня было следующее:

="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 секунд, чтобы перейти на вторую страницу. Это связано с тем, что время выполнения рассчитывается для каждого рендера (новая страница или экспорт в PDF) с использованием System.DateTime.Now.

Чтобы избежать этого, время создания отчета должно храниться в переменной (я изначально намеревался сохранить всю строку выше, однако время выполнения, похоже, не доступно для выражения переменной отчета, так как я при условии, что они инициализированы до того, как это будет завершено). Для этого сначала перейдите в Свойства отчета и добавьте новую переменную. Для этого примера я назвал переменную 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 ]

7 голосов
/ 14 декабря 2011

Я действительно использовал другой подход к этому, поскольку я не заметил здесь никаких ответов до сих пор. Возможно, сейчас так же хорошо, как и выше, но я бы сказал, что простое решение, которое можно реализовать, когда навык для создания альтернативных решений недоступен:

Как упоминалось ранее, у меня было следующее:

="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 секунд, чтобы перейти на вторую страницу. Это связано с тем, что время выполнения рассчитывается для каждого рендера (новая страница или экспорт в PDF) с использованием System.DateTime.Now.

Чтобы избежать этого, время создания отчета должно быть сохранено в переменной (я изначально намеревался сохранить всю строку выше, однако время выполнения, кажется, не доступно для выражения переменной отчета, так как я при условии, что они инициализированы до того, как это будет завершено). Для этого сначала перейдите в Свойства отчета и добавьте новую переменную. Для этого примера я назвал переменную 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)", ""))
)
3 голосов
/ 13 декабря 2011

Я бы построил это, используя пользовательский код:

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

и ваше время выполнения будет рассчитано только один раз для первого нижнего колонтитула, а затем вернет ранее вычисленный результат.

1 голос
/ 13 декабря 2011

Я медленно двигаюсь к добавлению времени выполнения в качестве поля к наборам данных отчетов. Это особенно полезно при использовании кэшированных наборов данных: время выполнения отчета не совсем то, что хочет пользователь; они хотят знать, когда данные были текущими.

SELECT
   GetDate() AS ExecTime,
   ...other SQL...
...
0 голосов
/ 10 ноября 2015

Наиболее эффективный способ сделать это - создать пользовательскую переменную, которая хранит значение в памяти, а затем вызывать ее каждый раз в текстовом поле.

  1. Щелкните правой кнопкой мыши на дизайне отчетапанель (пустое место)> Свойства отчета .
  2. Щелкните Переменные .
  3. Добавить новую переменную> например, vReportExecDuration .
  4. Добавить выражение ...

= IIf (System.DateTime.Now.Subtract (Globals! ExecutionTime) .TotalSeconds <1, "0 секунд", (IIf (System.DateTime.Now.Subtract (Globals! ExecutionTime). Часы> 0, System.DateTime.Now.Subtract (Globals! ExecutionTime). Часы & "час (ы),", "") + IIf (Система.DateTime.Now.Subtract (Globals! ExecutionTime). Минуты> 0, System.DateTime.Now.Subtract (Globals! ExecutionTime). Минуты & "minute (s),", "") + IIf (System.DateTime.Now.Вычесть (Globals! ExecutionTime) .Seconds> 0, System.DateTime.Now.Subtract (Globals! ExecutionTime) .Seconds & "second (s)", "")))

Хорошо, чтобы сохранить состояние. Из вашего текстового поля в верхнем / нижнем колонтитуле добавьте = Переменные! VReportExecDuration.Value , и это будет статическим на каждой странице отчета.
0 голосов
/ 18 октября 2012

Вы можете отслеживать длительность в миллисекундах, используя следующее:

="Execution Time: " + CStr(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalMilliseconds) + "Milliseconds(s)"
0 голосов
/ 29 августа 2012

Вы можете попробовать это.

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

...