тип возвращаемого значения IIF

Обсуждение Stimulsoft Reports.NET
Ответить
Аватара пользователя
Андрей Сорокин
Сообщения: 107
Зарегистрирован: 02 июл 2009, 11:31
Откуда: Bryansk, Russia
Контактная информация:

тип возвращаемого значения IIF

Сообщение Андрей Сорокин »

Добрый день,
после перехода на версию 2011.1 появилась ошибка в некоторых отчётах, где используется функция IIF.
Например, строка вида:

Код: Выделить всё

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * IIF(Coefficient2 == 0, 1, Coefficient2))}
где оба операнда Amount и Coefficient2 имеют тип decimal выдаёт ошибку:
Оператор "*" не может применяться к операндам типа "decimal" и "object"
Я так понял данная ошибка связана с тем, что IIF возвращает object. В предыдущих версиях всё было ОК. Как мне выйти из данной ситуации?

P.S. Временное решение проблемы нашёл через использование функции MAX, но это не есть хорошо:

Код: Выделить всё

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * Max(IIF(Coefficient2 == 0, 1, Coefficient2)))}
Ivan
Сообщения: 641
Зарегистрирован: 10 авг 2006, 05:40
Откуда: Stimulsoft Office

тип возвращаемого значения IIF

Сообщение Ivan »

Здравствуйте.

В предыдущей версии было несколько перегрузок функции IIF для разных типов параметров. Но эти перегрузки пришлось убрать из-за одного неприятного бага компилятора: если для метода есть перегрузки, то компилятор пытается найти перегрузку с точным совпадением типов параметров, и выдает ошибку если такая перегрузка не найдена (даже если есть перегрузка с универсальными типами параметров object).

Добавлять перегрузки методов для всех возможных комбинаций типов параметров не имеет смысла, так как получается больше сотни перегрузок каждого метода.
Поэтому была оставлена одна перегрузка с типом параметров object. Для дальнейшего использования в выражениях достаточно произвести приведение типов, например:

Код: Выделить всё

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * (decimal)IIF(Coefficient2 == 0, 1, Coefficient2))}
Спасибо.
Аватара пользователя
Андрей Сорокин
Сообщения: 107
Зарегистрирован: 02 июл 2009, 11:31
Откуда: Bryansk, Russia
Контактная информация:

тип возвращаемого значения IIF

Сообщение Андрей Сорокин »

Спасибо, как-то я не подумал о стандартном приведении типов! :feelgood:
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

тип возвращаемого значения IIF

Сообщение Aleksey »

Ок.
Сообщите, если понадобится дополнительная помощь.
Аватара пользователя
Андрей Сорокин
Сообщения: 107
Зарегистрирован: 02 июл 2009, 11:31
Откуда: Bryansk, Russia
Контактная информация:

тип возвращаемого значения IIF

Сообщение Андрей Сорокин »

Одна поправка: значение 1, возвращаемое IIF, корректно не приводится к типу decimal, т.е. в данном примере если Coefficient2 равен нулю получается в итоге пустая строка. Пришлось добавить к единице литеру "m", в итоге корректное выражение получилось такое:

Код: Выделить всё

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * (decimal)IIF(Coefficient2 == 0, 1m, Coefficient2))}
Funix
Сообщения: 7
Зарегистрирован: 29 мар 2010, 04:28
Откуда: Belarus

тип возвращаемого значения IIF

Сообщение Funix »

А вообще есть еще один вариант решения этой "проблемы" - старый добрый условный оператор (?:), он-то по прежнему работает "как часы" и не требует явного приведения типов. Таким образом получаем более простое и лаконичное:

Код: Выделить всё

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * (Coefficient2 == 0 ? 1 : Coefficient2))}
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

тип возвращаемого значения IIF

Сообщение Aleksey »

Да, такой вариант тоже можно использовать.
Ответить