Страница 1 из 1

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

Добавлено: 06 апр 2011, 08:45
Андрей Сорокин
Добрый день,
после перехода на версию 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)))}

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

Добавлено: 06 апр 2011, 16:04
Ivan
Здравствуйте.

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

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

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

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * (decimal)IIF(Coefficient2 == 0, 1, Coefficient2))}
Спасибо.

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

Добавлено: 07 апр 2011, 12:26
Андрей Сорокин
Спасибо, как-то я не подумал о стандартном приведении типов! :feelgood:

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

Добавлено: 07 апр 2011, 12:48
Aleksey
Ок.
Сообщите, если понадобится дополнительная помощь.

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

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

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

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * (decimal)IIF(Coefficient2 == 0, 1m, Coefficient2))}

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

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

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

{Format("{0:N2}", Sum(DataBand1,ReportRegister.Amount) * (Coefficient2 == 0 ? 1 : Coefficient2))}

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

Добавлено: 08 апр 2011, 11:10
Aleksey
Да, такой вариант тоже можно использовать.