填报监听类中实现修改报表原纪录执行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基础报表填报说明
在使用报表开发工具FineReport进行报表开发时,理解其内部执行过程对于优化报表性能、调试和监控报表生成至关重要。FineReport中的报表执行过程可以分为两个主要步骤,即报表计算和页面转换。 首先,报表计算过程...
在IT领域,尤其是在BI(商业智能)和报表设计中,帆软报表是一款广泛使用的工具,它提供了丰富的控件和功能,使得用户能够便捷地创建、编辑和预览各种复杂的报表。"填报预览下的懒加载下拉树控件"是帆软报表中的一种...
如下图所示报表,科目名称栏目里面的数据不是从数据库中拖曳扩展得来的,而是直接在单元格中输入,需要将每个科目的期初余额和期末余额填报入库,数据库中有科目ID、会计科目、期初余额和期末余额几个字段,在填报时...
亲测好用,挺不错的资源,大家快来下载吧!挺有用的!需要的话可以来下载哦!最新的1104报表填报详细说明,各个指标银监的具体含义,报表类型有G开头的、S开头的
最新的1104报表填报详细说明,各个指标银监的具体含义,报表类型有G开头的、S开头的
久其报表操作流程V.pdf 本资源主要讲述了久其报表操作流程,旨在帮助用户快速掌握久其报表软件的使用方法和操作流程。通过本资源,用户可以了解久其报表的安装、注册、参数装入、数据录入、审核和传出等操作流程。 ...
保存设置后,点击“填报预览”,在A2单元格中输入数据,触发编辑结束事件,进而实现对C2单元格值的检查与置数操作。 通过以上步骤,我们可以实现在FineReport中页面居中的效果以及填报页面上的控件联动与置数设置...
《2018年工会决算报表》是工会组织对...通过以上详细解释,我们可以看出《2018年工会决算报表》的填报是一项严谨的工作,涉及到单位的身份识别、财务制度执行、预算管理等多个层面,旨在提供全面、准确的工会财务信息。
总之,"1104报表填报说明.doc"文档是填报这项重要报表的重要指南,它涵盖了报表结构、会计原则、填报技巧、审核流程等多个方面,对于理解和完成报表工作具有极高的参考价值。通过深入学习这份文档,我们可以更准确、...
对于移动端报表而言,查看报表经常会有以下问题:查看缓存数据相比于实时数据,减少了数据传输...最好的解决办法就是实现离线查看报表,根据我平时报表的开发经验,以具体给大家讲讲这个离线查看的功能可以如何实现。
在电子表格中进行贷款五级分类操作,可以更高效、准确地进行风险评估和报表填报。 本次培训主要针对安徽省农村信用社的信贷人员,旨在提升他们对贷款五级分类电子表格的操作技能。培训内容包括以下几个方面: 1. *...
在帆软报表的填报功能中,用户可以创建交互式的表单来收集和录入数据,这对于企业的日常运营和管理非常重要。然而,原始的填报控件可能相对简单,无法满足所有用户对于页面丰富度的需求。为了增强用户体验和提升报表...
其中,填报报表是报表工具中的一个重要功能,通常用于收集各部门的数据输入。为了简化数据收集的过程,常常需要将空白的填报报表导出为Excel格式,以便部门人员填写数据。完成填写后,再将Excel中的数据导入到报表...
通过这样的电子表格操作与报表填报培训,信贷人员可以更好地理解和执行贷款五级分类制度,提高风险识别能力,降低信贷风险,确保农村信用社的稳健运营。同时,这种标准化的管理方式也有利于监管机构对农村信用社的...
【银行的财务会计报表格式及填报说明】 财务会计报表是银行业务运营的重要组成部分,它反映了银行的财务状况、经营成果和现金流量等关键信息。银行的财务会计报表通常包括资产负债表、利润表、现金流量表以及股东...
,早在2003年11月,银监会就计划用三年左右的时间建立一个“统一规划、统一管理、统一标准、资源共享”的非现场检查信息技术平台。银监会称其为“1104工程”。...1104报表作为银保监会的非现场监管报表体系。
在这样的背景下,如何将FineReport这类专业的报表开发工具制作出的报表嵌入到Web页面中,成为了一个重要的技术需求。 #### 二、问题描述 在大多数现代Web应用中,报表通常需要与业务系统紧密集成,以便用户可以在...