2009-02-10 13 views
5

Có gợi ý câu trả lời cho câu hỏi này ở đây và trên trang này, nhưng tôi hỏi một câu hỏi hơi khác.Công thức báo cáo tinh thể: IsNull + Iif

Báo cáo Crystal ở đâu tài liệu cú pháp này không hoạt động?

Trim({PatientProfile.First}) + " " 
    + Trim(Iif(
     IsNull({PatientProfile.Middle}) 
     , Trim({PatientProfile.Middle}) + " " 
     , " " 
     ) 
    ) 
+ Trim({PatientProfile.Last}) 

tôi biết giải pháp là

If IsNull({PatientProfile.Middle}) Then 
    Trim({PatientProfile.First}) 
     + " " + Trim({PatientProfile.Last}) 
Else 
    Trim({PatientProfile.First}) 
     + " " + Trim({PatientProfile.Middle}) 
     + " " + Trim({PatientProfile.Last}) 

nhưng làm thế nào chúng ta phải tìm ra chúng ta không thể sử dụng phiên bản đầu tiên?

Các tài liệu cho IsNull nói

  • Ước lượng các lĩnh vực quy định trong hồ sơ hiện tại và trả về TRUE nếu trường có chứa một giá trị null

và IIF cho

  • [Returns truePart nếu expression là True và falsePart nếu expression là False. Loại giá trị trả về giống với loại truePart và falsePart.

Tôi cho rằng nếu bạn nhìn chằm chằm vào dòng về "loại giá trị trả về" bạn có thể nhận được nó, nhưng ...

+0

Tôi không có CRXI tiện dụng ngày hôm nay, nhưng những gì không làm việc về người đầu tiên? Liệu nó chỉ nhận được khoảng cách sai (mà là một lỗi logic trong mã - bạn có thêm một Trim() trong đó) hay không nó theo một cách khác? – Stobor

+0

Đối với các bản ghi .Middle là NULL, CR không thể đánh giá giá trị chuỗi trong Trim (.Middle) và quyết định giá trị của Iif là NULL, mặc dù tôi có kiểm tra rõ ràng trong đó. – SarekOfVulcan

Trả lời

5

Tôi nghĩ CR đánh giá cả IIFs phần đúng và sai. Bởi vì bạn có "Trim ({PatientProfile.Middle})" một phần ở đó, sẽ được đánh giá giá trị null aganst, công cụ đánh giá CR dường như không thành công.

+1

Có, nhưng tôi đang cố gắng tìm ra nơi trong tài liệu đẫm máu nó _says_ này, thay vì làm cho tất cả mọi người chạy vào nó Google cho câu trả lời. Sau khi tất cả, một hoặc hai người trong chúng tôi biết mã _supposed_ hoạt động như thế nào ... – SarekOfVulcan

+2

Từ trợ giúp CR: Mọi đối số của hàm IIF được đánh giá trước khi kết quả được trả về. Vì vậy, bạn nên xem ra cho các tác dụng phụ không mong muốn khi sử dụng IIF. Ví dụ, nếu falsePart dẫn đến phân chia bằng không, một lỗi sẽ xảy ra, ngay cả khi biểu thức là True và do đó truePart được trả về. – Arvo

10

Báo cáo tinh thể nào tài liệu cú pháp này không hoạt động?

tôi nghi ngờ có bất cứ nơi nào đủ lớn trong toàn bộ vũ trụ để ghi lại tất cả những gì không làm việc trong Crystal Reports ...

+0

lol, cảm ơn vì đã khiến tôi cười vào thứ Sáu này;) – contactmatt

5

Tôi biết tôi là năm cuối một ngày này, nhưng tôi đi về câu hỏi này trong khi cố gắng tìm ra điều tương tự. Vui đủ, tôi thậm chí không thể tìm thấy câu trả lời trong tài liệu Crystal Reports, nhưng thay vào đó trong một link to IBM.

Ba bên, nếu bạn đang sử dụng Crystal Reports 8.x hoặc 10.x, ISNULLIIF không hoạt động cùng nhau. Từ trang web:

Nguyên nhân

Có một khiếm khuyết trong Crystal Reports 8.x và 10.x có thể ngăn chặn các công thức trên hoạt động bình thường. Các lệnh 'IIF' và 'IsNull' không thể hoạt động cùng nhau và bao gồm việc cố gắng sử dụng "Không" để sửa đổi lệnh IsNull; ví dụ, IIF (Không phải IsNull()).

Giải quyết vấn đề

Cách giải quyết là sử dụng một "If-then-else" tuyên bố.Ví dụ,

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

Vì vậy, nếu bạn đang sử dụng CR 8.x hoặc 10.x (mà chúng tôi đang có), bạn đang trên may mắn. Nó làm cho nó thực sự thú vị khi bạn đang nối nhiều lĩnh vực với nhau và một trong số họ có thể là NULL.

+1

Lưu ý rằng ngay cả khi bạn đang nối nhiều trường với nhau, cú pháp không quá tệ, vì Crystal hỗ trợ những thứ như sau: (nếu IsNull ({Col1}) 0 else {Col1}) + (nếu IsNull ({Col12}) thì 0 else {Col2}) – JoshL

-3

thử điều này:

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

Câu hỏi này có nghĩa gì phải trả lời? – SarekOfVulcan