Формула Crystal Reports: IsNull + Iif - PullRequest
5 голосов
/ 10 февраля 2009

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

Где 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.

Полагаю, если вы посмотрите на эту строку о "типе возвращаемого значения", вы можете его получить, но ...

Ответы [ 4 ]

10 голосов
/ 07 января 2011

Где Crystal Reports документирует, что этот синтаксис не работает?

Я сомневаюсь, что во вселенной достаточно места, чтобы документировать все, что не работает в Crystal Reports ...

5 голосов
/ 19 мая 2011

Я знаю, что опоздал на этот год, но я столкнулся с этим вопросом, пытаясь понять то же самое. Как ни странно, я даже не смог найти ответ в документации Crystal Reports, но вместо этого в ссылке на IBM .

Если не учитывать Crystal Reports 8.x или 10.x, ISNULL и IIF не работают вместе. С сайта:

Причина

В Crystal Reports 8.x и 10.x имеется дефект, из-за которого вышеуказанная формула не работает правильно. Команды «IIF» и «IsNull» не могут работать вместе, и это включает в себя попытку использовать «Not» для изменения команды IsNull; например, IIF (Not IsNull ()).

Решение проблемы

Обходной путь должен использовать оператор «If-Then-Else». Например,

If IsNull({~CRPT_TMP0001_ttx.install_date}) Then "TBD" Else "In Progress"

Так что, если вы используете CR 8.x или 10.x (которым мы являемся), вам не повезло. Это действительно весело, когда вы объединяете несколько полей вместе, и одно из них может быть NULL.

5 голосов
/ 12 февраля 2009

Я думаю, что CR оценивает как истинные, так и ложные части ИИФ. Поскольку у вас есть часть «Обрезать ({PatientProfile.Middle})», которая будет оценена как нулевое значение, вычислитель формулы CR кажется просто неудачным.

0 голосов
/ 29 июня 2011

попробуйте это:

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 ';
...