1

我有一个从数据库作为字符串返回的值,但它可能是 a decimal,当它是 a 时,decimal我想将其显示为 adecimal并以某种方式对其进行格式化,如果不是,decimal那么我只显示任何值回来。

这是我的代码:

=Iif
(
    IsNothing(Fields!Amount.Value) Or Len(Trim(Fields!Amount.Value)) < 1, 
    Fields!Amount.Value, //have even tried to do CStr(Fields!Amount.Value) in case conversion below makes the report expect decimals for all values
    Iif
    (
        IsNumeric(Fields!Amount.Value), 
        CDec(Fields!Amount.Value),
        Fields!Amount.Value
    )
)

上面的注释不是代码的一部分,我只是把它放在这里。无论如何,根据上述情况,所有小数都成功转换为小数并显示正常,但所有那些为空或包含非数字值的字符串都显示为#Error。

这是一个示例结果显示:

72.00
95.00
#Error
20.00

这个表达有什么问题?为什么 SSRS 不能使用 c# 而不是 VB?!!?

更新:我知道问题与转换有关,而不是与检查值是否为空、小于 1 个字符或数字的逻辑有关,因为以下方法有效:

=Iif
(
    IsNothing(Fields!Amount.Value) Or Len(Trim(Fields!Amount.Value)) < 1, 
    "is nothing or less than 1",
    Iif
    (
        IsNumeric(Fields!Amount.Value), 
        "is numeric",
        "is not numeric"
    )
)

这将正确显示:

is numeric
is numeric
is nothing or less than 1
is numeric
4

2 回答 2

1

Iif是一个函数,因此在调用函数之前对所有参数进行评估。所以使用 Iif 来防止错误是没有用的。

我想您需要一个用户定义的函数(在 SSRS 中编写自定义函数

所以与其Iif(IsNumeric(Fields!Amount.Value),...)

定义一个函数

Function DecimalIfPossible(Value as string) As Object
  If IsNumeric(Fields!Amount.Value) then
      Return  CDec(Fields!Amount.Value)
   else
      Return  Fields!Amount.Value
   End if
End Function

并调用它DecimalIfPossible(Fields!Amount.Value)

于 2013-08-23T17:23:48.747 回答
0

为什么不将小数转换回字符串

 IIF
    (
        IsNumeric(Fields!Amount.Value), 
        CStr(CDec(Fields!Amount.Value)),
        Fields!Amount.Value
    )

根据您的逻辑,您正在寻找空字符串或 Null 字符串,因此请在 SQL 中处理它。如果它是非数字的,则将其转换为 NULL

CASE WHEN ISNUMERIC(Amount) = 1 THEN Amount ELSE NULL END As Amount

或使用NULLIF

于 2013-08-23T17:28:54.857 回答