Ограничение параметров Служб отчетов
-
03-07-2019 - |
Вопрос
У меня есть отчет служб Reporting services (SQL 2008) с двумя параметрами даты / времени - begindate и enddate.Мне нужно ограничить дату окончания тем же месяцем и годом, что и дату начала.Кажется, что это должно быть легко сделать, но я не могу в этом разобраться.
В настоящее время я проверяю параметры, переданные хранимой процедуре, и выдаю сообщение об ошибке, если два параметра datetime не относятся к одному месяцу и году.Я ищу более элегантный способ добиться этого.
Решение
Вы можете проверить значение EndDate в выражении параметра, и если оно неверно, установите для него значение StartDate + 1 месяц.
Что -то вроде:
= IIF(DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) = 0, Parameters!EndDate.Value, AddDate(DateInterval.Month, 1, Parameters!StartDate.Value))
Если вы просто хотите уведомить пользователя, вы можете поместить какое-нибудь скрытое текстовое поле с соответствующим форматированием (красный крупный шрифт) и сообщением о неверном диапазоне параметров даты.В наборе скрытых выражений
= (DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) <> 0)
Кроме того, вы можете комбинировать оба действия с пользовательским кодом:
Public DateMessage As String
Public Function ValidateDate(StartDate As DateTime, EndDate As DateTime) As DateTime
Dim ResultDate As DateTime
If (DateDiff(DateInterval.Month, StartDate, EndDate) <> 0) Then
ResultDate = AddDate(DateInterval.Month, 1, StartDate)
DateMessage = String.Format("End Date parameter value {0}
was out of range and was changed to {1}", EndDate, ResultDate)
Else
ResultDate = EndDate
End If
End Function
Затем в выражении значения параметра:
= Code.ValidateDate(Parameters!StartDate.Value, Parameters!EndDate.Value)
В свойстве Value текстового поля tbDateParameterMessage:
= Code.DateMessage
И в выражении скрытого свойства:
= String.IsNullOrEmpty(Code.DateMessage)
Редактировать Но если вы хотите остановить запуск отчета, используйте этот пользовательский код:
Public Function CheckDate(SDate as Date, EDate as Date) as Integer
Dim msg as String
msg = ""
If (SDate > EDate) Then
msg="Start Date should not be later than End Date"
End If
If msg <> "" Then
MsgBox(msg, 16, "Parameter Validation Error")
Err.Raise(6,Report) 'Raise an overflow
End If
End Function
Это взято из Форум SQLServerCentral.
Другие советы
Очень часто возникают проблемы с развертыванием при использовании функции Msgbox в отчете SSRS.Они прекрасно работают на наших машинах разработки, но при фактическом развертывании их может быть сложно заставить работать.Вот пара ссылок, объясняющих проблемы:
Мое решение представляло собой ОЧЕНЬ упрощенную реализацию, в которой отчет был остановлен, но оно просто показывает ошибку отчета с сообщением, отображаемым пользователю из средства просмотра отчетов.
- Создайте новый текстовый / строковый параметр (я назвал его CheckDateRange).
- Разрешить пустые значения и сделать их скрытыми
- Доступные значения = отсутствуют
- Дополнительно = Использовать значения по умолчанию
- Значения по умолчанию = укажите значения - в поле Значение используйте функциональную кнопку и используйте следующее:=КОД.CheckDateParameters(Параметры!Дата начала.Значение, параметры!Дата окончания.Значение) - обратите внимание, что вы можете видеть имена моих параметров для отмеченных дат: BeginDate и EndDate
Наконец, в качестве кода отчета введите следующий фрагмент кода:
Function CheckDateParameters(StartDate as Date, EndDate as Date) as Integer Dim msg as String msg = "" If (StartDate > EndDate) Then msg="Start Date should not be later than End Date" Err.Raise(22000, "VBCore.Utility", msg) End If End Function
Ничего особенного, но выполняет то, что вам нужно.
Удачи вам!
Я использовал идею скрытого текстового поля, потому что это было лучше, чем допустить сбой отчета.Чего я надеялся добиться, так это заставить пользователя изменить свои параметры заранее, перед выполнением отчета.
Кстати, синтаксис не сработал.Вместо этого я использовал это:
= Month(Parameters!begindate.Value) = Month(Parameters!enddate.Value) and Year(Parameters!begindate.Value) = Year(Parameters!enddate.Value)
Спасибо coldice за идею.
> Public Function CheckDate(SDate as Date, EDate as Date) as Integer Dim msg as String
> msg = ""
> If (SDate > EDate) Then msg="Start Date should not be later than End Date"
> End If
> If msg <> "" Then MsgBox(msg, 16, "Parameter Validation Error") Err.Raise(6,Report) 'Raise an overflow
> End If End Function
Если они не внесли изменений, функция MsgBox () не будет работать с SSRS.Это не работает в SSRS 2010.Я полагаю, что это функция Windows, поэтому ее нельзя использовать на отображаемой веб-странице.