sábado, 14 de abril de 2012

Reporting Services Error División Por Cero

5 comentarios:
Manejar la división por cero es un verdadero problema,  existen 2 formas de corregir este problema.

1.) Utilizar un IIF
2.) Hacer un función para evaluar.

1.)  Solución a medias que puede fallar (IIf)


Query:

SELECT detalle.productid,
       productos.productname,
       detalle.quantity,
       detalle.unitprice,
       discount
FROM   [Order Details] detalle
       INNER JOIN products productos
         ON detalle.productid = productos.productid 



Error en el reporte:
Formula:  =Fields!UnitPrice.Value/Fields!Discount.Value



En este caso en particular, donde el campo Discount la cual divide, puede llegar a ser cero, el error será infinity, la solución en este caso será hacer una pequeña corrección al la formula.

=iif(Fields!Discount.Value=0,0,Fields!UnitPrice.Value/Fields!Discount.Value)




Si hacemos un cambio al query, para el que cambio discount tenga valores nulos, esto con el objetivo de hacer mar real nuestro ejemplo.

SELECT detalle.productid,
       productos.productname,
       detalle.quantity,
       detalle.unitprice,
       CASE discount
         WHEN 0 THEN NULL
         ELSE discount
       END discount
FROM   [Order Details] detalle
       INNER JOIN products productos
         ON detalle.productid = productos.productid 




Aun que la formula tenga el iif siempre nos muestra en mensaje de error, esto por que primero se evalúa los valores globales antes de la parte falsa.

Vea el siguiente ejemplo para solventar este problema de raíz.

2.) Solventar la situación de  por medio de una función:

2.1) Seleccione el las propiedades del reporte, clic derecho sobre el reporte y seleccione report properties.



2.2)  En la pestaña de code agregue la siguiente función:

Public Shared Function Calcular(ByVal Valor1 As Decimal, ByVal Valor2 As Decimal) As Decimal
If Valor2= 0 Then
Return 0 
End If 
Return (Valor1/ Valor2) 
End Function




2.3) Por ultimo debemos de corregir nuestra formula por:

=code.Calcular(Fields!UnitPrice.Value,Fields!Discount.Value)


Con esto tendremos el resultado esperado:


Ver