2009-02-10 226 views
5

在這個網站上,這裏和那裏有關於這個問題的答案有一些提示,但我提出了一個稍微不同的問題。水晶報告公式: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給

  • [返回]如果表達式爲True,則truePart,如果expression爲False,則爲falsePart。返回值的類型與truePart和falsePart的類型相同。

我想,如果你盯着這行約「類型的返回值」你可以得到它,但是......

+0

我沒有CRXI今天簡潔,但是並不瞭解的第一個工作?它是否會讓間距錯誤(這是代碼中的邏輯錯誤 - 您有一個額外的Trim())或者以其他方式失敗? – Stobor 2009-02-10 22:58:57

+0

對於.Middle爲NULL的記錄,CR無法評估Trim(.Middle)中的字符串值,並且決定Iif的值爲NULL,即使我在那裏有顯式測試。 – SarekOfVulcan 2009-03-04 17:30:29

回答

5

我覺得CR會評估綜合投資框架真假零件。因爲您有「Trim({PatientProfile.Middle})」部分,那麼將評估aganst null值,CR公式評估程序看起來只是失敗。

+1

是的,但我試圖找出它在血腥文檔中的位置,而不是讓所有遇到Google的人都能找到答案。畢竟,我們中有一兩個人知道代碼是如何工作的... – SarekOfVulcan 2009-03-04 17:31:33

+2

來自CR幫助: 在返回結果之前評估IIF函數的每個參數。因此,使用IIF時應注意不良副作用。例如,如果falsePart導致除零,即使表達式爲True,也會發生錯誤,因此返回truePart。 – Arvo 2009-03-04 22:25:53

10

Crystal Reports如何證明此語法不起作用?

我懷疑有任何地方在整個宇宙中記錄並不在Crystal Reports工作一切足夠大......

+0

大聲笑,感謝讓我在這個美好的星期五笑了) – contactmatt 2012-06-08 20:18:45

5

我知道我多年來就這一個晚了,但我來了在試圖弄清楚同樣的事情的同時,在這個問題上。有趣的是,我甚至無法在Crystal Reports文檔中找到答案,而是在link to IBM中找到答案。

如果您使用Crystal Reports 8.x或10.x,則和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。

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