历史版本9 :动态修改数据 返回文档
编辑时间:
内容长度:图片数:目录数:
修改原因:
1. 描述编辑
相同表结构,不同数据库,希望通过网络报表连接不同数据库的时候,在同一个网络报表里面可以显示结果,这样要怎样实现呢?
2. 原理编辑
通过使用程序网络报表所在类需要继承com.fr.web.reportlet这个抽象类,并且需要实现createReport(ReportletRequest arg0)这个方法,并返回报表对象。对返回的报表对象设置新的数据集,通过putTableData(DSName,tableData)方法,将定义的数据集添加到报表中,从而改变模板数据。DSName是定义的数据集名例如ds1,tableData是调用连接数据集。
3. 实现步骤编辑
3.1 定义程序数据集
程序数据集可以获取到不同数据库里面的值,或者通过java内部查询的结果放到程序数据集里面,再显示到报表上,具体程序数据集的使用,可参考程序数据源文档
3.2 新建将要获取的模板
新建模板1.cpt,新建数据集ds2,将ds2中的字段拖拽到报表中,模板保存到根目录下,如果不存在下图样式的表可以新建一个,具体设置如下图:获取的模板1.cpt,使用的数据集ds2,里面连接的数据库表的格式必须要跟我们定义的程序数据集里面的列的名字是匹配的例如Name,Score这样赋值新的数据集,才可以显示结果。
3.3 定义程序网络报表
具体代码如下:
//动态修改数据
package com.fr.demo;
import com.fr.data.ArrayTableDataDemo;
import com.fr.general.ModuleContext;
import com.fr.io.TemplateWorkBookIO;
import com.fr.main.TemplateWorkBook;
import com.fr.report.module.EngineModule;
import com.fr.web.core.Reportlet;
import com.fr.web.request.ReportletRequest;
import java.util.Map;
public class NewDateDemo extends Reportlet {
public TemplateWorkBook createReport(ReportletRequest reportletrequest) {
TemplateWorkBook workbook = null;
ModuleContext.startModule(EngineModule.class.getName());
try {
//创建workbook对象,将模板保存为workbook对象并返回
workbook = TemplateWorkBookIO.readTemplateWorkBook("1.cpt");
ArrayTableDataDemo a = new ArrayTableDataDemo(); //调用定义的程序数据集连接
workbook.putTableData("ds2", a); //给模板赋新的数据集
} catch (Exception e) {
e.getStackTrace();
}
return workbook;
}
@Override
public void setParameterMap(Map arg0) {
// TODO Auto-generated method stub
}
@Override
public void setTplPath(String arg0) {
// TODO Auto-generated method stub
}
}
这里要调用%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\data中的ArrayTableDataDemo类。
3.3 编译生成类文件
在java开发平台中会自动编译,在此不再详述。
3.4 发布并Web预览
将编译后的NewDateDemo.class放到网络报表根目录下,由于该类在包com.fr.demo中,因此存放在%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\demo下,保存后启动服务器,如内置服务器,在浏览器中输入下地址:http://localhost:8075/webroot/decision/view/report?viewlet=com.fr.demo.NewDateDemo,便可以看到效果。