数据集

阅读(1055) 标签: 定义数据集, 数据集类型,

本菜单项的功能是用于定义报表中用到的数据集。

数据集的概念:

数据集是一个二维的视图,是报表的数据来源。数据集可以通过数据库的SQL查询获得,也可以来自其他异构的数据文件。报表运算引擎不关心数据集的数据来自哪里,始终基于数据集的数据来运算报表。

数据集的定义:

点击 报表à数据集,或者使用快捷键 F11,可打开数据集设置界面,如下图所示:

1.4.2.2-1

在上面的界面中,【增加】按钮用于添加一个数据集;【删除】按钮用于删除数据集列表中选中的数据集;【上移】、【下移】可以改变数据集在数据集列表中的位置;【编辑】按钮可以修改数据集列表中选中的数据集定义;【浏览数据】按钮可以查看数据集包含的数据信息;【别名】按钮可以为记录集中的字段起别名,当从数据源取字段时,很多情况都是英文字段,这时可以通过数据集字段中文标题设置界面,给每个英文字段名附上中文名,我们在制作报表时,从数据集取字段名时可以使用中文名了,这样给不熟悉数据集里英文字段具体含义的用户带来了便利,当数据集类型为内建数据集时,不用设置中文名称,可直接修改字段名为中文即可;【转为内建】按钮可以把外部数据集转为内建数据集,所谓内建数据集是指报表中的数据是存储在报表模板中的。通过点击【复制】按钮,可复制选中的数据集,按住ctrl键,可复制多个数据集;打开其他报表,通过点击【粘贴】按钮,可将复制的数据集添加到其他报表的数据集配置界面。

也可以通过 文件à新建报表 向导在制作报表的步骤中新建数据集,如下图所示:

在数据集类型列表中可以任意选择一个数据集类型新建报表,也可以直接点击生成空白报表生成一张空白报表。

注意如果选择的是SQL数据集,并且该数据集有参数,需先点击“添加报表参数”添加参数。

数据集类型:

系统提供了多种类型的数据集供用户使用,有SQL检索存储过集算脚本数据集文件数据集内建数据自定义类型。

SQL检索

表示数据集的数据来自数据库,它是通过SQL语句到数据库中检索满足一定条件的数据,从而形成一个数据集。但这种类型的数据集并不要求用户自己写SQL语句,而是通过图形化的向导界面由用户去选择检索条件由系统自动的生成SQL语句,这种类型的数据集适用于那些对SQL语句不太熟悉的用户。

举例:以订单表和订单明细表为例来建立一个SQL检索数据集。

1、在图1.4.2.2-1 所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框,如下图所示:

2、选择“SQL检索”数据集类型,点击【确定】按钮,进入SQL编辑器界面,如下图所示:

3、选择“指定模式”,并通过“可选表名”框和“选中表名”框之间的箭头,在可选表名中选择数据表到选中表名中,也可以通过双击表名选择数据表。

4、切换到“数据字段”标签页,首先通过数据表下拉框选择对应的数据表,下面会列出对应数据表的可选字段,然后通过两个列表框之间的箭头,选择可选字段到选中字段中,也可以通过双击字段名选择字段

5、切换到“计算列”标签页,通过编辑界面中间的箭头,选择所需要的字段到“计算列”编辑框中,自己编辑表达式。

比如:订单明细表中有单价与数量字段,希望在数据表里直接取出订单的单价与数量的乘积,则可以在计算列中编辑:订单明细.单价*订单明细.数量 as 总金额,如下图所示:

6、切换到“检索条件”标签页,通过编辑界面中间的箭头,选择所需要的字段到检索条件编辑框中,自己编辑表达式。SQL语句中可以使用参数,在sql语法里,需要用到参数的地方写上问号。

比如:如果希望从订单表里取出订购日期是某一时间段内的订单,则可以在检索条件中编辑检索条件:订单.订购日期 >? and 订单.订购日期<?。如下图所示:

7、切换到“排序”标签页,通过编辑界面中间的箭头,选择需要进行排序的字段到排序字段框中。

8、切换到“语法”标签页可以看到编辑好的SQL语句。在SQL语法里,需要用到参数的地方系统后自动写上了问号,比如我们在前面编辑的检索条件,用到了两个问号。如下图所示:

