润乾报表V40高级教程.docx

上传人:b****8 文档编号:10224698 上传时间:2023-02-09 格式:DOCX 页数:40 大小:355.55KB
下载 相关 举报
润乾报表V40高级教程.docx_第1页
第1页 / 共40页
润乾报表V40高级教程.docx_第2页
第2页 / 共40页
润乾报表V40高级教程.docx_第3页
第3页 / 共40页
润乾报表V40高级教程.docx_第4页
第4页 / 共40页
润乾报表V40高级教程.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

润乾报表V40高级教程.docx

《润乾报表V40高级教程.docx》由会员分享,可在线阅读,更多相关《润乾报表V40高级教程.docx(40页珍藏版)》请在冰豆网上搜索。

润乾报表V40高级教程.docx

润乾报表V40高级教程

 

润乾报表V4.0

高级教程

 

 

北京润乾信息系统技术有限公司

第1章序言

中国式报表有别于西方报表,中国式报表很复杂!

润乾报表是专门用于解决中国式复杂报表的报表工具!

润乾报表软件的核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的强关联语义模型、多源关联分片、不规则分组、自由格间运算、行列对称等技术,使得复杂报表的设计简单化,以往难以实现的报表可以轻松实现,避免了大量的复杂SQL编写与前期数据准备,报表设计的效率提高了一个数量级。

润乾报表采用JAVA开发,由两个部分构成:

报表设计器和报表服务器。

润乾报表是一个很容易掌握的报表工具,对于复杂的中国式报表,完全不需要编程和复杂sql,只需要学习简单的表达式规则,就可以完成。

为了帮助读者快速掌握润乾报表的非线性模型用法,我们在《快逸报表V4.0入门教程》的基础上编写了这份《润乾报表V4.0高级教程》,希望读者先学习《快逸报表V4.0入门教程》,再来学习这份文档,效果更好。

本教程沿袭《快逸报表V4.0入门教程》的思路,避免复杂的概念,通过由浅入深的实例,深入浅出的讲解,辅以有针对性的练习题,一步一步帮助读者迅速掌握润乾报表的非线性报表模型的理论和操作。

只要你照着本教程去做,半天就可以初步掌握润乾报表。

希望在轻轻松松的过程中,你能很快地掌握非线性报表设计!

第2章多源关联分片

这份文档的思路,不再强调界面操作上的东西,比如某个按钮在哪里点,某个对话框怎么打开,更多地强调表达式怎么写,模型的原理是啥,表达式的规则是啥,用到的函数等

2.1多层交叉报表

2.1.1一个例子

我们先看下面这个多层交叉报表:

[截图]

从上面这个报表可以看出,这是一个多层的交叉报表,上边有两层动态横向扩展的上表头,左边有两层动态纵向扩展的左表头,中间的交叉点进行汇总统计,统计值和上表头、左表头息息相关。

我们看一下这样的报表在润乾报表中是如何设计的:

1、首先定义数据集:

[列出这个报表用到的数据集及其sql即可]

2、写入单元格表达式,如下图所示:

[设计界面截图,把格子拉大,表达式尽量看全]

从上图可以看出,上表头分别通过[]格和[]格横向扩展形成,左表头通过[]格和[]格纵向扩展形成,中间的交叉点利用[sum]函数进行汇总,于是一个多层交叉报表很轻松就完成了。

这个例子用到了非线性报表模型中的扩展模型以及主格和附属格的模型,介绍如下:

2.1.2扩展模型

扩展单元格:

当单元格的数据值表达式为集合表达式时,该单元格默认为可扩展单元格。

可以为扩展单元格设置一个扩展方向,扩展可以有横纵两个方向,即横向扩展和纵向扩展,但一个扩展格同时只能有一个扩展方向。

横向扩展:

当可扩展单元格的扩展方向为横向时,该单元格进行的扩展称为横向扩展。

此时该单元格会横向进行复制,复制出的单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个。

