参数对于报表的重要性不言自明,润乾集算报表支持两种参数输入方案,可以使用集算报表设计参数模板联合报表一同发布,还可以自定义参数输入后与报表结合。二者并没有显著的差异,前者在开发使用上更加方便快捷,而后者则在灵活性上更胜一筹,用户在使用集算报表参数输入时可以根据实际需要进行选择。
下面就上述两种参数输入方式的使用分别来看一下。
使用参数输入模板
集算报表提供了“参数模板”的报表类型,使用参数模板可以制作参数输入表单,而且其内置了多种编辑风格,如下拉树、下拉日历、列表框、下拉数据集等。使用时可以参照下面的步骤:
1、定义参数模板
新建参数模板类型报表,可以使用新建向导进行选择,也可以通过报表属性进行修改,新建的参数模板保存为orders_arg.rpx。
定义参数模板内容,主要包括表单样式、查询内容等信息。
右键单元格设置编辑风格,设置B2和D2为下拉日历,F2为编辑框。
在设计器中右侧的属性面板中设置单元格变量名称,用于数据报表接收参数。这里设置B2格变量名b_date、D2为e_date、F2为orderID。
2、编辑数据报表
新建数据报表,保存报表名称为orders.rpx,在数据报表中定义参数,其中用于接收参数输入的参数名应与参数模板中变量名一致。
设置报表数据集,这里要根据订购日期起止和订单ID来过滤数据,数据集SQL为:
SQL中的问号与参数要一一对应,包括名称和位置。
有时希望报表初次加载(不输入参数)时查询所有数据,此时需要修改SQL为:
SELECT * FROM 订单
where (订购日期>=? or ? isnull)
and (订购日期<=? or ? isnull)
and (订单ID>? or ? isnull)
同时参数部分也要做相应修改:
设置报表表达式,完成数据报表制作。
3、编写发布报表JSP页面
集算报表安装后自带了一个完整的web应用demo,在[安装目录]\report\webapps下可以找到。该应用中的reportJsp目录下自带showReport.jsp为发布报表的页面,用户可以直接使用,其中主要包括如下内容,当用户自定义页面发布带有参数的报表时使用。
报表部署可以参考润乾集算报表部署的相关文档,发布带有参数模板的报表时定义的JSP至少包含如下内容。
(1)参数处理部分,通过request接收参数模板传递的参数,将参数拼接成 参数名1=参数值1;参数名2=参数值2;…的格式:
EnumerationparamNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName =(String) paramNames.nextElement();
StringparamValue=request.getParameter(paramName);
if(paramValue!=null){
//把参数拼成name=value;name2=value2;.....的形式
param.append(paramName).append("=").append(paramValue).append(";");
}
}
}
(2)发布参数模板部分,使用集算报表提供的<report:param>标签发布参数报表,该标签中带有很多属性,使用时至少应包含name、paramFileName(模板名称)和params(参数):
<report:paramname="form1" paramFileName="orders_arg.rpx"
needSubmit="no"
params="<%=param.toString()%>"/>
(3)发布数据报表部分,联合参数模板一同发布的数据报表采用集算报表提供的<report:html>标签,其包含的的众多属性中必须使用的属性如下:
<report:htmlname="report1" reportFileName="orders.rpx"
params="<%=param.toString()%>"
/>
最后报表在页面上展现:
【附】完整JSP代码:
<%@page contentType="text/html;charset=GBK" %> <%@taglib uri="/WEB-INF/raqsoftReport.tld" prefix="report"%> <%@page import="java.util.*"%> <html> <bodytopmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0> <% request.setCharacterEncoding("GBK" ); StringBuffer param=new StringBuffer(); Enumeration paramNames =request.getParameterNames(); if(paramNames!=null){ while(paramNames.hasMoreElements()){ String paramName =(String) paramNames.nextElement(); StringparamValue=request.getParameter(paramName); if(paramValue!=null){ //把参数拼成name=value;name2=value2;.....的形式 param.append(paramName).append("=").append(paramValue).append(";"); } } } %> <tableid="rpt" width=100% height=100%> <tr><td=top height=100%> <tableid="param_tbl"><tr><td> <report:paramname="form1" paramFileName="orders_arg.rpx" needSubmit="no" params="<%=param.toString()%>" /> </td><td><ahref="javascript:_submit( form1 )"><imgsrc="../images/query.jpg" border=nostyle="vertical-align:middle"></a></td> </tr></table> </td></tr> <tr><td=top height=100%> <report:htmlname="report1" reportFileName="orders.rpx" params="<%=param.toString()%>" /> </td></tr> </table> </body> </html>
自定义参数输入
用户自定义参数输入时,需要自己定义查询表单,设置查询条件等信息。如仍以上述查询报表为例,使用自定义参数输入可参考如下步骤:
1、定义参数输入表单
<formaction="showReport.jsp?rpx=orders.rpx" method="post">
<p>订购日期起:<input type="text"name="b_date" /></p>
<p>订购日期止:<input type="text"name="e_date" /></p>
<p>订单ID大于:<input type="text"name="orderID" /></p>
<input type="submit"value="查询" />
<form>
其中参数name应与数据报表中参数名一致,这里参数输入均为文本框。
2、编辑数据报表
编辑数据报表与使用参数输入模板中数据报表一致,此处不再赘述。
3、定义发布报表页面
(1)接收参数表单传递的参数:
EnumerationparamNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName =(String) paramNames.nextElement();
StringparamValue=request.getParameter(paramName);
if(paramValue!=null){
//把参数拼成name=value;name2=value2;.....的形式
param.append(paramName).append("=").append(paramValue).append(";");
}
}
}
这里仍然要将参数拼成参数名=参数值;…的形式,这样数据报表才能正常接收。
(2)发布数据报表:
<report:htmlname="report1" reportFileName="orders.rpx"
params="<%=param.toString()%>"
/>
最后访问参数输入页面,输入条件即可得到数据报表的查询结果。
【附】完整JSP代码:
1、参数输入界面query.jsp
<html> <bodytopmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0> <formaction="show.jsp" method="post"> <p>订购日期起:<input type="text" name="b_date"/></p> <p>订购日期止:<input type="text" name="e_date"/></p> <p>订单ID大于:<input type="text"name="orderID" /></p> <input type="submit"value="查询" /> <form> </body> </html>
2、报表发布页面show.jsp
<%@page contentType="text/html;charset=GBK" %> <%@taglib uri="/WEB-INF/raqsoftReport.tld" prefix="report"%> <%@page import="java.util.*"%> <html> <bodytopmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0> <% request.setCharacterEncoding("GBK" ); StringBuffer param=new StringBuffer(); Enumeration paramNames =request.getParameterNames(); if(paramNames!=null){ while(paramNames.hasMoreElements()){ String paramName =(String) paramNames.nextElement(); StringparamValue=request.getParameter(paramName); if(paramValue!=null){ //把参数拼成name=value;name2=value2;.....的形式 param.append(paramName).append("=").append(paramValue).append(";"); } } } %> <tableid="rpt" width=100% height=100%> <tr><td=top height=100%> <report:htmlname="report1" reportFileName="orders.rpx" params="<%=param.toString()%>" /> </td></tr> </table> </body> </html>
集算报表中使用参数模板非常方便,通过报表设计器中的向导即可快速完成;而当应用中已有或者需要自定义的参数输入界面时,集算报表也支持与自定义页面联合发布,非常灵活。