【问题标题】:Performing IIF on a Double value in SSRS在 SSRS 中对 Double 值执行 IIF
【发布时间】:2019-01-18 10:39:58
【问题描述】:

我的报告中目前有一列正在计算平均值:

=FORMAT(Avg(Fields!intGradeTransposeValue.Value),"#.#")

我目前正在尝试使用该计算的结果来执行 IIF 语句,但出现错误:

文本运行“Textbox20.Paragraphs[0].TextRuns[0]”的值表达式包含错误:[BC30311]“Microsoft.ReportingServices.ReportProcessing.ReportObjectModel.ReportItem”类型的值无法转换为“Double”

我的表情是:

=CDbl(IIF(ReportItems!Textbox6 <= 1.4, "A*", 
        IIF(ReportItems!Textbox6 <= 2.4 AND >= 1.5, "A",
            IIF(ReportItems!Textbox6 <= 3.4 AND >= 2.5, "B",
                IIF(ReportItems!Textbox6 <= 4.4 AND >= 3.5, "C",
                    IIF(ReportItems!Textbox6 <= 5.4 AND >= 4.5, "D"
                        IIF(ReportItems!Textbox6 <= 6.4 AND >= 5.5, "E"
                            IIF(ReportItems!Textbox6 <= 7.4 AND >= 6.5, "U", "Error"))))))))

如何进行我需要的计算?

附加

我在下面添加了错误出现的位置 - 这让我感到困惑,因为它似乎接受了 1.4 的第一个双精度。我正在使用下面建议的答案,但这也不起作用。

【问题讨论】:

  • 我很确定您是说将 A* 或 B 等字符串值的输出转换为双精度值。这使得错误不能加倍。您可能希望将 reportItems 部分包装在 CDbl() 中,而不是像:CDbl(ReportItems!Textbox6) 强制转换该数字只是为了将其与您的静态双精度值进行比较。

标签: reporting-services double expression ssrs-2012 iif


【解决方案1】:

根据您收到的错误,问题是您试图将 ReportItems!Textbox6 本身转换为双精度值,而不是其中的值。为了引用文本框的值,您需要将其引用为ReportItems!Textbox6.Value。因此,我相信您需要的答案会将 arahman 的答案与此更改结合起来:

=IIF(CDbl(ReportItems!Textbox6.Value) <= 1.4, "A*", 
    IIF(CDbl(ReportItems!Textbox6.Value) <= 2.4 AND >= 1.5, "A",
        IIF(CDbl(ReportItems!Textbox6.Value) <= 3.4 AND >= 2.5, "B",
            IIF(CDbl(ReportItems!Textbox6.Value) <= 4.4 AND >= 3.5, "C",
                IIF(CDbl(ReportItems!Textbox6.Value) <= 5.4 AND >= 4.5, "D"
                    IIF(CDbl(ReportItems!Textbox6.Value) <= 6.4 AND >= 5.5, "E"
                        IIF(CDbl(ReportItems!Textbox6.Value) <= 7.4 AND >= 6.5, "U", "Error")))))))

Source

根据对原始帖子的编辑,我错过了表达式的另一个问题。你不能像那样比较这些值。您需要在 AND 之后添加对 Textbox 值的附加引用。

=IIF(CDbl(ReportItems!Textbox6.Value) <= 1.4, "A*", 
    IIF(CDbl(ReportItems!Textbox6.Value) <= 2.4 AND CDbl(ReportItems!Textbox6.Value) >= 1.5, "A",
        IIF(CDbl(ReportItems!Textbox6.Value) <= 3.4 AND CDbl(ReportItems!Textbox6.Value) >= 2.5, "B",
            IIF(CDbl(ReportItems!Textbox6.Value) <= 4.4 AND CDbl(ReportItems!Textbox6.Value) >= 3.5, "C",
                IIF(CDbl(ReportItems!Textbox6.Value) <= 5.4 AND CDbl(ReportItems!Textbox6.Value) >= 4.5, "D",
                    IIF(CDbl(ReportItems!Textbox6.Value) <= 6.4 AND CDbl(ReportItems!Textbox6.Value) >= 5.5, "E",
                        IIF(CDbl(ReportItems!Textbox6.Value) <= 7.4 AND CDbl(ReportItems!Textbox6.Value) >= 6.5, "U", "Error")))))))

