填报监听类中实现修改报表原纪录执行insert操作(一)
问题背景
客户希望用户在修改填报表中数据的时候,若修改的字段为对应数据表的主键,则报表提交时该记录执行insert操作;若修改的字段为非主键,则报表提交时执行update操作。
问题分析
当前润乾报表对于修改报表原有数据后进行填报,都执行update操作,无论修改的字段是主键还是非主键,要想实现上面问题背景中提到的需求,我们可以考虑不使用报表的更新属性设置,而是自己写sql进行数据库操作。
我们可以使用自定义更新类进行处理,而本例是在填报监听类中做的,好处是因为填报监听类中的beforeSave()和afterSave()方法处理问题的灵活性较强。接下来我们看一下具体实现。
实现步骤
1、 做报表
做一张简单的填报表,本例使用报表自带的demo数据源,报表制作时需注意,将报表属性中的【数据提交方案】修改为 全部单元格,不设置任何更新属性,如下图:
2、 写填报监听类:CustomInputListener.java
① 循环报表行列,判断主键是否被修改
② 将修改主键的行号放到ArrayList中,未修改主键的行号放到另外ArrayList中
③ 遍历两个ArrayList,对修改主键的行进行insert操作;未修改主键的行进行update操作。
(源码见附在本文最后)
3、写发布报表的jsp
在发布报表的标签中配置:inputListener=”runqian.CustomInputListener”
附:
填报监听类 CustomInputListener.java
package runqian;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.runqian.report4.usermodel.Context;
import com.runqian.report4.usermodel.INormalCell;
import com.runqian.report4.usermodel.input.AbstractInputListener;
public class CustomInputListener extends AbstractInputListener {
public void beforeSave() throws Exception {
//获取报表行列数
int row = report.getRowCount();
int col = report.getColCount();
INormalCell iCell;
Object oldObject;
Object inputObject;
String oldString;
String inputString;
List<Integer> listOldLine = new ArrayList<Integer>();// 存放主鍵未被修改行
List<Integer> listInputLine = new ArrayList<Integer>();// 存放主鍵被修改行
for (int i = 2; i <= row; i++) {// 从数据区开始
for (int j = 1; j <= 2; j++) {// j的最大值为主键个数,即第一列和第二列为主键
iCell = report.getCell(i, (short) j);
oldObject = iCell.getValue();
inputObject = iCell.getInputValue();
if (oldObject == null) {
oldString = “”;
} else {
oldString = oldObject.toString();
}
if (inputObject == null) {
inputString = “”;
} else {
inputString = inputObject.toString();
}
if (!oldString.equals(inputString)) {// 主键被修改
listInputLine.add(i);//若存在多个主键,则list中会有重复值,用的时候需去除重复
}
}
}
//将未改变主键值放入list,有重复值,使用时需去重
for (int i = 2; i <= row; i++) {
if (!listInputLine.contains(i)) {
listOldLine.add(i);
}
}
// 去除List中的重复数据
listOldLine = new NotRepeatedList<Integer>(listOldLine);
listInputLine = new NotRepeatedList<Integer>(listInputLine);
// 根据主键是否被修改,更新数据库
Context cxt = new Context();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//定义存储要更新的各字段值
String CUSTOMER_ID = “”;
String CUSTOMER_NAME = “”;
String CUSTOMERTYPE = “”;
String PROVINCE = “”;
String CITY = “”;
String TEL = “”;
String sql1 = “”;
String sql2 = “”;
int size = 0;
try {
conn = cxt.getConnectionFactory(“demo”).getConnection();
stmt = conn.createStatement();
//主键被修改的行,执行insert操作
for (int i = 0; i < listInputLine.size(); i++) {
size = listInputLine.get(i);
CUSTOMER_ID = (report.getCell(size, (short) 1).getInputValue()==null?”":report.getCell(size, (short) 1).getInputValue().toString());
CUSTOMER_NAME = (report.getCell(size, (short) 2).getInputValue()==null?”":report.getCell(size, (short) 2).getInputValue().toString());
CUSTOMERTYPE = (report.getCell(size, (short) 3).getInputValue()==null?”":report.getCell(size, (short) 3).getInputValue().toString());
PROVINCE = (report.getCell(size, (short) 4).getInputValue()==null?”":report.getCell(size, (short) 4).getInputValue().toString());
CITY = (report.getCell(size, (short) 5).getInputValue()==null?”":report.getCell(size, (short) 5).getInputValue().toString());
TEL = (report.getCell(size, (short) 6).getInputValue()==null?”":report.getCell(size, (short) 6).getInputValue().toString());
sql1 = “insert into CUSTOMER(CUSTOMER_ID,CUSTOMER_NAME,CUSTOMERTYPE,PROVINCE,CITY,TEL) values(” +
“‘” +CUSTOMER_ID+”‘,’”+CUSTOMER_NAME+”‘,’”+CUSTOMERTYPE+”‘,’”+PROVINCE+”‘,’”+CITY+”‘,’”+TEL+”‘”
+”)”;
System.out.println(“sql:”+sql1);
stmt.executeUpdate(sql1);
conn.commit();
}
//主键未修改行,执行update操作
for(int i=0;i<listOldLine.size();i++){
size = listOldLine.get(i);
CUSTOMER_ID = (report.getCell(size, (short) 1).getInputValue()==null?”":report.getCell(size, (short) 1).getInputValue().toString());
CUSTOMER_NAME = (report.getCell(size, (short) 2).getInputValue()==null?”":report.getCell(size, (short) 2).getInputValue().toString());
CUSTOMERTYPE = (report.getCell(size, (short) 3).getInputValue()==null?”":report.getCell(size, (short) 3).getInputValue().toString());
PROVINCE = (report.getCell(size, (short) 4).getInputValue()==null?”":report.getCell(size, (short) 4).getInputValue().toString());
CITY = (report.getCell(size, (short) 5).getInputValue()==null?”":report.getCell(size, (short) 5).getInputValue().toString());
TEL = (report.getCell(size, (short) 6).getInputValue()==null?”":report.getCell(size, (short) 6).getInputValue().toString());
sql2 = “update CUSTOMER set CUSTOMER_ID=’”+CUSTOMER_ID+”‘,CUSTOMER_NAME=’”+CUSTOMER_NAME+”‘,CUSTOMERTYPE=’”+CUSTOMERTYPE+
“‘,PROVINCE=’”+PROVINCE+”‘,CITY=’”+CITY+”‘,TEL=’”+TEL+”‘ where CUSTOMER_ID=’”+CUSTOMER_ID+”‘ and CUSTOMER_NAME=’”+CUSTOMER_NAME+”‘”;
System.out.println(“sq2:”+sql2);
stmt.executeUpdate(sql2);
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(conn!=null)
conn.close();
}
}
public void afterSave() throws Exception {
super.afterSave();
}
}
/**
* 去掉List中重复数据类
*/
class NotRepeatedList<E> extends ArrayList<E> {
private static final long serialVersionUID = 1269085290242775328L;
public NotRepeatedList() {
super();
}
public NotRepeatedList(Collection<? extends E> c) {
for (E e : c) {
add(e);
}
}
public NotRepeatedList(int initialCapacity) {
super(initialCapacity);
}
public boolean add(E o) {
if (!contains(o)) {
return super.add(o);
}
return false;
};
public void add(int index, E element) {
if (!contains(element)) {
super.add(index, element);
}
};
}
发布报表的jsp
<%@ page language=“java” contentType=“text/html; charset=GBK”
pageEncoding=“GBK”%>
<%@ taglib uri=“/WEB-INF/runqianReport4.tld” prefix=“report”%>
<html>
<head>
<title>customInput</title>
</head>
<body>
<div align=“center”>
<report:html name=“report1″
reportFileName=“custom.raq”
generateParamForm=“no”
inputListener=“runqian.CustomInputListener” />
</div>
</body>
</html>
相关推荐
用户在设计器中可以对报表填报的键盘快捷键进行个性化设置,以满足个人的操作习惯。通常,在模板设计器的报表填报属性中,找到填报快捷设置,点击切换图标即可进行设置,例如设定Enter键和Tab键的移动方向。 以上...
在本案例中,我们将学习如何使用帆软填报报表将数据从 Excel 导入到报表中。这个过程可以分为六个主要步骤:新建普通报表、添加字段名称、添加控件和设置竖向拓展、添加数据导入和提交按钮、设置其他的导入规则、...
1104基础报表填报说明1104基础报表填报说明1104基础报表填报说明1104基础报表填报说明1104基础报表填报说明
在IT领域,尤其是在BI(商业智能)和报表设计中,帆软报表是一款广泛使用的工具,它提供了丰富的控件和功能,使得用户能够便捷地创建、编辑和预览各种复杂的报表。"填报预览下的懒加载下拉树控件"是帆软报表中的一种...
在使用报表开发工具FineReport进行报表开发时,理解其内部执行过程对于优化报表性能、调试和监控报表生成至关重要。FineReport中的报表执行过程可以分为两个主要步骤,即报表计算和页面转换。 首先,报表计算过程...
如下图所示报表,科目名称栏目里面的数据不是从数据库中拖曳扩展得来的,而是直接在单元格中输入,需要将每个科目的期初余额和期末余额填报入库,数据库中有科目ID、会计科目、期初余额和期末余额几个字段,在填报时...
最新的1104报表填报详细说明,各个指标银监的具体含义,报表类型有G开头的、S开头的
亲测好用,挺不错的资源,大家快来下载吧!挺有用的!需要的话可以来下载哦!最新的1104报表填报详细说明,各个指标银监的具体含义,报表类型有G开头的、S开头的
久其报表操作流程V.pdf 本资源主要讲述了久其报表操作流程,旨在帮助用户快速掌握久其报表软件的使用方法和操作流程。通过本资源,用户可以了解久其报表的安装、注册、参数装入、数据录入、审核和传出等操作流程。 ...
保存设置后,点击“填报预览”,在A2单元格中输入数据,触发编辑结束事件,进而实现对C2单元格值的检查与置数操作。 通过以上步骤,我们可以实现在FineReport中页面居中的效果以及填报页面上的控件联动与置数设置...
《2018年工会决算报表》是工会组织对...通过以上详细解释,我们可以看出《2018年工会决算报表》的填报是一项严谨的工作,涉及到单位的身份识别、财务制度执行、预算管理等多个层面,旨在提供全面、准确的工会财务信息。
总之,"1104报表填报说明.doc"文档是填报这项重要报表的重要指南,它涵盖了报表结构、会计原则、填报技巧、审核流程等多个方面,对于理解和完成报表工作具有极高的参考价值。通过深入学习这份文档,我们可以更准确、...
对于移动端报表而言,查看报表经常会有以下问题:查看缓存数据相比于实时数据,减少了数据传输...最好的解决办法就是实现离线查看报表,根据我平时报表的开发经验,以具体给大家讲讲这个离线查看的功能可以如何实现。
在电子表格中进行贷款五级分类操作,可以更高效、准确地进行风险评估和报表填报。 本次培训主要针对安徽省农村信用社的信贷人员,旨在提升他们对贷款五级分类电子表格的操作技能。培训内容包括以下几个方面: 1. *...
在帆软报表的填报功能中,用户可以创建交互式的表单来收集和录入数据,这对于企业的日常运营和管理非常重要。然而,原始的填报控件可能相对简单,无法满足所有用户对于页面丰富度的需求。为了增强用户体验和提升报表...
通过这样的电子表格操作与报表填报培训,信贷人员可以更好地理解和执行贷款五级分类制度,提高风险识别能力,降低信贷风险,确保农村信用社的稳健运营。同时,这种标准化的管理方式也有利于监管机构对农村信用社的...
【银行的财务会计报表格式及填报说明】 财务会计报表是银行业务运营的重要组成部分,它反映了银行的财务状况、经营成果和现金流量等关键信息。银行的财务会计报表通常包括资产负债表、利润表、现金流量表以及股东...
,早在2003年11月,银监会就计划用三年左右的时间建立一个“统一规划、统一管理、统一标准、资源共享”的非现场检查信息技术平台。银监会称其为“1104工程”。...1104报表作为银保监会的非现场监管报表体系。
在这样的背景下,如何将FineReport这类专业的报表开发工具制作出的报表嵌入到Web页面中,成为了一个重要的技术需求。 #### 二、问题描述 在大多数现代Web应用中,报表通常需要与业务系统紧密集成,以便用户可以在...
【贷款五级分类】 ...综上所述,贷款五级分类电子表格是安徽省农村信用社联合社进行信贷风险管理的重要工具,通过系统的操作培训和报表填报,能够有效地识别和控制信贷风险,促进农村金融的稳健发展。