复制出来的新单元格的所有属性都引用被复制单元格的属性;

纵向扩展:

当可扩展单元格的扩展方向为纵向时,该单元格进行的扩展称为纵向扩展。

此时该单元格会纵向进行复制,复制出的单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个。

复制出来的新单元格的所有属性都引用被复制单元格的属性;

不可扩展:

当单元格的数据值表达式为单值表达式时,该单元格默认为不可扩展单元格。

2.1.3主格模型

主格和附属格:

单元格进行扩展的过程中,缺省情况下,相对于其右(下)边的单元格而言,扩展格是主动复制的,被称为其它格(其右/下的格)的主格,而其右(下)的单元格是被动跟随复制的,被称为扩展格的附属格或子格。

主格和附属格是相对的概念,即某格是另一格的主格或附属格,不存在单独的主格和附属格。

从主格的定义中看,显然只有扩展格才能是其它格的主格!

要注意的是,在缺省情况下,扩展格左(上)的格并不是其附属格,只有右(下)的格才是其附属格。

特别地,某个单元格的主格属性可以人为被改变。

左主格和上主格:

单元格进行纵向扩展时,我们又称其为其它格(其右/下的格)的左主格,而横向扩展时则称为上主格。

一个单元格可以既有左主格又有上主格。

特别地,某个单元格的左主格或者上主格属性可以人为的被改变,即可以人为的把某个纵向扩展格右边的单元格设为他的左主格,或者把某个横向扩展格下方的单元格设为他的上主格。

多层扩展:

多个单元格同时进行扩展时,一个扩展格可以既是某些格的主格又是另一个扩展格的附属格,这种情况下就形成多层扩展的情况。

如果主格A1的附属格是B1,而B1还有附属格C1,那么B1称为A1的1级子格(或1级附属格),C1称为A1的2级子格(或2级附属格),同时A1称作B1的1级主格,A1称作C1的2级主格。

如果C1再有附属格D1,那么A1是D1的3级主格,而D1是A1的3级子格。

显然,B1是D1的2级主格,D1是B1的2级子格。

同一行(列)上有两个或更多的扩展格。

左(上)边的扩展格将是右(下)边的扩展格的主格,右(下)边的扩展格是其左(上)边扩展格的附属格,同时又是其右(下)边单元格的主格。

图示:

[把这个图改一下,改成to(1,3)……]

直接主格和直接附属格:

单元格进行多层扩展时,若主格A的附属格B不再有任何同方向的主格是该主格A的附属格,则称B为A在该方向上的直接附属格,也称为一级附属格;反之,A称为B的直接主格,也称为一级主格

扩展变化规则:

多层扩展时,扩展次序是从主到次的,即先扩展主格,然后扩展其附属格,再扩展其二级附属格,依此类推。

单元格进行横向扩展时,会将其同列的上主格拉大,把其附属单元格复制,特别地,如果其某个上主格不在同列上,则该上主格不会被拉大;

单元格进行纵向扩展时,会将其同行的左主格拉大,把其附属单元格复制,特别地,如果其某个左主格不在同行上,则该左主格不会被拉大。

一般地,主格能够主动进行扩展复制,称为主动扩展格;附属单元格被主单元格带动着复制,称为被动复制格。

由于附属单元格同时又可能是别的单元格的主格,本身还可以进行主动扩展复制,因此主动扩展格和被动复制格是相对的。

既不能主动扩展复制,也不能被动复制的单元格,我们称为不可复制格,或者叫固定格。

同一报表中可能同时有纵向扩展格和横向扩展格,如果它们的子格有重叠部分,则这些子格就即有左主格又有上主格,在扩展时会被即向下又向右复制,形成一片矩形单元格区域,从而做到交叉扩展。

相应地,在这种机制下,多层交叉也不难实现。

