《非线性报表模型》由会员分享,可在线阅读,更多相关《非线性报表模型(40页珍藏版)》请在金锄头文库上搜索。
1、非线性报表模型北京润乾软件技术有限公司目 录一. 展现模型报表的展现模型严重关系到报表的绘制效率,而且数据处理模型对展现模型有一定的依赖性。1.1 单元格我们设计的展现模型采用类EXCEL式的方案,即认为报表从外观上看是由N行M列的基本矩形的格子构成的平面图形,这些格子称为单元格。如下图所示:1.2 合并单元格如果选中一片连续的单元格区域(这片连续区域只能是矩形区域),把这片区域内的单元格全部合并成一个大的单元格,这个合并后的大单元格称为合并单元格。如下图所示:1.3 行由水平排列的一组单元格构成了行,在这里,行都有编号,从上到下依次为1,2,3,4,,如下图所示:1.4 列由垂直排列的一组单
2、元格构成了列,在这里,列都有编号,从左到右依次为A,B,C,D,,如下图所示:1.5 单元格的命名单元格通过“列号+行号”来命名,例如:第A列第1行的单元格命名为A1合并单元格以左上角的单元格编号作为合并格的编号,例如1.2节中图示的合并格编号为B21.6 报表由单元格、合并单元格、行、列即组成了一个二维矩形的表格。表格中如果增加数据以及数据间的运算逻辑,即构成了报表。因此我们说,报表是由表格、格中的数据以及数据间的运算逻辑组成的。二. 数据模型如上所述,报表是由表格、数据、数据间的运算逻辑组成的,因此数据是报表的基础,我们首先来讲讲润乾报表的数据模型。2.1 基本概念2.1.1 数据集我们定
3、义数据集为一个由数据数组构成的二维数据表,其同列的元素数据类型都相同,为了方便,我们给数据集的列都起了一个可唯一标识的名字,列的名字和数据类型都保存在数据集中。2.1.2 记录和字段考虑到关系数据库的习惯,同时为了和报表的行、列加以区分,我们把数据集的行称为记录,列称为字段。数据集中的记录都有行号,依次为1,2,3,4,,获取数据集行号的书写规则为:dsName.#0 /获得当前行的行号或 dsName.select(#0) /获得数据集所有记录的行号其中dsName代表数据集的名字,#0代表第0列,即说明数据集的行号保存在第0列中。2.1.3 行集数据集的行集定义为一些由数据集的行按某种顺序
4、构成的数组,数据集本身也是一个行集。从组成元素上看,行集是数据集的子集,但排列次序未必与数据集的行序相同。2.1.4 分组与组集将数据集的所有记录按照一定的规则划分成N个行集的过程称为分组,分组后的每个行集称为一个组,多个组构成了组集。2.1.5 数据集函数能够对数据集的记录进行操作(取数、分组、运算等)的函数,我们称为数据集函数,其书写规则如下:dsName.f()其中,dsName为数据集的名字,f为函数名。2.1.6 单源报表与多源报表润乾报表中,报表数据来源是由一个或者多个数据集构成的集合,每个数据集都有唯一的名字,一般用ds1,ds2,来表示。当某个报表的数据来源只有一个数据集时,该
5、报表称为单源报表;当某个报表的数据来源包括了多个数据集时,该报表称为多源报表。由于单源报表的模型是多源报表的子集,因此我们这里仅仅介绍多源报表。2.2 多数据集模型2.2.1 多数据集模型图润乾报表的多个数据集不需要进行整合运算,而是直接用于报表的运算,在报表的运算过程中,通过一定的规则把多个数据集关联起来。其模型图示如下:2.2.2 多数据集的设计背景在制作报表的过程中,有时候各个单元格中的运算会基于不同的数据集甚至是基于不同的数据源。举例:这是一个比较典型的多源报表,图中背景为白色、粉红色、浅蓝色的格子数据分别来自三个不同的数据集,分别通过左表头的项目名称关联起来更有甚者,这三个数据集很有
6、可能存在不同的数据库中,或者是异构的数据来源,因此迫切的需要多数据集的模型。2.3 多数据集和单数据集模型比较真正意义上的多数据集模型,最典型的特征是不需要数据集间的整合运算,直接将数据集运用于报表的运算,在运算过程中关联。数据集间的整合运算是指将多个数据集通过类似数据库的union、join等操作,整合成一个数据集的过程。整合运算极大的占用cpu资源,很多时候会导致数据量大大增加,对内存的占用也随之增加。目前很多传统的报表工具号称支持多数据集,其实是把多个数据集通过整合运算,合并成一个数据集后,再运用于报表的运算,其实质还是单数据集模型。对于2.2.2中图示的报表,如果采用单数据集模型,那么
7、势必把三个数据集通过整合运算合并成一个数据集,然后进行交叉分组,其运算的复杂度大大增加,性能大大降低。因此我们说,对于多源分片的报表,采用多数据集模型是最佳选择。三. 运算模型3.1 基本概念3.1.1 集合一些确定的事物汇集成为集合,构成集合的事物称为集合的元素或者成员。在润乾报表中,集合的元素一般是数据、单元格、行、列、记录、字段、组等。3.1.2 数组将有限集的元素按照某种规则排序,得到一个有先后次序的序列,称为数组。数组的成员个数称为数组的长度。数组是集合的一种特殊情况。3.1.3 集合函数和操作符运算结果为集合的函数,我们称为集合函数;运算结果为集合的操作符,我们称为集合操作符。下面
8、详细介绍相关的集合函数和操作符。 SELECT函数说明: 从数据集或者当前行集(由其主格决定)中选取符合条件的记录 语法: datasetName.select( , desc_exp, filter_exp, sort_exp ) 功能说明: select()函数从数据集或者当前行集中选取select_exp字段列中符合过滤条件的值。 在不需要排序或数据集中已经按需要排好序时,为提高效率请如下使用此函数 datasetName.select( , , ) 参数说明: select_exp:要选择的字段列或者表达式,可以是字段列名,也可以是以“#列序号”的形式,#0表示记录行号,#1表示数据集
9、中的第一个字段列.以此类推。当然也可以是表达式 desc_exp: 指定数据排序的顺序,true表示降序排列,false表示升序排列。在不需要排序或数据集中已经按需要排好序时,为提高效率请不要用此参数,直接用逗号占位即可 filter_exp: 数据过滤表达式。 sort_exp: 数据排序表达式。当此项为空时先检查desc_exp是否为空,如果为空,则不排序,否则使用select_exp排序。返回值:一组数据的集合函数示例: ds1.select( name ) 从数据集ds1中选取name字段列的所有值, 不排序 ds1.select( #2, true ) 从数据集ds1中选取第二个字段
10、列的所有值并降序排列 ds1.select( name,false,sex=1) 从数据集ds1中选取性别为男性的name字段列的值并升序排列 ds1.select( name, true, sex=1, id ) 从数据集ds1中选取性别为男性的name字段列的值并按id字段降序排列 GROUP函数说明: 从数据集或者当前行集(由其主格决定)中选出符合过滤条件的一组记录,根据分组表达式select_exp进行分组操作,返回组集。 语法: datasetName.group( , desc_exp, filter_exp, sort_exp ) 功能说明: 在不需要排序或数据集中已经按需要排好
11、序时,为提高效率请如下使用此函数 datasetName.group( , , ) 参数说明: select_exp:选出的分组表达式,可以是字段列名,也可以是以“#列序号”的形式,#0表示记录行号,#1表示数据源中的第一个字段列.以此类推。当然也可以是表达式 desc_exp: 指定数据排序的顺序,true表示降序排列,false表示升序排列。 filter_exp: 数据过滤表达式。 sort_exp: 数据排序表达式。当此项为空时先检查desc_exp是否为空,如 果为空,则不排序,否则使用select_exp排序。返回值:一组数据的集合 函数示例: ds1.group( name )
12、从数据源ds1中选取name字段,并按照name列进行分组,取出每一组第一条记录的name字段的值, 不排序 ds1.group( #2, true ) 从数据源ds1中选取第二个字段并降序排列,然后按照第二列进行分组,取出每一组的第一条记录的第二个字段值 ds1.group( name,false,sex=1) 从数据源ds1中选取性别为男性的name字段列的值并升序排列,然后按照name字段进行分组,取出每一组第一条记录的name字段的值 ds1.group( name, true, sex=1, id ) 从数据源ds1中选取性别为男性的name字段列的值并按id字段降序排列,然后按照n
13、ame字段进行分组,取出每一组第一条记录的name字段的值 RSELECT函数说明: 从整个数据集记录(而不是当前行集)中选取符合条件的记录,其余说明参见select函数 语法: datasetName.rselect( , desc_exp, filter_exp, sort_exp ) 参数说明: select_exp:要选择的字段列,可以是字段列名,也可以是以“#列序号”的形式,#0表示记录行号,#1表示数据源中的第一个字段列.以此类推。 desc_exp: 指定数据排序的顺序,true表示降序排列,false表示升序排列。 filter_exp: 数据过滤表达式。 sort_exp: 数据排序表达式。当此项为空时先检查desc_exp是否为空,如果为空,则不排序,否则使用select_exp排序。返回值:一组数据的集合 RGROUP函数说明: 对整个数据集中的