这是关系表
StudentName
Course
Marks
Peter
Bio
65
Peter
Chem
70
Peter
Music
80
David
Chem
50
Run Code Online (Sandbox Code Playgroud)
我该如何制作以下内容
Peter Total : 215
Subject : Bio - 65
Subject : Chem - 70
Subject : Music - 80
Peter Total : 50
Subject : Chem - 50
Run Code Online (Sandbox Code Playgroud)
我不会为此使用子报表,因为这可以通过更简单的方式来实现:您可以利用报表组和变量来实现此目的。确保数据根据输出进行了排序。
制备
Student),选择字段StudentName作为组表达式,添加页眉但不添加页脚。报告设计
StudentName从报表检查器拖放到报表设计器中的“学生”组标题栏中。将出现一个弹出窗口,询问将显示哪种类型的值,选择“字段值”,然后单击“确定”。将变量totalMarksByStudent 从报表检查器拖放到报表设计器的“学生”组标题栏中。单击文本字段,然后在属性面板中修改以下设置:
200以留出更多空间)"Total : " + $V{totalMarkByStudent}java.lang.StringGroup意味着该值将在组的处理完成后得到评估)Student将“ 课程和标记 ”字段从报表检查器拖放到报表设计器的明细栏中。右键单击课程字段,然后选择“ 编辑表达式”。将表达式更改为"Subject : " + $F{Course},然后单击“应用”。
使用此配置,您将获得下图所示的报告输出。

要进一步参考,请参见使用报告组和变量的完整JRXML:
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report3" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="0dfbb9b2-a9ce-4447-beee-37d653140dd1">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString>
<![CDATA[select * from (
Select 'Peter' as StudentName, 'Bio' as Course, 65 as Marks
union select 'Peter', 'Chem', 70
union select 'Peter', 'Music', 80
union select 'David', 'Chem', 50
) tbl
order by StudentName, Course]]>
</queryString>
<field name="StudentName" class="java.lang.String"/>
<field name="Course" class="java.lang.String"/>
<field name="Marks" class="java.lang.Long"/>
<variable name="totalMarkByStudent" class="java.lang.Long" resetType="Group" resetGroup="Student" calculation="Sum">
<variableExpression><![CDATA[$F{Marks}]]></variableExpression>
</variable>
<group name="Student">
<groupExpression><![CDATA[$F{StudentName}]]></groupExpression>
<groupHeader>
<band height="50">
<textField>
<reportElement uuid="ea996b6c-d41d-47bb-bef1-5df580b5c161" x="0" y="30" width="100" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{StudentName}]]></textFieldExpression>
</textField>
<textField evaluationTime="Group" evaluationGroup="Student">
<reportElement uuid="8ddc9b5b-9c57-4fce-8ed0-587c6b54143c" x="180" y="30" width="200" height="20"/>
<textElement/>
<textFieldExpression><![CDATA["Total : " + $V{totalMarkByStudent}]]></textFieldExpression>
</textField>
</band>
</groupHeader>
</group>
<detail>
<band height="20">
<textField>
<reportElement uuid="f67b4e51-4da6-4758-b3d3-bd75de70c0f7" x="0" y="0" width="180" height="20"/>
<textElement/>
<textFieldExpression><![CDATA["Subject : " + $F{Course}]]></textFieldExpression>
</textField>
<textField>
<reportElement uuid="ea82c278-d2f3-4467-bf5d-8dab9ff99ae3" x="180" y="0" width="277" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$F{Marks}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Run Code Online (Sandbox Code Playgroud)
如果您改用子报表
我假设该子报表已使用学生ID进行了参数化处理,以显示给定学生的数据。主报告StudentName在详细信息面板中显示该字段和子报表。
total在子报表中,用于计算学生的总数。totalByStudent在主报表中创建一个变量,将计算类型设置为System。totalByStudent到明细栏中。选择它,然后在“属性”面板中将“评估时间”设置为Band。输出将与上面显示的相同。我建议对报告组和变量使用此方法,因为它可以降低报告的复杂性,并且这种方法的性能会更好。
| 归档时间: |
|
| 查看次数: |
2135 次 |
| 最近记录: |