`
langgufu
  • 浏览: 2309011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

填报监听类中实现修改报表原纪录执行insert操作(转载)

阅读更多

填报监听类中实现修改报表原纪录执行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>

分享到:
评论

相关推荐

    Web报表工具填报界面键盘操作

    用户在设计器中可以对报表填报的键盘快捷键进行个性化设置,以满足个人的操作习惯。通常,在模板设计器的报表填报属性中,找到填报快捷设置,点击切换图标即可进行设置,例如设定Enter键和Tab键的移动方向。 以上...

    帆软填报报表数据导入案例

    在本案例中,我们将学习如何使用帆软填报报表将数据从 Excel 导入到报表中。这个过程可以分为六个主要步骤:新建普通报表、添加字段名称、添加控件和设置竖向拓展、添加数据导入和提交按钮、设置其他的导入规则、...

    1104基础报表填报说明

    1104基础报表填报说明1104基础报表填报说明1104基础报表填报说明1104基础报表填报说明1104基础报表填报说明

    详细解密FineReport中的报表执行过程

    在使用报表开发工具FineReport进行报表开发时,理解其内部执行过程对于优化报表性能、调试和监控报表生成至关重要。FineReport中的报表执行过程可以分为两个主要步骤,即报表计算和页面转换。 首先,报表计算过程...

    帆软报表填报预览下的懒加载下拉树控件

    在IT领域,尤其是在BI(商业智能)和报表设计中,帆软报表是一款广泛使用的工具,它提供了丰富的控件和功能,使得用户能够便捷地创建、编辑和预览各种复杂的报表。"填报预览下的懒加载下拉树控件"是帆软报表中的一种...

    报表工具FineReport填报时,如何实现多个单元格绑定一个字段?

    如下图所示报表,科目名称栏目里面的数据不是从数据库中拖曳扩展得来的,而是直接在单元格中输入,需要将每个科目的期初余额和期末余额填报入库,数据库中有科目ID、会计科目、期初余额和期末余额几个字段,在填报时...

    完整版 最新的1104报表填报详细说明.doc

    亲测好用,挺不错的资源,大家快来下载吧!挺有用的!需要的话可以来下载哦!最新的1104报表填报详细说明,各个指标银监的具体含义,报表类型有G开头的、S开头的

    最新的1104报表填报详细说明

    最新的1104报表填报详细说明,各个指标银监的具体含义,报表类型有G开头的、S开头的

    久其报表操作流程V.pdf

    久其报表操作流程V.pdf 本资源主要讲述了久其报表操作流程,旨在帮助用户快速掌握久其报表软件的使用方法和操作流程。通过本资源,用户可以了解久其报表的安装、注册、参数装入、数据录入、审核和传出等操作流程。 ...

    FineReport报表工具填报专辑

    保存设置后,点击“填报预览”,在A2单元格中输入数据,触发编辑结束事件,进而实现对C2单元格值的检查与置数操作。 通过以上步骤,我们可以实现在FineReport中页面居中的效果以及填报页面上的控件联动与置数设置...

    《2018年工会决算报表》填报说明.doc.docx

    《2018年工会决算报表》是工会组织对...通过以上详细解释,我们可以看出《2018年工会决算报表》的填报是一项严谨的工作,涉及到单位的身份识别、财务制度执行、预算管理等多个层面,旨在提供全面、准确的工会财务信息。

    1104报表填报说明.7z

    总之,"1104报表填报说明.doc"文档是填报这项重要报表的重要指南,它涵盖了报表结构、会计原则、填报技巧、审核流程等多个方面,对于理解和完成报表工作具有极高的参考价值。通过深入学习这份文档,我们可以更准确、...

    移动端报表如何实现离线查看报表功能

    对于移动端报表而言,查看报表经常会有以下问题:查看缓存数据相比于实时数据,减少了数据传输...最好的解决办法就是实现离线查看报表,根据我平时报表的开发经验,以具体给大家讲讲这个离线查看的功能可以如何实现。

    贷款五级分类电子表格的操作与报表的填报.PPT

    在电子表格中进行贷款五级分类操作,可以更高效、准确地进行风险评估和报表填报。 本次培训主要针对安徽省农村信用社的信贷人员,旨在提升他们对贷款五级分类电子表格的操作技能。培训内容包括以下几个方面: 1. *...

    帆软报表新填报控件,只支持PC端

    在帆软报表的填报功能中,用户可以创建交互式的表单来收集和录入数据,这对于企业的日常运营和管理非常重要。然而,原始的填报控件可能相对简单,无法满足所有用户对于页面丰富度的需求。为了增强用户体验和提升报表...

    FineReport实现EXCEL数据导入自由报表

    其中,填报报表是报表工具中的一个重要功能,通常用于收集各部门的数据输入。为了简化数据收集的过程,常常需要将空白的填报报表导出为Excel格式,以便部门人员填写数据。完成填写后,再将Excel中的数据导入到报表...

    [财务]农村信用社联合社-贷款五级分类电子表格培训-贷款五级分类电子表格的操作与报表的填报.pptx

    通过这样的电子表格操作与报表填报培训,信贷人员可以更好地理解和执行贷款五级分类制度,提高风险识别能力,降低信贷风险,确保农村信用社的稳健运营。同时,这种标准化的管理方式也有利于监管机构对农村信用社的...

    银行的财务会计报表格式及填报说明

    【银行的财务会计报表格式及填报说明】 财务会计报表是银行业务运营的重要组成部分,它反映了银行的财务状况、经营成果和现金流量等关键信息。银行的财务会计报表通常包括资产负债表、利润表、现金流量表以及股东...

    1104基础报表填报说明(最新)

    ,早在2003年11月,银监会就计划用三年左右的时间建立一个“统一规划、统一管理、统一标准、资源共享”的非现场检查信息技术平台。银监会称其为“1104工程”。...1104报表作为银保监会的非现场监管报表体系。

    报表工具FineReport中如何把报表放到网页中显示

    在这样的背景下,如何将FineReport这类专业的报表开发工具制作出的报表嵌入到Web页面中,成为了一个重要的技术需求。 #### 二、问题描述 在大多数现代Web应用中,报表通常需要与业务系统紧密集成,以便用户可以在...

Global site tag (gtag.js) - Google Analytics