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
,当它使用参数运行时(例如 20141002 和 20141103) 它应该显示 from 02 October 2014 to 03 November 2014
更新:
我似乎记得从 VB6 开始,IIF
函数在返回计算结果之前计算所有表达式。这意味着如果 Parameters!EndDate.Value
是 Null 那么 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"))
在我的 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
,当它使用参数运行时(例如 20141002 和 20141103) 它应该显示 from 02 October 2014 to 03 November 2014
更新:
我似乎记得从 VB6 开始,IIF
函数在返回计算结果之前计算所有表达式。这意味着如果 Parameters!EndDate.Value
是 Null 那么 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"))