SSRS中的懒惰评估

时间:2008-12-23 12:18:57

标签: vba reporting-services switch-statement iif

我正在使用SSRS 2005生成报告,我报告中的一列是简单的平均值计算。我不想除以零,所以对于我放的文本框值:

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

这仍然会评估第二个表达式。

同样如此:

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

我不希望我的报告显示错误。我怎样才能克服这个问题?

4 个答案:

答案 0 :(得分:2)

不幸的是因为IIF实际上只是一个函数,所以在调用函数之前会对所有参数进行求值(导致除以零)。

在表达式中嵌入复杂逻辑的一种方法是在报表中嵌入一个函数。您可以编写一个VB函数,在报告属性的代码选项卡中返回您喜欢的任何内容。

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

End Function

在文本框文本表达式属性中:

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

以下是一直对我有用的解决方案: Avoiding Divide By Zero Errors

如果报告有太多分歧,那就太乏味了。我更喜欢一些vb代码进行除法并处理除零。不确定是否有太多的vb代码会降低报告的性能。

这是how to do it with vb

答案 3 :(得分:1)

检查零时,我总是否定这样的表达式:

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

如果Count字段为空/ null,则可以避免分割。