水晶报表中动态显示小数位

水晶报表中动态显示小数位

from<http://learningtips.spaces.live.com/blog/cns!a48ecc897d8e2e57!132.entry>

大家都知道,在水晶报表里,小数点的保留是个比较讨厌的问题。因为在数字字段的格式化中,小数点格式化的位数是固定的。也就是说要么保留两位,要么保留三位……,要么一位都不保留。其实在很多时候,客户更希望的是服务器端是几位就保留几位。曾经有N 个人问过我这个问题如何解决,今天又有人问了,干脆写了一个函数解决这个问题,以后再有客户有这样的需求,直接套用这个函数就行了。
其实我以前也说过,解决这个问题有一个方法就是在服务器端直接把这个数字字段转换成字符型,这样在水晶报表这边就不需要做任何处理了。但是这种办法有个不好的地方就是要去改服务器端视图,这样有可能会影响其他业务的操作。虽然可以创建一个新的视图来在它基础上做此报表,但是为了一个字段而新建个视图有时候也比较郁闷。
另外一个办法就是在水晶报表中添加一个公式字段,对那个数字字段进行处理。思路就是先把这个字段转换成字符型,然后把小数点后面多余的0去掉。水晶报表有个数字转换字符的函数“ToText”,这里就有一个问题,这个函数可恶之处就是它必须要指定小数位数,如果不指定,它就保留两位小数。如果非要指定那就指定吧,但是它又说了,小数不能超过10位,“ToText(123.456, 11)”是通不过的,真是昏死!
水晶报表中的函数代码如下:
Local StringVar strTemp := ToText({FLEX_PURCH_REQ_REP\.ORIGINAL_QTY}, 10);
Local NumberVar i;
Local StringVar str := "";
Local NumberVar strLen := Length (strTemp);
For i := strLen To 1 Step -1 Do
(
If strTemp[i] = "." Then
( //Integer,we should delete the point
str := Left(strTemp, i-1);
Exit For
)
Else If strTemp[i] <> "0" then
(
str := Left(strTemp, i);
Exit For
)
);
//Leading Zero
If str[1] = "." Then
(
str := "0"+str;
);
Str

在使用的时候,只要新建一个公式,把上面代码拷贝进去,然后修改一下要转换的字段(蓝色字)就可以了。这里有个要注意的地方是:不能转换超过10位小数的数字,这是水晶报表的限制,在水晶报表客户端没有办法解决。我们到数字字段的格式化里去看,那里也最多格式化10位。如果将来真要有家客户需要保留10位以上小数,我们只好还是采用第一种方法 ―― 改服务器端视图。

你可能感兴趣的:(Flex,Blog)