2008-12-23 21 views
4

J'utilise SSRS 2005 pour produire un rapport, et l'une des colonnes de mon rapport est un calcul de moyenne simple. Je ne veux pas diviser par zéro, la valeur textbox j'ai mis:Évaluation paresseuse dans SSRS

=Switch(Fields!Count.Value=0,0,Fields!Count.Value>0,Fields!Sum.Value/Fields!Count.Value)

Cette évalue encore la deuxième expression.

et ainsi fait:

=IIF(Fields!Count.Value=0,0,Fields!Sum.Value/Fields!Count.Value)

Je ne veux pas que mon rapport pour afficher les erreurs. Comment puis-je surmonter ce problème?

+0

Pouvez-vous effectuer le calcul dans l'instruction proc stockée ou sql que vous référencez? J'essaie d'éviter de faire quoi que ce soit d'inhabituel dans SSRS si je peux le faire dans le SP lui-même. –

+0

Je peux le faire ... mais je ne veux pas! –

+0

Je le fais également dans la requête où la requête n'est pas utilisée à d'autres fins (c'est-à-dire qu'elle est incorporée dans le rapport). Je le trouve simplement plus facile et moins imprévisible. –

Répondre

2

Malheureusement, parce que IIF n'est en fait qu'une fonction, tous les arguments sont évalués avant que la fonction ne soit appelée (ce qui entraîne votre division par zéro).

Une façon d'incorporer une logique complexe dans une expression consiste à incorporer une fonction dans le rapport. Vous pouvez écrire une fonction VB pour renvoyer ce que vous voulez dans l'onglet Code des propriétés du rapport.

Public Function GetMeanValue(ByVal Sum as Decimal, ByVal Count As Int) As Decimal 
    'your logic in plain old vb syntax here 

End Function 

Dans la propriété Textbox d'expression du texte:

=Code.GetMeanValue(Fields!Sum.Value, Fields!Count.Value) 
1

Essayez ceci:

=IIf(Fields!Count.Value = 0, 0, Fields!Sum.Value/IIf(Fields!Count.Value = 0, 1, Fields!Count.Value))

1

Voici une solution qui a toujours travaillé pour moi: Avoiding Divide By Zero Errors.

Cela devient fastidieux si le rapport comporte trop de divisions. Je préfère le code vb pour faire la division et gérer la division par zéro. Vous ne savez pas si trop de code vb réduirait les performances du rapport.

est ici how to do it with vb

+0

Le 2ème lien est mort. –

1

Lors de la vérification des zéros, je nie toujours l'expression comme ceci:

=IIF(Fields!Count.Value<>0,Fields!Sum.Value/Fields!Count.Value,0) 

Cela a l'avantage d'éviter la division dans le cas où le champ Count est vide/null.