我有一個報告,其中包含一個參數,允許用戶選擇哪些字段以及哪些順序字段將顯示在報告上。我遇到的唯一問題是數據類型可以是字符串,數字或日期,我不知道如何檢查數據類型(我首先將所有內容都轉換爲字符串),然後將值更改爲正確的數據類型。我想這個公式看起來像這樣:在運行時在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;
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]
);
我明白了這是如何工作的,但是,公式返回公式中定義的最後一個數據類型。 –
該解決方案適合您嗎? – Siva
不幸的是,沒有。因爲我無法爲代碼創建退出循環的方式,所以數據會在代碼中使用最後一種數據類型。即如果日期是最後一行,它會嘗試格式化日期,或者如果數字是它試圖格式化爲數字的最後一行。 –