【问题标题】:Reporting Services Parameter ConstraintReporting Services 参数约束
【发布时间】:2009-03-03 14:38:05
【问题描述】:

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

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

【问题讨论】:

    标签: reporting-services ssrs-2008


    【解决方案1】:

    您可以检查参数表达式中的EndDate值,如果不正确,请将其设置为StartDate + 1 Month。
    比如:

    = 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
    

    并在隐藏属性表达式中:

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

    【讨论】:

    • 我想过,但问题是用户可能没有注意到日期已调整。我想做的是显示一个对话框,告诉他们日期必须在同一个月内。
    【解决方案2】:

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

    From MSDN

    From SQLDev

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

    1. 创建一个新的文本/字符串参数(我称之为 CheckDateRange)
    2. 允许空白值并将其隐藏
    3. 可用值 = 无
    4. 高级 = 使用默认值
    5. 默认值 = 指定值 - 在值中,使用功能按钮并使用以下命令: =CODE.CheckDateParameters(Parameters!BeginDate.Value,Parameters!EndDate.Value) - 请注意,您可以看到我的参数名称检查日期是 BeginDate 和 EndDate
    6. 最后,为报告代码输入以下代码sn -p:

      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
      

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

    祝你好运!

    【讨论】:

      【解决方案3】:

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

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

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

      感谢coldice的想法。

      【讨论】:

      • 是的,我暂时没有 SSRS 和 VB IDE :)。结帐答案更新。
      • 顺便说一句,如果开始日期 = 12/29/2008 和结束日期 = 01/01/2009,那么年份检查呢?
      【解决方案4】:
      >     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 功能,因此不能在呈现的网页上使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多