在报表组中实现Sheet间的跳转
报表组的功能很强大,可以实现一些单个报表实现不了的功能。但是由于客户需求的多样化,有些功能还不能直接实现,比如点击一个sheet页面中的订单ID然后在另一个sheet页面显示该订单的明细。
本文就来通过例子说明怎样间接实现该功能。
做过报表组的人知道,浏览报表组的时候默认显示的第一张报表。通过查看显示报表组的页面源代码了解到报表组是把每个报表sheet的内容放在一个div中,默认显示第一个div,点击第二个报表的tab页就显示第二报表的div。所以要实现上面的功能,我们可以根据下面的思路来做。
大致思路:
首先创建一个包含两个报表的报表组,在第一个报表中创建超链接,连接到报表组本身,把订单ID和需要显示的哪个层的标志传递给报表组,第二个报表根据订单ID查询订单明细,报表组再根据显示层标志来显示相应的div。比如这个超链接:”/reportJsp/showReportGroupTest.jsp?rpg=/group/group.rpg&order=”+A2+”&showFlag=2″
就是显示第二个div并根据订单idA2单元格的值查询显示相应的订单明细。
制作步骤
第一步制作sheet报表组
打开快逸复杂报表设计" target="_blank" class="quieeLink1">设计器,连接demo数据源,新建一张空白报表,命名为”订单主表”。新建数据集ds1,sql语句为:” ELECT 订单.订单ID,订单.订购日期,订单.货主名称,订单.货主地区,订单.到货日期 FROM 订单 WHERE 订单.订单ID like ’105__’ ORDER BY 订单.订单ID ASC”
单元格中输入内容如下:
A1: 订单ID
B1: 订购日期
C1: 货主名称
D1: 货主地区
E1: 到货日期
A2: =ds1.Select(订单ID)
B2: =ds1.订购日期
C2: =ds1.货主名称
D2: =ds1.货主地区
E2: =ds1.到货日期
再新建一张空白报表,另存为”订单明细”,新建一个参数”order”用来接收第一个报表传递过来的订单ID,新建数据集ds1,sql语句:
“SELECT 订单明细.订单ID,订单明细.产品ID,订单明细.单价,订单明细.折扣,订单明细.数量 FROM 订单明细 WHERE 订单明细.订单ID =? ORDER BY 订单明细.订单ID ASC”
在数据集编辑界面增加一个参数”order”,
这个数据集用于订单明细。再新增一个数 据集ds2,sql语句:
“SELECT 产品.产品ID,产品.产品名称 FROM 产品”,
用于显示产品的中文名字。
单元格中输入的内容如下:
A1:订单ID
B1: 产品
C1: 单价
D1: 折扣
E1: 数量
A2: =ds1.Select(订单ID)
B2: =ds1.产品ID
C2: =ds1.单价
D2: =ds1.折扣
E2: =ds1.数量
选中B2单元格,设置显示值表达式为”ds2.select1(产品名称,产品ID==value())”。
新建一个报表组,把刚才创建的两个报表添加到报表组中,报表组命名为group.
上图中url类型最好使用相对路径。
给报表组定义一个参数”order”,用于接收第一个报表传过来的订单ID。如下图
设置报表组和报表之间的参数传递,选中下图中的”订单明细”点击右键
选择”报表项设置”,如下图
点击上图中的”+”号,增加报表组和报表之间传递的参数”order”。
第二步.设置超链接
在设计器打开订单主表,选中A2单元格,在超链接的表达式窗口中输入”"/reportJsp/showReportGroupTest.jsp?rpg=/group/group.rpg&order=”+A2+”&showFlag=2″”。如下图:
第三步.制作解析报表组的jsp
新建一个jsp,另存为showReportGroupTest.jsp,用于解析刚才创建的报表组。内容如下
<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<%@ page import=”java.io.*”%>
<%@ page import=”java.util.*”%>
<html>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
//接收参数,把参数拼成name=value;name2=value2;…..的形式
StringBuffer param=new StringBuffer();
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(“;”);
}
}
}
%>
<!–导入存有工具栏的jsp–>
<jsp:include page=”toolbar.jsp” flush=”false” />
<table align=center>
<tr><td>
<report:group groupFileName=”group.rpg”
funcBarLocation=”"
exceptionPage=”/reportJsp/myError2.jsp”
params=”<%=param.toString()%>”
/>
</td></tr>
</table>
<%
//得到显示哪个div的标志
String showFlag = request.getParameter(“showFlag”);
if(“2″.equals(showFlag)){%>
//标志为2的时候就显示第二张报表,就是div名字为div_item2的层
<script language=”javascript”>
//显示第二个报表的div,隐藏第一个报表的div
document.getElementById( “div_item1″ ).style.display = “none”;
document.getElementById( “div_item2″ ).style.display = “”;
//更改tab页字体的颜色
document.getElementById(“tab_item1″).className=”";
document.getElementById(“tab_item2″).className=”rq_curr”;
</script>
<%}else{%>
//显示第一个报表的div,隐藏第二个报表的div
<script language=”javascript”>
document.getElementById( “div_item1″ ).style.display = “”;
document.getElementById( “div_item2″ ).style.display = “none”;
document.getElementById(“tab_item1″).className=”rq_curr”;
document.getElementById(“tab_item2″).className=”";
</script>
<%}%>
<script language=”javascript”>
//重新定义第二个报表tab页的点击事件
document.getElementById(‘tab_item2′).onclick=function()
{ //显示第二个报表的div,隐藏第一个报表的div
document.getElementById( “div_item1″ ).style.display = “none”;
document.getElementById( “div_item2″ ).style.display = “”;
//更改tag标签字体的颜色
document.getElementById(“tab_item1″).className=”";
document.getElementById(“tab_item2″).className=”rq_curr”;
//调用快逸自定义的tab页自定义函数
_groupClicked(document.getElementById(‘tab_item2′));
}
//重新定义第一个报表tab页的点击事件
document.getElementById(‘tab_item1′).onclick=function(){
document.getElementById( “div_item1″ ).style.display = “”;
document.getElementById( “div_item2″ ).style.display = “none”;
document.getElementById(“tab_item1″).className=”rq_curr”;
document.getElementById(“tab_item2″).className=”";
_groupClicked(document.getElementById(‘tab_item1′));
}
</script>
</body>
</html>
第四步.运行浏览
运行设计器中内置的tomcat,在IE输入url:http://127.0.0.1:6001/quiee/reportJsp/showReportGroupTest.jsp,运行效果如下
点击上图红框中的订单ID,就可以显示下面的效果
总结:以后用户如果再遇到类似这样的需求,就可以按照上面的方法解决了。