4

Я использую несколько пользовательских функций для выполнения некоторых статистических данных в SSRS. Код был построен и протестирован в Visual Studio 2010, и отлично работает, когда я пытаюсь и просматриваю отчет. Однако, когда я пытаюсь развернуть отчет в SSRS 2008R2 я получаю сообщение об ошибке:Ошибка SSRS в пользовательском коде: выражение ожидается

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 

EDIT: Строка 40 является, по-видимому объявление функции (первая строка представлена) ... хотя я не могу найти ничего плохого.

Функция принимает 8 параметров из отчета и на основе количества неархивированных кварталов данных, которые считывает отчет (который может варьироваться от 1-4), объявление массива отличается. Этот массив подается в статистическую функцию, которая выполняет фактическую статистику и возвращает нужный номер. В этом примере это простое среднее.

Я изменил код один раз, первоначально это было предложение if-elseif-else, но я прочитал несколько мест, которые мне нужно было заменить каскадным IIF, потому что SSRS VB-компилятор имеет gimped.

Любая помощь была бы принята с благодарностью!

+0

Мы не можем определить, какие из этих строк являются «Линией 40». – OneFineDay

+0

Это первая строка кодового блока; Я уточнил это в вопросе. Благодаря! –

+0

Отладить эту функцию и посмотреть, какая она. Это может быть даже функция 'STDEV_Ave' – OneFineDay

ответ

0

Итак, я понял, я просто подумал, что отправлю ответ всем, кто задавался вопросом, как решить эту проблему.

Прежде всего, вот моя ссылка на это: http://www.sqlservercentral.com/blogs/dknight/2012/01/26/ssrs-custom-code-with-external-assemblies/

способность SSRS для компиляции VB, в частности, в 2008R2 и ранее, является несовместимым с компилятором в VS 2010. (EDIT, СМ: 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 Создайте библиотеку классов и возьмите dll из папки debug/bin вашего проекта (это значение по умолчанию). Как только вы его получите, вам нужно будет сделать две вещи на сервере отчетов.

Во-первых: Скопируйте 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), вам необходимо либо использовать командную строку с повышенными и компакт-диск в папку, где 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) в свое Свойство отчета в ЗАЯВКЕ на вашем сервере.

Теперь, чтобы ссылаться на ваш код в выражении, вы должны использовать Class Class и Class name для доступа к вашим функциям. Например:

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

Теперь ваш отчет должен быть развернут и функционировать точно так же, как если бы вы поместили свои функции в собственный код!

0

Одна вещь, которую следует отметить: когда это произошло, я обычно могу исправить ее с помощью пробелов. Например, если для ясности у вас есть оператор Switch, разбитый на несколько строк, это отлично работает при предварительном просмотре, но взрывается при развертывании. Помещение всего объекта на одной линии обычно исправляет его.

Это приводит к большему изменению позже, но оно немного менее решительно, чем наличие пользовательской сборки, если у вас слишком много кода.