c#report返回#error

时间:2012-02-15 23:17:19

标签: vb.net reporting-services report

当我使用以下表达式时,我在reportviewer中得到#Error:

    =IIf(Fields!PaymentNumber.Value>0,
         IPmt(Fields!Annual_Interest_Rate.Value/1200,
              Fields!Payment.Value,
              Fields!No_of_Monthly_Payments.Value,
              Fields!Total_Amount_Financed.Value),0)

当我删除I​​Pmt()函数并使用一些静态值时,它可以工作。 有没有办法找出确切的错误?

3 个答案:

答案 0 :(得分:1)

基于equation used to calculate an annuity我会说你每年的期数为0或0为利率,因此得出零除错误。

您正在检查PaymentNumber是否大于零,但您的IPmt计算中未使用PaymentNumber,因此您可能在计算中使用了错误的字段?

无论如何,无论如何,你需要知道IIF不是一个声明,它是一个传递两个参数的函数。因此,在函数调用之前评估这两个参数,从而评估“if语句”的两个边。这可能会造成混淆,因为当您检查除数是非零时,您仍会得到除以零错误。只记住它是一个函数,而不是一个语句,因此没有短路评估来防止错误的部分被执行。但是,有一些解决方法,主要涉及进行两次IIF调用以消除零值计算中使用的零值:

=IIF(Fields!DivideBy.Value <> 0, Fields!Something.Value / IIF(Fields!DivideBy.Value <> 0, Fields!DivideBy.Value, 1), 0)

答案 1 :(得分:0)

在Reporting Services中调试#Error并不是特别容易。

根据我的经验,最好的方法是将其分解为组成部分,看看是否有任何问题。您已经将其缩小到IPmt函数,该函数期望传递四个Double参数。

您是否检查过传入的四个参数是否都具有值并且类型正确?

答案 2 :(得分:0)

SSRS中的“IIF”没有短路评估。确保在您调用此函数时即使PaymentNumber为0或更少,您有IPmt()的有效值。

可能有几种解决方法: