在程序里怎么给交叉报表(JasperReport)传递参数

nopain_nogain 2009-04-13 12:59:30
大家好,我想问下,在程序里怎么给交叉报表(JasperReport)传递参数?
下面是详细信息,谢谢!
--------------------------------------------------------------
普通的报表:
没有使用 <subDataset/>标签。
<parameter name="classId" class="java.lang.Integer"/>
在程序里(Java):
Map map = new HashMap();
map.put("classId", 1);
JasperPrint jasperPrint = JasperFillManager.fillReport(report,map, conn);
这样就可以传递成功了。

交叉报表:
<subDataset name="SubDataset3">
<parameter name="classId" class="java.lang.Integer"/>
...............
</subDataset>
在程序里使用上边的办法参数传递不进去。
--------------------------------------------------------------
在网上找了很多资料都是针对普通报表的参数传递。
官方的demo里,也有这样的代码:
<subDataset name="SubDataset3">
<parameter name="classId" class="java.lang.Integer"/>
...............
</subDataset>
但没有提示如何传参,再次谢谢!
...全文
279 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
platfrom 2012-10-24
  • 打赏
  • 举报
回复
楼上的不错,帮我大忙了,UP!!!
nopain_nogain 2009-04-14
  • 打赏
  • 举报
回复
结贴!谢谢CSDN各位朋友,尽管我们不认识,但是你们的热情帮顶和出谋划策也帮助了我很多,很多。

为避免其他同行遭遇同样问题,下面我把解决这个问题的详细步骤与大家分享。
1、Java代码,classIds是报表文件需要的一个参数,在这里和给普通报表传递参数是一样的。
Map parameters = new HashMap();
parameters.put("classIds", 1);
JasperPrint jasperPrint = JasperFillManager.fillReport(report,parameters, conn);
2、jrxml文件内容
<subDataset name="SubDataset3">
<parameter name="classId" isForPrompting="true" class="java.lang.Integer"/>
<queryString>
<![CDATA[select a.name course_name,b.name course_type_name,c.marks,d.name as school_name,e.name as classname
from t_course a,t_course_type b,t_marks c,t_schoolmates d ,t_class e
where c.student_id=d.id and c.course_id=a.id and a.type_id= b.id and d.class_id=$P{classId} ]]>
</queryString>
<field name="classname" class="java.lang.String"/>
<field name="course_type_name" class="java.lang.String"/>
<field name="marks" class="java.lang.Integer"/>
<field name="school_name" class="java.lang.String"/>
<field name="course_name" class="java.lang.String"/>
</subDataset>
<parameter name="classIds" class="java.lang.Integer"/>
<queryString>
<![CDATA[select * from dual]]>
</queryString>
<columnHeader>
<band height="144">
<crosstab isRepeatColumnHeaders="false">
<reportElement x="0" y="15" width="812" height="108"/>
<crosstabDataset>
<dataset>
<datasetRun subDataset="SubDataset3">
<datasetParameter name="classId">
<datasetParameterExpression> <![CDATA[$P{classIds}]]> </datasetParameterExpression>
</datasetParameter>
<connectionExpression> <![CDATA[$P{REPORT_CONNECTION}]]> </connectionExpression>
</datasetRun>
</dataset>
</crosstabDataset>
1、红色为第一步,Java里的Map里的key和 <parameter name="classIds">是对应的,这时候他的值是1。
2、蓝色为第二步,$P{classIds}根据{}大括号里面的名字去取值,这时候他的值是1。
3、黄色为第三步, <datasetParameter name="classId">和 <subDataset/>标签里设置的 <parameter name="classId">是对应的。
这时候 <parameter name="classId">的值是1。
4、紫色为第四步,拼装SQL。
5、 <queryString>
<![CDATA[select * from dual]]>
</queryString>
外部必须要有一个结果集,这一点,我的理解是JasperReport的容错处理。
为什么这么说呢,第一点,我没有使用List包含JavaBean的方式做为数据源,传给报表。第二点,如果没有这个简单的 <queryString/>,那么对于报表来说,他就没有任何的结果集了;那么回为他没有结果集了,所以使用 <parameter/>标签定义的参数也不显示。
6、第五条,是最重要的,也是最会最容易遗忘的,我就是因为没有加外部的 <queryString/>,参数传递不进去,而昨天加班加到9点多。俺们6点下班。
Defonds 2009-04-13
  • 打赏
  • 举报
回复
mark

67,523

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