9

我有一个报告服务 (SQL 2008) 报告,其中包含两个日期/时间参数 - begindate 和 enddate。我需要将 enddate 限制为与 begindate 相同的月份和年份。这似乎应该是一件容易的事,但我无法弄清楚。

目前,我正在检查传递给存储过程的参数,如果两个日期时间参数不在同一月份和年份,则会引发错误。我正在寻找一种更优雅的方式来实现这一点。

4

4 回答 4

6

您可以检查参数表达式中的 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)

在 tbDateParameterMessage 文本框的 Value 属性中:

= Code.DateMessage

在 Hidden 属性表达式中:

= 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 论坛

于 2009-03-03T15:44:18.137 回答
1

很多时候,在 SSRS 报告中使用 Msgbox 功能会出现部署问题。它们在我们的开发机器上运行良好,但在实际部署时可能很难开始工作。以下是一些解释问题的链接:

来自 MSDN

从 SQLDev

我的解决方案是一个非常简单的实现,报告被停止,但它只是显示一个报告错误,并从报告查看器向用户显示消息。

  1. 创建一个新的文本/字符串参数(我称之为 CheckDateRange)
  2. 允许空白值并将其隐藏
  3. 可用值 = 无
  4. 高级 = 使用默认值
  5. 默认值 = 指定值 - 在值中,使用功能按钮并使用以下内容: =CODE.CheckDateParameters(Parameters!BeginDate.Value,Parameters!EndDate.Value) - 请注意,您可以看到我检查日期的参数名称是 BeginDate和结束日期
  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
    

没有什么花哨的,但可以满足您的需求。

祝你好运!

于 2011-05-23T14:14:59.570 回答
0

我使用了隐藏文本框的想法,因为它比让报告崩溃要好。我希望完成的是强制用户在报告执行之前预先更改他们的参数。

顺便说一句,语法不起作用。我改用这个:

= Month(Parameters!begindate.Value) = Month(Parameters!enddate.Value) and Year(Parameters!begindate.Value) = Year(Parameters!enddate.Value)

感谢coldice的想法。

于 2009-03-03T19:16:10.387 回答
0
>     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 功能,因此不能在呈现的网页上使用。

于 2013-07-02T03:45:13.643 回答