2017-04-05 79 views
0

我有一個報告,其中包含一個參數,允許用戶選擇哪些字段以及哪些順序字段將顯示在報告上。我遇到的唯一問題是數據類型可以是字符串,數字或日期,我不知道如何檢查數據類型(我首先將所有內容都轉換爲字符串),然後將值更改爲正確的數據類型。我想這個公式看起來像這樣:在運行時在Crystal Reports中定義可變數據類型

numbervar counter; 
shared stringvar Array FieldVal; 
counter := count({?Fields}); 

if counter >= 5 then 

if NumericText(FieldVal[5]) then tonumber(FieldVal[5]) else 
if isdate(FieldVal[5]) then CDate(FieldVal[5]) else 
FieldVal[5] 

問題是我收到一條錯誤消息「這裏需要一個日期。」或「這裏需要一個號碼」。如果計數器> = 5,則 (如果NumericText(FieldVal [5])而不是(isdate(FieldVal [5]))則val(FieldVal [5]));

如果計數器> = 5然後

(如果不是(NumericText(FieldVal [5])和ISDATE(FieldVal [5]))然後 FieldVal [5]); (如果isdate(FieldVal [5])而不是(numerictext(FieldVal [5]))則CDate(FieldVal [5]));如果計數器> = 5則

返回Date數據類型

如果計數器> = 5然後

(如果不是(NumericText(FieldVal [5])和ISDATE(FieldVal [5]))然後 FieldVal [5]) ; (如果isdate(FieldVal [5])而不是(numerictext(FieldVal [5]))則CDate(FieldVal [5]));如果計數器> = 5則 如果計數器> = 5,則 (如果NumericText(FieldVal [5])而不是(isdate(FieldVal [5]))則val(FieldVal [5]));

返回一個數字數據類型,這就是最終在報表上顯示的內容,不管實際的數據類型是什麼。

我也曾嘗試以下和接收數據類型不匹配的等效:

numbervar counter; 
Shared StringVar Array FieldVal; 
Shared NumberVar Array FieldValNbr; 
Shared DateVar Array FieldValDte; 
StringVar DType := ''; 
StringVar StrValue := FieldVal[5]; 
NumberVar NbrValue := FieldValNbr[5]; 
DateVar DteValue := FieldValDte[5]; 

counter := count({?Fields}); 

if counter >= 5 then 
if StrValue <> '' then DType := 'String'; 
if NbrValue <> 0 then DType := 'Number'; 
if StrValue <> '' and NbrValue <> 0 then DType := 'Date'; 

Select DType 
case 'String' : StrValue 
Case 'Number' : NbrValue 
Case 'Date' : DteValue; 

Data returned. The first Pay Rate as defined in the formula returns a string, and the second Pay Rate is what it should be.

Shared numbervar counter; 
shared stringvar Array FieldVal; 

if counter >= 5 then 
(
if NumericText(FieldVal[5]) then tonumber(FieldVal[5]) 
); 

if counter >= 5 then 
(
if isdate(FieldVal[5]) then CDate(FieldVal[5]) 
); 

if counter >= 5 then 
(
if Not(NumericText(FieldVal[5]) and isdate(FieldVal[5])) then 
FieldVal[5] 
); 

回答

0

它不這樣,你寫的代碼工作,因爲在一個if or if else語句不能有不同的數據類型作爲輸出返回。

改爲寫入多個if語句,然後如果沒有條件滿足則寫入一個。

嘗試象下面這樣:

numbervar counter; 
shared stringvar Array FieldVal; 
counter := count({?Fields}); 

if counter >= 5 then 
(
if Not(NumericText(FieldVal[5]) and isdate(FieldVal[5])) then 
FieldVal[5] 

否則如果(NumericText(FieldVal [5]) 然後tonumber(FieldVal [5]) 否則如果(ISDATE(FieldVal [5]) 然後CDATE(FieldVal [5]) );

+0

我明白了這是如何工作的,但是,公式返回公式中定義的最後一個數據類型。 –

+0

該解決方案適合您嗎? – Siva

+0

不幸的是,沒有。因爲我無法爲代碼創建退出循環的方式,所以數據會在代碼中使用最後一種數據類型。即如果日期是最後一行,它會嘗試格式化日期,或者如果數字是它試圖格式化爲數字的最後一行。 –