【问题标题】:report builder IIF() function with multiple TRUE value具有多个 TRUE 值的报表生成器 IIF() 函数
【发布时间】:2015-05-20 10:10:38
【问题描述】:

我在编写一些关于 RB 的报告时遇到了问题。

我有一个 tablix,其中的列是一天中的时间,而行是不同的产品。我还有一个包含 3 个值(AM、PM、NIGHT)的参数。

这里的重点是,如果参数设置为AM,tablix只显示6到12的列,如果设置为PM,tablix显示12到18,...

我可以通过使用过滤器来显示时间间隔(6 到 12),我告诉他“小时”在“6、7、8、9、10、11、12”中。但是当我将过滤器值设置如下时它不起作用:

表达式:=Cstr(Fields!ProdHour.Value)

接线员:IN

价值:

=iif(join(Parameters!Shift.Value) = "AM", "6, 7, 8, 9, 10, 11, 12" , iif(join(Parameters!Shift.Value) = "PM", "13, 14, 15, 16, 17, 18", iif(join(Parameters!Shift.Value) = "NIGHT", "19, 20, 21, 22, 23, 0", false) ) )

你知道我该如何解决这个问题吗?尝试更改 Integer 中的每个数字,但没有成功...

【问题讨论】:

  • 您是否尝试过使用 switch 语句代替一系列嵌套的 iif 语句?
  • 我没有,我会尝试并反馈。谢谢
  • 我认为 SWITCH 函数只允许“真”的“假”的 1 个值。它与 IIF() 语句相同。我从 microsoft 站点中获取了示例:SWITCH(Customer Type = "I", "Individual", Customer Type = "S", "Shop") “个人,Indiv1,Indiv2,……”你明白我的意思吗?我需要它给出与使用以下过滤器集相同的结果:表达式:=Fields!Hour.Value 运算符:IN 值:6,7,8,9,10,11,12
  • 我不确定我是否在关注你。在您的问题中,您的 iif 语句返回一个逗号分隔的字符串。当您返回一个字符串值时,我没有看到使用开关的问题。并评估每段开关的 1 个真假陈述
  • 您似乎误解了@MaximeCoppée 的开关功能。它允许您为任意数量的条件中的第一个真实条件返回一个值。逗号分隔的字符串是“一个值”。所以你可以做 MyField = "AM", "1,2,3", MyField="PM","4,5,6",MyField="NIGHT","7,8,9"。但是,也就是说,我建议您尝试将嵌套 IIF 表达式末尾的“false”更改为空字符串。

标签: reporting-services ssrs-tablix reportbuilder iif


【解决方案1】:

我建议更改您的参数的绑定,例如 (ID,Value) 请参阅下面的屏幕截图

现在您可以使用表达式来获取选定的值

=Parameters!ReportParameter1.Value

如果不想硬编码,您也可以使用下面的查询来绑定下拉列表

Select ID,Value From 
(Values('6,7,8,9,10,11,12','AM'),
('13,14,15,16,17,18','PM'),
('19,20,21,22,23,0','Night'))
tblTime(ID,Value)

我想这就是你要找的东西

【讨论】:

  • 我认为我们正朝着正确的方向前进@Naveen Kumar。我试过了,如果我将 =Parameters!Shift.Value(0) 放在文本框中,它会正确显示“6,7,8,9,10,11,12”,但在我的列过滤器中它不显示任何列...由于我无法在此处发布图片,您可以在此链接后查看屏幕截图:s9.postimg.org/ml5depkvj/Filterprod.jpg 例如,如果我在参数中选择“AM”,则输出报告应显示的​​内容:s14.postimg.org/igusyu8b5/tablix1.jpg 当我尝试您的提议时以上所有内容,它什么都不显示.. :/
  • 没有9,10和11是正常的,因为列没有数据所以不显示。
  • 看起来,即使参数的输出值是“6,7,8,9,10,11,12”也不会认为和手动放入过滤器一样” 6,7,8,9,10,11,12" 与 IN 运算符(见上面评论中的第一张图片)
【解决方案2】:

我找到了一个可行的解决方案:

我必须在与表相同的数据集中创建 2 个新字段,我将这些字段命名为“ShiftStart”和“ShiftStop”。

ShiftStart 值:=iif(join(Parameters!Shift.Label)="AM","6",iif(join(Parameters!Shift.Label)="PM","12",iif(join(Parameters !Shift.Label)="NIGHT","0","0")))

与 ShiftStop 相同,但具有其他值 (12,18,0)。所以有了这 2 个数据,当我选择“AM”、ShitStart= 6 和 ShiftStop=12 时,现在我可以创建一个过滤器来显示 [Hour] 介于 [ShiftStart] 和 [ShiftStop] 之间的列。

就这么简单!

感谢大家的帮助!对不起,我不能给你投票,没有足够的声誉:(

【讨论】:

    【解决方案3】:

    我会放弃在 SSRS 过滤器表达式中使用 In 运算符。除了使用“=”之外的任何运算符以及数据类型的问题,我在过滤器方面只有普遍的糟糕经历。

    我的偏好是使用 SQL 在数据集查询中过滤掉这些数据。然而,这不是问题。

    在 SSRS 过滤器中,根据经验,我现在只设置数据类型:“布尔”、运算符:“=”和值:“真”。那么你的挑战是编写一个只为你想要保留的行返回 True 的表达式。

    可能是这样的:

    =Iif ( ( Parameters!Shift.Value = AM and ("6,7,8,9,10,11,12").Contains(Fields!Hour.Value) ) Or ( ...

    Shift参数是多选的吗?

    【讨论】:

    • 如果 Shift(我希望这是正确的拼写,而不是你上面使用的那个 :-))参数是多选的,它看起来像这样:=Iif ( ( Join(Parameters!Shift.Value , "," ).Contains("AM") And ("6,7,8,9,10,11,12").Contains(Fields!Hour.Value) ) Or ( ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    相关资源
    最近更新 更多