有的时候在做报表设计的时候,用单数据集和多数据集都能实现一个报表的功能,那么在何种情况下应该用单数据集?何种情况下用多个数据集呢?这里有以下2个原则:
报表中,经常会出现多个单元格的数据来自同一个数据表,但是取出的条件不一样,或者条件相同,取出的字段或表达式不一样等等,如果你细心研究,会发现这些单元格的数据完全可以通过一个sql取出来,然后再通过数据集的函数算出每个单元格的值。
如果将多个sql合并以后,取出的数据量并没有增大非常多,那么我们建议您尽量将sql合并,充分利用数据集函数中的条件表达式来计算每个单元格的值;
如果sql合并后,取出的数据量增大了非常多,那么我们建议您尽量将sql拆开,减少传输的数据量。
这两者是一个权衡的关系,sql多的时候,系统访问数据库的次数多了,导致效率低;反之,sql少了,可如果传输的数据量变的非常大,同样会导致效率非常低。所以需要用户根据实际情况权衡利弊。
注意:
使用select函数时,相当于从数据集中取出一组符合条件的记录集合,在单元格中进行扩展,此时每个扩展出来的单元格都保留一个指针,指向当前记录,即当前行,因此在这些单元格的附属单元格中,应当直接用“数据集名.列名”来引用同一个数据集同一条记录的值,此时报表引擎不需要对数据集进行检索遍历了,而是直接从当前行中取值。
group函数是对数据集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值,放到单元格中进行扩展,扩展出来的每个单元格都保留了一个指针指向当前的组集,该组集称为当前组。
因此在附属单元格中,需要对该组集进行操作时,不需要用任何条件和主单元格关联了,如果加设了条件,反倒画蛇添足,导致报表引擎还对组集中的记录进行遍历检索。
使用or操作符时,尽量把值为true的可能性更大的条件表达式放在or的前面,为true的可能性更小的条件表达式放在or的后面;这样做的原因:or操作符的左右两个操作数,只要有一个为true,其结果必定为true,因此只要第一个条件表达式算出来是true,后面的条件表达式就没必要算了,这样可以加快运算速度。
虽然皕杰报表提供了or和||两种写法,这么做仅仅为了方便习惯写or的用户,表达式中用||代替or可以加快表达式的解析速度。
使用and操作符时,尽量把值为false的可能性更大的条件表达式放在and的前面,为false的可能性更小的条件表达式放在and的后面;这样做的原因:and操作符的左右两个操作数,只要有一个为false,其结果必定为false,因此只要第一个条件表达式算出来是false,后面的条件表达式就没必要算了,这样可以加快运算速度。
虽然皕杰报表提供了and和&&两种写法,这么做仅仅为了方便习惯写and的用户,表达式中用&&代替and可以加快表达式的解析速度。
把选中概率高的条件放在前面。
表达式中,经常需要用到空值判断,例如在单元格的显示值属性中,判断当单元格的值为空时,显示为0,否则显示单元格的真实值,等等。一般这种情况下,用户习惯写的表达式是: if(@value==null, 0, @value)。
如果我们把@value换成更加复杂的表达式,例如if(ds1.select1(…)==null, 0, ds1.select1(…)),大家可以看出,这种算法明显很慢,需要把ds1.select1(…)这样的复杂表达式运算两次,而如果采用nvl()则可以避免这个问题。
这几个函数都属于动态构造表达式、动态解析表达式的范畴,它能够给使用者带来很大的便利,可以解决很多难以解决的问题,但是同时对cpu资源的占用也比较大,所以要慎用。
数值型的数据,根据其精度不同,可以分成好几种,例如:整型数据有short(16位),int(32位),long(64位),BigInteger(大于64位);浮点型数据有float(32位), double(64位),BigDecimal(大于64位)。
一般来说,精度越高的数据类型,运算速度越慢,因此,如果您的数据长度没有那么长,那么建议选择精度相对比较低的数据类型,可以加快运算速度。
皕杰报表提供的数值型转换函数有:
请用户在选择以上函数时根据数据的长度慎重选择。