1、模板多张页面,如一系列的帐簿的模板。每次只打印部分页面(可能是一张,可能是多张,不一定从第一页开始),每次打印后希望触筛觐子裆发事件,在数据库中对应位置记录本页面对应的帐簿已经打印过了。每张页面在固定位置有本张帐簿的编号,对应到数据库中有一个记录是否已经打印的记录字段,如只打印第三页时,希望在数据库中编号3457的帐簿所对应的toprint字段值改为true。如下图效果:
2、实现思路FineReport6.5中,可通过报表>报表Web属性>分页预览设置>添加打印后事件,使用JavaScript调用一个jsp的执行事件。若点击打印,就会将当前页的编号获取到,进而通过update语句修改toprint字段的值。
3、示例以已部署过FineReport的WebReport工程到tomcat服务器为例,其详细过程如下:
4、对模板添加打印后事件打开设计器,打开其tomcat报表工作目录,在菜单中点击报表>报表Web属性>分页预览设置,在右边栏中,如点击添加Flash打印后事件。在其JavaScript中,输入js代码,目的是调用其WebReport工程下写的一个jsp的执行入库操作。
5、获取所在页单元格的值如编号ID在J3单元格,即第鹩梏钔喔三行、第十列,则js方法如下:var a = $("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;注释:$("#r-2-0","div.reportPane") 这个是获取模板当前页第三行,第一行为:"#r-0-0",行号从0开始;注释:eq(9)[0] 是获取第9列,第一列为eq(0)[0],列号从0开始。注:如果是扩展单元格,则要根据扩展以后所在的行与列来获取。
6、通过Ajax把值传到jsp页面完整代码如下:var a = $("#r-2-0","div.reportPane").children().eq(9)[0].innerHTML;$.ajax({url : 'http://localhost:8080/WebReport/print1.jsp?ID='+a})
7、定义jsp获取编号修改数据库表定义页面print1.j衡痕贤伎sp,首先获取编号ID的值,连接数据库通过update语句把表中toprint字段愉桴狁焕进行修改,代码如下:package com.fr.io;import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import com.fr.base.FRContext; import com.fr.base.dav.Env; public class SaveReportToDatabase { public static void main(String[] args) { SaveReport(); } private static void SaveReport() { try { // 连接数据库 String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:oracle:thin:@192.168.100.169:1521:orcl10g"; String user = "temp"; String pass = "temp123"; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, pass); PreparedStatement presmt = conn .prepareStatement("insert into report values(?,?)"); // 读进需要保存入库的模板文件 Env oldEnv = FRContext.getCurrentEnv(); String envPath = oldEnv.getPath(); File cptfile = new File(envPath + "\\reportlets\\gettingstarted.cpt"); int lens = (int) cptfile.length(); InputStream ins = new FileInputStream(cptfile); // 将模板保存入库 presmt.setString(1, "gettingstarted.cpt"); // 第一个字段存放模板相对路径 presmt.setBinaryStream(2, ins, lens); // 第二个字段存放模板文件的二进制流 presmt.execute(); conn.commit(); presmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }将其print1.jsp文件放到tomcat服务器的WebReport工程下。
8、效果预览启动Web服务器,预览报表,点击Flash打印,打印完之后查看数据库的记录信息表print1,可看到当前页的编号对应的toprint字段值变成true了。