在交叉扩展中,有的单元格有可能既被横向扩展向右复制,也被纵向扩展向下复制,可是,单元格的横向扩展与纵向扩展这两种扩展是相互独立的,既可以先进行横向扩展,也可以先进行纵向扩展,并不会影响扩展之后的结果。

例3.3.2-2:

[把这个图改一下,改成to(1,3)……]

例3.3.2-3:

[把这个图改一下,改成to(1,3)……]

例3.3.2-4:

[把这个图改一下,改成to(1,3)……]

例3.3.2-5:

[把这个图改一下,改成to(1,3)……]

2.2纵向分片

现在,我们把2.1.1中的报表做一些改变,首先,我们在原有数据集的基础上增加如下数据集的定义:

[列出增加的数据集及其sql即可]

然后在报表下方追加一行,增加一个纵向扩展格,如下图所示:

[截图,注意:

新增加的这一行换一种比较浅的背景色,以示区别]

该报表的预览效果如下图所示:

[截图]

从上图可以看出,该报表出现了两片纵向扩展区域,这两片纵向扩展区域看起来毫无关系,但是格线严格对齐。

下面我们对这个报表继续做改变,在新增加的行中写入计算表达式,如下图所示:

[截图]

[]格中的表达式为:

其含义是:

;可以看出,这个表达式既和上表头[]格有关联,又和左表头[]格有关联,我们再看一下预览效果:

[截图]

从上图可以看出,上下两片本来没有关系的扩展区域,通过[]格的表达式和上表头[]格关联起来,变成了上下两片紧密关联的扩展区域。

2.3横向分片

[参照纵向分片的写法,在2.2的报表基础上继续做变化]

2.4扩展区域与静态区域混合

[参照前面的写法,在2.3的报表基础上继续做变化,横向纵向分别增加静态列]

2.5行列对称

从前面的几个例子可以看出,润乾报表横向扩展横向分片的能力和纵向是完全对称的,中国式报表中,经常出现类似的需求。

行列对称的能力不仅仅体现在扩展和分片的能力上,还体现在左表头固定,表体横向滚动以及横向分页时左表头每页重复的能力上。

就拿2.4中的报表例子来说,该报表横向已经很宽了,浏览的时候很可能屏幕不够大,需要固定左表头,横向滚动着浏览才方便;打印的时候,一张A4纸也肯定容不下这么宽的报表,只能横向分页,分页的时候左表头很可能需要重复,此时如何实现?

下面看一下润乾报表中的做法:

[……]

1、设置左表头

2、在tag中设置固定表头属性

3、。

2.6多片扩展

2.6.1一个例子

我们看下面这个报表:

[截图,单表式主子表的效果图]

这是一个很常见的主子报表,主表和子表往往存储在不同的物理表中,而且通常是一对多的关系。

在一般的报表工具中,这种报表往往利用专门的子表控件来实现,虽然功能实现了,但是存在的缺点是:

主子表之间不容易共享数据,不容易进行表间数据的运算。

润乾报表利用其多源关联分片模型,很轻松地在单个报表中实现了主子表的功能。

下面我们介绍一下该报表的制作方法:

[

1、定义数据集:

2、定义单元格的表达式

3、设置左主格属性

4、……

]

这个例子中,我们发现,左主格是人为指定的,并不是缺省的,这用到了润乾主格模型中的主格认定规则,主格的认定包括缺省认定和人为认定,下面我们对该理论进行介绍:

2.6.2主格认定规则

缺省主格认定

单元格横向扩展时,上方横向扩展单元格缺省为它的上主格,下方单元格缺省为它的附属格;如果上方没有横向扩展格,则上主格缺省为`0格

单元格纵向扩展时,左边纵向扩展单元格缺省为它的左主格,右边单元格缺省为它的附属格;如果左边没有纵向扩展格,则左主格缺省为`0格

人为改变主格规则

除了上面提到的缺省情况外,我们允许人为地改变单元格的主格。

可以将某个单元格的左主格设置成某个纵向扩展格、上主格设置的某个横向扩展格,左主格和上主格是分别设置的。