9、切换到“参数”标签页,按照问号顺序,写入参数名或含参数的表达式(不用等号开头)。在这里不用考虑参数的数据类型,程序中会自动转换。如下图所示:

数据集工厂侦听器类,该类由IDataSetFactoryListener 接口来实现,如果数据集创建不需要做特殊处理,就不用设置该属性。如果需要做特殊处理,则需要写一个数据集创建后处理类,用IDataSetFactoryListener 接口,实现它的public void beforeCreated(Context context, DataSetConfig dsc, DataSet arg2)public void afterCreated(Context context, DataSetConfig dsc, DataSet arg2)方法(详细介绍可参考《程序员参考》数据集工厂侦听小节),并将编译后的类带包路径放在应用的classes下。(注:在设计器端,放到报表安装根目录下的classes文件夹中)

数据集工厂过滤器类,该类由IDataSetFilter接口来实现,如果数据集创建不需要做特殊处理,就不用设置该属性。如果需要做特殊处理,则需要写一个数据集创建后处理类,用IDataSetFilter接口,实现它的public boolean filter(Object[] arg0)public void setContext(Context context)public void setDataSet(DataSet ds)public void setDataSetConfig(DataSetConfig dsconfig)方法(详细介绍可参考《程序员参考》数据集工厂过滤 小节),并将编译后的类带包路径放在应用的classes下。(注:在设计器端,放到报表安装根目录下的classes文件夹中)

数据集记录行设置用于控制数据集的按行取数。

起始行结束行:用于人为控制数据集的行数。如果您的报表数据量比较大时,可以通过参数传递来改变起始行和结束行。一般来说,起始行和结束行都是输入参数,通过参数来控制行号,如果输入常数没什么意义。

记录阈值:针对大数据量生成数据集时,往往会长时间无响应。设置一个阈值(int),实际获得记录数超过阈值时中止运算。默认0,表示没有限制。

预警阈值:勾选后,先获得记录数,判断后未超阈值再生成数据集;不勾选,直接生成数据集,在生成过程中超过阈值,中断,数据集被置空。

:对于大数据集,阈值相关的设置是无效的。

根据需要填写数据集工厂侦听器类名,以及起始行和结束行。没有特殊需要,可不填。

10、点击【确定】按钮,回到数据集设置界面。如果字段名为英文时希望给数据字段设置中文标题,可点击【别名】按钮,按照字段顺序为每个字段设置中文标题,然后在制作报表时直接使用中文名即可。

11、如果不想使用缺省数据集名称,可以手动编辑数据集名称,还可以选择不同数据源,最后点击【确定】按钮,完成数据集定义。

存储过程

表示数据集的数据来自存储过程。SQL语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些SQL语句。应用程序需要用的时候直接调用就可以了,所以效率比较高。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和复杂的运算。存储过程可以返回结果集,可以返回参数,也可以同时返回结果集和参数。

存储过程的参数分为输入参数和输出参数两种。输入参数是存储过程执行的条件参数。输出参数类似于返回值,但是输出参数具有两个重要的优势:可以使用输出参数从存储过程传递出VarCharIntMoney或任何其他数据类型的值,而返回值则只能返回整数。输出参数的另一个优势就是在一个存储过程中可以有多个输出参数,一个存储过程可以包含1024个参数(其中包括输入和输出参数),但是只能包含一个返回值。

 

举例一:带有输入参数的存储过程。

1、在图1.4.2.2-1 所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“存储过程”数据集类型,点击【确定】按钮,进入存储过程数据集界面,如下图所示:

3、切换到“参数”标签页,如下图所示:

参数的顺序必须与问号的顺序保持一致,并指定参数模式。这里用到的参数必须在 报表à参数 中定义,并且在 报表à参数 中定义参数时需指定对应的数据类型。

从上图可以看到,“参数定义”后有“结果类型”属性,如果“参数模式”为输入参数,选择“默认”就可以了,只要在 报表à参数 中定义参数时指定对应的数据类型即可。

 

举例二:带有输出参数的存储过程。

本例使用的数据库类型为:sqlserver2000 sp4

存储过程如下:

create proc Procname

@a char(100) output  //默认定义的是输入参数,如果有关键字output说明是输出参数。

