2011-03-29 5 views
37

Tenemos un problema con uno de nuestros informes. En uno de nuestros tablixes un cuadro de texto tiene la siguiente expresión:SSRS 2008 - Tratamiento de la división por escenarios cero

=Iif(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value/Fields!SomeField.Value) 

Cuál debe ser bastante explica por sí mismo. Si "SomeField" es cero, establezca el valor del cuadro de texto en cero, de lo contrario, configúrelo en "SomeOtherValue/SomeValue".

Lo que nos ha dejado perplejos es que el informe todavía arroja una excepción de tiempo de ejecución "intentó dividirse por cero", aunque la expresión anterior debería evitar que eso suceda.

Nos jugueteó un poco con la expresión sólo para asegurarse de que el cero-cheque está trabajando, y

=Iif(Fields!SomeField.Value = 0, "Yes", "No") 

funciona de maravilla. Los casos en los que los datos son de hecho cero dieron como resultado que el cuadro de texto mostrara "Sí" y viceversa. Entonces el cheque funciona bien

Mi intuición es que el motor de generación de informes arroja la excepción en tiempo de ejecución, porque "parece" que vamos a dividir por cero, pero en realidad, no lo somos.

¿Alguien ha tenido el mismo problema anteriormente? Si es así, ¿qué hiciste para que funcione?

+0

Impresionante! Usé la sugerencia para responder mi pregunta en: http: // stackoverflow.com/questions/43662727/ssrs-expression-error-calculate-variable-shows-error-when-dividing-by-zero/43666171 # 43666171 – Aline

Respuesta

58

IIf siempre evaluará ambos resultados antes de decidir cuál devolverá realmente.

Trate

=IIf(Fields!SomeField.Value = 0, 0, Fields!SomeOtherField.Value/IIf(Fields!SomeField.Value = 0, 1, Fields!SomeField.Value)) 

Esto utilizará 1 como el divisor si SomeOtherField.Value = 0, que no genera un error. El padre IIf devolverá el 0 correcto para la expresión general.

+2

Impresionante, eso funcionó. ¡Gracias! – tobias86

+3

¡Eso es tan astuto! – GONeale

+0

encanta esto! especialmente la lógica de "Esto usará 1 como el divisor si SomeOtherField.Value = 0, que no genera un error. El padre IIf devolverá el 0 correcto para la expresión general". jejeje, furtivo, de hecho –

14

Pensándolo bien, me siento mejor idea es multiplicar por el valor para alimentar -1, que es una división:

=IIf 
    (
     Fields!SomeField.Value = 0 
    , 0 
    , Fields!SomeOtherField.Value * Fields!SomeField.Value^-1 
) 

Esto no se dispara preprocese cheques como val * -1 0 resultados^en Infinity, no error

18

Una forma sencilla de evitar una división por error cero es utilizar el área de código de informe.

En el menú, ve al informe> Propiedades del informe> Código y pegue el código de abajo

Public Function Quotient(ByVal numerator As Decimal, denominator As Decimal) As Decimal 
     If denominator = 0 Then 
      Return 0 
     Else 
      Return numerator/denominator 
     End If 
    End Function 

Para llamar a la función de ir a la expresión del cuadro de texto y escriba:

=Code.Quotient(SUM(fields!FieldName.Value),SUM(Fields!FieldName2.Value)) 

En este caso, estoy poniendo la fórmula a nivel de grupo, así que estoy usando suma. De lo contrario sería:

=Code.Quotient(fields!FieldName.Value,Fields!FieldName2.Value) 

Desde: http://williameduardo.com/development/ssrs/ssrs-divide-by-zero-error/

+4

Me encanta. Limpio y reutilizable. Si pegas esta solución aquí, más personas verían lo bueno que es :-) – Mariusz

1

IIF se evalúa tanto la expresión, incluso pensó que el valor de los campos SomeField.Value es 0. Uso Si en lugar de IIF se solucionará el problema.

Cuestiones relacionadas