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?
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.
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/
À 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
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.