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