【问题标题】:SSRS Iif always true when false part contains expression当 false 部分包含表达式时,SSRS Iif 始终为 true
【发布时间】:2015-01-06 14:30:04
【问题描述】:

我有一个输出到 Excel 文件的报告,数据库中的某些字段为空。

我正在尝试在单元格中使用以下 Iif 表达式过滤掉这些空值:

=Iif(
    IsNothing(Fields!START_DATETIME.Value),
    0,
    Fields!START_DATETIME.Value
)

这不起作用,我在数据为空的单元格中得到“#VALUE”,以及有数据的单元格的时间值。

如果我使用相同的表达式而不使用表达式作为第三个参数:

=Iif(
    IsNothing(Fields!START_DATETIME.Value),
    0,
    1
)

我得到1s 表中有日期,0s 没有任何内容。

很抱歉,如果这是重复的,我找不到任何适合我的东西...

编辑: 我正在使用 VisualStudio Professional 2013

更新

我为数据库中的每个条目得到的是:授权时间的日期时间,开始时间的另一个日期时间和停止时间的另一个日期时间时间>。 授权时间总是有一个条目,但开始停止并不总是这样。

我已将日期和时间从各种日期时间拆分为如下列:

  • 授权日期
  • 授权时间
  • 开始时间
  • 停止时间

想法是,如果没有开始和停止时间,就使用授权时间

以下表达式放在开始时间列中。抱歉,我没有足够的代表来发布图片或超过 2 个链接。我已经把程序输出放在这张专辑里了:

http://imgur.com/a/zJSAY

在做:

=Iif(Fields!START_DATETIME.Value is Nothing,
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)),
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value))
)

输出授权时间,这样就可以正常工作了。

但是,这样做:

=Iif(Fields!START_DATETIME.Value is Nothing,
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value)),
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value))
)

输出有条目的开始时间和#VALUE! (null 或类似的) 当没有任何东西时。

然后做:

=Iif(Fields!START_DATETIME.Value is Nothing,
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value)),
    DateAdd(DateInterval.Day,693594,TimeValue(Fields!AUTH_DATETIME.Value))
)

开始时间中有条目的地方输出授权时间和#VALUE!什么都没有的时候。

我想不通。我了解 (1) 和 (3),但我需要 (2) 显示正确的开始时间,同时显示正确的授权时间不是。

更新 2

事实证明,Iif() 会评估每个条件,即使它没有被选中,遇到的任何错误都会继续传递。见cmets到Why isn't my iif statement evaluating true when the condition is correct?

为了解决这个问题,我做了:

=DateAdd(
    DateInterval.Day,
    693594,
    TimeValue(
        Iif(
            Fields!START_DATETIME.Value is Nothing,
            Fields!AUTH_DATETIME.Value,
            Fields!START_DATETIME.Value
        )
    )
)

这似乎对我有用,并且应该是首先做到这一点的常识方式......

再次感谢你们的帮助。

【问题讨论】:

  • 为什么要在包含 DATETIME 的列中显示“0”?它代表什么?您不需要 NULL、空字符串或一些默认日期时间吗?
  • 如果你想像“不显示它们”那样过滤掉它们,你不能在你的查询中这样做吗?
  • @Jeroen 除了#VALUE 之外的任何东西!很好,那只是尝试一下,我可能会留空。
  • @Tino 我可以试试,但是我还没有触及报表设计器之外的查询。我想知道为什么 Iif 不起作用。谢谢你们的意见。

标签: reporting-services iif


【解决方案1】:

Excel 将根据前几个单元格猜测列的类型。如果其中有典型的DATETIME 值,它会猜测该列是日期列,并且在与类型不匹配的值(例如“0”)上会出现“#VALUE!”错误。

你应该问问自己,你想在 Excel 中为 NULL 值显示什么:

  • 如果您只想要一个空单元格,请不要使用表达式。只需 Fields!START_DATETIME.Value 会将 NULL 值呈现为空单元格。
  • 如果您想要一个“基线”日期时间,请确保使用它而不是“0”。最简单的可能是在您的查询中使用ISNULL(START_DATETIME, GETDATE()) 之类的内容。
  • 如果您真的想要一个“0”,请确保它按顺序出现在前几个单元格之一中。 Excel 将看到“0”并且不会将列类型设置为日期/时间。

【讨论】:

  • 谢谢,效果很好。我不敢相信我没有想到这一点。我真是太棒了……对不起,我不能投票,我的名声太小了。
  • 我无法让它只有一个空单元格。知道 Excel 如何存储空白吗?当使用 Nothing (null) 作为 Iif() 表达式的真实部分时,#Value! 被放在那里。
  • @user111395 当START_DATETIMENull 时,您不需要IIF,因为它已经是Null,正如@Jeroen 所说,只需使用=Fields!START_DATETIME.Value 作为您的单元格值表达式。 +1 @Jeroen 以获得很好的解释。
  • @ChrisLätta 这行得通,但 Excel 不知道如何将此输出格式化为日期或时间。我需要一点时间,以便我可以在 Excel 中使用过滤器和排序选项。这是一个新问题,但我正在尝试使用DateAdd(DateInterval.Day,693594,TimeValue(Fields!START_DATETIME.Value))。如果不可能,我将不得不尝试查看其他一些选项,例如宏。再次感谢您的帮助。
  • 如果你想在START_DATETIMENull 时设置一个较低的恒定开始日期,然后按照@Jeroen 在他的第二个要点中的建议在你的表达式中设置一个实际日期(而不是0),比如所以:=IIF(IsNothing(Fields!START_DATETIME.Value), CDate("1900-01-01"), Fields!START_DATETIME.Value)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多