as

set @a='aaa'

select * from jobs

GO

该存储过程返回一个数据集和一个变量aa的数据类型为char类型,值为’aaa’

1、在图1.4.2.2-1 所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“存储过程”数据集类型,点击【确定】按钮,进入存储过程数据集界面,如下图所示:

3、切换到“参数”标签页,如下图所示:

参数对应call Procname(?)中的?,参数表达式为:@arg2arg2是我们在报表中定义的一个普通参数,它接收Procname存储过程中输出参数a的值。结果类型为字符串,因为我们的输出参数achar类型,所以结果类型为字符串。参数模式为:输出参数。输出名称为:arg2,我们在报表中就用arg2来引用存储过程中的输出参数a的值。

报表设计中需定义的参数:

报表设计:

预览报表,在参数arg2中输入任何值,报表展示后,E2{}中返回的都是’aaa’arg2已经被调用的Procname存储过程的输出参数重新赋值了。

存储过程可以没有输出参数,但是如果你的存储过程是将结果集返回给一个参数,则需要在报表à参数里定义该参数,并指定该参数的“参数模式”为“输出参数”。这个时候,如果你的数据库是oracle,则还需要将这个输出参数的结果类型设置为“游标”。

集算器

集算器类型数据集是指数据集中的数据是从集算器文件中获取到的,集算器文件的运算结果可以通过return语句或者不写(不写时最后一个语句如果是赋值格,则会自动被返回)返回用作润乾报表的数据集。

集算器类型数据集界面如下:

SPL文件:通过SPL文件后面的按钮,选择集算器文件(文件后缀为.splx/.spl/.dfx)

集算器文件路径既可以是绝对路径也可以是相对路径,在设计器中的相对路径是相对于【工具】à【选项】à【集算器选项】中配置的寻址路径,在web端是相对于 raqsoftConfig.xml中的Esproc里的splPath路径。使用相对路径时,路径前不要加斜杠“/”

缓存文件名对应的变量:缓存文件名对应的变量对应集算器文件中的缓存文件变量

数据管理方式:分为缓存和SPL自管理。

缓存—基于缓存文件取数

SPL自管理—通过自定义SPL取数。

脚本文件优先在WEB应用中查找:使用相对路径时,勾选该选项会优先在WEB应用路径中查找。

参数如果集算器文件中定义了参数,系统在参数列表中自动加载集算器文件中的参数名。参数列表中参数名对应集算文件里定义的参数名。参数值可以使用值,还可以使用报表参数,使用报表参数时可以对报表的参数通过表达式(这里使用报表的表达式语法)计算出结果传递给集算文件作为参数。

注意:

当数据集用于大报表,并且需在集算器数据集中自定义缓存文件时,需将缓存文件名对应的变量设置为集算器中的缓存文件变量。

 

举例:

集算器文件的内容如下:

1、在数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“集算器”数据集类型,点击【确定】按钮,进入集算器数据集编辑界面,如下图所示:

3、点击SPL文件后面的按钮,选择集算器文件

系统在参数列表中自动加载集算器文件中的参数

4、点击【确定】按钮,生成数据集

关于集算器数据集的更多用法,可参考《教程》集算器数据集小节。

●注意:能够作为数据集类型被使用的集算器文件,如果用的是报表当前连接的数据源,程序有自动连接数据库机制,集算器文件中可以直接使用db.query()。如果用的不是报表当前连接的数据源,首先集算器文件中必须通过connect(”db”)函数建立数据连接,再进行查询,最后通过close()函数关闭该连接。

 

例如:下边的SPL使用的数据源与报表使用的数据源相同,则直接使用db.query()来进行查询:

脚本数据集

可直接在脚本编辑区添加计算表达式,通过return语句或者不写(不写时最后一个语句如果是赋值格,则会自动被返回)将结果集返回到润乾报表数据集中,脚本编辑区的表达式语法需遵循集算器语法。

脚本数据集界面如下:

缓存文件名对应的变量:当数据集用于大报表时,为缓存文件设置变量名,方便在脚本中调用缓存文件。

注意:

当数据集用于大报表时,脚本必须返回游标。

 

举例:

1、在数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“脚本数据集”数据集类型,点击【确定】按钮,进入脚本数据集编辑界面,如下图所示:

