我在生成.rdlc报告时遇到问题。其中一列有这个表达式:
IIF(CInt(Fields!MyColumn.Value) = 0 or Fields!MyColumn.Value is nothing,"Unknown",Fields!MyColumn.Value)
我也尝试将该字段用作字符串:
=IIF(IsNothing(Fields!MyColumn.Value) or Fields!MyColumn.Value is nothing,"Unknown",Fields!MyColumn.Value.ToString())
当MyColumn的值不是NULL
时,报告会正确显示该值,但当它为NULL
时(或者当它转换为int类型时为0),报告将返回#Error
。奇怪的是,当我删除if函数并仅显示该字段的值时,报告显示0或空白(它不返回错误)。
我该如何解决这个问题?
答案 0 :(得分:3)
您可以尝试在不进行比较的情况下进行验证:
=IIf(Fields!YourColumn.Value
, Fields!YourColumn.Value
, "Unknown")
或者撤销支票(检查是否存在,而不是检查它是否存在):
=IIf(Fields!YourColumn.Value > 0
, Fields!YourColumn.Value
, "Unknown")
另外,我不确定,但它可能与在同一列中使用不同的值类型有关。尝试对整列使用相同的值类型。例如,仅输出字符串,或仅输出整数。
如果没有任何效果,您还可以检查代码中的NULL值,然后将值设置为0或-1(或左右)。然后在您的RDLC报告中,您可以检查它。
答案 1 :(得分:0)
我认为你必须先检查你的字段是否为空,否则你会在比较中得到错误(NULL
大于0? - >错误!)
所以你的公式必须是:
=IIF(IsNothing(Fields!MyColumn.Value) or CInt(Fields!MyColumn.Value) = 0,"Unknown",Fields!MyColumn.Value)
我也会尝试切换功能:
=Switch(
IsNothing(Fields!MyColumn.Value), "Unknown",
Fields!MyColumn.Value = 0, "Unknown",
Fields!MyColumn.Value > 0, Fields!MyColumn.Value,
)
此外,如果您的字段已经是数字,则不必使用CInt(“”),否则公式将为:
=Switch(
IsNothing(Fields!MyColumn.Value), "Unknown",
CInt(Fields!MyColumn.Value) = 0, "Unknown",
CInt(Fields!MyColumn.Value) > 0, Fields!MyColumn.Value,
)
答案 2 :(得分:0)
根据@ Deruijter的答案中的评论,如果表达式if (dr.ItemArray.GetValue(15).ToString() == "")
没有错误,那么你的字符串不是NULL
;你的数据集中只有空(即零长度)字符串。在这种情况下,在RDLC表达式中,您将使用Len
而不是IsNothing
,Is Nothing
或CInt
技巧。
如果值为真NULL
,则只需进行一次IsNothing
检查。
还要记住,在使用VB .NET does NOT short-circuit的RDLC表达式中Or
; VB .NET中与C#或C类似的等效短路or
运算符是OrElse
运算符。 (但这似乎不会影响到你)。