web-dev-qa-db-fra.com

Masquer SSRS #Error affiché dans la cellule

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. ).

14
poke

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
12
Jamie F

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.

19
Gil

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))
10
Andy Needham

Ajouter une petite valeur à la deuxième expression -

Champs! Champ1.Value/(Champs! ValueThatMightBeZero.Value + .00001)

Cela retournera 0.

5
Anthony Smith

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)

4
Paolo

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)}

0
Cameron

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
0
whistler

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)
0
xm1994

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 
0
Eduardo Slimming