在脚本编辑区编写脚本,或粘贴写好的脚本(粘贴时,选中某单元格后点击粘贴按钮),如果脚本中需要传入参数,可在报表文件的参数列表中定义,其中参数名是脚本里定义的参数名

3、点击【确定】按钮,生成数据集。

 

使用脚本数据集时,需使用含有脚本执行功能点的润乾报表授权。

●注意:脚本数据集与集算器数据集相同,如果用的是报表当前连接的数据源,程序有自动连接数据库机制,可以直接使用db.query()。如果用的不是报表当前连接的数据源,首先必须通过connect(”db”)函数建立数据连接,再进行查询,最后通过close()函数关闭该连接。

文件数据集

文件数据集是指数据集的数据是从文件中获取到的,支持txtxlsxlsxcsvbtx(集文件)、ctx(组表文件)六种类型文件。

使用btx(集文件)和ctx(组表文件)类型文件时,需使用含有集文件功能点的润乾报表授权,目前仅支持读取基表数据。

 

文件数据集界面如下:

文件:文件名,支持绝对路径或相对路径。使用相对路径时,路径前不需要加斜杠“/”。在设计器中的相对路径是相对于工具à选项中的应用资源路径,在web端是相对于raqsoftConfig.xml<Report/>里配置的home属性的路径。

工作表:当文件类型是Excel文件时,用于选择同一个Excel文件的不同Sheet工作表。

字符集:Text文件、CSV文件的字符集。字符集类型包括:GBKUTF-8

第一行是标题:文件中的第一行内容是否作为标题

预览时重新选择文件:数据集在浏览数据或者设计器进行预览时,可以在弹出的重新选择数据集文件对话框中重新选择数据集文件。

如果字符串外有引号则先剥离,包括标题部分: 是否删除字符串最外层的引号

分隔符:Text文件字段间的分隔符。分隔符类型包括:制表符( TAB )、逗号( , )、空格、竖线( | )、短横线( - )、下划线( _ )

注意CSV文件字段间的分隔符仅支持逗号。

起始行/结束行:当文件类型选择Excel文件后,页面中会出现起始行和结束行,用于对Excel文件的行数进行筛选。

 

使用文件数据集时,文件的数据量很大,为了避免将不需要的数据加载到内存,数据量过大造成内存溢出,可采用如下方法,以减小计算得到的数据集。

有用字段:选择文件,选取需要用到的字段。

聚合:对需要做统计的字段进行聚合运算。

过滤:对符合条件的记录进项筛选,过滤条件中不支持使用参数。过滤条件需满足布尔表达式多个布尔表达式之间可使用逻辑运算符,如:&&||

分组:选择需要分组统计的字段

注:“分组”需要与“聚合”一起使用,单独使用“分组”不起作用,得到的结果会与原始数据一样。

显示:生成的数据集中需要显示的字段

 

举例:用orders.txt建立一个文件数据集。

1、在图1.4.2.2-1 所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“文件数据集”类型,点击【确定】按钮,进入文件数据集编辑界面,如下图所示:

3、点击按钮选择orders.txt;也可以输入orders.txt文件的路径,例如:【工具】à【选项】文件tab中的应用资源路径设为G:\raqsoft\report\web\webapps\demo\WEB-INF\reportFilesorders.txt位于reportFiles文件夹时,文件设置为orders.txt即可。

4、选择文件对应的【字符集】类型,默认是GBK。【第一行是标题】默认为勾选。选择字段间的【分隔符】,默认是制表符(TAB)。此时文件数据集编辑界面,如下图所示:

5、选出有用字段,设置聚合运算、过滤条件、分组字段,数据集显示字段。

选出有用字段,订单ID、雇员ID、运货费:

对运货费做求和统计:

设置过滤条件:订单ID < 10300

根据雇员ID分组:

选出生成数据集的字段:

点击“确定”按钮,一个文件数据集就创建好了。

 

内建数据

内建数据集是指数据集的结构和数据都存入报表模板,运算报表的时候不需要从数据源取数了。可以使用户快速的体验建立报表的过程,用户只需在报表设计器中定义一个内建数据集,录入一些数据就可以在报表中使用了,这样给用户的体验过程带来了极大的方便。也可以用于报表的跟踪调试,当报表预览结果和您预想的结果不符合时,可以把数据集转为内建,然后把报表模板发给技术支持人员,方便支持人员跟踪调试。

