Вопрос

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

Из MSDN

Из SQLDev

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

  1. Создайте новый текстовый / строковый параметр (я назвал его CheckDateRange).
  2. Разрешить пустые значения и сделать их скрытыми
  3. Доступные значения = отсутствуют
  4. Дополнительно = Использовать значения по умолчанию
  5. Значения по умолчанию = укажите значения - в поле Значение используйте функциональную кнопку и используйте следующее:=КОД.CheckDateParameters(Параметры!Дата начала.Значение, параметры!Дата окончания.Значение) - обратите внимание, что вы можете видеть имена моих параметров для отмеченных дат: 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, поэтому ее нельзя использовать на отображаемой веб-странице.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top