自定义代码中的SSRS错误:预期的表达式

时间:2015-04-08 16:08:05

标签: vb.net visual-studio-2010 reporting-services ssrs-2008-r2

我正在使用一些自定义函数来执行SSRS中的某些统计信息。代码是在Visual Studio 2010中构建和测试的,当我尝试预览报表时工作正常。但是,当我尝试将报告部署到SSRS 2008R2时,出现错误:

There is an error on line 40 of custom code: [BC30201] Expression expected.

我搜索了这个问题的解决方案,但我还没找到。这是有问题的代码:

Public Function Avrg(c1 As Double, c2 As Double, c3 As Double, c4 As Double, c5 As Double, c6 As Double, c7 As Double, c8 As Double, NumQuarters As Integer) As Double
    Dim AV_Data As Double() =
    IIf(NumQuarters = 1, {c1, c2, c3, c4, c5},
    IIf(NumQuarters = 2, {c1, c2, c3, c4, c5, c6},
    IIf(NumQuarters = 3, {c1, c2, c3, c4, c5, c6, c7}, {c1, c2, c3, c4, c5, c6, c7, c8})))

    Dim stats = STDEV_Ave(AV_Data)

    Avrg = stats(2)
End Function

编辑:第40行显然是函数声明(第一行显示)......虽然我找不到任何错误。

该函数从报告中获取8个参数,并根据报告正在读取的非归档数据的数量(可能在1-4之间变化),数组声明不同。该数组输入统计函数,执行实际统计并返回所需的数字。在这个例子中,它是一个简单的平均值。

我改变了一次代码,最初它是一个if-elseif-else子句,但我读了几个我需要用级联IIF代替它的地方,因为SSRS的VB编译器是gimped。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

好的,所以我想出来了,我只是觉得我会为那些想知道如何解决这个问题的人发布答案。

首先,这是我对此的参考:http://www.sqlservercentral.com/blogs/dknight/2012/01/26/ssrs-custom-code-with-external-assemblies/

SSRS编译VB的能力,特别是在2008R2及更早版本中,与VS 2010中的编译器不兼容。(编辑,参见:Integrate SSRS with Visual Studio 2010)为了解决这个问题,我创建了一个共享函数的类库Visual Studio并将我的功能放入其中。按照上面的说明操作,并使用我的笔记作为可能被遮盖的部分的补充。

Public Class ClassName
....<Other functions>
    Public Shared Function StdDevP(c1 As Double, c2 As Double, c3 As Double, c4 As Double, c5 As Double, c6 As Double, c7 As Double, c8 As Double, NumQuarters As Integer) As Double
    Dim ST_data As Double() = IIf(NumQuarters = 1, {c1, c2, c3, c4, c5}, IIf(NumQuarters = 2, {c1, c2, c3, c4, c5, c6}, IIf(NumQuarters = 3, {c1, c2, c3, c4, c5, c6, c7}, {c1, c2, c3, c4, c5, c6, c7, c8})))
    Dim stats = STDEV_Ave(ST_data)

    StdDevP = stats(1)
End Function
End Class

对于SSRS 2008R2,特别是我们稍微偏离了引用的指令:在解决方案属性中将目标框架更改为3.5以避免兼容性问题。还要确保按照上面的说明对DLL进行签名!

.NET Version 构建类库并从项目的debug / bin文件夹中获取dll(这是默认值)。一旦掌握了它,您需要在报告服务器上执行两项操作。

首先:将dll复制到此文件夹:... \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportServer \ bin 这将是您的报告所引用的内容。

第二步:使用gacutil将dll添加到C:\ Windows \ Assembly文件夹中。如果您在服务器上安装了完整版VS,则可以使用Visual Studio命令提示符。

gacutil /i "ClassName.dll"

如果你没有安装VS(或只是有BIDS),你需要使用提升的命令提示符和CD到gacutil.exe所在的文件夹,或者如果你根本没有gacutil ,您需要为您的操作系统下载Microsoft SDK,其中包括gacutil。我有Windows Server 2008 R2,所以我将使用.NET Framework 4和Windows 7。使用适合您服务器的版本。您可以在安装后找到gacutil(根据您拥有的SDK更改v号):

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin

在SSRS报告中,将程序集(ReportServer文件夹中的程序集)添加到服务器上BIDS的“报告属性”中。

现在,为了在表达式中引用您的代码,您将使用类库和类名来访问您的函数。例如:

=ClassLibrary.ClassName.StdDevP(Fields!Column_1.Value,...)

您的报告现在应该部署和运行,就像您将功能放在自定义代码中一样!

答案 1 :(得分:0)

有一点需要注意:当我发生这种情况时,我通常可以通过空白更改来修复它。就像你为了清晰起见将一个Switch语句分成多行一样,这在预览中工作正常但在部署时会爆炸。将整个事情放在一行通常会解决它。

这使得以后进行修改变得更加痛苦,但如果您没有太多代码,那么与自定义程序集相比,它会更加激烈。