填报监听类实现填报表单数据不提交入库但打印时录入数据可见
需求背景: 
利用填报表实现网页表单的填报,并可完成数据校验和自动计算。但是用户录入的数据不需要提交入库进行报存,仅需要临时查看和打印。 
比如某些表单提供了自动计算和校验功能,用户可以进行表单填报,根据录入数据,表单会校验数据正确性并完成自动计算,生成的单据不需要在数据库端进行保存,但是用户需要打印当前生成的页面。 
润乾的报表的打印功能是打印当前的报表展现结果页面,对于没有提交入库的录入数据及自动计算的结果,打印页面中是没有的。那上面提到的需求如何实现? 本文将介绍如何用填报监听类实现填报表单数据不提交入库但打印时录入数据可见。
实现思路: 
填报监听类主要用于系统执行填报数据提交之前和提交之后进行业务处理的类,用户可以自行实现填报监听类,从而在数据提交前和提交后实现自己的业务处理。填报监听类可以在报表提交时不进行数据的提交入库操作,而是得到填报数据,将其转存在另一个报表结果中进行打印。 
1. 设计填报表orginal.raq,并用jsp页面展现报表,用tag标签的inputListener设置该报表的填报监听类。 
2. 设计临时报表模板tempresult.raq,该报表模板和填报表样式一样,但不需要配置数据集。 
3. 编写java类(InputProcessor)实现填报时的处理: 
3.1 取填报表对象,获得填报表数据,并根据填报表数据生成动态的数据集。 
3.2 取临时填报模板,为其加载生成的动态数据集。 
3.3 计算临时报表,将结果保存为rat文件。 
3.4 通过另一个jsp页面展现保存好rat结果,进行打印。
具体实现: 
1.填报表及参数表单: 
 
报表设计过程(略),详见附件。可实现输入参数进行数据过滤,填报数据完成自动计算功能(填入数量,自动计算金额和总计结果)。效果如下: 
 
2.临时报表tempresult.raq 
 
报表设计过程(略),详见附件。注意该报表未配置数据集,报表数据集会在填报监听类中动态加载。 
3. 填报表展现页面input.jsp: 
设置了saveDataByListener=”yes”和 inputListener=”one.InputProcessor” 指定填报监听类。 
部分代码: 
…… 
<report:param name=”form1″ paramFileName=”<%=paramFile%>” 
needSubmit=”yes” 
/> 
<report:html 
name=”report1″ 
reportFileName=”<%=report%>” 
inputListener=”one.InputProcessor” 
saveDataByListener=”yes” 
submit=”打印表单” 
/> 
4. 填报结果展现及打印页面printresult.jsp 
调用内置的报表打印javascript函数打印结果。 
部分代码: 
…… 
<body onload=”javascript:report1_print();”> 
<report:html 
name=”report1″ 
reportFileName=”<%=report%>” 
needPrint=”yes” /> 
5. 填报监听类InputProcessor.java: 
部分代码: 
public void beforeSave() throws Exception { 
System.out.println(“进入预处理”); 
//取得临时报表tempresult 
InputStream fis=request.getSession().getServletContext().getResourceAsStream(“/reportFiles/tempresult.raq”); 
ReportDefine rd = (ReportDefine)ReportUtils.read( fis ); 
//构建数据集,并根据填报录入数据生成动态数据集 
DataSet ds=new DataSet(“ds1″); 
ds.addCol(“produectid”); 
ds.addCol(“productname”); 
ds.addCol(“price”); 
ds.addCol(“amount”); 
ds.addCol(“sumresult”); 
for(int i=1;i<=report.getRowCount();i++){ 
INormalCell inc1=report.getCell(i, (short)1); 
if(inc1.getInputProperty()!=null && inc1.getInputProperty().getInputValue()!=null){ 
Row r=ds.addRow(); 
r.setData(1, inc1.getInputProperty().getInputValue()); 
System.out.print(inc1.getInputProperty().getInputValue()); 
INormalCell inc2=report.getCell(i, (short)2); 
if(inc2.getInputProperty()!=null && inc2.getInputProperty().getInputValue()!=null){ 
r.setData(2, inc2.getInputProperty().getInputValue()); 
System.out.print(” “+inc2.getInputProperty().getInputValue()); 
…… 
}
//为临时报表对象,加载生成的动态数据集计算报表并将结果保存为rat 
context.setDataSet(“ds1″, ds); 
Engine engine = new Engine(rd,context); 
IReport iReport = engine.calc(); 
Date date=new Date(); 
SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd”); 
String preFileName=sdf.format(date); 
String saveFile=request.getRealPath(“/reportFiles/”)+”/”+preFileName+”.rat”; 
FileOutputStream fos = new FileOutputStream(saveFile); 
ReportUtils.write(fos, iReport); 
fos.close(); 
System.out.println(“保存为”+saveFile); 
//进行填报结果的展现和打印 
response.sendRedirect(“jsp/resultprint.jsp?report=”+preFileName); 
实现效果: