自定义代码中的 SSRS 错误:需要表达式

SSRS Error in custom code: expression expected

我正在使用几个自定义函数在 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 之间变化),数组声明是不同的。该数组输入一个统计函数,该函数执行实际统计和 returns 所需的数字。在这个例子中,它是一个简单的平均值。

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

如有任何帮助,我们将不胜感激!

好的,所以我想通了,我只是想 post 想知道如何解决这个问题的人的答案。

首先,这是我对此的参考: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)为了解决这个问题,我创建了一个class 共享函数库 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 已按照上述说明进行签名!

构建 class 库并从项目的 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(v 数字根据你拥有的 SDK 而变化):

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

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

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

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

您的报表现在应该可以部署和运行,就像您将函数放在自定义代码中一样!

需要注意的一件事:当我遇到这种情况时,我通常可以通过更改空格来修复它。就像如果您为了清楚起见将 Switch 语句分成多行,它在预览中工作正常但在部署时爆炸。将整个事情放在一行通常会解决它。

这会使以后修改起来更加痛苦,但如果您不涉及太多代码,则比使用自定义程序集要轻松一些。