润乾报表(V4)用ajax实现关联单元格自动填充

填报表可能会遇到这样的需求,某个单元格值发生变化后,其他一些单元格值也跟着发生变化(局部刷新)。如果是简单的加减乘除运算,可以在单元格的自动计算里面实现;如果关联单元格显示的内容是从数据库中取出来的,就需要用ajax来异步取数加载了。

比如订单表,当选择产品后,产品的单价、库存自动填充,用户便可以根据这些信息填写订货量。

分析思路:

利用报表单元格的自动计算功能完成不同单元格信息的自动关联,自动计算表达式采用的是js函数,js函数中调用ajax,ajax中调用servlet查询数据库检索订单、库存量信息,返回给相应的单元格。

实现过程:

报表(如A3单元格)设置下拉数据集,用来选择产品,在B3单元格自动计算里面设置表达式“getValue("单价",A3)”(第一个参数是要查询的字段,第二个参数是关联的单元格,返回数据库中A3选择的产品对应的单价),C3单元格自动计算的表达式“getValue("库存量",A3)”,单元格D3设置为可写。

 

解析报表的jsp如下

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/runqianReport4.tld" prefix="report" %>

<html>

<body>

<%request.setCharacterEncoding( "GBK" );%>

<report:html name="report1" reportFileName="testAjax.raq"/>

<script language="javascript">

var xmlHttp;

var result;

//初试化XMLHttpRequest对象

function createXMLHttpRequest(){

if(window.ActiveXObject){

xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");

}else if(window.XMLHttpRequest){

xmlHttp=new XMLHttpRequest();

}

}

function call(){

if (xmlHttp.readyState == 4){//响应内容解析完成,可以在客户端调用了

if (xmlHttp.status == 200){//http请求一切正常,对GETPOST请求的应答文档跟在后面

result = decodeURI(xmlHttp.responseText);

}}}

//根据关联单元格、字段名称返回该字段的值

function getValue(field, orderID){

createXMLHttpRequest();

var url="<%=request.getContextPath()%>/ajax_Servlet2?selectField=" + field +"&orderID=" + orderID;

xmlHttp.onreadystatechange = call;

xmlHttp.open("GET", url, false);

xmlHttp.send(null);

return result;

}

</script>

</body>

</html>

Servlet如下:

public class AjaxServlet_2 extendsHttpServlet{

Connection conn ;

Statement stmt;

ResultSet rs;

public void doGet(HttpServletRequestrequest, HttpServletResponse response)

throws ServletException,IOException{

response.setCharacterEncoding("GBK");

Context ctx = Context.getInitCtx();

try {

conn =ctx.getConnectionFactory(ctx.getDefDataSourceName()).getConnection();

stmt = conn.createStatement();

catch (Exceptione) {

e.printStackTrace();

}

String selectField = request.getParameter("selectField");

String orderID = request.getParameter("orderID");

if(!"".equals(selectField)|| selectField == null){

String selectSQL = "SELECT "+ selectField +"FROM 产品 where 产品ID="+ orderID;

try {

rs = stmt.executeQuery(selectSQL);

if(rs.next()){

PrintWriter out=response.getWriter();

out.write(URLEncoder.encode(rs.getString(selectField).trim(),"UTF-8"));

out.flush();

out.close();

}

catch (SQLExceptione) {

e.printStackTrace();

}finally{

try {

if(stmt != nullstmt.close();

if(rs != nullrs.close();

if(conn != nullconn.close();

catch (SQLExceptione) {

e.printStackTrace();

}

}

}

}

}

猜你喜欢

转载自blog.csdn.net/cainiao_M/article/details/78716830