排名与跨行组运算也是典型的中国复杂报表形式,这类报表的源数据集通常比较简单,但在表格的单元格之间会有较随意的计算要求。在制作报表时,单元格还没有扩展出来,因而不能像 Excel 那样直接引用单元格名字,报表工具需要提供某种机制允许在表达式中引用还没有产生的单元格。
用例说明
报表式样
数据结构
[学生成绩表]
学生成绩表中存储各班级同学历年语文、数学、语文成绩信息
特点分析:
1、 报表中根据学生成绩既要做班级内排名,又要做年级内排名。
2、 报表中要列出去年班级内的名次,以用来展示该同学本学期较上学期的名次变化。
3、 要求统计出各班级内前三名的学号。
4、 要求统计出各班级内名次较上学期上升最快的三位同学的学号。
关于工作量的评估,我们仍假定使用者熟悉相应的报表工具,并只记录实际的制作和正常调试的时间,不包括查阅产品函数资料的时间。
润乾报表
制作过程:
1、 配置并连接数据源。
2、 设置参数及数据集
2.1 此报表要求查询出相应年度的学生成绩,所以需要通过传入参数控制具体展示哪年数据,报表中增加参数,参数名为 nd。
2.2 报表中既要统计所选年度数据,还需要和去年数据做比较,所以报表中要取出两年数据,这里为了方便制作和理解,建立两个数据集,分别取出两年数据,如:
ds1(取今年数据):
对应传入参数设置:
ds2(取去年数据)
数据集语法为 select * from xscj where nd=?
对应传入参数为:nd-1
两个数据集 SQL 语句完全一样,用 ? 代替变量,然后在参数中设置 ? 具体传入值,润乾在传入参数这不仅可以直接写入参数,也可以写入表达式先进行计算。
3、 设计报表模板
这个报表从展现形式上来看是一个分组报表,按照年级分组,列出各班级同学的成绩、排名等信息,然后在每个班级下再增加对应的汇总信息,下面介绍下主要单元格设置情况:
3.1、 A 列到 F 列单元格,都是普通的分组、取数等,按照常规设置就行, 其中 A3 单元格中,数据库里存储的是 1,2,3,4 这种数字格式,显示值表达式中写入:chn(int(value()))+“班”,将数字转换成中文
3.2、 G3 格:=count(F3[A3]{F3>$F3})+1,取出班级内的排名,润乾提供了排名计算方法,统计当前班级内成绩大于当前这人成绩的人员个数,然后再加 1,就是当前这个人的排名。
3.3、 H3 格:
,前边单元格统计了班级内排名,这个单元格中要统计整个年级的排名情况,表达式同 G3 类似,只不过 G3 中对 F3 计数时加了 [A3], 也就是表示取当年班级内的成绩排名,此处是 [`0],取所有成绩排名,这是润乾特有的层次坐标表示法,可以引用各个分组层次的单元格(及集合)。
3.4、 I3 格:=ds2.select(YUWEN+YINGYU+SHUXUE,bj==A3 && studentid==B3),因为报表中要列出去年的排名,所以这里要取出去年的总分情况,此列是辅助单元格,然后将这列隐藏掉就行。
3.5、 J3 格:=count(I3[A3]{I3>$I3})+1,去年成绩排名,一样的做法
3.6、 B4~K4,是个合并单元格,表达式:=disp(A3)+“成绩前三名同学是:”+B3{G3==1}+“,”+B3{G3==2}+“,”+B3{G3==3},A3 单元格在数据库中存储的是 1,2,3 这种形式,用 disp 函数取这个单元格的显示值,学号在 B3 单元格,在 G3 单元格中已经算出了排名,所以可以根据排名来获取对应的数据,B3{G3==1} 这个表达式表示取 G3 等于 1 的 B3 单元格的值,这样就取出了第一名的学号,后边两个同样的做法。
3.7、 B5~K5,合并单元格,表达式:=“班级名次上升最快的三位同学是:”+stri