Вопрос

Здесь и там на этом сайте есть намеки на ответ на этот вопрос, но я задаю немного другой вопрос.

Где 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 ';
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top