2012-12-13 19 views
5

Tôi có một trường chuỗi chứa hầu hết các giá trị thập phân, nhưng đôi khi chứa các giá trị như "< 0.10" hoặc "HEMOLYSIS".Công thức Crystal Reports chuyển đổi chuỗi số thành giá trị, nhưng không để trống số/null

Tôi muốn sử dụng công thức để chuyển đổi các chuỗi giá trị số thành giá trị, để trống các giá trị không (null).

if isNumeric({a_omgang.omg_resultat}) then 
    toNumber({a_omgang.omg_resultat}) 

trả về 0 cho tất cả các giá trị không phải số, khó tính toán, ví dụ: trung bình hoặc trung bình hoặc để đếm số lượng giá trị. (Tất nhiên sau này có thể đạt được bằng cách sử dụng tổng số đang chạy với công thức đánh giá là isNumeric.)

Bất kỳ đề xuất nào tôi có thể làm công thức hoạt động như tôi muốn?

Chỉnh sửa: Tôi muốn giá trị trống (không), không chỉ chuyển sang chế độ hiển thị nếu không phải là số.

Trả lời

4

Trong quá khứ, tôi đã tạo ra một biểu thức SQL trả về một NULL:

-- {@DB_NULL} 
-- Oracle syntax 
(
SELECT NULL FROM DUAL 
) 

 

-- {@DB_NULL} 
-- MS SQL syntax 
(
SELECT NULL 
) 

Sau đó, tôi tham khảo lĩnh vực này trong công thức:

// {@FormulaField} 
If IsNumberic({table.field} Then 
    ToNumber({table.field}) 
Else 
    ToNumber({@DB_NULL}) 
+0

Khái niệm thú vị, nhưng tôi nhận được "Tên đối tượng không hợp lệ 'DUAL'" khi tôi chạy với máy chủ MS SQL. Đã cố gắng thay đổi nó thành tên bảng thực tế, nhưng vẫn gặp lỗi. – LapplandsCohan

+2

Chỉ thử 'SELECT NULL'. Tôi không có quyền truy cập vào SQL Server, vì vậy tôi không thể kiểm tra điều này. – craig

+0

Đã hoạt động! Tôi nghĩ đây là giải pháp chung nhất. – LapplandsCohan

0

Không chắc chắn đây có phải là giải pháp tốt nhất hay không, nhưng đó là giải pháp một giải pháp.

Tạo tổng công thức đang chạy cho trường tối đa. Đánh giá theo công thức
NumericText(Replace({a_omgang.omg_resultat}, ".", ","))
và thiết lập lại bằng công thức
true

này sẽ cung cấp cho bạn kết quả tối đa của mỗi entry. (Ie. mục đó.) Chỉ các mục có thể được chuyển đổi thành giá trị mới được đánh giá, vì vậy tất cả các mục nhập khác sẽ là rỗng. Có true khi đặt lại công thức đảm bảo rằng bạn luôn nhận được giá trị của mục nhập đang được đánh giá.

Kết quả của tổng số hoạt động này sau đó có thể được chuyển đổi thành giá trị bằng cách sử dụng công thức trong câu hỏi.

Replace() là do ngôn ngữ và có thể không cần thiết tùy thuộc vào cài đặt hệ thống của bạn. Nếu cần, nó cũng sẽ phải được sử dụng trong công thức chuyển đổi giá trị.

0

Theo hiểu biết tốt nhất của tôi, bạn không thể thực hiện việc này trực tiếp. Nếu trường công thức số trả về giá trị rỗng, nó được chuyển thành 0.

Bạn nói bạn không thể chặn. Bạn có thể chuyển đổi thành một số sau đó quay lại một chuỗi không?

+0

Đối với báo cáo cụ thể này nó sẽ đủ để ngăn chặn, nhưng tôi quan tâm đến một giải pháp chung. Đang cập nhật câu hỏi. – LapplandsCohan

2

Bạn có thể có được điều này để làm việc bằng cách làm như sau:

  1. Tạo một công thức mới và chỉ cần nhập một số vào nó, sau đó lưu. Bây giờ Crystal sẽ kết hợp công thức này với một giá trị trả về số.
  2. Quay lại công thức và xóa số và lưu lại. Bây giờ bạn có một công thức trả về một null, nhưng CR đã liên kết nó như là một công thức số, do đó bạn có thể sử dụng nó bất cứ nơi nào bạn có thể sử dụng một kiểu số.
if isNumeric({a_omgang.omg_resultat}) 
    then toNumber({a_omgang.omg_resultat}) 
else {@NullNumeric}

Lưu ý rằng bạn cũng có thể sử dụng cho bất kỳ loại dữ liệu khác (bao gồm cả chuỗi từ một chuỗi rỗng là không tương đương với một chuỗi null) và nó là vô cùng hữu ích cho việc sử dụng với các chức năng tóm tắt nơi bạn chỉ muốn để thẳng lên bỏ qua các hàng nhất định.