Reporting Services参数约束
-
03-07-2019 - |
题
我有一个带有两个日期/时间参数的报告服务(SQL 2008)报告 - begindate和enddate。我需要将enddate限制在相同的月份和年份。这似乎应该是一件容易的事情,但我无法弄明白。
目前,我正在检查传递给存储过程的参数,如果两个日期时间参数不在同一个月和一年,则会引发错误。我正在寻找一种更优雅的方式来实现这一目标。
解决方案
您可以检查参数表达式中的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
其他提示
通常,在SSRS报告中使用Msgbox功能存在部署问题。它们在我们的开发机器上运行良好,但在实际部署时可能很难工作。以下是一些解释问题的链接:
我的解决方案是一个非常简单的实现,其中报告已停止,但它只显示报告错误,并从报告查看器向用户显示消息。
- 创建一个新的文本/字符串参数(我称之为CheckDateRange)
- 允许空白值并将其隐藏
- 可用值=无
- 高级=使用默认值
- 默认值=指定值 - 在“值”中,使用功能按钮并使用以下命令:= CODE.CheckDateParameters(Parameters!BeginDate.Value,Parameters!EndDate.Value) - 请注意,您可以查看已选中的参数名称日期是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
醇>
没什么好看的,但能完成你所需要的。
祝你好运!我使用了隐藏文本框的想法,因为它比让报告崩溃更好。我希望完成的是强制用户在报告执行之前预先更改他们的参数。
BTW,语法不起作用。我改用了这个:= Month(Parameters!begindate.Value) = Month(Parameters!enddate.Value) and Year(Parameters!begindate.Value) = Year(Parameters!enddate.Value)
感谢冷酷的想法。
> 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功能,所以不能在渲染的网页上使用。
不隶属于 StackOverflow