• 银行存折套打续打功能 -- 报表如何记录上次打印的位置


    在实际项目中,经常会遇到打印的需求,而对于打印的特殊需求也越来越多,例如需要记录上次打印位置,当前打印时根据上次的打印位置继续打印的功能,像银行的存折的数据每次打印都不是用新的纸张,而是根据上次打印的位置继续打印。

    在润乾的打印功能中如何实现上述需求呢?

    大致思路:首先润乾提供了打印后调用的 js 函数 runqian_printOver(),打印结束后调用 runqian_printOver() 计算下这次打印的最后一页高度以及报表名称等相关参数统一插入到库里。再次访问时候,根据相关的字段取出相应的记录对当前 raq 插入空白一行并且设置行高存成新的 raq 文件,然后通过标签里面的 printedRaq 属性打印修改后的 raq。来实现记录打印的功能。

    首先随意准备一张可以展现多页数据的报表(增加了个参数模板,通过选择不同参数产生不同数据来模拟多次打印的功能)。

    因为要进行打印记录的相关数据插入到数据库,创建一张数据库表用来存放报表名称、最后一页的行高、参数、状态等信息(具体需要插入哪些参数根据具体需求决定,例子中只用报表名称作为标识进行查询),表结构如下。

    REPORTNAME          VARCHAR2(20)         Y

    ROWHEIGHT            NUMBER                   Y

    在展现报表前先要进行查询是否有打印记录,如果有的话读取行高数对当前报表进行插入一行并且设置行高再另存为一张新的 raq,然后通过标签中的 printedRaq 属性(打印的报表,此属性用于显示报表和打印报表不同)打印修改后的 raq。(由于此属性只能存放具体 raq,所以不能使用 reportdefine 的形式,需要将报表对象另存为成一个 raq 文件)。如果没有记录则正常流程。

    // 查询是否有过记录,如果有过记录取得最后一页行高插入到报表第一行,然后将新报表存放在标签里的 printedRaq 属性

               Connect connect = new Connect();

               ResultSet res = connect

                      .executeQuery(“select * from PRINTMEMORY t where t.reportname = ‘”

                             + report + “‘”);

               // 如果数据库中没有记录则代表第一次打印,如果有记录进行计算

               if (res.next()) {

                  // 读取历史打印位置(行高)插入到报表第一行

                  reportTemp = “temp” + report;

                  float rowHeight = res.getFloat(“ROWHEIGHT”);

                  System.out.println(“取历史打印位置:” + rowHeight);

                  ReportDefine rd = (ReportDefine) ReportUtils.read(application

                         .getRealPath(reportFileHome + File.separator + report));

                  rd.insertRow(1, 1);

                  rd.getRowCell(1).setRowHeight(rowHeight);

                  ReportUtils.write(application.getRealPath(reportFileHome

                         + File.separator + reportTemp), rd);

               } else {

                  System.out.println(“第一次打印”);

                  reportTemp = report;

               }

    在打印结束后会自动调用润乾内置函数 runqian_printOver(),重写 runqian_printOver() 函数内容,通过 ajax 或者直接嵌入 java 代码进行对数据库表插入或修改行高记录。

    在后台 servlet 中进行行高的计算以及数据的更改:

    传入参数为打印的报表(注意不是浏览的报表)即标签中 printedRaq 属性的报表名称,以及相关的参数。

    然后通过 pagebuilder 进行分页计算,取最后一页,逐行遍历获取累计行高数。

            float rowHeight = 0;

           for (int i = 1; i <= ireport.getRowCount(); i++) {

               rowHeight = rowHeight + ireport.getRowCell(i).getRowHeight();

           }

    最后根据报表名判断是否是第一次打印,分别对数据库数据进行 insert 和 update 操作。

    ResultSet res = connect

                  .executeQuery(“select * from PRINTMEMORY t where t.reportname = ‘”

                         + reportName + “‘”);

           // 有记录 update,无记录 insert

           if (res.next()) {

               connect.executeUpdate(“UPDATE printmemory SET rowheight = “

                      + rowHeight + ” WHERE reportname = ‘” + reportName + “‘ “);

           } else {

               connect.executeInsert(“INSERT INTO printmemory VALUES (‘”

                      + reportName + “‘, ”, ”, ” + rowHeight + “)”);

           }

  • 相关阅读:
    经典SQL语句大全
    C# 在子线程中创建不会阻塞执行窗体
    win7 C# winForm编程 savefiledialog 不能弹出保存窗体
    什么是AJAX技术及其常识
    C++安装失败解决办法
    java实现图像的直方图均衡以及灰度线性变化,灰度拉伸
    java关于邮件发送
    我都博客第一天
    开博随笔
    git使用
  • 原文地址:https://www.cnblogs.com/IBelieve002/p/10979275.html
Copyright © 2020-2023  润新知