Редактор выражений SSRS не распознает встроенную функцию кода
У меня есть отчет SSRS с информацией о счетах, выставленных моей компанией, с указанием суммы, даты, платежа, причитающейся суммы и т. Д. Я использую SSRS 2008 (не R2) в среде Visual Studio 2008. Моя проблема связана с форматированием отчета с использованием редактора выражений. В настоящее время счет-фактура будет отформатирован как серебро, если счет-фактура имеет сумму задолженности (столбец) более 0,01 (неоплаченный счет-фактура). Мы также выдаем кредиты (отрицательные суммы), и они почти всегда являются отрицательной суммой предыдущего счета.
Таким образом, счет, на который выдан кредит, будет по-прежнему отображаться как серебро, потому что его сумма должна быть> 0,01. Но если на этот счет выставлен кредит, он не является непогашенным и должен быть белым. Например, если счет-фактура составляет 100 долларов США, и после этого стоит кредит (100 долларов США), фоновый цвет исходного счета должен быть переключен на белый.
Вот здесь и дается объяснение кода. Я думал, что это возможно с помощью пользовательского кода VB в отчете, но кажется, что редактор выражений в SSRS не распознает мою функцию, так как он говорит "Нераспознанный идентификатор". Я немного погуглил, и большинство тем, с которыми я сталкивался, говорили, что это покажет это, но на самом деле работает в любом случае. Ну, я почти уверен, что это вообще не работает, потому что я добавил это в качестве выражения и получил все белые клетки для определенного столбца:
=IIF(Fields!Amount_Due.Value > 0.01,
IIF(Code.HasCredit(Fields!Amount_Due.Value) = True, "Blue", "Silver"), "Red")
Функция HasCredit находится ниже.
Function HasCredit(ByVal currentAmt as Double) As Boolean
Dim i as Integer
Dim amt as Double
Dim amts as System.Collections.ArrayList = New System.Collections.ArrayList()
Dim negativeAmt as Double
Dim retValue as Boolean = "False"
i = 0
For i = 1 to Report.Parameters!Test.Count()
amt = Report.Parameters!Test.Value(i)
amts.Add(amt)
Next
negativeAmt = currentAmt * -1
If amts.Contains(negativeAmt) Then
retValue = "True"
End If
Return retValue
End Function
Когда эти две части запускаются, я получаю белый фон для всех ячеек этого столбца. Я прочитал что-то в сети, говоря, что будут работать только общие функции, но я нашел несколько других примеров, показывающих функции, которые не были разделены, которые работали. Когда я делюсь им, это дает мне: BC30369 Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.
из-за строки Report.Parameters!Test.Count(). Я получил представление об использовании Report.Parameters с http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/a7d59224-0ee5-491e-883b-2e5fcb3edeab.
Итак, еще раз повторяю, что я в основном пытаюсь сделать, это получить значения каждой ячейки в этом столбце в коллекцию и, для любых двух сумм, где одна сумма имеет отрицательный эквивалент, дать ей белый фон вместо серебра.
2 ответа
В SSRS 2008 R2, даже если вы ссылаетесь на допустимый метод пользовательского кода, редактор выражений может все же предупредить, что идентификатор недействителен. Это не всегда означает, что это неверно. Моя функция сработала, хотя это предупреждение было сгенерировано.
После нескольких дополнительных исследований я понял, как решить эту проблему. В основном мне пришлось добавить текстовое поле с функцией =Join(), чтобы все значения в столбце были помещены в это текстовое поле; затем обратитесь к текстовому полю в пользовательском коде и используйте логическое значение в редакторе выражений. Подробные инструкции ниже.
1) Добавьте многозначный параметр в свой отчет (щелкните правой кнопкой мыши Параметры, Добавить параметр). Назовите его, выберите "Разрешить множественные значения", выберите "Скрытый" для видимости параметра. Для вкладки Доступные значения выберите Получить значения из запроса. Укажите на свой набор данных и установите в поле "Значение" столбец, который вы хотите проверить параметром. Для меня это была моя колонка Сумма к оплате. Поле метки не имеет значения и может быть оставлено пустым. На вкладке Значения по умолчанию сделайте то же самое, убедитесь, что в поле значения указан тот же столбец, что и раньше. В разделе "Дополнительно" выберите "Никогда не обновлять".
2) Создайте новое текстовое поле в своем отчете. Может хотеть назвать это, ex txtColumnValues. Отредактируйте выражение и вставьте это в: =Join(Parameters!YourParameter.Value, ",")
Это позволит получить все значения полей из столбца, указанного в параметре, каждое из которых разделено запятой.
3) Отредактируйте пользовательский код вашего отчета и сделайте функцию VB (как Boolean), чтобы проверить текстовое поле. Например, вот мой код.
Public Function HasCredit(Amt as Double, ri as ReportItems) as Boolean
Dim retValue as Boolean = False
If Amt > 0.00 AndAlso ri!txtAmounts.Value.Contains(Amt*-1) Then
retValue = True
End If
Return retValue
End Function
4) Наконец, перейдите в редактор выражений для поля, которое вы хотите изменить. В моем примере я хотел изменить цвет фона, если текущее поле имело отрицательный эквивалент в одном из других полей (мое текстовое поле), поэтому мой код выглядел так:
=IIF(Fields!Balance.Value > 0.01
AND Code.HasCredit(Fields!Balance.Value, ReportItems) = False, "Silver", "White")
Мне пришлось взять отдельные фрагменты информации с 3 или 4 страниц, собрать их вместе и надеяться, что они сработали... примерно через неделю они сработали... Думаю, все дело в настойчивости. Если вам нужна дополнительная помощь с этим, просто дайте мне знать.