统计图可以使复杂的统计数字简单化、通俗化、形象化,使人一目了然,便于理解和比较。因此,统计图在报表统计与分析中占有重要地位,并得到广泛应用。

统计图的联动是指统计图之间的数据根据点击图形上的不同区域(例如柱形图中的柱子,饼形图中的图块)来做动态变化.

通常情况下,我们在报表中放入统计图是为了对数据进行展现,那么,我们如何来利用统计图来完成联动功能呢?

首先,我们制作两张带有统计图的报表:

报表一:这张报表的功能是统计货主地区的订单数分布.


报表二:

这张报表的功能在于接收点击报表一传过来的地区参数后,做城市明细订单分布的展现.


由于报表二要接收报表一传过来的参数来对数据进行过滤,所以我们要在报表二中增加参数:


参数X代表的是地区值.

同样我们也要在报表二的数据集中来对参数X进行设置:


接着,我们就要对报表一的联动位置进行设置.我们这里采用的是超链接url传参数:

我们这里以集算器统计图(柱图)为例:


这里的设置是:当点击图形中的柱子,会触发一个自定义的down()方法,并把横纵坐标值当作入参进行传递,参数名分别为@x(横轴)和@z(纵轴).

最后,我们写两个页面来把这几张报表进行展现:

主体jsp,里面放两个iframe,每个iframe里放一个报表.


<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<%@ page import=”java.io.*”%>
<%@ page import=”java.util.*”%>
<%@ page import=”com.runqian.report4.usermodel.Context”%>
<html>
<head>
<title>联动demo</title>
</head>

<body>
<%
request.setCharacterEncoding( “GBK” );
%>
<div style=”height:550px;”>
<iframe name=”report1″ src=”showReport.jsp?raq=demoarg2chart.raq” scrolling=”auto” frameborder=”0″ width=42.5% height=100% style=”margin:0px 10px;border:1px solid #DDDDDD”></iframe>
<iframe name=”report2″ src=”showReport.jsp?raq=demoarg2.raq&x=华北” scrolling=”auto” frameborder=”0″ width=54% height=100% style=”border:1px solid #DDDDDD”></iframe></div>
</body>
</html>

然后,在定义一下展现报表一和报表二的jsp,其中要包含前面提到的自定义js函数down():

<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<%@ page import=”java.io.*”%>
<%@ page import=”java.util.*”%>
<%@ page import=”com.runqian.report4.usermodel.Context”%>

<html>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
request.setCharacterEncoding( “GBK” );
String report = request.getParameter( “raq” );
String reportFileHome=Context.getInitCtx().getMainDir();
StringBuffer param=new StringBuffer();

//保证报表名称的完整性
int iTmp = 0;
if( (iTmp = report.lastIndexOf(“.raq”)) <= 0 ){
report = report + “.raq”;
iTmp = 0;


Enumeration paramNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName = (String) paramNames.nextElement();
String paramValue=request.getParameter(paramName);
if(paramValue!=null){
//把参数拼成name=value;name2=value2;…..的形式
param.append(paramName).append(“=”).append(paramValue).append(“;”);


}

//以下代码是检测这个报表是否有相应的参数模板
String paramFile = report.substring(0,iTmp)+”_arg.raq”;
File f=new File(application.getRealPath(reportFileHome+ File.separator +paramFile));

%>
<jsp:include page=”toolbar.jsp” flush=”false” />
<table id=”rpt” align=”center”><tr><td>
<% //如果参数模板存在,则显示参数模板
if( f.exists() ) {
%>
<table id=”param_tbl” width=”100%” height=”100%”><tr><td>
<report:param name=”form1″ paramFileName=”<%=paramFile%>”
needSubmit=”no”
params=”<%=param.toString()%>”

/>
</td>
<td><a href=”javascript:_submit( form1 )”><img src=”../p_w_picpaths/query.jpg” border=no style=”vertical-align:middle”></a></td>
</tr>
</table>
<% }
%>


<table align=”center” width=”100%” height=”100%”>
<tr><td>
<report:html name=”report1″ reportFileName=”<%=report%>”
funcBarLocation=”top”
needPageMark=”yes”
generateParamForm=”no”
params=”<%=param.toString()%>”
needSaveAsExcel=”yes”
needImportExcel=”yes”
exceptionPage=”/reportJsp/myError2.jsp”
generateCellId=”yes”
needSaveAsText=”yes”
width=”1000″
/>
</td>
</tr>
</table>

<script language=”javascript”>
//设置分页显示值
document.getElementById( “t_page_span” ).innerHTML=report1_getTotalPage();
document.getElementById( “c_page_span” ).innerHTML=report1_getCurrPage();

function down(aa,bb){
parent.report2.location.href=”/demo/reportJsp/showReport.jsp?raq=demoarg2.raq&x=”+aa;


</script>
</body>
</html>

其中down()函数的作用就是,把参数传递并刷新页面.

最后我们来看一下页面效果:



点击某一个区域的柱子后,右侧数据进行过滤并展现城市明细数据:


通过这样的方法,可以制作出来统计图联动的效果.