Использование параметров отчета в заголовке
Я читал другие посты, которые рекомендуют использовать параметры при отображении динамических данных в заголовке, потому что они корректно отображаются в формате PDF. Я пытаюсь реализовать это решение, но столкнулся с проблемой. Это работает, когда данные возвращаются для параметра, но выдает ошибку, если данные не возвращаются. Вот моя установка:
- скрытый
- Разрешить нулевое значение
- Разрешить пустое значение
- Доступные значения: из запроса
- Значения по умолчанию: из запроса
Текстовое поле в моем заголовке имеет следующее значение:
=IIf(IsNothing(Parameters![Report Parameter Name].Value), "", Parameters![Report Parameter Name].Value)
Когда строка не возвращается для значения по умолчанию, она отображает ошибку:
В параметре [Имя параметра отчета] отсутствует значение.
Я новичок в службах отчетности, поэтому мне может не хватать какой-то большой концепции. На мой взгляд, никакие возвращаемые данные не соответствуют критериям Allow null value.
1 ответ
Проблема с использованием IIF в случаях с IsNothing, а также в аналогичных делениях на ноль состоит в том, что это не языковая конструкция, а фактически функция. Поэтому параметры оцениваются перед вызовом функции, а это означает, что выражение, которое, по вашему мнению, не должно оцениваться, действительно оценивается перед вызовом функции.
Я знаю, что кажется сумасшедшим, что и истинная, и ложная части выражения IF вычисляются, но воспринимают это как вызов функции, а не как функцию языка. Нет короткого замыкания пути, как в языке, ошибка в вычислении ВСЕХ параметров до вызова функции.
Вы можете заменить это пользовательской функцией кода, чтобы получить тот же эффект, что и после. Итак, что-то вроде следующего:
Щелкните правой кнопкой мыши тело отчета и выберите "Свойства". Перейдите на вкладку "Код" и введите следующий код:
Public Function GetParamVal(ByVal ParamVal) As String
If IsNothing(ParamVal) Then
Return ""
Else
Return ParamVal
End If
End Function
Затем назовите это в своем заголовке так:
=Code.GetParamVal(Parameters!MyParam.Value)
(Я не перед системой, чтобы проверить это, но вы должны понять)