sábado, 14 de abril de 2012

Reporting Services Error División Por Cero

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:


5 comentarios:

Unknown dijo...

Excelente resolverlo con la función , me ha sacado de apuros muchas gracias por compartir!!

Luis dijo...

man agrego ese código en propiedades de reporting y luego en la expresión invoco a code.Calcular me sale error, estoy trabajando con reporting services no con builder

Luis dijo...

man si no existe dato en las tablas porque no hay registro como se plantearía.

Unknown dijo...

Gracias por compartir este articulo, me ayudo...

Eduardo Reyes dijo...

Hola Gracias por el aporte, justo me sirvió para resolver el problema que tenia, gracias.