在Crystal Reports中

时间:2017-04-05 15:23:59

标签: 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]);

如果计数器> = 5那么 (如果是isdate(FieldVal [5])而不是(numerictext(FieldVal [5]))那么CDate(FieldVal [5]));

返回Date数据类型

如果计数器> = 5则

(如果不是(NumericText(FieldVal [5])和isdate(FieldVal [5]))那么 FieldVal [5]);

如果计数器> = 5那么 (如果是isdate(FieldVal [5])而不是(numerictext(FieldVal [5]))那么CDate(FieldVal [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]
);

1 个答案:

答案 0 :(得分: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]

否则if(NumericText(FieldVal [5]) 然后tonon(FieldVal [5]) 否则if(isdate(FieldVal [5]) 然后CDate(FieldVal [5])     );

相关问题