【问题标题】:Nested IIF/SWITCH in Report Builder: Error BC30201 Expression Expected报表生成器中的嵌套 IIF/SWITCH:预期错误 BC30201 表达式
【发布时间】:2017-11-16 13:06:14
【问题描述】:

我正在报表生成器 3 中进行一些背景颜色格式设置,但我在使用这个表达式时遇到了困难。运行报告是否太复杂,还是我遗漏了什么?

伪代码 - 如果 Marks 为 Null (True),背景颜色为白色,否则如果 Coursecode 为 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"
        )
    )
)

【问题讨论】:

  • 您是否遇到错误或者您是否获得了不正确的背景颜色?顺便说一句:如果没有设置背景颜色,请使用 Nothing 而不是“白色”,这是默认设置。
  • 获取Error BC30201 Expression Expected - BG 颜色的好提示 - 谢谢!
  • 您在 '50089109' 周围使用单引号,这是不允许的。如果您使用双引号,那应该可以。 SSRS 表达式中的单引号表示注释。
  • 你说的很对——很好看!

标签: reporting-services ssrs-2012 reportbuilder3.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,而任何位于 false 部分但与任何 switch 语句都不匹配的东西都将是粉红色的。您还会注意到我已经删除了 switch 语句中的部分中间表达式。这些不是必需的,因为当满足第一个真条件时 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"
        )
    )
)

【讨论】:

  • 感谢您,效果很好。也错过了我单引号没有帮助的 CourseCode。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多