搜索文章

推荐内容

快逸做的更好

产品优势

您的位置: 首页 > 报表技术分享 > 带参数模板的折叠报表实现

带参数模板的折叠报表实现

关于快逸折叠报表的实现已经有相关文章或例子进行过介绍,本文将在原有折叠报表的基础上,实现带有参数模板的折叠报表。

实现难点

我们原来制作的折叠报表是使用超链接传参数控制隐藏行实现的,每次要传递的参数放到form中保存,通过request传递给报表。

而参数模板的查询会跳转到servlet进行处理,其间会将原来放到request中的内容(参数和参数值等)一直保存,servlet处理后将request中的内容输出到url中,而且url不再变化,直到进行下一次查询

这就导致了当通过参数模板查询数据后,再点击折叠报表必要的参数就无法通过request传递给报表了。

所以必须想办法将要传递的参数拼到现有不变的url中,可以先获取到现有的url,将需要传递的参数拼接到其中,然后再将拼好的串返回到url中。

实现步骤

通过超链接隐藏行做一张带有参数模板的折叠报表,发布后,点击查询可以看到折叠报表无法正常展开了。

我们来修改一下发布报表的jspjs部分:

//获得当前浏览器url

var url = window.location.href;

var new_url;

//判断

if(url.indexOf(“show_groups=”)<0){//url中不包含show_groups字样,说明报表无展开

frm.submit();//此时不改变url,使用原有方式提交表单

}else{//url中包含show_groups字样,说明折叠报表有部分展开并进行了参数查询

new_url = url.substr(0,url.indexOf(“show_groups=”)+12)+groups+url.substr(url.indexOf(“&context_name=”),url.length);//拼接url

window.location.href=new_url;//将修改后url串返回浏览器,不进行表单提交

}

重新访问该报表,可以看到报表查询后可以正常展开折叠

部分主要代码:

<%

request.setCharacterEncoding( “GBK” );

Exception exp = null;

Context ctx = null;

String contextName = request.getParameter(“context_name”);

String raqFile = request.getParameter(“raq”);

String showGroups = “”;

session.setMaxInactiveInterval(-1);

try{

if(raqFile==null || “”.equals(raqFile)) throw new Exception(未指定报表模版名!);

// 没有context_name参数,说明页面第一次被访问,构建一个context

if(contextName==null || “”.equals(contextName)){

// 读取报表模版

ReportDefine rd = (ReportDefine)ReportUtils.read(application.getResourceAsStream(Context.getMainDir()+“/”+raqFile));

ctx = new Context();

// 因为要将context存在session中,所以名称最好加上一些随机值,此处省略

contextName = “report_context”;

}

else{

ctx = (Context)session.getAttribute(contextName);

if(ctx==null) throw new Exception(找不到Context);

// 如果是数组参数,传入context 要用ArrayList

showGroups = request.getParameter(“show_groups”);

String gs[] = showGroups.split(“,”);

ArrayList al = new ArrayList();

for(int i=0;i<gs.length;i++) al.add(gs[i]);

ctx.setParamValue(“show_groups”,al);

}

// 保存到session中,供下次使用

session.setAttribute(contextName,ctx);

// 保存到request中,传给报表

request.setAttribute(contextName,ctx);

}

catch(Exception e){

exp = e;

e.printStackTrace();

}

%>

<html>

<head>

<title>折叠报表例子2</title>

<script language=“javascript”>

// 参数是要折叠/展开的组名

function _changeShowGroup(group){

//alert(“B10内容:“+group);

var frm = document.tree_params;

var groups = frm.show_groups.value;

//alert(“frm.show_groups->”+groups);

// 重新组装参数

var isInGroup = false;

var gs = groups.split(“,”);

groups = “”;

for(var i=0;i<gs.length;i++){

if(gs[i]!=group)

groups += gs[i]+“,”;

else

isInGroup = true;

}

if(!isInGroup) groups += group;

// 清除首尾多余的逗号

while(groups.substr(groups.length-1,1)==“,”) groups = groups.substring(0,groups.length-1);

while(groups.substr(0,1)==“,”) groups = groups.substring(1,groups.length);

//alert(“处理后groups:”+groups)

// 填值,提交

frm.show_groups.value = groups;

//获得当前浏览器url

var url = window.location.href;

var new_url;

//判断

if(url.indexOf(“show_groups=”)<0){//url中不包含show_groups字样,说明报表无展开

frm.submit();//此时不改变url,使用原有方式提交表单

}else{//url中包含show_groups字样,说明折叠报表有部分展开并进行了参数查询

new_url = url.substr(0,url.indexOf(“show_groups=”)+12)+groups+url.substr(url.indexOf(“&context_name=”),url.length);//拼接url

window.location.href=new_url;//将修改后url串返回浏览器,不进行表单提交

}

//alert(“放到form里的groups:”+frm.show_groups.value);

//frm.submit();

}

</script>

</head>

<body>

<form name=“tree_params” action=“” method=“post”>

<input type=“hidden” name=“context_name” value=<%=contextName %>>

<input type=“hidden” name=“show_groups” value=<%=showGroups %>>

</form>

本文标签: