2
votes

SSRS - Conversion d'une valeur en nombre causant des problèmes lors de l'utilisation d'une valeur NULL

J'ai une expression dans SSRS qui est conçue pour changer le format d'un champ en fonction de la valeur d'un autre champ:

=IIF(ISNOTHING(Fields!RD.Value), "", IIF(InStr(Fields!ReportHeader_f2.Value,"Average") > 0,Format(Fields!RD.Value,"N") * 1.000,Format(Fields!RD.Value,"#,##;(#,##)") * 1.000))

J'ai besoin que les valeurs apparaissent sous forme de nombres dans Excel feuille de calcul donc je les multiplie par 1.000 (j'ai aussi essayé Cdbl).

Lorsque l'expression rencontre une valeur NULL pour RD , le La cellule #Error apparaît. J'ai essayé d'utiliser la balise ISNOTHING () pour en tenir compte et j'ai essayé de transformer les valeurs NULL en zéros, puis d'en tenir compte.

Quel pourrait être le problème avec mon expression?


2 commentaires

Avez-vous essayé dans la première condition de rechercher également du blanc? ISNOTHING (Champs! RD.Value) OU Champs! RD.Value = ""


Merci d'avoir répondu, Wei. J'ai juste essayé ceci - cela n'a pas fonctionné pour moi non plus.


3 Réponses :


0
votes

1- Vous pouvez utiliser la fonction ISNOTHING:

Function IfNullUseZero(myvalue as object)
     IF IsNull(myvalue) then
            Return 0
     Elseif myvalue =" " then
            Return 0
End If

2- Développer une requête personnalisée. Ouvrez le menu Rapport-> Propriétés du rapport-> Code, et utilisez:

=IIF(IsNothing(Fields!RD.Value),0,Fields!RD.Value)

puis, sur le rapport, faites = Code.IfNullUseZero (Fields! RD.Value) .

Réf: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/bd6dfd75-feb6-4093-8909- 6c4054b64c96 / convert-null-to-0-in-ssrs? Forum = sqlreportingservices


2 commentaires

Merci d'avoir répondu, Eray. Lorsque j'essaye le code que vous avez collé, j'obtiens une erreur dans l'écran de prévisualisation: «IsNull» n'est pas déclaré. Il peut être inaccessible en raison de son niveau de protection. Une idée de ce que cela pourrait signifier?


J'ai essayé ça. Aucun message d'erreur mais cela n'a pas résolu le problème initial.



2
votes

Pour moi, il semble que votre IsNothing n'attrape pas les valeurs NULL et l'erreur survient lorsque SSRS tente de formater la valeur NULL mais n'a pas de moyen de gérer cela. Personnellement, ma solution préférée à cela serait de m'assurer que toutes les valeurs NULL sont converties en zéros dans la requête / proc avant d'entrer dans le rapport. Frappez simplement un ISNULL (RD, 0) et essayez de gérer le zéro dans le rapport. J'essaierais également de CDbl essentiellement tout ce qui entre dans cette expression juste pour être sûr que rien ne vient avec un mauvais type de données. Probablement une meilleure option que d'essayer de multiplier chacun par 1.000. En outre, l'erreur peut provenir de la tentative de multiplication du champ formaté par 1.000. SSRS fonctionne de manière mystérieuse. Je pense que cela devrait fonctionner.

=IIF(CDbl(Fields!RD.Value) = 0.0, 
     "", 
     IIF(InStr(Fields!ReportHeader_f2.Value, "Average") > 0, 
         Format(CDbl(Fields!RD.Value), "N"),
         Format(CDbl(Fields!RD.Value), "#,##;(#,##)")))

Vous pourriez également être en mesure de remplacer les conversions CDbl par Format (Fields! RD.Value * 1.000, " N ") , etc ... Il y a quelques endroits où les choses auraient pu mal tourner, mais cette approche semble la plus susceptible de fonctionner, IMO.

Une autre solution potentielle que j'ai explorée avec mes tests était de créer un champ calculé basé sur le champ d'origine. Par exemple, appelez-le RD2 et définissez la valeur égale à = IIF (Fields! RD.Value Is Nothing OR Fields! RD.Value = 0, 0, Fields! RD.Value) . Ensuite, vous pouvez utiliser l'expression ci-dessus avec le champ calculé RD2 . Semblait attraper les valeurs nulles lors de mes tests.


