数据集
数据集
本菜单项的功能是用于定义报表中用到的数据集。
点击 配置-数据集 ,可打开数据集设置界面,如下图所示:
在上面的界面中,【增加】按钮用于添加一个数据集;【删除】按钮用于删除数据集列表中选中的数据集;【上移】、【下移】可以改变数据集在数据集列表中的位置;【编辑】按钮可以修改数据集列表中选中的数据集定义;【浏览数据】按钮可以查看数据集包含的数据信息;【别名】按钮可以为记录集中的字段起别名,当从数据源取字段时,很多情况都是英文字段,这时可以通过数据集字段中文标题设置界面,给每个英文字段名附上中文名,我们在制作报表时,从数据集取字段名时看到的都是中文名了,这样给不熟悉数据集里英文字段具体含义的用户带来了便利,当数据集类型为内建数据集时,不用设置中文名称,可直接修改字段名为中文即可;【转为内建】按钮可以把外部数据集转为内建数据集,所谓内建数据集是指报表中的数据是存储在报表模板中的。通过点击【复制】按钮,可复制选中的数据集,按住ctrl键,可复制多个数据集;通过点击【粘贴】按钮,可将复制的数据集添加到数据集配置界面。
系统提供了多种类型的数据集供用户使用,有SQL检索、存储过程、复杂SQL 、Text文件、XML文件、内建数据、语义层视图、EssBase、自定义和集算器等数据集类型。
-
SQL检索
表示数据集的数据来自数据库,它是通过SQL语句到数据库中检索满足一定条件的数据,从而形成一个数据集。
但这种类型的数据集并不要求用户自己写SQL语句,而是通过图形化的向导界面由用户去选择检索条件由系统自动的生成SQL语句,这种类型的数据集适用于那些对SQL语句不太熟悉的用户。
-
举例:以订单表和订单明细表为例来建立一个SQL检索数据集。
-
在所示的数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框,如下图所示:
-
选择“SQL检索”数据集类型,点击【确定】按钮,进入SQL编辑器界面,如下图所示:
-
选择“指定模式”,通过“可选表名”框和“选中表名”框之间的箭头,在可选表名中选择数据表到选中表名中。
-
切换到“数据字段“标签页,首先通过数据表下拉框选择对应的数据表,下面会列出对应数据表的可选字段,然后通过两个列表框之间的箭头,选择可选字段到选中字段中。
-
切换到“计算列”标签页,通过编辑界面中间的箭头,选择所需要的字段到“计算列”编辑框中,自己编辑表达式。
比如:订单明细表中有单价与数量字段,希望在数据表里直接取出订单的单价与数量的乘积,则可以在计算列中编辑:订单明细.单价*订单明细.数量 as 总金额,如下图所示:
-
切换到“检索条件”标签页,通过编辑界面中间的箭头,选择所需要的字段到检索条件编辑框中,自己编辑表达式。SQL语句中可以使用参数,在sql语法里,需要用到参数的地方写上问号。
比如:如果希望从订单表里取出订购日期是某一时间段内的订单,则可以在检索条件中编辑检索条件:订单.订购日期>? and 订单.订购日期<?。
如下图所示:
-
切换到“排序”标签页,通过编辑界面中间的箭头,选择需要进行排序的字段到排序字段框中。
-
切换到“语法”标签页可以看到编辑好的SQL语句。在SQL语法里,需要用到参数的地方写上问号,比如我们在前面编辑的检索条件,用到了两个问号。如下图所示:
-
切换到“参数”标签页,按照问号顺序,写入参数名或含参数的表达式(不用等号开头)。在这里不用考虑参数的数据类型,程序中会自动转换。如下图所示:
数据集工厂侦听类,该类由IDataSetFactoryListener 接口来实现,如果数据集创建不需要做特殊处理,就不用设置该属性。
如果需要做特殊处理,则需要写一个数据集创建后处理类,用IDataSetFactoryListener 接口,实现它的public void beforeCreated(Context context, DataSetConfig dsc, DataSet arg2)及public void afterCreated(Context arg0, DataSetConfig arg1, DataSet arg2)方法,并将编译后的类带包路径放在应用的classes下。(注:在设计器中,请直接在润乾安装根目录下建立一个classes文件夹)
数据集记录行设置:用于控制数据集的按页取数。一般来说,起始行和结束行都是输入参数,通过参数来控制行号,如果输入常数,一般没什么意义。
起始行和结束行可用来人为控制分页,如果您的报表数据量比较大时,可以通过参数传递来改变起始行和结束行,通过按页取数的方式来减少数据量 。
根据需要填写数据集工厂侦听器类名,以及起始行和结束行。没有特殊需要,可不填。
-
点击【确定】按钮,回到数据集设置界面,如果希望给数据字段设置中文标题,可点击【别名】按钮,按照字段顺序为每个字段设置中文标题。
-
点击【确定】按钮,完成数据集定义。
-
-
-
存储过程
数据集的数据来自存储过程。sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。应用程序需要用的时候直接调用就可以了,所以效率比较高。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和复杂的运算。存储过程可以返回结果集,可以返回参数,也可以同时返回结果集和参数。
存储过程的参数分为输入参数和输出参数两种。输入参数是存储过程执行的条件参数。输出参数类似于返回值,但是输出参数具有两个重要的优势:可以使用输出参数从存储过程传递出VarChar,Int,Money或任何其他数据类型的值,而返回值则只能返回整数。输出参数的另一个优势就是在一个存储过程中可以有多个输出参数,一个存储过程可以包含1024个参数(其中包括输入和输出参数),但是只能包含一个返回值。
-
举例一:带有输入参数的存储过程。
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“存储过程”数据集类型,点击【确定】按钮,进入存储过程数据集界面,如下图所示:
-
切换到“参数”标签页,如下图所示:
参数的顺序必须与问号的顺序保持一致,并指定参数模式。这里用到的参数必须在配置-参数中定义,并且在配置-参数中定义参数时指定对应的数据类型。
从上图可以看到,“参数定义”后有“结果类型”属性,如果“参数模式”为输入参数,选择“自动”就可以了,只要在配置-参数中定义参数时指定对应的数据类型即可。
-
-
举例二:带有输出参数的存储过程。
本例使用的数据库类型为:sqlserver2000 sp4 存储过程如下: create proc Procname @a char(100) output //默认定义的是输入参数,如果有关键字output说明是输出参数。
as set @a='aaa' select * from jobs GO 该存储过程返回一个数据集和一个变量a,a的数据类型为char类型,值为’aaa’
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“存储过程”数据集类型,点击【确定】按钮,进入存储过程数据集界面,如下图所示:
-
切换到“参数”标签页,如下图所示:
参数对应call Procname(?)中的?,参数表达式为:@arg2,arg2是我们在报表中定义的一个普通参数,它接收Procname存储过程中输出参数a的值。结果类型为字符串,因为我们的输出参数a为char类型,所以结果类型为字符串。参数模式为:输出参数。输出名称为:arg2,我们在报表中就用arg2来引用存储过程中的输出参数a 的值。
报表设计中需定义的参数:
报表设计
预览报表,在参数arg2中输入任何值,报表展示后,E2{}中返回的都是’aaa’,arg2已经被调用的Procname存储过程的输出参数重新赋值了。
注意 存储过程可以没有输出参数,但是如果你的存储过程是将结果集返回给一个参数,则需要在配置-参数里定义该参数,并指定该参数的“参数模式”为“输出参数”。这个时候,如果你的数据库正好是oracle,则还需要将这个输出参数的结果类型设置为“游标”。
-
-
-
复杂SQL
SQL检索和复杂SQL 没有太大的区别,仅仅编辑的时候略有差异,如果是SQL检索,系统会有编辑向导来引导用户选择检索条件,用户不用自己写SQL语句。如果是复杂SQL,系统仅仅提供一个编辑框,用户可以将调试好的SQL语句直接拷贝进来。复杂SQL适用于对SQL语句掌握比较好的用户。
-
举例:以订单表和订单明细表为例来建立一个复杂SQL数据集。
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“复杂SQL”数据集类型,点击【确定】按钮,进入复杂SQL数据集编辑界面,如下图所示:
-
在“定义”标签页中输入SQL语句,如上图所示:
-
同sql检索一样,在sql语法里,需要用到参数的地方写上问号,然后在“参数”标签页中按照问号顺序,写入参数名或含参数的表达式,如下图所示:
注意 SQL语句中用到的参数要事先在报表参数中定义。
-
-
-
Text文件
表示该数据集的数据来自TEXT文件,此时编辑的时候只需要录入TEXT文件名,可以是绝对路径名,也可以是相对路径名。如果是相对路径,编辑器中相对于配置-选项中的应用资源路径,WEB发布时,相对于WEB.XML 中配置的ReportFileHome 属性中的路径。
-
举例:以area.txt为例来建立一个Text文件数据集。
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“Text文件”数据集类型,点击【确定】按钮,进入文本数据集编辑界面,如下图所示:
-
点击【…】按钮选择area.txt文件所在的位置,也可以输入area.txt文件相对路径。
-
点击【确定】按钮既可完成Text文件数据集的建立。
TEXT 文件中的格式如下图所示:
第一行为列名定义,第二行为列的数据类型定义,第三行开始是数据。
其中第一行和第二行都可以省略,如果省略列名定义,那么表达式里引用列时用dsn.#n的方式,n代表列号;如果省略列数据类型定义,那么数据类型全部默认为字符型。 数据类型的定义采用java.sql.Types里的标准定义。
列间分隔符为TAB键,即\t,行间分隔符为回车键,即\n。
-
-
-
XML文件
数据集如果是XML文件类型,表示该数据集的数据来自XML文件,此时编辑的时候只需要录入XML文件名,可以是绝对路径名,也可以是相对路径名。如果是相对路径,编辑器中相对于配置-选项中的应用资源路径,WEB发布时,相对于WEB.XML中配置的ReportFileHome属性中的路径。
-
举例:以student.xml为例来建立一个XML文件数据集。
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“XML文件”数据集类型,点击【确定】按钮,进入XML数据集编辑界面,如下图所示:
-
点击【…】按钮选择student.xml文件所在的位置,也可以输入student.xml文件相对路径。
-
点击【确定】按钮既可完成xml文件数据集的建立。
XML文件中的格式如下图所示:
根节点为ROWS,根节点下第一个节点为列名定义,第二个节点为列的数据类型定义,第三个节点开始是数据 列名和列的数据类型都可以不定义,如果省略列名定义,那么表达式里引用列时用dsn.#n的方式,n代表列号;如果省略列数据类型定义,那么数据类型全部默认为字符型。 数据类型的定义采用java.sql.Types里的标准定义 一行数据为一个ROW节点定义
-
-
-
内建数据集
内建数据集是指数据集的结构和数据都存入报表模板,运算报表的时候不需要从数据源取数了。可以使用户快速的体验建立报表的过程,用户只需在报表设计器中定义一个内建数据集,录入一些数据就可以在报表中使用了,这样给用户的体验过程带来了极大的方便。也可以用于报表的跟踪调试,当报表预览结果和您预想的结果不符合时,可以把数据集转为内建,然后把报表模板发给技术支持人员,方便支持人员跟踪调试。
-
举例:创建一个包含姓名和年龄的内建数据集。
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“内建数据集”类型,点击【确定】按钮,弹出“内建数据集”窗口,在此窗口中我们可以定义内建数据集包含的字段和数据值。在“字段”标签页定义内建数据集包含的字段,点击右边的【增加】按钮,在左边的字段列表中就会增加一个字段的定义,可以修改字段名和字段的数据类型。假设我们定义姓名和年龄两个字段,如下图所示:
-
切换到“数据”标签页,点击右边的【增加】按钮,可以添加字段对应的数据值。如下图所示:
我们也可以把excel文件中已有的数据导入到内建数据集中。首先复制excel文件中的数据值,在内建数据集的“数据”标签页点击右边的【粘贴】按钮即可把excel文件中的数据导入到内建数据集中。
-
点击【确定】按钮,一个内建数据集就建好了。
可以把一个外部数据集转为内建数据集也可以把内建数据集还原为外部数据集。
在 所示的数据集设置窗口中选中数据集列表中的一个数据集,点击右边的【转为内建】按钮,即可把外部数据集转为内建数据集。如下图所示:
从上图中我们看到ds1转为内建数据集后,右边的【转为内建】按钮变成了【还原】按钮。选中数据集列表中的ds1,点击【还原】按钮,ds1内建数据集就还原成了它最初的“SQL检索”数据集类型。如下图所示:
注意 把内建数据集还原为外部数据集,要求内建数据集最初是由外部数据集转化而来的,不能是用户自己建的内建数据集,如果是用户自己建的内建数据集不能还原为外部数据集合。
-
-
-
语义层视图
语义层视图数据集是指由语义层视图获取数据的数据集(关于语义层的详细介绍,可参见第六章)。在配置语义层视图数据集时,需要选择数据集使用的视图名称、所使用的字段以及数据集应用的语义层条件。语义层视图数据集的数据源将会自动根据语义层来设定。
举例:以语义层的订单视图为例来建立一个语义层视图。
1、在中点击【增加】按钮,弹出数据集类型对话框。
2、选择“语义层视图”数据集类型,点击【确定】按钮,弹出“视图数据集”窗口,如下图所示:
视图名称下拉框列出了设计器打开的语义层文件所包含的视图名称,我们选择“订单”
视图,在可选字段列表框中选择我们的视图数据集所要包含的字段,双击可选字段名即可将该字段放入选中字段列表中。
3、点击“条件”标签页,选择数据集应用的语义层条件。如下图所示:
双击可选条件即可将该条件放入选中条件列表中。
4、点击【确定】按钮,一个语义层视图数据集就建好了。
当报表中包含由语义层创建的表达式的时候,在分析语义层之后,会自动产生应用到的语义层数据集,自动产生的语义层数据集是和应用的视图同名的。所以,在自定义语义层数据集或者修改已有的语义层数据集后要注意:如果在配置-选项里面选择了“自动分析语义层”,那么在系统进行语义层分析之后,同名的语义层将被更新,有可能会改变已经设定好的语义层视图数据集。
-
EssBase
Essbase:Extended SpreadSheet DataBase,用户可以把essbase想像成多张叠起来的excel表格,不仅仅在单张excel上可以进行表格之间的各种运算,在多张excel表格之间也可以做各种累计运算。EssBase是一个多维的数据库,它根据大部分多维模型项目的需要,归纳出了一些在大部分项目中都需要的特殊维度和属性,提供了预定义的这些维度和属性的行为,用户只要根据不同的需求去选择不同的维度类型和维度属性,就能够自动产生许多针对该维度类型相关的分析。当然用户也可以根据自己的需要定义自己所需要的维度和属性。EssBase数据集可以从多维的角度对数据进行分析。
第一步:在中点击【增加】按钮,弹出数据集类型对话框
第二步:选择“EssBase”数据集类型,点击【确定】按钮,弹出“EssBase数据集类型”选择窗口,如下图所示:
EssBase数据集类型有三种:从Cube中检索数据、取出Cube中维信息和MDX多维检索。
从Cube中检索数据:从指定维度的指定层次中取出数据。
取出Cube中维信息:检索维度的层次信息,可用于制作多层次的报表头。
MDX多维检索:可通过多个维度定位数据。
下面以EssBase自带的Demo数据为例,简单介绍一下这三种数据集。
第三步:在第二步中选择EssBase数据集类型为:从Cube中检索数据,点击【确定】按钮,弹出OLAP数据集数据检索,如下图所示:
其中,hinamizawa是数据库服务器的主机名,Demo、Sample为数据库,Basic为数据表。Year为数据的一个维度,其下的Qtr1-Qtr4是该维度的一个层次,之下还有Jan、Feb、Mar是另一个层次。“Gen2,Year”表示列举Year维度的第二层次内容,即Qtr1-Qtr4。依次类推。
第四步:选中Gen3.Year,将其拖动到右边的文本框中,点击【确定】按钮返回。
注意 一定要为EssBase类型的数据集指定数据源,否则会取不到数据。
第五步:在图4.6.3.2-1 数据集设置窗口中点击【浏览数据】按钮,可以看到系统成功的取到了以Year为维度的第三层次的数据:
在这里我们取的是月份,也就是Year维度的第三层次的值。如果需要取第二层次的值,EssBase也会自动进行数据的汇总:
第六步:在第二步中选择EssBase数据集类型为:取出Cube中维信息,点击【确定】按钮,弹出数据库Cube维定义窗口,如下图所示:
这里我们只能展开到维定义的这一层。
第七步:选中一个维,将其拖到右边的文本编辑框中。点击【确定】按钮返回。
第八步:在中点击【浏览数据】按钮,系统取出了“Year”维度下面的层次结构:
可以看到,这种数据集并不真正的取出数据,而只是取出一个维度下的层次结构。这种数据即可在数据钻取,或是多层次的分组报表中使用。
第九步:在第二步中选择EssBase数据集类型为:MDX多维检索,点击【确定】按钮,弹出OLAP数据集数据MDX检索定义窗口,如下图所示:
第十步:在这里我们可以使用五个维度检索数据,即右边界面上的“列、行、页、章、节”。这里我们将Year.Gen2拖到“列”下面,然后将Market.Gen2拖到“行”下面。点击【确定】按钮返回。
注意 注意:同一维度下各个层次,不能拖到两个分类下;一个分类下也不能拖进两个不同的维度。
第十一步:在图4.6.3.2-1 数据集设置窗口中点击【浏览数据】按钮,取出来的数据如图:
虽然取出的数据表是简单的网格式表,但是其中包含有分组的信息,可以将其转化成一张二维表。同理,我们最多可以得到一张五维的数据表。
在报表制作方面,EssBase类型的数据集返回的是标准的润乾报表数据集,因此与我们平时制作报表并没有什么区别。
-
自定义
如果报表的数据来源比较特殊,需要程序员自己处理,可以采用自定义数据集的方式,此时选择数据集的类型为自定义,然后在编辑界面中输入类名和需要用到的参数。
-
举例:创建一个学生成绩的自定义数据集。
-
在中点击【增加】按钮,弹出数据集类型对话框。
-
选择“自定义”数据集类型,点击【确定】按钮,弹出“自定义数据集”窗口,如下图所示:
在数据集类名编辑框中输入数据集类名,该类应该由程序员自己实现,实现润乾报表提供的一个接口IDataSetFactory,
IDataSetFactory接口只定义了一个方法: 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()) ); }
-
点击【增加】按钮,为自定义数据集添加参数。
-
点击【确定】按钮,一个自定义数据集就建好了。
-
-
-
集算器
集算器类型数据集是指数据集中的数据是从集算器文件中获取到的,它的取数方式有两种:
1.通过设置表达式。勾选设置界面上的【用单元格返回值】,再在表达式区域内设置集算器文件中的单元格名或能够返回序表的表达式。
2.通过集算器文件中的result语句。如果不勾选【用单元格返回值】的话,报表会自动寻找集算器文件中的result语句,并将结果返回到数据集中,数据集与集算器文件中的result语句是一对一的。
集算器类型数据集界面如下:
-
举例:通过表达式从集算器数文件中取数的数据集
1. 在数据集设置窗口中点击【增加】按钮,弹出数据集类型对话框。
2. 选择“集算器”数据集类型,点击【确定】按钮,进入集算器数据集编辑界面,如下图所示:
3. 点击集算器文件后面的选择 按钮,选择集算器文件的文件名;
注意 集算器文件的路径既可以是绝对路径也可以是相对路径,在设计器中的相对路径是相对于配置—>选项中配置的应用资源路径而言的,在WEB端是相对于reportConfig.xml中的reportFileHome的路径而言的。
4. 勾选用单元格返回值;
5. 表达式中添加集算器文件中的单元格,表示数据集中的数据均来自于集算器文件中的单元格表达式:
上述设置表示,所设置的数据集中的数据全部来自集算器文件“p1.dfx” 中的A2单元格,p1.dfx文件内容如下:
另外,在表达式中还可以设置多个单元格,单元格用[]括起来,每个单元格之间用英文的逗号分开。
添加一个数据集,设置为集算器类型,设置如下图所示:
这样就必须在数据集名称中手动设置两个名称,中间用英文逗号分开,如下图:
表示数据集ds2中的数据来自于集算器文件“p1.dfx” 中的A2单元格,数据集ds3中的数据来自于表达式“A2.select(产品名称=="牛奶")”中。
注意 在集算器数据集编辑界面的表达式中设置的单元格的个数必须与数据集中设置的数据集名称的个数一致。
5. 点击【确定】按钮,就完成了集算器类型的数据集的建立。
-
举例:通过result语句从集算器文件中取数的数据集
如果通过result语句从集算器文件中取数,集算器文件中必须含有result语句;
例一:
集算器文件中有一个result结果集,如下图:
1. 新建一集算器类型的数据集;
2. 设置集算器文件;
3.不勾选用【单元格返回值】,表示返回集算器文件中的所有result结果集,勾选则是通过指定单元格表达式返回结果集;
4. 点击【确定】按钮,生成数据集,如下图:
例二:
集算器文件的内容如下:
1. 新建一集算器类型的数据集;
2. 设置集算器文件;
3.不勾选【单元格返回值】复选框;
4. 点击【确定】按钮,生成数据集后,需手动设置两个名称,中间用英文逗号隔开,如下图所示:
根据集算器文件中result结果集个数可以在数据集中手动设置n个名称;当文件中有一个result结果集时,也可以写一个或多个名称,用逗号隔开,但返回结果为同一个数据集。
注意 使用result数据集时可以作为数据集类型被使用的集算器文件,首先必须通过connect()函数建立数据连接,再进行查询,最后通过close()函数关闭该连接,当通过表达式从集算器文件中取数时则可以不通过close()函数关闭连接。
其他的集算器文件虽然在集算器中也是可以进行数据查询,但是在报表中无法获取到数据连接,例如直接使用db.query()来进行查询的集算器文件:
上述集算器文件因为没有通过connect()和close()函数来连接/关闭数据源,从而无法作为数据集类型来使用。
-