【讨论】:

  • 可悲的是,从我对我的问题的编辑中可以看出,这也不起作用。我已经求助于导出到 Excel 并在那里执行计算。
  • 我已经编辑了我的答案。新表达式应该可以工作吗?
  • 附加说明,您可能还需要将每个比较括在括号中,例如(CDbl(ReportItems!Textbox6.Value) &lt;= 2.4) AND (CDbl(ReportItems!Textbox6.Value) &gt;= 1.5)
  • 如此接近。最后一行出现错误。我在“U”之后添加了一个右括号,这略微减少了错误,但我无法弄清楚它为什么会出现问题:IIF(CDbl(ReportItems!Textbox6.Value) = 6.5, "U") "错误")))))))
  • 嗯...“错误”之前的右括号不应该是必需的,因为每个 IIF 都需要三个参数,而“错误”将是最后一个 IIF 的第三个参数。实际上,现在我仔细查看了,您似乎缺少了几个逗号。在 "D" 和 "E" 之后添加一个逗号,看看是否可以解决问题。
【解决方案2】:

我很确定您是在说将 A* 或 B 等字符串值的输出转换为双精度值。这使得错误不能加倍。

您可能希望将 reportItems 部分包装在 CDbl() 中,而不是强制转换该数字,然后将其与静态双精度值进行比较。

只有在确实需要将字段更改为双精度以进行比较时,您才会以这种方式转换字段。

=IIF(CDbl(ReportItems!Textbox6) <= 1.4, "A*", 
    IIF(CDbl(ReportItems!Textbox6) <= 2.4 AND >= 1.5, "A",
        IIF(CDbl(ReportItems!Textbox6) <= 3.4 AND >= 2.5, "B",
            IIF(CDbl(ReportItems!Textbox6) <= 4.4 AND >= 3.5, "C",
                IIF(CDbl(ReportItems!Textbox6) <= 5.4 AND >= 4.5, "D"
                    IIF(CDbl(ReportItems!Textbox6) <= 6.4 AND >= 5.5, "E"
                        IIF(CDbl(ReportItems!Textbox6) <= 7.4 AND >= 6.5, "U", "Error")))))))

【讨论】:

  • 不幸的是,我试过了,但它不起作用。它仍然不喜欢 Double 值。
  • @MIS_Gem TextBox6 的那个值最初是什么样子的,然后你做了 format(value, "#.#") 之后是什么样子的
  • @MIS_Gem 为什么不确保查询中的值是十进制的,然后在收集平均值时,当您执行比较表达式时,它们已经是双倍了。所以不需要在 ssrs 字段中使用额外的 FORMAT()。
  • intGradeTransposeValue.Value 的原始数据是一个整数,但是当它执行平均时,结果是双倍的,因为平均值不会都是整数,但我相信它存储为文本(不知道如何检查)。我需要将该值转换为等级。我想知道是否有一种方法可以一次性完成所有这些操作,而不是使用 ReportItems!那么添加到我计算平均值的原始表达式中?
  • 我通常不使用 AVG(),因为有时它会让人感到困惑,并且不会使用手动使用的正确字段。我通常采用获取成绩的方法并获取人数或其他变量。然后,在 ssrs 字段中,您可以执行gradesamount/countofpeople = AVGGradeOverall。或者如果所有测试中有 1 人的平均成绩,您可以这样做:TotalOfAllGradesNumber/NumberOfTests = AVGGradeForThatPerson。在查询中,如果我需要它们是双精度的,我会在查询中的每个字段中转换为浮点数或小数。
猜你喜欢
  • 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
相关资源
最近更新 更多