Службы Reporting Ограничения Параметра

У меня есть отчет служб reporting services (SQL 2008) с двумя параметрами даты/времени - begindate и enddate. Мне нужно ограничить enddate тем же месяцем и годом, что и begindate. Кажется, это должно быть легко сделать, но я не могу понять.

В настоящее время я проверяю параметры, переданные хранимой процедуре, и вызываю ошибку, если два параметра datetime не находятся в одном месяце и Году. Я ищу более элегантный способ решения этот.

4 ответов


вы можете проверить значение EndDate в выражении параметра, и если оно неверно, установите его в StartDate + 1 месяц.
Что-то вроде:

= IIF(DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) = 0, Parameters!EndDate.Value, AddDate(DateInterval.Month, 1, Parameters!StartDate.Value))

если вы просто хотите уведомить Пользователя, вы можете разместить скрытое текстовое поле с соответствующим форматированием (красный большой шрифт) и сообщение о неправильном диапазоне параметров даты. В скрытом выражении set

= (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. Они отлично работают на наших машинах разработки, но могут быть трудными для работы при фактическом развертывании. Вот несколько ссылок, объясняющих проблемы:

из MSDN

Из SQLDev

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

  1. создайте новый параметр text / string (я назвал его CheckDateRange)
  2. разрешить пустые значения и сделать его скрытым
  3. доступные значения = нет
  4. Advanced = использовать значения по умолчанию
  5. значения по умолчанию = укажите значения-в значении, используйте кнопку функции и используйте следующее: =код.CheckDateParameters (Параметры!BeginDate.Значение, Параметры!Параметр enddate.Value) - обратите внимание, что вы можете видеть мой имена параметров для проверяемых дат: BeginDate и EndDate
  6. наконец, для кода отчета введите следующий фрагмент кода:

    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, поэтому ее нельзя использовать на отображаемой веб-странице.