Jasper reports 如何将子报表值传递给主报表?

Jasper reports 如何将子报表值传递给主报表?,jasper-reports,Jasper Reports,这是关系表 StudentName Course Marks Peter Bio 65 Peter Chem 70 Peter Music 80 David Chem 50 如何制作以下内容 Peter Total : 215 Subject : Bio - 65 Subject : Chem - 70 Subject : Music - 80 Peter Total : 50 Subject : C

这是关系表

StudentName
Course
Marks



Peter
Bio
65

Peter
Chem
70



Peter
Music
80



David
Chem
50
如何制作以下内容

Peter            Total : 215

Subject : Bio    -   65
Subject : Chem   -   70
Subject : Music  -   80

Peter            Total : 50

Subject : Chem   -   50

我不会为此使用子报表,因为这可以通过更简单的方式实现:您可以利用报表组和变量来实现。确保数据按照输出进行了相应的排序

准备

  • 基于StudentName创建报告组。在报表检查器的iReport中右键单击报表,然后选择“添加报表组”。按照向导操作,为其命名(例如,
    Student
    ),选择field
    StudentName
    作为组表达式,添加页眉但不添加页脚
  • 创建一个用于保存学生总数的变量。在报表检查器的iReport中单击鼠标右键“变量”,然后选择“添加变量”。在属性面板中,配置如下:名称:totalMarkByStudent,变量类:java.lang.Long,计算:Sum,重置类型:Group,重置组:Student,变量表达式:$F{Marks}。将其余部分保留为其默认值
报告设计

  • 将字段
    StudentName
    从报表检查器拖放到报表设计器中的学生组标题栏中。将出现一个弹出窗口,询问应显示哪种类型的值,选择字段值并单击“确定”
  • 将变量
    totalMarksByStudent
    从报表检查器拖放到报表设计器中的学生组标题栏中。单击文本字段并在“属性”面板中修改以下设置:

    • 宽度:
      200
      (以允许更多空间)
    • 文本字段表达式:
      “总计:+$V{totalMarkByStudent}
    • 表达式类:
      java.lang.String
    • 求值时间:
      (意味着一旦组的处理完成,就会对值进行求值)
    • 评估组:
      学生
  • 将字段和标记从报表检查器拖放到报表设计器的详细信息栏中。在课程字段上单击鼠标右键,然后选择“编辑表达式”。将表达式更改为
    “Subject:+$F{Course}
    ,然后单击Apply

通过此配置,您可以实现下图所示的报告输出。

以下是使用报告组和变量的完整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>

如果改用子报表

我假设子报表与显示给定学生数据的学生id并行化。主报告在详细信息面板中显示字段
StudentName
和子报告

  • 在子报表中创建一个变量
    total
    ,用于计算学生的总数
  • 在主报告中创建一个变量
    totalByStudent
    ,计算类型设置为
    System
  • 单击子报表,然后在“属性”面板中单击“返回值”。单击添加并选择:子报表变量:总计,本地目标变量:totalByStudent,其余保留默认值。点击Ok
  • 将变量
    totalByStudent
    拖放到详细信息栏中。选择它,然后在“属性”面板中将“计算时间”设置为“带”。输出将与上面显示的相同

我建议使用带有报表组和变量的方法,因为它降低了报表的复杂性,并且这种方法的性能会更好

我不会为此使用子报表,因为这可以通过更简单的方式实现:您可以利用报表组和变量来实现。确保数据按照输出进行了相应的排序

准备

  • 基于StudentName创建报告组。在报表检查器的iReport中右键单击报表,然后选择“添加报表组”。按照向导操作,为其命名(例如,
    Student
    ),选择field
    StudentName
    作为组表达式,添加页眉但不添加页脚
  • 创建一个用于保存学生总数的变量。在报表检查器的iReport中单击鼠标右键“变量”,然后选择“添加变量”。在属性面板中,配置如下:名称:totalMarkByStudent,变量类:java.lang.Long,计算:Sum,重置类型:Group,重置组:Student,变量表达式:$F{Marks}。将其余部分保留为其默认值
报告设计

  • 将字段
    StudentName
    从报表检查器拖放到报表设计器中的学生组标题栏中。将出现一个弹出窗口,询问应显示哪种类型的值,选择字段值并单击“确定”
  • 将变量
    totalMarksByStudent
    从报表检查器拖放到报表设计器中的学生组标题栏中。单击文本字段并在“属性”面板中修改以下设置:

    • 宽度:
      200
      (以允许更多空间)
    • 文本字段表达式:
      “总计:+$V{totalMarkByStudent}
    • 表达式类:
      java.lang.String
    • 求值时间:
      (意味着一旦组的处理完成,就会对值进行求值)
    • 评估组:
      学生
  • 将字段课程和标记从报表检查器拖放到deta中