《润乾报表高级设计二》由会员分享,可在线阅读,更多相关《润乾报表高级设计二(92页珍藏版)》请在金锄头文库上搜索。
1、润乾报表高级设计(二 )培训内容动态参数 动态宏 报表组 高级统计图性能优化技巧 一、动态参数参数有数据类型参数是个变量参数有缺省值参数有输入格式和精度参数的用法Sql语句中使用query/query2/call/call2函数中使用参数举例:1, query2(“exercise“,“SELECT max(amount) FROM contract WHERE contract.signdate ? and contract.signdate ? and contract.signdate ? and contract.signdate 标签发布报表组 举例:润乾报表4.0报表组演示 带参数
2、的报表组的发布制作参数表单分别用和发布参 数报表和报表组填报报表组的发布填报表组要求报表组的所有报表均为填报表,制 作方式与普通报表组一样,只需将发布用的jsp 文件略作改动即可将报表组以填报的形式发布 。增加属性 isInput=“yes“添加校验功能添加导入功能添加导出、打印功能订单.raq与订单明细.raq是两张准备好的填报表 ,利用这两张填报表做一个填报表组并发布,实 现报表组的excel导入,打印,导出功能。四、高级统计图双轴柱线图双轴折线图时间走势图时序状态图甘特图里程碑图雷达图仪表盘工字图全距图4.1 双轴柱线图共用一条横轴的两套数据同时展现时适用 例子双轴柱线图4.2 双轴折线
3、图在双轴柱线图基础上进行修改,用双轴折线图显 示。4.3 时间走势图-时间走势图要求:展现销售量在1996-12-01与1997-12-01 这段时间之间的数量走势情况如何动态展现2000-01-01之前的销售量走势情况 4.4 时序状态图指定该 时间区 域的结 束时间 ,一般 是某个 单元格 的值 显示多个分类的状态,分类值一般是某个扩展单元格 的值,填写单元格名称即可,也可以是个常数,如果 是单元格,那么该单元格必须是起始时间、结束时间 、状态的主单元格。 指定该时间区 域的起始时间 ,一般是某个 单元格的值 状态数据 ,一般是 某个扩展 单元格的 值 -时序状态图要求:通过时序状态图展现
4、各个频道在各个时段 的状态情况4.5 甘特图指定该 时间区 域的结 束时间 ,一般 是某个 单元格 的值 任务列表,对应的单元格为任务表达式 指定该时间区 域的起始时间 ,一般是某个 单元格的值 任务 或项 目当 前所 处的 状态 -甘特图要求:通过甘特图展现某项目各个阶段的实际实 施与计划进度情况4.6 里程碑图该任务 实际完 成日期 ,对应 的单元 格为日 期型表 达式 每一个任务或项目的列表 该任务计划完成 日期,对应的 单元格为日期 型表达式 -里程碑图要求:通过里程碑图展现某公司各个项目计划与 实际完成时间的对比4.7 雷达图-雷达图(一)用雷达图展现每个项目的得分情况-雷达图(二)
5、要求:通过雷达图显示每个学生每科成绩。4.8 仪表盘-仪表盘1要求:依据上例,通过仪表盘显示各温度段-仪表盘2要求:通过仪表盘显示各年龄段0-18岁为少年,18-40岁为青年,40-60为中年,60-80为老年。指针指示的年龄通过参数动态控制4.9 工字图-工字图通过工字图展现每个雇员的销售总价情况,并动 态以某一地区的平均值作为标准值。4.10 全距图左端为最小值,右端为最大值,中间的黄色分割线 为平均值,左侧比平均值低的部分为红色,右侧比 平均值高的部分为绿色,蓝色的稍长一点的分割线 为所查询的员工李芳处在的位置 -全距图用全距图动态展现某销售员完成的订单总价在所 有员工的水平中处在的位置
6、 四、 报表设计性能优化 灵活应用多数据集 写sql的技巧 当前行、当前组的概念 写表达式的技巧 按段分组慎用eval(“”),field(),fieldname(),ds(“”)等函数 减少冗余单元格占用内存 2.1 灵活应用多数据集网格式、分组式、交叉式尽量用单数据集 多数据集单数据集我们试比较一下两种做法的优缺点: 第一种做法: 数据集不需要对多表进行叉乘,取数速度快 事实记录数据集可以在sql里先进行分组聚集操作,减少取过来的记录 书,加快取数的速度和报表运算速度 表头扩展直接对码表进行select操作,运算速度快 交叉点汇总需要对事实记录表进行检索遍历,查找出和表头关联的记 录进行汇
7、总,交叉点的格子数远远大于表头单元格的个数,事实记录表的 记录数也一般远远大于码表的记录数,每个交叉点都要对事实记录表遍历 检索一次,运算速度非常慢 第二种做法: 数据集需要对码表和事实记录表进行叉乘,取数速度慢,但是一般情 况下码表的字段数只有一两个,而且数据库有索引,记录数不是非常大的 情况下慢不了很多 在数据集sql里就可以对表头字段先进行分组聚集,这样取过来的记录数 大大减少,加快了取数速度和报表的运算速度 表头单元格是对事实记录表进行分组操作,然后再扩展,比第一种做法 慢一些,但是由于对数据集只要进行一次的分组操作,因此慢不了太多 交叉点汇总不需要再对事实记录表进行检索遍历了,而是直
8、接对当前组 集里的记录进行汇总,因此速度大大提高了 第二种的做法性能优于第一种 2.1 灵活应用多数据集多源分片、主子报表尽量用多数据集 两种做法:第一种: 每个主表和子表分别定义一个数据集,在报表里通过条件把子 表和主表关联起来 优点:避免了表间叉乘,减少了数据量,加快了取数速度和数 据库的运算速度。 原因:对于主子报表,主表的字段数一般比较多,而子表一般 有多条记录和主表的一条记录关联,同时子表间往往没有关联关系 ,因此如果叉乘会导致数据量大大增加,在多子表的情况下这个现 象尤其明显 缺点:子表取数扩展时,需要根据条件和主表记录关联,需要 对子表记录进行遍历检索,但是大部分的情况下,主表只
9、有一条记 录或者只有十几条记录,因此对子表的遍历检索次数不会很多第二种: 只定义一个数据集,把主表和所有子表叉乘起来 缺点:由于子表之间没有关联关系,且主表的字段数比较多,叉 乘往往导致记录数呈几何级数增加 优点:子表取数扩展时,不需要对子表记录进行遍历扩展,运算 速度快点 2.2 写sql的技巧尽量在sql里进行group 对于汇总类型的报表,往往需要进行分组聚集运算,如 果在数据库中先进行一次分组聚集,能够大大减少取到 报表服务器的记录数,加快取数和报表运算的速度。 第一种:select 产品,客户,销量 from 购买记录表第二种:select产品,客户,sum(销量) from 购买记
10、录表 group by 产品,客户 采用第一种做法,不仅仅取到报表服务器上记录数多了,取数速度慢,而且在报表 端对购买记录表进行分组运算的时候速度也慢了;采用第二种做法,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快 ,且取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表端进行 分组运算的时候只要对很少的记录数进行,报表的运算速度大大加快了 第二种做法的性能远远优于第一种 尽量不用select * from 对于初学者来说,这是一个很容易犯的错误,例 如报表中只需要用到三个字段,但是数据库中实 际的表有十个字段,一些初学者习惯性的用 select * from table
11、1,这样相当于把十个字段的 数据都取到报表服务器端,增加了报表服务器端 的内存占用以及减慢了运算速度正确的写法是:select col1,col2,col3 from table1,即用到哪几个字段就取哪几个,用不着 的不要取 尽量在sql里排序 报表中往往需要对数据进行排序,排序运算可以 在数据库中进行,也可以在报表端进行,如果报 表中的排序规则是确定的,那么建议排序操作选 择在数据库端进行,因为数据库中有索引,且数 据库是c语言开发的,数据运算速度快。 尽量在sql里过滤 报表很多时候并不需要对表中的所有记录进行操 作,而是对部分满足条件的记录进行操作,因此 建议过滤操作在数据库中进行,这
12、样取到报表服 务器端的记录数大大减少,既加快了取数的速度 ,也加快了报表的运算速度,因为报表需要处理 的数据少了。 大数据量可以采用存储过程 有时候,需要用于汇总统计的原始数据量非常大 ,如果每次生成报表都需要现算,一方面非常慢 ,另一方面数据库的压力会很大,此时可以采用 存储过程对数据预先进行一次压缩,生成中间表 ,然后再基于中间表生成报表,可以大大提高运 算速度并减轻数据库的压力。 2.3 当前行、当前组的概念 Select()Select1()Group()select函数 数据集名.列名 典型的select用法:不合理的用法: Select1函数select1的函数和select函数的
13、区别在于,它每次只取出 一条记录,但是当前行的概念是一样的,当它从数据集 中取出一条记录时,保留了一个指针指向该记录,因此 他的附属单元格里只需要利用“数据集名.列名”即可从该 记录中取值,而不需要重新检索遍历数据集。 正确的select1的用法:select1和select函数还有一个区别在于:当它检索数据集时,检索 到第一条满足条件的记录随即把该记录返回,而不继续往下检索;对于select来说,即使已经检索到满足条件的记录了,还会继续往 下检索,直到所有记录检索完为止。 如果你确定只要从数据集中取出一条记录,那么请一定用select1而 不要用select group函数 正确的group
14、 用法: 不合理的group用法: 2.4 写表达式的技巧 or/| 操作符 and/class,false,A1;sex,true,B1“) 采用二分法,找到数据集ds1中id和当前格的值相等、class和A1相等且sex和B1相等的记录 ,返回其name字段值。注意这三个条件在表达式中的顺序必需和它们在数据集中的排序先后相 同,也就是说,在数据集中是先对id升序排序,再对class升序排序,最后对sex进行降序排序的 。 二分法检索算法介绍 例如存在A-Z按照检索条件排好序的23个数据,二分算 法首先找到最中间的那个数M,比较M和检索条件是否 相等,如果相等,直接返回M,运算结束;如果不等
15、, 那么是大了还是小了,假设大了,那么指针直接指向A 和M中间的那个数G,再判断是否相等,如果相等,直接 返回G,运算结束;如果不等,就看大了还是小了,假 设G小了,那么指针直接指向G和M中间的那个数,继续 进行判断,以此类推。 select1在记录按照检索条件已经排 好序的情况下,select1 比bselect1慢 巧用空值判断nvl nvl()函数说明: 根据第一个表达式的值是否为空 ,若为空则返回指定值 语法: nvl( valueExp1, valueExp2 ) 参数说明: valueExp1 需要计算的表达式, 其结果不为空时返回其值 valueExp2 需要计算的表达式, 当valueExp1结果为空时返回此值 返回值: valueExp1或valueExp2的结果值 示例: 例1:nvl(A1,“) 表示当A1为 空时,返回空串,否则返回A1 if(value()=null, 0, value() if(ds1.select1()=null, 0, ds1.select1() 数据类型的考虑 数值型的数据,根据其精度不同,可