【问题标题】:SSRS conditional formatting (Using AND and OR)SSRS 条件格式(使用 AND 和 OR)
【发布时间】:2015-04-29 17:43:33
【问题描述】:

我有一个关于我目前尝试实施的复杂条件格式的问题。代码是:

=iif(Fields!ACT.Value = "N/V", "No Color",
iif(Fields!ACT.Value = "N/K", "No Color",
iif(Fields!ACT.Value = "N/A", "No Color",
iif(Fields!NUM.Value < Fields!SHORT.Value , "Yellow", 
iif(Fields!NUM.Value > Fields!INC.Value, "Orange", 
iif((isnothing(Fields!ACT.Value <> "N/A" and Fields!NUM.Value) or isnothing(Fields!ACT.Value <> "N/K" and Fields!NUM.value) or isnothing(Fields!ACT.Value <> "N/V" and Fields!NUM.Value)), "Purple", "No Color"))))))

在它引用的最后一个 IIF 之前一切正常。我已经尝试了很多不同的方法来解决它,发生的事情是它要么不将紫色应用于任何空白单元格,要么将紫色应用于所有空白单元格,即使它们是 N/A, N/K 或 N/V。 谁能解释为什么会发生这种情况?我试过只处理那一行代码,忽略其余的,但没有成功。

谢谢

戴夫

【问题讨论】:

    标签: algorithm reporting-services ssrs-2008 conditional-formatting iif


    【解决方案1】:

    第一个问题是:

    isnothing(Fields!ACT.Value <> "N/A" and Fields!NUM.Value) or isnothing(Fields!ACT.Value <> "N/K" and Fields!NUM.value) or isnothing(Fields!ACT.Value <> "N/V" and Fields!NUM.Value)
    

    总是返回True,因为内部布尔表达式总是不为空。

    第二:你可以使用switch,而不是iif的组合。

    所以,我认为,你应该试试这个表达方式:

    =Switch
    (
        Fields!ACT.Value = "N/V", "No Color",
        Fields!ACT.Value = "N/K", "No Color",
        Fields!ACT.Value = "N/A", "No Color",
        Fields!NUM.Value < Fields!SHORT.Value, "Yellow", 
        Fields!NUM.Value > Fields!INC.Value, "Orange", 
        IsNothing(Fields!NUM.Value), "Purple",
        True, "No Color"
    )
    

    编辑:

    我根据您最后的评论更改了表达式代码。

    别忘了,switch 中的条件顺序是重要The Switch function returns the value associated with the first expression in a series that evaluates to true (c)MSDN (https://msdn.microsoft.com/en-us/library/ms157328(v=sql.105).aspx)

    所以你应该把IsNothing表达式放在最后一个顺序,只在默认值之前。

    【讨论】:

    • 您好,我已经尝试过这个版本,但它仍然使 N/A、N/K 和 N/V 的 NULL 值为紫色。我正在尝试将除 N/A、N/K 和 N/V 之外的所有为 NULL 的列都设置为紫色,当它们根据给我的规则应该是无颜色时。
    • 您好,感谢您的更新,但我的 IN 仍然存在问题。出于某种原因,它仍然在 SSRS 中强调它,当我将鼠标悬停在它上面时,消息是语法错误。当我将它们分开时,ACT 等于 N/A 等。它仍然将那些 N/A 等的 NULL 字段标记为紫色,而不是将它们保留为无颜色。我认为这是因为 IsNothing 覆盖了 N/A 顶部的 No Color。
    • 我修改了我的代码以使 IsNothing 更明确(left(Fields!ACTIVITY_MONTH_NAME.Value, 2) &lt;&gt; "N/" and isnothing(Fields!NUMBER_OF_RECORDS.Value)), "Purple", True, "No Color" 但是对于 NULL N/A、N/K 和 N/V,它的颜色仍然是紫色。我不知道如何使分组停止仅对这三个值应用格式。
    • 我在您的代码中看不到任何错误...可能是Fields!ACTIVITY_MONTH_NAME.Value 中的问题?也许有一些尾随空格或其他东西。尝试使用这个:(left(Fields!ACTIVITY_MONTH_NAME.Value.ToString().Trim(), 2) &lt;&gt; "N/" and isnothing(Fields!NUMBER_OF_RECORDS.Value)), "Purple", True, "No Color"
    • 非常感谢。现在正在工作。那里似乎有一些空间。非常感谢您的帮助和时间。
    【解决方案2】:

    您最后一个带有IsNothing 函数的Iif 语句没有写在正确的上下文中,因为IsNothing 函数中的条件总是返回true

    另外,用 NOT IN 子句重写你的 OR 条件以缩小你的代码并提高可读性。

    =Switch
    (
        Fields!ACT.Value IN ("N/V", "N/K", "N/A"), "No Color",
        Fields!NUM.Value < Fields!SHORT.Value, "Yellow", 
        Fields!NUM.Value > Fields!INC.Value, "Orange", 
        IsNothing(Fields!NUM.Value) and (Fields!ACT.Value NOT IN ("N/A", "N/K", "N/V"), "Purple",
        True, "No Color"
    )
    

    想想你的表达方式,避免相互重叠。

    【讨论】:

    • 嗨。我已经尝试过了,不幸的是它在 IN 语句中引发了错误。它强调它是语法错误,并需要逗号或)。
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多