web-dev-qa-db-fra.com

Expression SSRS divisée par zéro erreur

J'ai une zone de tableau matriciel qui a une expression de division. Lorsque je divise par zéro ou par des valeurs nulles, #Error S'affiche dans mon rapport. J'ai essayé de créer une instruction IIF et j'ai testé avec des valeurs statiques. Cela a vérifié que ma syntaxe était correcte mais je vois toujours l'erreur sur mes rapports.

Report Preview

=IIF(Sum(Fields!CY_Dollars.Value)=0, 0, (Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))/(Sum(Fields!PY_Dollars.Value)))

Je prends donc les dollars de l'année en cours, en soustrayant les dollars de l'année précédente et en divisant ce total par les dollars de l'année précédente pour obtenir la variation en pourcentage. Y a-t-il une astuce que je ne comprends pas?!

15
d90

Vous pouvez ajouter une fonction à votre code de rapport qui gère la condition de division par zéro, ce qui facilite l'implémentation dans plusieurs cellules, par exemple.

Public Function Divider (ByVal Dividend As Double, ByVal Divisor As Double)
If IsNothing(Divisor) Or Divisor = 0
  Return 0
Else
  Return Dividend/Divisor
End If
End Function 

Vous pouvez alors appeler cela dans une cellule comme ceci:

=Code.Divider(Fields!FieldA.Value, Fields!FieldB.Value)
46
Nathan Griffiths

Je soupçonne que vous rencontrez le problème où SSRS ne court-circuite pas réellement une instruction IIF; même si vous vérifiez , vous allez toujours frapper une division par zéro erreur.

Essayez quelque chose comme:

=IIf(Sum(Fields!PY_Dollars.Value) = 0, 0, Sum(Fields!CY_Dollars.Value) - Sum(Fields!PY_Dollars.Value))
  / IIf(Sum(Fields!PY_Dollars.Value) = 0, 1, Sum(Fields!PY_Dollars.Value))

L'utilisation de deux instructions IIf signifie que vous évitez l'erreur en utilisant l'équation 0/1 Lorsque Sum(Fields!PY_Dollars.Value) = 0, donc en retournant simplement .

Notez également que l'expression ci-dessus vérifie Sum(Fields!PY_Dollars.Value) = 0, mais la vôtre vérifie Sum(Fields!CY_Dollars.Value) = 0 - le dénominateur a besoin du contrôle zéro ici.

10
Ian Preston

Pour éviter les frais généraux liés à la maintenance du code, la solution ci-dessous me semble la plus simple. Il évite la division par zéro dans le dénominateur en y ajoutant la plus petite valeur Double possible (Double.Epsilon, lequel est 4.94e-324). Cette valeur est trop petite pour affecter la valeur de la fraction pour tout ce que les gens utiliseraient pour SSRS. Il évite également l'imbrication des fonctions IIF.

=IIF(Sum(Fields!Denominator.Value)>0, 
     Sum(Fields!Numerator.Value)/(Sum(Fields!Denominator.Value)+Double.Epsilon),
     nothing)
3
ambrosen