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

时间:2017-11-16 13:06:14

标签: reporting-services ssrs-2012 reportbuilder3.0

我正在报表生成器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"
        )
    )
)

1 个答案:

答案 0 :(得分:1)

我的表达式确实看不出太多错误所以可能是某些值没有被捕获。出于测试目的,我将设置除白色之外的背景颜色,以便您可以查看是否满足第一个条件。您也可以稍微清理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,任何虚假部分,但与任何开关语句不匹配都是粉红色的。您还会注意到我已经删除了switch语句中的部分中间表达式。这些不是必需的,因为当满足第一个真实条件时,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"
        )
    )
)