Формула Crystal Reports:IsNull + Iif
-
22-08-2019 - |
Вопрос
Здесь и там на этом сайте есть намеки на ответ на этот вопрос, но я задаю немного другой вопрос.
Где Crystal Reports документирует, что этот синтаксис не работает?
Trim({PatientProfile.First}) + " "
+ Trim(Iif(
IsNull({PatientProfile.Middle})
, Trim({PatientProfile.Middle}) + " "
, " "
)
)
+ Trim({PatientProfile.Last})
Я знаю, что решение таково
If IsNull({PatientProfile.Middle}) Then
Trim({PatientProfile.First})
+ " " + Trim({PatientProfile.Last})
Else
Trim({PatientProfile.First})
+ " " + Trim({PatientProfile.Middle})
+ " " + Trim({PatientProfile.Last})
но как мы должны понять, что не можем использовать первую версию?
В документации для IsNull говорится
- Вычисляет поле, указанное в текущей записи, и возвращает значение TRUE, если поле содержит нулевое значение
и Iif дает
- [Возвращает] truePart, если выражение равно True, и falsePart, если выражение равно False.Тип возвращаемого значения совпадает с типом truePart и falsePart.
Я полагаю, если вы посмотрите на эту строку о "типе возвращаемого значения", вы можете получить его, но...
Решение
Я думаю, что CR оценивает как истинные, так и ложные части IIFs.Поскольку у вас там есть часть "Trim({PatientProfile.Middle})", которая будет оцениваться по нулевому значению, CR formula evaluator, похоже, просто терпит неудачу.
Другие советы
Где Crystal Reports документирует, что этот синтаксис не работает?
Я сомневаюсь, что во всей вселенной есть место, достаточно большое, чтобы документировать все, что не работает в Crystal Reports...
Я знаю, что опоздал с этим вопросом на годы, но я наткнулся на этот вопрос, пытаясь выяснить то же самое.Как ни странно, я даже не смог найти ответ в документации Crystal Reports, но вместо этого в ссылка на IBM.
К сожалению, если вы используете Crystal Reports 8.x или 10.x, ISNULL
и IIF
не работайте вместе.С сайта:
Потому что
В Crystal Reports 8.x и 10.x имеется дефект, который не позволяет приведенной выше формуле работать корректно.Команды 'IIF' и 'IsNull' не могут функционировать вместе, и это включает в себя попытку использовать "Not" для изменения команды IsNull;например, IIF(не IsNull ()).
Решение проблемы
Обходной путь заключается в использовании инструкции "If-Then-Else".Например,
If IsNull({~CRPT_TMP0001_ttx.install_date}) Then "TBD" Else "In Progress"
Так что, если вы используете CR 8.x или 10.x (каковыми являемся мы), вам не повезло.Это делает работу ПО-НАСТОЯЩЕМУ увлекательной, когда вы объединяете несколько полей вместе, и одно из них может быть нулевым.
попробуй это:
currencyvar tt;
currencyvar dect;
tt :={ship.comm_amount};
dect := tt - Truncate(tt);
tt := truncate(tt);
dect := dect * 100;
if dect = 0 then
UPPERCASE('$ ' + ToWords (tt,0 )) + ' ONLY'
else
UPPERCASE('$ ' + ToWords (tt,0) + ' And ' + ToWords(dect,0)) + ' ONLY ';