2009-02-10 3 views
5

На этом сайте есть подсказки ответа на этот вопрос, но я задаю несколько другой вопрос.Формула Crystal Reports: IsNull + Iif

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

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

+0

Я не CRXI удобно сегодня, но что не работает о первом? Неправильно ли это происходит с интервалом (что является логической ошибкой в ​​коде - у вас есть дополнительный Trim()) или он не работает каким-то другим способом? – Stobor

+0

Для записей, где .Middle является NULL, CR не может оценить строковое значение в Trim (.Middle) и решает, что значение Iif равно NULL, хотя у меня есть этот явный тест. – SarekOfVulcan

ответ

5

Я думаю, CR оценивает как КИРП истинные и ложные детали. Поскольку у вас есть часть «Trim ({PatientProfile.Middle)), которая будет оцениваться с нулевым значением aganst, оценщик формулы CR, похоже, просто терпит неудачу.

+1

Да, но я пытаюсь выяснить, где в кровавой документации это _says_ это, вместо того, чтобы заставить всех, кто сталкивается с ним, Google для ответа. В конце концов, один или два из нас знают, как код _supposed_ работать ... – SarekOfVulcan

+2

Из справки CR: Каждый аргумент функции IIF оценивается до возвращения результата. Таким образом, вы должны следить за нежелательными побочными эффектами при использовании IIF. Например, если falsePart приводит к делению на ноль, произойдет ошибка, даже если выражение True, и возвращается truePart. – Arvo

10

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

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

+0

lol, спасибо, что заставил меня смеяться над этой прекрасной пятницей;) – contactmatt

5

Я знаю, что лет поздно на этом, но я пришел на этот вопрос, пытаясь понять то же самое. Забавно, я даже не мог найти ответ в документации Crystal Reports, но вместо этого в link to 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.

+1

Обратите внимание, что даже если вы объединяете несколько полей вместе, синтаксис не так уж плох, так как Crystal поддерживает такие вещи: (if IsNull ({Col1}), затем 0 else {Col1}) + (если IsNull ({Col12}), то 0 else {Col2}) – JoshL

-3

попробовать это:

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 '; 
+4

Какой вопрос должен отвечать? – SarekOfVulcan

Смежные вопросы