SSRS报告中的IIF无效

时间:2015-01-06 17:36:20

标签: reporting-services visual-studio-2013 sql-server-2008-r2 ssrs-2008-r2

在我的SSRS报告中,报告可以使用2个Null参数运行,或者用户可以使用YYYYMMDD格式输入start amd结束日期。

如果报告使用Null参数运行,我有一个文本框,如果数据集只显示月份和年份,如果用户放入日期参数​​,则文本框应显示格式为DD的开始和结束日期MMMM YYYY如下

From 02 October 2014 to 03 November 2014

但是尽管尝试了几个小时,但我没有成功地在表达式中使用IIF函数来使文本框起作用。

以下是基本代码:

= IIF(IsNothing(Parameters!StartDate.Value), 
" for " & MonthName(Month(DateAdd("m",-1,Today))) & " " & Year(DateAdd("m",-1,Today)), 
"From " & 
    RIGHT(Parameters!StartDate.Value,2) + " " + 
    MonthName(CInt(Mid(Parameters!StartDate.Value,5,2))) & " " &
    LEFT(Parameters!StartDate.Value,4) & 
" to " &
    Right(Parameters!EndDate.Value, 2) + " " &
    MonthName(CInt(Mid(Parameters!EndDate.Value,5,2))) & " " &
    Left(Parameters!EndDate.Value, 4)
)

以下是自己的作品:

"From " & Right(Parameters!StartDate.Value, 2) + "-" + 
    MonthName(CInt(Mid(Parameters!StartDate.Value,5,2))) & "-" &
    Left(Parameters!StartDate.Value, 4)
&
" to " &
    Right(Parameters!EndDate.Value, 2) + "-" &
    MonthName(CInt(Mid(Parameters!EndDate.Value,5,2))) & "-" &
    Left(Parameters!EndDate.Value, 4)

并且这可以自己工作(对于缺少参数或Null的情况):

=" for " & MonthName(Month(DateAdd("m",-1,Today))) & " " & Year(DateAdd("m",-1,Today))

所以我知道两个IIF选项的逻辑和代码没有问题。

当使用Null参数运行报表时,它应显示for October 2014,当它使用参数(例如 20141002 20141103 )运行时,它应显示{ {1}}

更新: 我似乎记得VB6中from 02 October 2014 to 03 November 2014函数在返回评估结果之前评估所有表达式。这意味着如果IIF Null ,那么即使将使用True部分,错误部分也会引发错误...

我应该如何编写IIF功能才能正常工作?

如何使用Parameters!EndDate.Value

编写

2 个答案:

答案 0 :(得分:1)

是的,IIF在渲染之前会对两边进行评估,并且由于参数可以为null,因此eval会失败。我认为这很愚蠢,但是......

以下是编写大约100行代码以使IIF工作的解决方法。

SSRS允许自定义VB(仅VB,而不是C#)代码。

在报告属性中,在自定义代码块中输入此

Public Shared Function DateString(startDate As String, endDate As String) As String
    Dim s As New DateTime()
    Dim e As New DateTime()
    Dim now As DateTime = DateTime.Now

    If String.IsNullOrEmpty(startDate) OrElse String.IsNullOrEmpty(endDate) Then
        Return " for " & now.ToString("MMMM yyyy")
    End If

    s = DateTime.ParseExact(startDate, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture)

    e = DateTime.ParseExact(endDate, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture)

    Return String.Format("From {0} to {1}", s.ToString("MMMM yyyy"), e.ToString("MMMM yyyy"))
End Function

在字段表达式中输入此

= Code.DateString(Parameters!StartDate.Value, Parameters!EndDate.Value)

答案 1 :(得分:0)

尝试:

FORMAT(CDate(Max(IIf(((CSTR(Fields!Planned_End_Date.Value)="2050-01-01 00:00:00.000")

或:(CSTR(Fields!Planned_End_Date.Value)="")),"1900-01-01",Fields!Planned_End_Date.Value))),"MMM-dd-yyyy"))