Je fais des calculs sur ces données qui entraîneront parfois une erreur # Erreur. La cause sous-jacente est une division par zéro. Je pourrais passer à travers les solutions nécessaires pour éviter la division par zéro, mais il serait peut-être plus simple de masquer le texte #Error et d’afficher une cellule vide. Est-il possible de cacher le #Error et de ne rien afficher?
Modifier
L'expression du texte peut afficher #Error est le suivant:
Fields!Field1.Value / Fields!ValueThatMightBeZero.Value
Je pourrais contourner ce problème en vérifiant quelque peu, mais il serait peut-être plus facile d’attraper le #Error. (Une simple vérification iif
autour de l'express ne fonctionne pas car SSRS évalue d'abord les clauses true et false; s'il obtient une division par zéro sur l'une ou l'autre clause, il retournera #Error, même si cette clause n'aurait pas été utilisée. ).
Il existe une fonction IsError, mais elle ne réduira pas le code nécessaire pour gérer cela. Si vous n'aimez pas les solutions habituelles de iif
, je pense que vous devez utiliser votre propre code incorporé dans le rapport. Dans ce code, vous pouvez avoir un gestionnaire de catch try. Créez une fonction que vous pouvez appeler avec =Code.MyDivider(Fields!Field1.Value , Fields!ValueThatMightBeZero.Value)
Public Function MyDivider(top As Double, bottom As Double) As Double
If top = 0 Then Return 0
If bottom = 0 Then Return 0
Return top / bottom
End Function
Changez la police pour qu'elle soit la couleur de l'arrière-plan si Fields!Value_Denominator.Value=0
et vous ne verrez pas le message d'erreur.
C'est moche, mais voici un moyen que j'ai trouvé pour le faire fonctionner dans l'expression et sans la fonction personnalisée.
Vous devez également vérifier le dénominateur et y substituer un diviseur non nul afin que la division par 0 ne se produise jamais (même si nous aimerions que la première moitié de l'IIF le court-circuite et ne l'obtienne pas du tout): J'utilise 1.
Bien sûr, cela donnera alors une valeur incorrecte, mais je garde ensuite le IIF externe pour montrer ce que je veux quand le dénominateur est 0 (je montre 0 dans mon exemple).
=IIF(Fields!Value_Denominator.Value=0, 0, Fields!Value_Numerator.Value/IIF(Fields!Value_Denominator.Value=0,1,Fields!Value_Denominator.Value))
Ajouter une petite valeur à la deuxième expression -
Champs! Champ1.Value/(Champs! ValueThatMightBeZero.Value + .00001)
Cela retournera 0.
C'est une bonne solution ... Je pense cependant qu'il est possible de l'améliorer. Au lieu de mettre la mise en forme conditionnelle sur "Blanc", je suggère de mettre l'expression masquée conditionnelle sur True au lieu de ... .. Dans ce cas, lorsqu'elle est exportée vers Excel, la cellule ne contiendra rien, contrairement au cas de la modification de la couleur de la police. Sous Visibilité -> Caché = Iif (Fields! Denominator.Value = 0, True, False)
Une autre alternative aux suggestions suggérées jusqu'ici consiste à ajouter la partie de la formule qui pourrait créer l'erreur.
Exemple: a/b, si b = 0, l'équation donne une erreur.
{= IIF (b = 0, VRAI, FAUX)}
Utilisez la fonction NULLIF
:
DECLARE @a int
DECLARE @b int
SET @a = 1
SET @b = 0
SELECT @a/@b --this returns an error
SELECT @a/NULLIF(@b,0) -- this returns NULL
Vous pouvez utiliser IsNumeric pour vérifier chaque expression et afficher un 0 ou mieux, mais ne rien afficher car 0 pourrait avoir une signification.
IsNumeric - Retourne une valeur booléenne indiquant si une expression peut être évaluée en tant que nombre.
Par exemple:
=Iif(IsNumeric(Fields!YourValue.Value), Fields!YourValue.Value, Nothing)
ou
=Iif(IsNumeric(Fields!YourValue.Value), Fields!YourValue.Value, 0)
Utilisez TRY & CATCH dans un code personnalisé SSRS
Public Function My_Function(ByVal My_Divisor As int) As int
Dim My_Result as integer
TRY
My_Result = 100/My_Divisor
CATCH
My_Result = -1
END TRY
Return My_Result
End Function