报表生成器中嵌套 IIF/SWITCH:错误 BC30201 表达式预期

Nested IIF/SWITCH in Report Builder: Error BC30201 Expression Expected

我正在 Report Builder 3 中设置一些背景颜色格式,但我在处理这个表达式时遇到了困难。报告给 运行 是不是太复杂了,还是我遗漏了什么?

伪代码 - 如果标记为空(真),背景颜色为白色,否则如果课程代码为 L1 英语(数字),格式化成绩(开关 1),否则格式化成绩(开关 2)。

=IIF(IsNothing(Fields!Marks.Value), 
    "White",
    IIF(Fields!CourseCode.Value = '50089109',
        SWITCH(
            Fields!Marks.Value > 57, "YellowGreen",
            Fields!Marks.Value >= 48 AND Fields!Marks.Value <= 57 , "Orange",
            Fields!Marks.Value < 48, "Firebrick"
        )
        ,
        SWITCH(
            Fields!Marks.Value > 61, "YellowGreen",
            Fields!Marks.Value >= 52 AND Fields!Marks.Value <= 61 , "Orange",
            Fields!Marks.Value < 52, "Firebrick"
        )
    )
)

这是我解决同一问题的另一种方法 - 首先评估课程代码是否正确,然后根据该代码应用格式:

=IIF(Fields!CourseCode.Value = '50089109',
    IIF(IsNothing(Fields!Marks.Value), "White",
    SWITCH(
        Fields!Marks.Value > 57, "YellowGreen",
        Fields!Marks.Value >= 48 AND Fields!Marks.Value <= 57 , "Orange",
        Fields!Marks.Value < 48, "Firebrick"
        )
    ),
    IIF(IsNothing(Fields!Marks.Value), "White", 
    SWITCH(
        Fields!Marks.Value > 61, "YellowGreen",
        Fields!Marks.Value >= 52 AND Fields!Marks.Value <= 61 , "Orange",
        Fields!Marks.Value < 52, "Firebrick"
        )
    )
)

我真的看不出你的表达有什么问题,所以可能是某些值没有被捕获。出于测试目的,我会设置白色以外的背景颜色,以便您可以查看是否满足第一个条件。您还可以稍微清理一下 SWITCH 语句。

因此,出于测试目的,我将使用以下表达式

测试版

=IIF(IsNothing(Fields!Marks.Value), 
    "LimeGreen",
    IIF(Fields!CourseCode.Value = "50089109",
        SWITCH(
            Fields!Marks.Value > 57, "YellowGreen",
            Fields!Marks.Value >= 48, "Orange",
            Fields!Marks.Value < 48, "Firebrick",
            True, "HotPink"
        )
        ,
        SWITCH(
            Fields!Marks.Value > 61, "YellowGreen",
            Fields!Marks.Value >= 52, "Orange",
            Fields!Marks.Value < 52, "Firebrick",
            True, "HotPink"
        )
    )
)

任何被 IIF 的 True 部分捕获的东西都将是 LimeGreen,而任何在 False 部分但不匹配任何 switch 语句的东西都将是粉红色。您还会注意到我已经删除了 switch 语句中的部分中间表达式。这些不是必需的,因为 switch 语句在满足第一个 true 条件时停止。您会在下面的 'production' 版本中看到,我们可以删除更多内容。

我们还添加了一个最终的 switch 表达式,true。当 Switch 在第一个真表达式处停止时,我们新表达式中的 true 就像 else

解决所有问题后,生产版本将如下所示。

正式版

=IIF(IsNothing(Fields!Marks.Value), 
    Nothing,
    IIF(Fields!CourseCode.Value = "50089109",
        SWITCH(
            Fields!Marks.Value > 57, "YellowGreen",
            Fields!Marks.Value >= 48, "Orange",
            True, "Firebrick"
        )
        ,
        SWITCH(
            Fields!Marks.Value > 61, "YellowGreen",
            Fields!Marks.Value >= 52, "Orange",
            True, "Firebrick"
        )
    )
)