6.6 数据项上的鼠标事件
在大纲视图下,选中数据源,数据集,主体中的网格,行,单元格,表,表的行,单元格,以及参数等中的任何一个,都能在报表编辑器的脚本选项卡下面看到可以编写脚本的输入区,这是BIRT提供给设计者一个非常强大的接口,可以添加很多的事件。
具体能分为两个阶段:
报表生成阶段的事件:
1、 报表级事件:
initialize 在报表开始执行生成阶段前执行。包含定义全局变量、函数、和对象。
beforeFactory :在开始生成阶段之前执行。可以访问报表中的元素。如数据集、标签等等。
afterFactory:在开始生成阶段阶段之前执行
2、 数据源事件:
beforeOpen:在BIRT打开数据源连接之前执行,一般进行连接数据源的配置信息的编写,包括:驱动、数据库的URL、用户名、密码等等。
AfterOpen :在BIRT打开数据源连接之后执行
BeforeCLose::在BIRT关闭数据源连接之前执行
afierClose: 在BIRT关闭数据源连接之后执行
3、 数据集事件:
beforeOpen:在BIRT打开数据集之前执行,一般编写要执行的SQL语句。
AfterOpen :在BIRT打开数据集之后执行
Onfetch:获取每一行的数据以后,并应用过滤器计算列之前执行onFetch事件处理程序。
BeforeCLose::在BIRT关闭数据源连接之前执行
afierClose: 在BIRT关闭数据源连接之后执行
4、报表元素事件:
onPrepare:在报表生成阶段调用,并且针对报表设计中的每一个元素,在此事件中就可以修改元素的设计。
onCreate:在此事件中可以修改和访问元素的实例。
报表显示阶段事件:
1、报表级事件:
initialize : 在报表开始执行显示阶段前执行。在初始化事件中可以定义全局变量、函数、和对象。
beforeRender:在开始显示阶段前执行。
afterRender:在开始显示阶段后执行。
2、报表元素事件:
onRender:可以改变元素实例。
在下拉框为以上函数的输入区内,我们都可以编写javascript脚本,用来改变报表的显示。
具体的机制和用法我们在后面的章节再详细说明,在这儿我们仅仅利用动态文本的onRender函数,来给报表添加鼠标事件。
我们新建一个报表overall2.rptdesign,采用示例数据库,空白模板,sql选择查询数据源,数据集
select CLASSICMODELS.PRODUCTS.PRODUCTNAME,
sum(CLASSICMODELS.ORDERDETAILS.PRICEEACH * CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED) as "sales"
from CLASSICMODELS.ORDERS, CLASSICMODELS.ORDERDETAILS, CLASSICMODELS.PRODUCTS
where (CLASSICMODELS.ORDERS.ORDERNUMBER = CLASSICMODELS.ORDERDETAILS.ORDERNUMBER)
and (CLASSICMODELS.ORDERDETAILS.PRODUCTCODE = CLASSICMODELS.PRODUCTS.PRODUCTCODE)
and (CLASSICMODELS.PRODUCTS.PRODUCTLINE = 'Classic Cars')
group by CLASSICMODELS.PRODUCTS.PRODUCTNAME
插入一个1行1列的网格,在网格中插入1行2列的表,在报表编辑器中布局如下:
![](https://img-my.csdn.net/uploads/201301/08/1357632914_5592.png)
第二个单元格拖入dataSetRow["sales"]
我们选中动态文本,在脚本选项卡下,选择onRender方法,输入以下内容:
- var value1=row["PRODUCTNAME"];
- var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer2'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer2'].location = origUrl.substr(0, pos) + '&__overwrite=true&productname='+paravalue ;} else {parent.frames['birtViewer2'].location = origUrl+ '&__overwrite=true&productname='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value1 + "</b></u></i></a>";
- this.text = str;
var value1=row["PRODUCTNAME"];
var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer2'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer2'].location = origUrl.substr(0, pos) + '&__overwrite=true&productname='+paravalue ;} else {parent.frames['birtViewer2'].location = origUrl+ '&__overwrite=true&productname='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value1 + "</b></u></i></a>";
this.text = str;
![](https://img-my.csdn.net/uploads/201301/08/1357632990_9076.png)
说明:该脚本的含义是插入了一个超链接,单击触发事件,javascript脚本的含义是修改id为birtViewers2的报表地址,拼接上参数productname为当前报表行row["PRODUCTNAME"],这样就实现了动态刷新嵌入有product.rptdesign的frame,让报表只显示单击后的产品名称的产品销售明细。
我们新建一个报表product.rptdesign,DBC报表类型,SQL查询类型的空白模板
数据源MyDataSource,采用BIRT设计器自带的例子数据库:
驱动程序类:org.eclipse.birt.report.data.oda.sampledb.Driver (Classic Models Inc. SampleDB Driver)
Database URL:jdbc:classicmodels:sampled
用户名:ClassicModels
数据集TrendDataSet,查询SQL如下:
select CLASSICMODELS.PRODUCTS.PRODUCTNAME,
(CLASSICMODELS.ORDERDETAILS.PRICEEACH * CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED) as sales,
CLASSICMODELS.ORDERS.ORDERDATE
from CLASSICMODELS.ORDERS,
CLASSICMODELS.ORDERDETAILS,
CLASSICMODELS.PRODUCTS
where (CLASSICMODELS.PRODUCTS.PRODUCTCODE = CLASSICMODELS.ORDERDETAILS.PRODUCTCODE)
and (CLASSICMODELS.ORDERS.ORDERNUMBER = CLASSICMODELS.ORDERDETAILS.ORDERNUMBER)
and (CLASSICMODELS.PRODUCTS.PRODUCTNAME = ?)
报表参数productname,字符串静态文本框,默认值为:1992 Ferrari 360 Spider red,如图:
绑定数据集TrendDataSet占位符和报表参数productname,如图
新建一行一列网格,在网格框内插入图表,选择图表类型为折线图,如图,
![](https://img-my.csdn.net/uploads/201301/08/1357633104_1055.png)
选择数据,使用以下来源的数据-TrendDataSet,类别(X)系列选择可用列绑定-图表- row["ORDERDATE"],值(Y)系列选择可用列绑定-图表- row["SALES"],如图。
![](https://img-my.csdn.net/uploads/201301/08/1357633134_2465.png)
在图表格式中定制X轴,把标签顺时针旋转45度,如图,
![](https://img-my.csdn.net/uploads/201301/08/1357633162_6777.png)
<page-footer>
<text id="3">
<property name="contentType">html</property>
<text-property name="content"><![CDATA[<value-of>new Date()</value-of>]]></text-property>
</text>
</page-footer>
关于图表的设计,后文还会详细描述。
我们新建一个jsp,包含两个frame,然后用前frame中表中数据项的鼠标事件来刷新第二个frame中的内容:
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="ISO-8859-1"%>
- <%@ taglib uri="/birt.tld" prefix="birt" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta http-equiv="Content-Language" content="en-us">
- <title>BIRT JSP Tag Lib Mashup</title>
- <style>
- .pageHeader {
- position: absolute;
- width: 1020px;
- text-align: center;
- color: #224499;
- font-size: xx-large;
- font-weight: bold;
- }
- .mashupContainer {
- position: absolute;
- font-family: Verdana, Tahoma, Arial;
- font-size: 11px;
- border: 1px solid #87AFDA;
- margin: 3px;
- }
- .mashupTitle {
- position: absolute;
- background: #D4E6FC;
- font-size: 14px;
- font-weight: bold;
- color: #224499;
- padding: 3px;
- border-bottom: 1px solid #87AFDA;
- }
- .mashupContent {
- position: absolute;
- padding: 3px;
- }
- </style>
- </head>
- <body>
- <div class="mashupContainer" id="salesChartContainer" style="top: 50px; left: 20px; width: 655px; height: 400px;">
- <div class="mashupTitle" style="width: 99.1%; height: 20px;">overall Chart</div>
- <div class="mashupContent" id="overallDiv" style="top: 24px; left: 0px; width: 99%; height: 380px;">
- <birt:viewer id="birtViewer"
- reportDesign="overall2.rptdesign"
- baseURL="<%= request.getContextPath( )%>"
- pattern="run"
- height="367"
- width="645"
- format="html"
- frameborder="false"
- isHostPage="false"
- isReportlet="true"
- showParameterPage="false"
- >
- </birt:viewer>
- </div>
- </div>
- <div class="mashupContainer" id="salesChartContainer" style="top: 50px; left: 700px; width: 655px; height: 400px;">
- <div class="mashupTitle" style="width: 99.1%; height: 20px;">trend Chart</div>
- <div class="mashupContent" id="trendDiv" style="top: 24px; left: 0px; width: 99%; height: 380px;">
- <birt:viewer id="birtViewer2"
- reportDesign="product.rptdesign"
- baseURL="<%= request.getContextPath( )%>"
- pattern="run"
- height="367"
- width="645"
- format="html"
- frameborder="false"
- isHostPage="false"
- isReportlet="true"
- showParameterPage="false"
- >
- </birt:viewer>
- </div>
- </div>
- </body>
- </html>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/birt.tld" prefix="birt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-us">
<title>BIRT JSP Tag Lib Mashup</title>
<style>
.pageHeader {
position: absolute;
width: 1020px;
text-align: center;
color: #224499;
font-size: xx-large;
font-weight: bold;
}
.mashupContainer {
position: absolute;
font-family: Verdana, Tahoma, Arial;
font-size: 11px;
border: 1px solid #87AFDA;
margin: 3px;
}
.mashupTitle {
position: absolute;
background: #D4E6FC;
font-size: 14px;
font-weight: bold;
color: #224499;
padding: 3px;
border-bottom: 1px solid #87AFDA;
}
.mashupContent {
position: absolute;
padding: 3px;
}
</style>
</head>
<body>
<div class="mashupContainer" id="salesChartContainer" style="top: 50px; left: 20px; width: 655px; height: 400px;">
<div class="mashupTitle" style="width: 99.1%; height: 20px;">overall Chart</div>
<div class="mashupContent" id="overallDiv" style="top: 24px; left: 0px; width: 99%; height: 380px;">
<birt:viewer id="birtViewer"
reportDesign="overall2.rptdesign"
baseURL="<%= request.getContextPath( )%>"
pattern="run"
height="367"
width="645"
format="html"
frameborder="false"
isHostPage="false"
isReportlet="true"
showParameterPage="false"
>
</birt:viewer>
</div>
</div>
<div class="mashupContainer" id="salesChartContainer" style="top: 50px; left: 700px; width: 655px; height: 400px;">
<div class="mashupTitle" style="width: 99.1%; height: 20px;">trend Chart</div>
<div class="mashupContent" id="trendDiv" style="top: 24px; left: 0px; width: 99%; height: 380px;">
<birt:viewer id="birtViewer2"
reportDesign="product.rptdesign"
baseURL="<%= request.getContextPath( )%>"
pattern="run"
height="367"
width="645"
format="html"
frameborder="false"
isHostPage="false"
isReportlet="true"
showParameterPage="false"
>
</birt:viewer>
</div>
</div>
</body>
</html>
我们把这三个文件部署到服务器上,就可以看到效果如下:
![](https://img-my.csdn.net/uploads/201301/08/1357633235_2118.png)
单击左边的商品名称,会看到右边的趋势图随之发生变化。
利用这种特性,我们可以进行动态的排序
例如我们新建报表,customer.rptdesign,自带数据库,空白模板,sql选择查询数据集:
select *
from customers
新建参数srt
![](https://img-my.csdn.net/uploads/201301/08/1357633277_5126.png)
我们在报表编辑器中插入一个10行1列的表,把数据集中的数据列拖入表中:
![](https://img-my.csdn.net/uploads/201301/08/1357633307_1412.png)
分别修改customernumber,customername,contactlastname的页眉,删除数据,插入动态文本,
其中customernumber页眉的动态文本使用可用列绑定row["CUSTOMERNUMBER"],在脚本的onRender中输入:
- var value1= "firstcol";
- var value2= "CUSTOMERNUMBER";
- var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer1'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer1'].location = origUrl.substr(0, pos) + '&__overwrite=true&srt='+paravalue ;} else {parent.frames['birtViewer1'].location = origUrl+ '&__overwrite=true&srt='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value2 + "</b></u></i></a>";
- this.text = str;
var value1= "firstcol";
var value2= "CUSTOMERNUMBER";
var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer1'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer1'].location = origUrl.substr(0, pos) + '&__overwrite=true&srt='+paravalue ;} else {parent.frames['birtViewer1'].location = origUrl+ '&__overwrite=true&srt='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value2 + "</b></u></i></a>";
this.text = str;
其中customername页眉的动态文本使用可用列绑定row["CUSTOMERNAME"],在脚本的onRender中输入:
- var value1= "secondcol";
- var value2= "CUSTOMERNAME";
- var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer1'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer1'].location = origUrl.substr(0, pos) + '&__overwrite=true&srt='+paravalue ;} else {parent.frames['birtViewer1'].location = origUrl+ '&__overwrite=true&srt='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value2 + "</b></u></i></a>";
- this.text = str;
var value1= "secondcol";
var value2= "CUSTOMERNAME";
var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer1'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer1'].location = origUrl.substr(0, pos) + '&__overwrite=true&srt='+paravalue ;} else {parent.frames['birtViewer1'].location = origUrl+ '&__overwrite=true&srt='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value2 + "</b></u></i></a>";
this.text = str;
其中contactlastname页眉的动态文本使用可用列绑定row["CUSTOMERNAME"],在脚本的onRender中输入:
- var value1= "secondcol";
- var value2="CONTACTLASTNAME";
- var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer1'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer1'].location = origUrl.substr(0, pos) + '&__overwrite=true&srt='+paravalue ;} else {parent.frames['birtViewer1'].location = origUrl+ '&__overwrite=true&srt='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value2 + "</b></u></i></a>";
- this.text = str;
var value1= "secondcol";
var value2="CONTACTLASTNAME";
var str="<script language='JavaScript' type='text/JavaScript'>function refreshTag(paravalue){var origUrl = parent.frames['birtViewer1'].location.toString();var pos = origUrl.indexOf('&__overwrite=true');if (pos > 0) { parent.frames['birtViewer1'].location = origUrl.substr(0, pos) + '&__overwrite=true&srt='+paravalue ;} else {parent.frames['birtViewer1'].location = origUrl+ '&__overwrite=true&srt='+ paravalue;} }</script><a href='' οnclick='refreshTag(\""+value1+"\")'><i><u><b>" + value2 + "</b></u></i></a>";
this.text = str;
编写jsp,测试这个脚本
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="ISO-8859-1"%>
- <%@ taglib uri="/birt.tld" prefix="birt" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <meta http-equiv="Content-Language" content="en-us">
- <title>BIRT JSP Tag Lib Mashup</title>
- <style>
- .pageHeader {
- position: absolute;
- width: 1020px;
- text-align: center;
- color: #224499;
- font-size: xx-large;
- font-weight: bold;
- }
- .mashupContainer {
- position: absolute;
- font-family: Verdana, Tahoma, Arial;
- font-size: 11px;
- border: 1px solid #87AFDA;
- margin: 3px;
- }
- .mashupTitle {
- position: absolute;
- background: #D4E6FC;
- font-size: 14px;
- font-weight: bold;
- color: #224499;
- padding: 3px;
- border-bottom: 1px solid #87AFDA;
- }
- .mashupContent {
- position: absolute;
- padding: 3px;
- }
- </style>
- </head>
- <body>
- <div class="mashupContainer" id="salesChartContainer" style="top: 50px; left: 20px; width: 1200px; height: 400px;">
- <div class="mashupTitle" style="width: 99.1%; height: 20px;">customer</div>
- <div class="mashupContent" id="customer" style="top: 24px; left: 0px; width: 99%; height: 380px;">
- <birt:viewer id="birtViewer1"
- reportDesign="SortTable.rptdesign"
- baseURL="<%= request.getContextPath( )%>"
- pattern="run"
- height="367"
- width="1150"
- format="html"
- frameborder="false"
- isHostPage="false"
- isReportlet="true"
- showParameterPage="false"
- >
- </birt:viewer>
- </div>
- </div>
- </body>
- </html>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/birt.tld" prefix="birt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-us">
<title>BIRT JSP Tag Lib Mashup</title>
<style>
.pageHeader {
position: absolute;
width: 1020px;
text-align: center;
color: #224499;
font-size: xx-large;
font-weight: bold;
}
.mashupContainer {
position: absolute;
font-family: Verdana, Tahoma, Arial;
font-size: 11px;
border: 1px solid #87AFDA;
margin: 3px;
}
.mashupTitle {
position: absolute;
background: #D4E6FC;
font-size: 14px;
font-weight: bold;
color: #224499;
padding: 3px;
border-bottom: 1px solid #87AFDA;
}
.mashupContent {
position: absolute;
padding: 3px;
}
</style>
</head>
<body>
<div class="mashupContainer" id="salesChartContainer" style="top: 50px; left: 20px; width: 1200px; height: 400px;">
<div class="mashupTitle" style="width: 99.1%; height: 20px;">customer</div>
<div class="mashupContent" id="customer" style="top: 24px; left: 0px; width: 99%; height: 380px;">
<birt:viewer id="birtViewer1"
reportDesign="SortTable.rptdesign"
baseURL="<%= request.getContextPath( )%>"
pattern="run"
height="367"
width="1150"
format="html"
frameborder="false"
isHostPage="false"
isReportlet="true"
showParameterPage="false"
>
</birt:viewer>
</div>
</div>
</body>
</html>
修改布局,适当美化:
![](https://img-my.csdn.net/uploads/201301/08/1357633437_8130.png)
部署到服务器上,预览效果如下:
![](https://img-my.csdn.net/uploads/201301/08/1357633465_2131.png)
单击customername,排序后显示如下:
![](https://img-my.csdn.net/uploads/201301/08/1357633744_1551.png)
当然还可以按照contactlastname排序。
利用这种方式,我们可以添加数据项上的鼠标帮助,鼠标单击响应,还可以添加超链接转跳。
var str=row.__rownum+":"+row["CUST_ID"]+":"+row["CUST_NAME"]+":"+row["SUPPERID"]+":"+row["UPNAME"];
添加鼠标帮助和单击事件如下:
this.text="<a href='' alt='' title='"+str+"' onClick='alert(\""+str+"\")'><i><u><b>查看行参数</b></u></i></a>";
添加转跳如下
this.text="<a href='../frameset?__report=overall.rptdesign' alt='单击会显示另外一张报表' title='单击会显示另外一张报表' >查看</a>";
需要说明的是:前面javascript脚本用parent.frames['birtViewer1']是因为在runtime环境下,报表本身是放在一个frame中的,需要指定父frame再寻找改变地址。
而此处的a href='../frameset?__report=overall.rptdesign的意思是要返回到父目录上再去调用url链接。
6.7 外部脚本的使用,样式,模板,库,与资源
我们编写一个脚本combine.js:
function combine(num1, num2) {
var str = num1 + '_' + num2;
return str;
}
把文件复制到报表共享资源中,用报表的属性的标签资源导入:
![](https://img-my.csdn.net/uploads/201301/08/1357633799_9481.png)
反映到xml中,则是添加了如下几行:
<list-property name="includeScripts">
<property>combine.js</property>
</list-property>
以后在任何需要的表达式生成器中都可以使用
![](https://img-my.csdn.net/uploads/201301/08/1357633830_5178.png)
同理我们可以导入properties,jar文件,然后在javascript脚本事件处理或者脚本生成器中使用。如果发布到环境中,则需要配置资源的路径,默认路径为应用根目录下。配置如下为web.xml下的context-param:
<context-param>
<param-name>BIRT_VIEWER_SCRIPTLIB_DIR</param-name>
<param-value></param-value>
</context-param>
我们可以新建,编辑,删除,应用样式:
![](https://img-my.csdn.net/uploads/201301/08/1357633876_8228.png)
实际上熟悉css的可以直接导入样式。
然后我们在需要使用的地方右击,应用样式即可。需要注意的是,样式最好要匹配,即页面,网格,表,页眉,页脚,行,列,单元格,分组等等元素的样式最好用不同的名称区分开来,使用也是区分使用。
库是一个工程下所有报表都可以调用的资源。
新建库很简单,只需要在资源管理器的共享资源目录上右击选择新建库即可,或者在菜单中的文件菜单下新建:
![](https://img-my.csdn.net/uploads/201301/08/1357633940_6949.png)
添加库元素的方法是,在大纲视图下右击需要添加的库元素,选择导出到库即可:
![](https://img-my.csdn.net/uploads/201301/08/1357633976_2154.png)
报表本身,数据源,数据集,样式,表,网格,参数,脚本都可以导出到库。
使用方法则是,在资源管理器的共享资源目录下的库元素上右击,选择添加到报表即可。
![](https://img-my.csdn.net/uploads/201301/08/1357634011_8822.png)
发布的时候,需要把库和报表一起发布,并处在同一个路径下。
使用了库的报表,会增加一个锁链标志,
xml中会出现类似如下的语句:
- <list-property name="libraries">
- <structure>
- <property name="fileName">common.rptlibrary</property>
- <property name="namespace">common</property>
- </structure>
- </list-property>
<list-property name="libraries">
<structure>
<property name="fileName">common.rptlibrary</property>
<property name="namespace">common</property>
</structure>
</list-property>
库的使用也要遵循一一匹配的同类原则,不要把脚本数据源添加到另一个不需要脚本数据源的交叉报表中。
模板和报表很像,或者你直接把报表改后缀名new_template.rpttemplate为new_template.rptdesign即可运行。建立模板的方式和建立报表的方式一样。不过如果想要在新建报表中使用模板,需要先注册:
![](https://img-my.csdn.net/uploads/201301/08/1357634114_4750.png)