内建数据类型数据集界面如下:

 

举例:创建一个包含姓名和年龄的内建数据集。

1、在图1.4.2.2-1 所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“内建数据集”类型,点击【确定】按钮,弹出“内建数据集”窗口,在此窗口中我们可以定义内建数据集包含的字段和数据值。在“字段”标签页定义内建数据集包含的字段,点击右边的【增加】按钮,在左边的字段列表中就会增加一个字段的定义,可以修改字段名和字段的数据类型。假设我们定义姓名和年龄两个字段,如下图所示:

3、切换到“数据”标签页,点击右边的【增加】按钮,可以添加字段对应的数据值。如下图所示:

我们也可以把Excel文件中已有的数据复制粘贴到内建数据集中。首先复制Excel文件中的数据值,在内建数据集的“数据”标签页点击右边的【粘贴】按钮即可把Excel文件中的数据粘贴到内建数据集中。

4、点击【确定】按钮,一个内建数据集就建好了。

可以把一个外部数据集转为内建数据集也可以把内建数据集还原为外部数据集。

在图1.4.2.2-1 所示的数据集设置窗口中选中数据集列表中的一个数据集,点击右边的【转为内建】按钮,即可把外部数据集转为内建数据集。如下图所示:

从上图中我们看到ds1转为内建数据集后,右边的【转为内建】按钮变成了【还原】按钮。选中数据集列表中的ds1,点击【还原】按钮,ds1内建数据集就还原成了它最初的“SQL检索”数据集类型。如下图所示:

把内建数据集还原为外部数据集,要求内建数据集最初是由外部数据集转化而来的,不能是用户自己建的内建数据集,如果是用户自己建的内建数据集不能还原为外部数据集合。

自定义

如果报表的数据来源比较特殊,需要程序员自己处理,可以采用自定义数据集的方式,此时选择数据集的类型为自定义,然后在编辑界面中输入类名和需要用到的参数。

自定义类型数据集界面如下:

举例:创建一个学生成绩的自定义数据集。

1、在图1.4.2.2-1 所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。

2、选择“自定义”数据集类型,点击【确定】按钮,弹出“自定义数据集”窗口,如下图所示:

在数据集类名编辑框中输入数据集类名,该类应该由程序员自己实现,实现润乾报表提供的一个接口IDataSetFactoryIDataSetFactory接口只定义了一个方法:

public DataSet createDataSet(Context ctx, DataSetConfig dsc,boolean retrieve)

自定义类必须实现此方法,并返回一个DataSet对象,以下是对本方法的说明:

功能:生成自定义数据集

语法:public DataSet createDataSet(Context ctx,DataSetConfig dsc, boolean retrieve)

参数说明:  Parameters:ctx – 报表运行上下文

dsc – 数据集配置

retrieve – 是否检索出数据,若为false则不取出数据只产生数据集的结构

createDataSet()方法由系统调用,我们不用去关心怎么调用它,而关心的是如何利用已有的方法参数,根据需要实现这个方法。createDataSet()方法返回的是一个DataSet对象,可以开始时便新建一个用于返回的DataSet对象:

int rows = listsize();  //数据初始行数,根据实际求得

int cols = 3;  //数据列数

DataSet ds = new DataSet(rows,cols,"ds1");

DataSet的三个参数分别是数据初始行数、数据字段列和数据集名。新建DataSet对象后往其中设置数据字段名,这个过程一定要在设置数据前。例如,我们要对这个数据集添加三个数据字段:

ds.addCol( "name" );  //列名

ds.addCol( "subject" );  //列名

ds.addCol( "grade" );  //列名

对于有字段的数据集,就可以设置其包含的数据了:

for( int i = 0; i < rows; i++ ) {

Row row = ds.addRow();

DataBean data = (DataBean) list.get(i);

     

row.setData(1, data.getName());

row.setData(2, data.getSubject());

row.setData(3, new Integer(data.getGrade()) );

}

3、点击【增加】按钮,为自定义数据集添加参数。

4、点击【确定】按钮,一个自定义数据集就建好了。