web-dev-qa-db-fra.com

SSRS 2008 - Gérer la division par zéro

Nous rencontrons un problème avec l'un de nos rapports. Dans l'un de nos tablix, une zone de texte a l'expression suivante:

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

Ce qui devrait être assez explicite. Si "SomeField" est égal à zéro, définissez la valeur de la zone de texte sur zéro, sinon définissez-la sur "SomeOtherValue/SomeValue".

Ce qui nous a déconcerté, c'est que le rapport lève toujours une exception d'exécution "a tenté de diviser par zéro" même si l'expression ci-dessus devrait empêcher que cela se produise.

Nous avons joué un peu avec l'expression juste pour nous assurer que le contrôle zéro fonctionne, et

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

fonctionne magnifiquement. Dans les cas où les données sont en fait nulles, la zone de texte affiche "Oui" et vice versa. Donc, le chèque fonctionne bien.

Mon intuition est que le moteur de rendu de rapport lève l'exception au moment de l'exécution, car il "semble" que nous allons diviser par zéro, mais en réalité, nous ne le sommes pas.

Quelqu'un a-t-il déjà rencontré le même problème? Si oui, qu'avez-vous fait pour le faire fonctionner?

44
tobias86

IIf évaluera toujours les deux résultats avant de décider lequel retourner réellement.

Essayer

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

Cela utilisera 1 comme diviseur si SomeOtherField.Value = 0, ce qui ne génère pas d'erreur. Le parent IIf renverra le 0 correct pour l'expression globale.

66
MartW

Un moyen simple et efficace d'empêcher une erreur de division par zéro est d'utiliser la zone de code de rapport.

Dans le menu, accédez à Rapport> Propriétés du rapport> Code et collez le code ci-dessous

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

Pour appeler la fonction, accédez à l'expression Textbox et tapez:

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

Dans ce cas, je mets la formule au niveau du groupe, donc j'utilise la somme. Sinon, ce serait:

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

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

22
william mendoza

À la réflexion, je pense que la meilleure idée est de multiplier par la valeur de puissance -1, ce qui est un fossé:

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

Cela ne déclenche pas les vérifications avant rendu car val * 0 ^ -1 se traduit par Infinity, pas par erreur

16
SkyDkn

IIF évalue les deux expressions même si la valeur de Fields! SomeField.Value est 0. Utilisez IF au lieu de IIF pour résoudre le problème.

1
user1689669