【问题标题】:SSRS Error in custom code: expression expected自定义代码中的 SSRS 错误:预期表达式
【发布时间】:2015-04-08 16:08:04
【问题描述】:

我正在使用几个自定义函数来执行 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。

任何帮助将不胜感激!

【问题讨论】:

  • 我们无法分辨其中哪一行是Line 40
  • 是代码块的第一行;我已经在问题中澄清了。谢谢!
  • 调试该函数并查看它是哪一行。甚至可以是函数STDEV_Ave
  • 这个函数我已经调试过了。正如我所说,报告在预览模式下运行良好,代码在我为测试它而制作的控制台应用程序中编译和运行完美。它只是没有部署我的 SSRS 报表服务器。
  • 我在 Visual Studio 2008 中开发 SSRS 2008 R2 报告,并且我的自定义代码没有问题。我想知道这可能是版本兼容性问题吗?来自:stackoverflow.com/questions/12470969/…“只有 SQL Server 2012 支持在 Visual Studio 2010 中开发 SSRS 报表。”

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


【解决方案1】:

好的,所以我想通了,我只是想将答案发布给任何想知道如何解决此问题的人。

首先,这是我的参考: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 进行签名!

构建类库并从项目的 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 中的报告属性中。

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

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

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

【讨论】:

    【解决方案2】:

    需要注意的一点:当我遇到这种情况时,我通常可以通过更改空格来修复它。就像您为了清楚起见将 Switch 语句分成多行一样,它在预览中运行良好,但在部署时会爆炸。将整个东西放在一条线上通常会解决它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多