“是”,“否”,“其他”的SSRS程序流程

时间:2019-03-19 13:00:05

标签: sql reporting-services

我正在创建一个SSRS报告,并具有三个日期字段。

开始日期 目标日期 CompleteDate

在我的报告中,我想创建一个具有一些条件的计算字段,以确定是否满足目标日期。

  1. If CompleteDate <= TargetDate then "Yes", "No"

  2. If CompleteDate is NULL but TargetDate has not exceeded current date then "Pending","No" (即开始日期为01/01/2019,目标日期为20/03/2019

编辑1 *

IIF(Fields!CompleteDate.Value <= Fields!TargetDate.Value, "Yes", IIF(Fields!CompleteDate.Value Is Nothing AND Fields!TargetDate.Value < Now(), "Pending", "No")

即使已达到TargetDate,它也会返回“否”或“待处理”。

编辑2 *

IIF((Format(Fields!CompleteDate.Value,"dd-MM-yyyy") <= (Format(Fields!TargetDate.Value,"dd-MM-yyyy"), "Yes", IIF(Fields!CompleteDate.Value Is Nothing AND Fields!TargetDate.Value < Now(), "Pending,"No")

有关“由于没有可访问的'IIF'接受此数量的参数,所以重载解析失败,”错误。支架放错了位置吗?

编辑3 * @Sentinel-Switch表达式效果完美

=Switch( NOT isNothing(Fields!CompleteDate.Value) AND Fields!CompleteDate.Value <= Fields!TargetDate.Value, "Completed On-Time" , NOT isNothing(Fields!CompleteDate.Value) AND Fields!CompleteDate.Value > Fields!TargetDate.Value, "Completed Late" , isNothing(Fields!StartDate.Value), "Not Started" , Fields!TargetDate.Value > Now(), "In Progress" , Fields!TargetDate.Value <= Now(), "Running Late" , TRUE, "Other")

感谢@ Sentinel,@ Steve-o169非常感谢

2 个答案:

答案 0 :(得分:1)

使用SWITCH函数,

  

计算一个表达式列表,并返回与列表中第一个表达式为true对应的Object值。

=Switch( NOT isNothing(Fields!CompleteDate.Value) AND
         Fields!CompleteDate.Value <= Fields!TargetDate.Value, "Completed On-Time"
       , NOT isNothing(Fields!CompleteDate.Value) AND
         Fields!CompleteDate.Value >  Fields!TargetDate.Value, "Completed Late"
       , isNothing(Fields!StartDate.Value), "Not Started"
       , Fields!TargetDate.Value > Now(), "In Progress"
       , Fields!TargetDate.Value <= Now(), "Running Late"
       , TRUE, "Other")

您可以根据需要调整逻辑表达式和字符串值。请记住,第一个计算为TRUE的表达式将获胜。在我的样本测试中,我的数据中有NULL CompleteDates,并且与非null TargetDates进行比较时,它们的值为TRUE而不是FALSE,因此,{{前两个测试中的1}} s。如果您的NOT isNothing()可以为空,那么您可能还需要在逻辑语句中检查该条件。

答案 1 :(得分:0)

因此,到达SSRS时通常没有NULL值。您需要与Nothing进行比较以获得所需的结果。在相同的条件语句中,您需要将TargetDateNow()进行比较,这将为您提供当前时间。因此2的表达式将类似于以下内容。

=IIF(Fields!CompleteDate.Value Is Nothing AND Fields!TargetDate.Value <= Now(), "Pending", "No")

因此,如果我理解正确,那么您希望所有这些都在一个表达式中。如果是这样,则应如下所示。

=IIF(Fields!CompleteDate.Value <= Fields!TargetDate.Value, "Yes",
    IIF(Fields!CompleteDate.Value Is Nothing AND Fields!TargetDate.Value < Now(), "Pending", "No")

您可能需要格式化日期以使其与表达式匹配,具体取决于您的日期值是如何从数据库中输入的。像Format(Fields!TargetDate.Value,”dd-MM-yyyy”) < Format(Now(),”dd-MM-yyyy”)这样的东西可能会解决问题。

编辑:基于下面的评论,我建议在比较值之前格式化它们的值。尝试以下表达式。

    =IIF((Year(Fields!CompleteDate.Value) <= Year(Fields!TargetDate.Value)) AND DatePart(DateInterval.DayOfYear, Fields!CompleteDate.Value) <= DatePart(DateInterval.DayOfYear, Fields!TargetDate.Value) , "Yes",
  IIF(Fields!CompleteDate.Value Is Nothing AND Fields!TargetDate.Value < Now(), "Pending", "No")