Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Crystal reports 在Crystal Reports中定义运行时的变量数据类型_Crystal Reports - Fatal编程技术网

Crystal reports 在Crystal Reports中定义运行时的变量数据类型

Crystal reports 在Crystal Reports中定义运行时的变量数据类型,crystal-reports,Crystal Reports,我有一个报告,其中包含一个参数,允许用户选择哪些字段以及字段在报告中显示的顺序。我遇到的唯一问题是,数据类型可以是string、number或date,我不知道如何检查数据类型(我首先将所有内容转换为字符串),然后将值更改为正确的数据类型。我可以想象公式会是这样的: numbervar counter; shared stringvar Array FieldVal; counter := count({?Fields}); if counter >= 5 then if Numer

我有一个报告,其中包含一个参数,允许用户选择哪些字段以及字段在报告中显示的顺序。我遇到的唯一问题是,数据类型可以是string、number或date,我不知道如何检查数据类型(我首先将所有内容转换为字符串),然后将值更改为正确的数据类型。我可以想象公式会是这样的:

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,则 (如果数字文本(FieldVal[5]),而不是(isdate(FieldVal[5]),则为val(FieldVal[5])

如果计数器>=5,则

(如果不是(数字文本(FieldVal[5])和isdate(FieldVal[5]),则 FieldVal[5])

如果计数器>=5,则 (如果是isdate(FieldVal[5]),而不是(numerictext(FieldVal[5]),则是CDate(FieldVal[5])

返回日期数据类型

如果计数器>=5,则

(如果不是(数字文本(FieldVal[5])和isdate(FieldVal[5]),则 FieldVal[5])

如果计数器>=5,则 (如果是isdate(FieldVal[5]),而不是(numerictext(FieldVal[5]),则是CDate(FieldVal[5])

如果计数器>=5,则 (如果数字文本(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;

您编写代码时,它不能以这种方式工作,因为在单个
if或if else
语句中,不能返回不同的数据类型作为输出

相反,如果语句不满足条件,则编写多个语句,然后编写一个

尝试以下方法:

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]
Else if(数字文本(FieldVal[5]) 然后是tonumber(FieldVal[5]) Else if(isdate(FieldVal[5]) 然后CDate(FieldVal[5])
)

我知道这是如何工作的,但是,公式返回公式中定义的最后一种数据类型。因此,如果我切换if语句的顺序,最后一种数据类型将获胜。不幸的是,不是。因为我无法创建代码退出循环的方法,所以数据将采用代码中的最后一种数据类型。即,如果date是最后一行,它将尝试形成在日期,或者如果数字是它试图格式化为数字的最后一行。不明白你…你能通过编辑问题来显示样本数据吗…将尝试解决目前为止,我唯一能想到的是覆盖字段并根据其数据类型显示它们…处理它的方式非常混乱。当前re中有100个数据字段端口要复制和维护这些将是非常困难的,所以尝试在代码中寻址。
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]