填报监听类中实现修改报表原纪录执行insert操作(二)
问题背景
客户希望用户在修改填报表中数据的时候,若修改的字段为对应数据表的主键,则报表提交时该记录执行insert操作;若修改的字段为非主键,则报表提交时执行update操作。
早些时候我介绍了在填报监听类中写sql进行数据更新,今天我们换一个方法解决该问题。
问题分析
当前润乾报表对于修改报表原有数据后进行填报,都执行update操作,无论修改的字段是主键还是非主键。报表填报时,先拿报表中原数据,根据更新主键去数据库中查找该记录是否存在,存在即进行update操作;否则进行insert操作。
而我们要做的就是当判断主键被修改以后,将主键或主键所在行数据的原值置空,这样报表引擎再拿原值去数据库中比较时,由于数据库中不存在主键为空的记录,所以会执行insert操作,将该记录插入到数据库中。
实现步骤
1、 做报表
做一张简单的填报表,本例使用报表自带的demo数据源,设置报表更新属性,如下图:
2、 写填报监听类:CustomInputListener.java
在beforsave方法中循环报表行列,判断主键是否被修改
将主键被修改的记录主键置空;
正常使用报表填报进行提交。
(源码见附在本文最后)
3、写发布报表的jsp
在发布报表的标签中配置:inputListener=”runqian.CustomInputListener2″
附:
填报监听类 CustomInputListener2.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 CustomInputListener2 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 = “”;
// System.out.println(“主键不能为空!“);
// throw new Exception();
} else {
inputString = inputObject.toString();
}
if (!oldString.equals(inputString)) {// 主键被修改,将原值置空
//listInputLine.add(i);
System.out.println(“主键被修改,原值置空“);
iCell.setValue(“”);
}
}
}
}
public void afterSave() throws Exception {
super.afterSave();
}
}
发布报表的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=“custom2.raq”
generateParamForm=“no”
inputListener=“runqian.CustomInputListener2″ />
</div>
</body>
</html>