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

热门文章