7 commentaires

Cela l'a fait! J'ai demandé à la colonne de renvoyer zéro sur IsNull dans le SQL et j'ai utilisé votre extrait de code SSRS. J'ai dû ajouter une autre parenthèse à la fin. Si vous modifiez votre solution pour inclure les parenthèses supplémentaires, je la marquerai comme solution. Merci pour votre temps, Steve-o !! EDIT: parlé trop tôt - les valeurs ne semblent pas revenir sous forme de nombres dans la feuille Excel. Je vais devoir enquêter à ce sujet ...


Terminé. Heureux de vous aider.


@ScottS. Il était trop tard pour modifier mon commentaire mais je me demande si le Format dans certains cas change la valeur en une chaîne ... Pas vraiment sûr, mais vous feriez peut-être mieux de simplement apporter la valeur et en utilisant Excel pour formater la valeur en conséquence.


J'ai compris ce que c'était. C'était la ligne Format avec le morceau "#, ##; ... etc". SSRS ne semble pas aimer lorsque vous multipliez une chaîne par un double. Le client n'aime peut-être pas l'omission de la virgule, mais je pense qu'il préférerait le format numérique. Je vais toujours marquer votre réponse, Steve-o ... cela m'a conduit à ce qui a finalement fonctionné: = IIF (CDbl (Fields! RD.Value) = 0.0, "", IIF (InStr (Fields! ReportHeader_f2.Value) , "Average")> 0, Format (CDbl (Fields! RD.Value), "N") * 1.000, Format (CDbl (Round (Fields! RD.Value)), "N") * 1.000))


@ScottS. Pouvez-vous simplement faire la multiplication avant de formater? Comme Format (CDbl (Round (Fields! RD.Value * 1.000)), "#, ##; (#, ##)") ?


Dernier commentaire pour ce fil: Je viens d'essayer votre suggestion - elle est toujours retournée sous forme de champ de texte dans Excel. Merci encore pour votre temps et votre aide.


@ScottS. C'est la fonction Format qui convertit la cellule en texte plutôt qu'en numérique. Vérifiez ma réponse sur la façon d'obtenir des valeurs numériques exportées vers Excel.



0
votes

Il y a deux ou trois choses qui se produisent ici qui posent des problèmes:

Premièrement, IIF est une fonction et non une construction de langage. Cela signifie qu'il n'y a pas de court-circuit logique en fonction de la valeur de la première comparaison de paramètres, il évalue tous les paramètres avant d'appeler la fonction. Donc, si le paramètre True ou False avait une erreur, le tout explosera quelle que soit la valeur du conditionnel.

Pour éviter cela, vous devez généralement organiser deux appels de fonction IIF de manière à ce qu'aucune erreur ne se produise. Passons maintenant à la source de votre problème: CDbl lancera une erreur s'il rencontre une entrée non numérique. La réponse de @ Steve-o169 empêche cela en utilisant deux fonctions IIF de manière à ce qu'aucune conversion invalide ne soit effectuée, évitant ainsi l'erreur. Une autre façon serait d'utiliser la fonction Val plutôt que CDbl car la fonction Val fait des évaluations numériques sans générer d'erreur - elle saisit simplement ce qu'elle peut et appelle ce numéro.

Cependant, vous n'avez pas à vous en soucier car la présentation doit être séparée des données: vous voulez que la Valeur soit numérique, sinon si vous utilisez le La fonction Format puis l'exportation vers Excel auront des valeurs textuelles plutôt que numériques. Plutôt que de mettre le formatage dans l'expression Value , vous devez le placer dans la propriété Format à sa place, de sorte que les valeurs seront exportées sous forme de nombres et le format sera également correct dans Exceller.

Donc, nous n'avons même pas à nous soucier de la valeur du champ, il suffit de définir l'expression de la propriété Value sur la valeur du champ afin qu'elle soit exportée sous forme de nombre.

Maintenant, pour définir correctement le Format , dans la propriété Format de votre cellule, utilisez l'expression suivante:

=IIF(InStr(Fields!ReportHeader_f2.Value, "Average") > 0, "N", "#,##;(#,##)")


0 commentaires