0

在我SSRS报表报表可以用2个空参数运行,或者用户可以输入开始格式YYYYMMDD AMD结束日期。IIF在SSRS报告不工作

如果报告使用空参数运行,那么我有一个文本框,应该只显示Month和Year如果数据集,如果用户放入日期参数​​,那么文本框应显示格式为的开始和结束日期为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) 

这一点也适用于它自己(的情况下,当参数丢失或空):

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

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

当报告与空参数也应显示for October 2014,当它与参数(如和)运行它应该表现出from 02 October 2014 to 03 November 2014

更新运行: 我似乎记得从VB6的IIF函数返回的评估结果前评估所有表达式。这意味着,如果Parameters!EndDate.Value那么错误是由就算真一部分将用于假部分抛出...

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

怎么可能用它来编写Switch

回答

1

是IIF做的eval之前,双方呈现既然一个参数可以是空的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) 
+0

这是光荣的,但不得不将它改为'Dim now As DateTime = DateTime.Now.AddMonths(-1)'以获得前一个月的名称... 非常感谢您的帮助 - 我试过了嵌套的IIF与内部的一个返回true或false,但仍然无法让它工作,所以你的解决方案是非常有帮助的 –

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