Vb.net ReportViewer IIF表达式返回#错误

Vb.net ReportViewer IIF表达式返回#错误,vb.net,reportviewer,Vb.net,Reportviewer,我花了两天的时间来解决这个问题,但是运气不好。 我有一个IIF表达式,它在条件变为真(IPmt计算)时显示正确的值,但else总是返回#error,尽管它应该仅为0 =IIf(Fields!PaymentNumber.Value<>0, IPmt(Fields!Annual_Interest_Rate.Value/1200,Fields!PaymentNumber.Value,Fields!Payment.Value,Fields!Total_Amount_Financed

我花了两天的时间来解决这个问题,但是运气不好。 我有一个IIF表达式,它在条件变为真(IPmt计算)时显示正确的值,但else总是返回#error,尽管它应该仅为0

=IIf(Fields!PaymentNumber.Value<>0,
     IPmt(Fields!Annual_Interest_Rate.Value/1200,Fields!PaymentNumber.Value,Fields!Payment.Value,Fields!Total_Amount_Financed.Value),
     0)
=IIf(字段!PaymentNumber.Value0,
IPmt(字段!年利率.值/1200,字段!付款编号.值,字段!付款.值,字段!总金额.值),
0)
所有字段都有值(不能为空) 这是什么原因造成的


谢谢,错误是因为始终计算真实条件,并在PaymentNumber=0时返回错误。根据文档,IIF表达式的两个条件都会被计算。您可以通过切换顺序来测试这一点:

=IIf(Fields!PaymentNumber.Value=0, 0, 
    IPmt(Fields!Annual_Interest_Rate.Value/1200,Fields!PaymentNumber.Value,Fields!Payment.Value,Fields!Total_Amount_Financed.Value)) 
我过去所做的是在“自定义代码”中创建一个函数。我没有使用IPmt,但我相信这应该可以:

Function CalcIpmt(Annual_Interest_Rate As Decimal, PaymentNumber As Integer, Payment As Decimal, Total_Amount_Financed As Decimal) As Decimal)

    If PaymentNumber = 0 Then
        Return 0
    Else
        Return IPmt(Annual_Interest_Rate, PaymentNumber, Payment, Total_Amount_Financed)
    End If 

End Function
那么你的表达是:

=Code.CalcIpmt( Fields!Annual_Interest_Rate.Value/1200, Fields!PaymentNumber.Value, Fields!Payment.Value, Fields!Total_Amount_Financed.Value )

(注意:我还没有对此进行测试,您需要检查数据类型)

已解决!IIF表达式计算导致的问题。vb.net还尝试计算真假情况。如果PaymentNumber为0,则IPmt返回#Error(除以零)。解决方案:当PaymentNumber等于0时,在IPmt中将PaymentNumber设置为1(或除0以外的其他值)。d'OH刚刚在下面完成了我的回答。很高兴你明白了。