为了符合扩展变化的规则,我们可以知道人为设置主格需要满足一些条件:

Ø左主格必须是纵向扩展格,上主格必须是横向扩展格,否则设置无效。

Ø不允许出现循环设置的情况,即设置A的主格是B,B的主格是C,C的主格又是A,出现循环设置时认为设置有误,报表无法计算。

显然,在缺省的情况下是不可能出现循环设置的,而在人为设置时必须避免这种情况的出现。

Ø横向扩展格不允许有左主格,纵向扩展格不允许有上主格。

人为设置时,可能发生左(上)主格在右(下)边的情况,而且主格也不一定和附属格在同一行(列)上。

例3.3.2-1:

2.7多源关联分片的概念与特征总结

从前面的报表例子,我们可以总结出多源关联分片的概念:

多源是指一个报表的数据来源来自多个物理数据表(或类似数据体),甚至是多个物理数据库。

这里的“多个”常常不是两个三个,而是七八个乃至十几个。

多源往往带来分片,正是由于分片,使得报表设计必须直接基于多源进行,而不能先将多源转成单源进行。

有相当一部分分片报表无论如何也不可能转化成单源处理,部分能转成单源的报表处理也非常繁琐。

分片是指报表的纵向或横向或双向同时被分成了多个区域,每个区域独立扩展或者其中一个扩展区域为另一个扩展区域的子扩展区域,也可能是扩展区域和静态区域的混合。

关联是指不同的扩展区域或者扩展与静态区域之间,数据存在着关联,不同区域之间的数据还可能进行运算。

第3章不规则分组

3.1分组报表

3.1.1一个例子

我们先看下面这个分组报表:

[截图,单层的分组报表即可,找个按地区分组的报表,后面的例子比较好演变]

从上面的这个报表可以看出,这是一个分组报表,左边按照[]维度进行了完全的分组,整个报表被分成[列举组名,例如日用品、饮料、海鲜等]等[n]组,我们看一下这样的报表在润乾报表中是如何设计的:

1、首先定义数据集:

[列出这个报表用到的数据集及其sql即可]

2、写入单元格表达式,如下图所示:

[设计界面截图,把格子拉大,表达式尽量看全]

从上图可以看出,该报表最关键的是[]格和[]格,其中[]格利用group函数对数据集进行了分组,并把分组结果在报表中进行纵向扩展,[]格利用select函数把当前组的记录取出来进行纵向扩展。

这个例子用到了group函数和select函数,下面我们做一下介绍:

3.1.2group()

函数说明:

根据分组表达式,从数据集中选出一组组集。

语法:

