iReport子报表SubReport.docx
《iReport子报表SubReport.docx》由会员分享,可在线阅读,更多相关《iReport子报表SubReport.docx(11页珍藏版)》请在冰豆网上搜索。
iReport子报表SubReport
iReport子报表(SubReport)
SubReport是ireport提供的高级功能,通过SubReport咱们能够创建复杂的报表。
通过SubReport咱们能够创建一个包括假设干个子报表的报表。
创建一个包括子报表的报表咱们需要三个对象:
一个jasper文件,一个包括参数map(固然能够为空)和一个DataSource(数据源,或是一个JDBC的Connection)。
在本章中咱们将说明如何通过这三个对象创建一个SubReport并实此刻子报表中数据过滤显示的目的。
创建一个子报表(createaSubReport)
一个SubReport是一个真正的包括它自己xml文件而且是一个已经编译好的jasper文件。
创建一个SubReport确实是创建一个一般的报表文件,创建进程中唯一需要注意的是设置SubReport的宽度、高度及一些不需要显示的band,一样情形下关于不显示的band咱们把它们的高度都设置为0。
在设置子报表的宽度时咱们应该考虑到它在父报表中显示时的成效,然后针对这一特性有针对性的去设置。
在父报表中咱们要添加一个子报表能够通过iReport中的SubReport工具
来实现。
子报表的形状和一个距形类似,咱们能够调整SubReport的尺寸和位置以操纵子报表的显示。
将一个子报表链接到父报表中需要做三件情形:
取得SubReport所对应的jasper报表对象、如何为它提供数据及如何为子报表的parameters设置具体的值。
所有这些信息的概念咱们能够通过SubReportproperties窗口来实现。
图
图
传递参数(Passageoftheparameters)
当咱们在应用程序里通过fillReport方式来生成一个报表的时候,咱们会提供一个包括参数值的Map一路传递到报表中,包括参数的Map对象是由报表引擎直接治理的。
在子报表属性窗口的里的“SubReport”标签里的“ParametersMapExpression”属性确实是提供给咱们的最简单的方式来为子报表设置parameters的值,它许诺咱们概念一个最终能够返回对象的表达式,利用这种方式咱们能够把从外部应用程序传到父报内外的parameter对象,固然那个parameter的实际值是一个对象传递给子报表利用(比如$P{TestMap}),那个地址咱们也能够利用内建的报表parameters:
$P{REPORT_PARAMETES_MAP}把子报表中的对象传递到父报表中供利用。
若是该属性咱们空着不填那么一个不包括任何值的空的将会被传到子报表中。
这种机制的局限性是parameters里所对应的值是死的、可不能变的。
为了克服这种局限性jasperreport许诺咱们概念parameter键值对的时候每一个对象的值通过一个表达式来创建,如在图中的“SubReportParameter”表中通过添加个参数来填充子报表。
图
deptId是子报表中一个parameter的名称,若是设置值时也要与子报表中deptId的数据类型维持一致。
指定数据源
为子报表指定数据源确实是告知jasperreport引擎如何获到数据来填充SubReport。
咱们能够指定两种类型的数据源:
JDBCConnection和DataSource。
利用JDBC来填充报表是很简单的,在ConnectionExpression里概念一个已经连接到数据库的对象。
要把一个已经处于打开状态下的连接传到SubReport中咱们只需利用一个预概念的包括一个基于从应用程序里挪用fillReport方式时的传入的连接REPORT_CONNECTION参数
若是利用一个DataSource就略微复杂一点,事实上它是一个简单的记录的集合,记录集合的概念和JDBCConnection不同,既然如此咱们能够通过一个parameter来传递一个DataSource来填充SubReport,现在采纳这种机制内建的parameterREPORT_CONNECTION就再也不起作用了。
一个DataSource是一个一般的“消费品”对象仅仅可用来填充一次报表。
因此一个作parameter传递的DataSource能够知足一个SubReport的需要。
因此parameter的方式不能知足当父报表的每一行记录都有一些子报表的数据与之对应(除非主报表中只有一条记录)。
当咱们说明DataSource时咱们能够看到那个问题能够通过自概念DataSource方式解决。
指定SubReport
创建一个SubReport咱们需要指定一个扩展名为.jasper文件,咱们需要在SubReport属性窗口中设置SubReportExpression属性。
表达式返回的类型必需与咱们在下拉框里选择的类似维持一致,类型列表如下:
类型名称
含义
在一个JasperReport对象里预加载一个jasper文件
一个jasper文件的流
一个用来定义jasper文件的URL
一个jasper文件的File对象
文件的文件名
若是表达式是一个String类型,那么引擎将通过JRLoad来加载指定位置的jasper文件。
子报表例如(SubReportsample)
在那个例子中咱们将采纳例如数据库来创建一个简单的包括子报表的报表。
咱们要从两张内外取数据:
dept(部门表)、employee(员工表),要达到的成效是依照部门表的部门ID掏出该部门下的所有员工。
类似的成效的报表咱们在groups一章中利用group也实现了一次,那个地址咱们将用SubReport来实现相同的成效。
新建一个空报表,新建一个名为deptId的parameter对象,如以下图:
图
在那个地址咱们在DefaultValueExpression里给予了一个空的字符串,什么缘故要如此做呢,因为接下来咱们要利用该parameter来作为SQL的查询条件的输入值,因此咱们要对那个参数给予一个初始化的值。
点击
打开SQL查询引擎窗口,输入下面的查询语句:
Select*fromemployeewheredept_id=$P{deptId}
在那个地址,咱们在查询员工信息的时候加了一个部门的条件,如以下图:
图
现在若是咱们把相关的field拖到detailband里,然后点击
咱们发觉没有任何记录,缘故是因为咱们并无为deptId赋值。
保留报表文件,咱们命名为,咱们把那个报表文件作为下面将要引用的子报表文件。
因为它将作为子报表被引用,因此咱们需要调整该报表的不用显示的band的高度及detailband的高度,如以下图:
图
在detailband里咱们放置了三个字段:
employee_name(员工姓名)、sex(性别)、birthday(诞生日期)。
接下来咱们需要成立一个父报表,关闭文件,新建一个空的报表文件,命名为。
点击主工具栏里
打开SQL查询窗口,输入下面的语句:
Select*fromdept
如以下图:
图
把dept_name那个field拖动到报表的detailband里,同时在detailband里添加一个了报表,在弹出的子报表向导中咱们选择“Cancel”按钮,那个地址咱们不采纳向导来创建SubReport。
如以下图
图
双击子报表图标打开子报表属性设置窗口,在弹出的窗口中咱们选择“SubReport”标签,在“Connection/DataSourceExpression”属性里咱们选择“UseConnectionExpression”而且指定内建的parameter:
REPORT_CONNECTION作为表达式用来存储JDBC连接,如以下图:
图
切换到“Subreport(other)”标签窗口,指定如何找到子报表文件“”和如何创建和修改在子报表与父报表之间的参数传递。
利用绝对途径在iReport里咱们不用去考虑子报表文件是不是能够被找到的问题,因为子报表寄存的目录已经被自动的加到iReport的classpath里了。
那个地址咱们指定的值是“$P{SUBREPORT_DIR}+""”
图
为了在子报内外能够显示员工的信息咱们需要为子报表的deptId那个parameter赋值,那个地址咱们通过父报表传过去,在“Subreportparameters”窗口中,咱们添加了一个用于为子报表的deptId赋值的parameter,该值到于父报表中的$F{DEPT_ID}那个field。
编译子报表和父报表。
点击主工具栏中的
按钮,查看生成的后父报表成效。
图
在那个地址咱们看到子报内外的有一些字段显示的有问题(如sex性别这块显示的是true和false,仍是日期不是咱们要的日期格式),需要咱们进一步对显示的字段信息进行格式化操作。
打开文件,选中detailband里的sexfield,右键选择properties,在弹出的窗口作如下修改:
图
在TextFieldExpression里咱们输入($F{SEX}.booleanValue()?
"男":
"女")的意思是把原先显示的true和false翻译成男和女。
那个地址$F{SEX}是类型,因此需要先把它转化成所对应的简单类型,然后若是值为true那么为男,不然为女。
关于birthday(诞生日期)咱们一样需要对其做格式化操作,如以下图:
图
关闭(关闭之前别忘记对其进行编译)。
打开父报表文件,编译查看报表成效:
图表
ReturnParameters
有时候咱们需要从子报内外返回一些值到子报里,比如子报里有多少条记录等。
提供的一个新的特性确实是许诺用户从子报表中返回值到父报表中,如以下图,在“Subreport(other)”标签下的“Subreportreturnvalues”标签里设置咱们需要在父报内外显示子报内外的参数值。
图
SubReportWizard
之前面的操作中咱们能够看出,当咱们插入一个SubReport时会自动弹出向导窗口,通过那个向导窗口咱们能够快速创建一个SubReport对象,创建进程超级简单,咱们那个地址就再也不介绍。