SSRS 报告中的 IIF 不起作用

IIF in SSRS Report not working

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

如果报表使用 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,当它使用参数运行时(例如 2014100220141103) 它应该显示 from 02 October 2014 to 03 November 2014

更新: 我似乎记得从 VB6 开始,IIF 函数在返回计算结果之前计算所有表达式。这意味着如果 Parameters!EndDate.ValueNull 那么 false 部分会抛出错误,即使将使用 True 部分...

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

怎么可能用Switch

写成

是的,IIF 在呈现之前对双方进行评估,并且由于参数可以为空,因此评估失败。我认为这很愚蠢,但是....

这是一种解决方法,只需编写大约 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)

尝试:

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"))