You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免SSRS报表中自定义代码产生的NaN结果?

解决SSRS报表自定义计算中的NaN问题

我来帮你搞定这个报表里的NaN困扰!先梳理下你当前代码的核心问题:你原本尝试在表达式里处理除零,但自定义函数里已经直接执行了SValue/(ThisValue+TValue)*100——如果ThisValue+TValue为0,这一步已经产生NaN了,后面的IIF根本没机会生效。另外你用全局变量做累计,这个逻辑没问题,但得把除零判断放到函数内部才行。

下面是修改后的自定义代码,直接从根源上避免NaN,返回你想要的0值:

Public Dim TotalAmount As Double = 0
Public Dim ThisValue As Double = 0
Public Dim SValue As Double = 0
Public Dim TValue As Double = 0

Public Function CalculateTotal(FirstValue as Double, SecondValue as Double, ThirdValue as Double) as Double
    ' 保留你的累计逻辑
    ThisValue = ThisValue + FirstValue
    SValue = SValue + SecondValue
    TValue = TValue + ThirdValue
    
    ' 先判断分母是否为0,避免除零错误
    Dim denominator As Double = ThisValue + TValue
    If denominator = 0 Then
        TotalAmount = 0
    Else
        TotalAmount = (SValue / denominator) * 100
    End If
    
    Return TotalAmount
End Function

改动说明

  • 把除零判断移到了函数内部,在计算百分比之前就检查分母合法性,彻底避免NaN生成
  • 保留了你原本的全局变量累计逻辑,如果你需要跨行累计计算,这个逻辑依然有效
  • 当分母为0时,直接将结果设为0,报表里就不会再出现NaN了

你的表达式可以完全保持不变:
=Code.CalculateTotal(Fields!N_ANSWERED.Value,Fields!SLA.Value,Fields!N_ABANDONED.Value)

如果你不需要全局累计(比如只是计算当前行的独立百分比),还可以把变量移到函数内部,避免全局变量带来的意外累计:

Public Function CalculateTotal(FirstValue as Double, SecondValue as Double, ThirdValue as Double) as Double
    Dim ThisValue As Double = FirstValue
    Dim SValue As Double = SecondValue
    Dim TValue As Double = ThirdValue
    
    Dim denominator As Double = ThisValue + TValue
    Return If(denominator = 0, 0, (SValue / denominator) * 100)
End Function

内容的提问来源于stack exchange,提问作者B.Avramov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:06:13