报表生成系统FineReport中如何将当前页数据入库

2025-12-02 07:09:36

1、模板多张页面,如一系列的帐簿的模板。每次只打印部分页面(可能是一张,可能是多张,不一定从第一页开始),每次打印后希望触发事件,在数据库中对应位置记录本页面对应的帐簿已经打印过了。每张页面在固定位置有本张帐簿的编号,对应到数据库中有一个记录是否已经打印的记录字段,如只打印第三页时,希望在数据库中编号3457的帐簿所对应的toprint字段值改为true。如下图效果:

报表生成系统FineReport中如何将当前页数据入库

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.jsp,首先获取编号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了。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