datasetName.group(,,

//适用于不需要排序或数据集中已排好序datasetName.group(selectExp{,descExp{,filterExp{,sortExp{,groupSortExp{,groupDescExp{,rootGroupExp}}}}}})

参数说明:

selectExp选出的分组表达式,可以是字段列名/列号,也可以是表达式。

列号

用#n表示,例如#0代表第0列,#1代表第1列,依此类推

descExp分组前记录的排序顺序,true为逆序,false为顺序

filterExp过滤表达式

sortExp分组前记录的排序依据表达式

groupSortExp分组后对组的排序表达式,一般是汇总运算的表达式,如组合计等

groupDescExp组排序顺序,true为逆序,false为顺序

rootGroupExp是否root数据集表达式

返回值:

一组数据的集合,数据类型由selectExp的运算结果来决定

示例:

例1:

ds1.group(class)

把数据集ds1中所有记录按照class字段进行分组,并返回每组的class值组成的集合

例2:

ds1.group(class,true)

把数据集ds1中所有记录按照class字段降序排列,然后根据class进行分组,并返回每组的class值组成的集合

例3:

ds1.group(class,false,sex=='1')

从数据源ds1中选取性别为"1"的记录,按照class字段升序排列,然后根据class进行分组,并返回每组的class值组成的集合

例4:

ds1.group(class,true,sex=='1',id)

从数据源ds1中选取性别为"1"的记录,按照id字段降序排列,然后根据class进行分组,并返回每组的class值组成的集合

例5:

ds1.group(省份,true,,,sum(工业产值),true)

对数据集ds1按照省份进行分组,分组后求出每组的sum(工业产值),然后按照这个汇总值对组进行逆序排列

●注意

group函数是对数据集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值,放到单元格中进行扩展,扩展出来的每个单元格都保留了一个指针指向当前的组集,该组集称为当前组。

因此在附属单元格中,需要对该组集进行操作时,不需要用任何条件和主单元格关联了,如果加设了条件,反倒画蛇添足,导致报表引擎还对组集中的记录进行遍历检索。

正确的group用法:

不合理的group用法:

[把上面的截图改一下,a3改成A3]

group函数的原理图示:

3.1.3select()

函数说明:

从数据集的当前行集中选取符合条件的记录

语法:

datasetName.select({,desc_exp{,filter_exp{,sort_exp{,rootGroupExp}}}})

datasetName.select(,,)//适用于不需排序或数据集中已排好序

参数说明:

select_exp:

要选择的字段列名/列号,,也可以是表达式。

列号用#n表示,例如#0代表第0列,#1代表第1列,依此类推

desc_exp:

指定数据排序的顺序,true表示降序排列,false表示升序排列。

filter_exp:

数据过滤表达式,如果全部选出,则此参数省略,仅用“,”占位。

sort_exp:

数据排序表达式。

当此项为空时先检查desc_exp是否为空,如果为空,则不排序,否则使用select_exp排序。

rootGroupExp是否root数据集表达式

返回值:

一组数据的集合,数据类型由select_exp的运算结果决定

函数示例:

例1:

ds1.select(name)

从数据源ds1中选取name字段列的所有值,不排序

例2:

ds1.select(#2,true)

从数据源ds1中选取第二个字段列的所有值并降序排列

例3:

ds1.select(name,false,sex=='1')

从数据源ds1中选取性别为男性('1')的name字段列的值并升序排列

例4:

ds1.select(name,true,sex=='1',id)

从数据源ds1中选取性别为男性的name字段列的值并按id字段降序排列

●注意

使用select函数时,相当于从数据集中取出一组符合条件的记录集合,在单元格中进行扩展,此时每个扩展出来的单元格都保留一个指针,指向当前记录,即当前行,因此在这些单元格的附属单元格中,应当直接用“数据集名.列名”来引用同一个数据集同一条记录的值,此时报表引擎不需要对数据集进行检索遍历了,而是直接从当前行中取值。

图示:

典型的select用法:

不合理的用法:

3.2不完全分组

我们把3.1中的报表做些变化,不要把所有的记录用于分组,因为某些组用户并不关心,我们仅仅保留[……..]这几个组,把剩余的组全部归并成一组,命名为“其他”,报表样式如下图所示:

[结果报表截图]

这种仅仅对数据集中的部分记录进行分组的报表,我们称为不完全分组报表。

这种不完全分组的报表,不能简单地用sql中的过滤条件来实现,因为剩余没有参与分组的记录也要在“其他”组中进行统计,而不是sql中过滤掉就行了。

看看润乾报表中如何实现这样的报表:

[

1、定义数据集

2、定义单元格属性和表达式

3、预览

]

●说明

可以看出,润乾报表处理这种问题很巧妙,润乾报表提供的select和group函数均带有过滤条件参数,可以在进行选出或者分组的时候,过滤掉无关的记录,仅仅对部分记录进行分组。

之后还可以对同一个数据集重复进行多次的分组或者选出、汇总操作,从而可以实现很复杂的分组报表。

参见函数说明[此处加上超链接]

3.3归并分组

如果把3.1中的报表做些变化,变成下面的报表,该如何做呢?

[结果报表的截图]

该报表和3.1的报表很类似,所不同的是分组规则发生了变化,把[]组和[某某]组合并成了一组,组名改成[];……

这种人为地把某几组合并成一组,且合并规则并无规律,需要逐组枚举的报表,我们称为归并分组的报表。

下面我们看看该报表在润乾报表中如何设计:

[设计界面截图,把格子拉大,表达式尽量看全]

从这个报表可以看出,核心部分在[]格,利用enumGroup函数代替了group函数,下面我们看一下该函数的介绍:

3.3.1enumGroup

函数说明:

根据表达式的不同计算结果,返回不同的值,然后按这些值进行分组。

本函数:

从左到右计算,先出现的表达式先算,如果出现满足的表达式,则返回相应的结果,后面的不再计算。

如果没有一个表达式满足条件,而且有缺省值表达式,则返回缺省值,否则返回null。

语法:

ds.enumGroup({hasNullGroup{,termExp1,resultExp1{,term2,resultExp2{,...{,defaultExp}}}}})

参数说明:

hasNullGroup布尔表达式,true返回空组,false不返回空组

termExp(n)条件表达式

resultExp(n)返回结果表达式

defaultExp缺省值表达式,如果所有表达式结果都不满足,则返回本表达式计算结果

返回值:

一组数据的集合,数据类型由resultExp1的运算结果决定

函数示例:

例1:

ds1.enumGroup(true,类别ID==1or类别ID==3,"副食品",类别ID==6,"肉类","其他")

将数据集中满足类别ID==1or类别ID==3的记录归到“副食品”组中,满足类别ID==6的记录归到“肉类”组中,其他的记录归到“其他”组中

 

3.4重叠分组

3.4.1一个例子

我们把3.2中的报表继续做变化,如下图所示:

[截图,把3.2的报表变成含有“其中:

”的报表]

图上可以看出,[]组中的一部分记录被拎出来在[其中:

…..]组中进行了重复的统计,便于用户一目了然,既了解总的统计数据,又了解[其中:

….]的统计数据,这种同一部分记录在不同组中被重复统计的分组报表称为重叠分组报表。

下面我们介绍一下润乾报表中如何实现该报表:

[

1、定义数据集

2、定义单元格表达式

3、看设计界面截图[尽量能在图上看清单元格表达式]

]

从上述介绍可以看出,重叠分组的关键在于[]格的表达式发生了变化,用overlap函数代替了enumGroup函数,下面我们介绍一下overlap函数的用法:

3.4.2overLap

函数说明:

对每一条记录依次计算条件表达式,如果满足则把该条记录加入到相应的组里。

如果有多个组满足,则这些组中都会含有此条记录。

如果都不满足并且有缺省值表达式,则把该条记录加入到缺省组中。

组值为以该组的第一条记录计算结果表达式所得到的值。

语法:

ds.overlap({hasNullGroup{,termExp1,resultExp1{,term2,resultExp2{,...{,defaultExp}}}}})

参数说明:

hasNullGroup布尔表达式,true返回空组,false不返回空组

termExp(n)条件表达式

resultExp(n)返回结果表达式

defaultExp缺省值表达式,如果所有表达式结果都不满足,则返回本表达式计算结果

返回值:

一组数据的集合,数据类型由resultExp1的运算结果决定

函数示例:

例1:

ds1.overlap(true,货主地区=="华北","华北",货主城市=="北京","其中:

北京",货主地区=="华南","华南",货主地区=="华中","华中","其他")

把数据集中满足“货主地区=="华北"”的记录归到"华北"组中,满足“货主城市=="北京"”的记录归到"其中:

北京"组中,满足“货主地区=="华南"”的记录归到"华南"组中,满足“货主地区=="华中"”的记录归到"华中"组中,剩余的记录归到"其他"组中。

3.5条件分组

利用enumGroup函数,设计一个比较复杂的条件分组的报表,每一组的条件均不相同,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1