René Nyffenegger's collection of things on the web | |
René Nyffenegger on Oracle - Most wanted - Feedback
- Follow @renenyffenegger
|
Jasper - Subreports | ||
First example
Ex_02_00.jrxml includes Ex_02_00_sub.jrxml. Both the driving report Ex_02_00 and the subreport
Ex_02_00_sub consist of (or display) exactly one record.
Ex_02_00_sub.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 ="report name" pageWidth = "100" pageHeight = "13" columnWidth = "100" leftMargin = "0" rightMargin = "0" topMargin = "0" bottomMargin = "0" > <queryString> <![CDATA[ select 'From subreport' subreport from dual --------------]]> </queryString> <field name="SUBREPORT" class="java.lang.String"> <fieldDescription><![CDATA[]]></fieldDescription></field> <background> <band splitType="Stretch"/> </background> <title> <band height="0" splitType="Stretch"/> </title> <pageHeader> <band height="0" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="0" splitType="Stretch"/> </columnHeader> <detail> <band height="13" splitType="Stretch"> <textField> <reportElement x= "0" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{SUBREPORT}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band height="0" splitType="Stretch"/> </columnFooter> <pageFooter> <band height="0" splitType="Stretch"/> </pageFooter> <summary> <band height="0" splitType="Stretch"/> </summary> </jasperReport> Ex_02_00.jrxml
<?xml version="1.0" encoding="UTF-8"?> <!-- Subreports first: compile Ex_02_00_sub.jrxml into Ex_02_00_sub.jasper. then: compile this file (Ex_02_00.jrxml) into Ex_02_00.jasper then: run. additional notes: open source is when everybody claims everything is possible but nobody knows how. --> <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 ="Demonstrating Subreports" pageWidth = "595" pageHeight = "845" columnWidth = "595" leftMargin = "0" rightMargin = "0" topMargin = "0" bottomMargin = "0" > <queryString> <![CDATA[ select 42 forty_two, 99 ninety_nine from dual --------------]]> </queryString> <field name="FORTY_TWO" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="NINETY_NINE" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <title> <band splitType="Stretch"/> </title> <pageHeader> <band splitType="Stretch"/> </pageHeader> <columnHeader> <band splitType="Stretch"/> </columnHeader> <detail> <band height="13" splitType="Stretch"> <textField> <reportElement x= "0" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.lang.Float"><![CDATA[$F{FORTY_TWO}]]> </textFieldExpression> </textField> <textField> <reportElement x="120" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.lang.Float"><![CDATA[$F{NINETY_NINE}]]></textFieldExpression> </textField> <subreport> <reportElement x="240" y="0" width="100" height="13"/> <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression> <subreportExpression class="java.lang.String"><![CDATA["Ex_02_00_sub.jasper"]]></subreportExpression> </subreport> </band> </detail> <columnFooter> <band splitType="Stretch"/> </columnFooter> <pageFooter> <band splitType="Stretch"/> </pageFooter> <summary> <band splitType="Stretch"/> </summary> </jasperReport> Second example
Demonstrates how to pass parameters from a driving report to a subreport. Similar to the first example,
Ex_02_01.jrxml includes Ex_02_01_sub.jrxml.
Ex_02_01_sub expects two parameters, named O1 and O2 and constists of exactly one record
whose values depend on the parameter values passed to the report.
Ex_02_01 consists of for records. The sub report is «called» for each of these records. The values of $F{VAL_1} and $F{VAL_2} is
passed to the subreport within the <subreportParameter> directive.
Ex_02_01_sub.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 ="report name" pageWidth = "595" pageHeight = "13" columnWidth = "100" leftMargin = "0" rightMargin = "0" topMargin = "0" bottomMargin = "0" > <parameter name="O1" class="java.lang.Float" /> <parameter name="O2" class="java.lang.Float" /> <queryString> <![CDATA[ -------------- select $P!{O1} + $P!{O2} a, $P!{O1} - $P!{O2} b, $P!{O1} * $P!{O2} c, $P!{O1} / $P!{O2} d from dual -------------- ]]> </queryString> <field name="A" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="B" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="C" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="D" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <background> <band splitType="Stretch"/> </background> <title> <band height="0" splitType="Stretch"/> </title> <pageHeader> <band height="0" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="0" splitType="Stretch"/> </columnHeader> <detail> <band height="13" splitType="Stretch"> <textField> <reportElement x= "0" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[""+$P{O1} + " + " + $P{O2} + " = " + $F{A} ]]> </textFieldExpression> </textField> <textField> <reportElement x="150" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[""+$P{O1} + " - " + $P{O2} + " = " + $F{B} ]]> </textFieldExpression> </textField> <textField> <reportElement x="300" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[""+$P{O1} + " * " + $P{O2} + " = " + $F{C} ]]> </textFieldExpression> </textField> <textField> <reportElement x="450" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[""+$P{O1} + " / " + $P{O2} + " = " + $F{D} ]]> </textFieldExpression> </textField> </band> </detail> <columnFooter> <band height="0" splitType="Stretch"/> </columnFooter> <pageFooter> <band height="0" splitType="Stretch"/> </pageFooter> <summary> <band height="0" splitType="Stretch"/> </summary> </jasperReport> Ex_02_01.jrxml
<?xml version="1.0" encoding="UTF-8"?> <!-- Subreports first: compile Ex_02_01_sub.jrxml into Ex_02_01_sub.jasper. then: compile this file (Ex_02_00.jrxml) into Ex_02_01.jasper then: run. additional notes: open source is when everybody claims everything is possible but nobody knows how. --> <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 ="Demonstrating Subreports" pageWidth = "595" pageHeight = "845" columnWidth = "595" leftMargin = "0" rightMargin = "0" topMargin = "0" bottomMargin = "0" > <queryString> <![CDATA[ select 0 val_1, 3 val_2 from dual union all select 0.5 val_1, 3.2 val_2 from dual union all select -11.8 val_1, 7.4 val_2 from dual union all select 2.6 val_1, 13.1 val_2 from dual --------------]]> </queryString> <field name="VAL_1" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <field name="VAL_2" class="java.lang.Float"> <fieldDescription><![CDATA[]]></fieldDescription> </field> <title> <band splitType="Stretch"/> </title> <pageHeader> <band splitType="Stretch"/> </pageHeader> <columnHeader> <band splitType="Stretch"/> </columnHeader> <detail> <band height="39" splitType="Stretch"> <textField> <reportElement x= "0" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.lang.Float"><![CDATA[$F{VAL_1}]]> </textFieldExpression> </textField> <textField> <reportElement x="120" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.lang.Float"><![CDATA[$F{VAL_2}]]></textFieldExpression> </textField> <subreport isUsingCache="false"> <reportElement positionType="Float" x="0" y="13" width="200" height="13" isRemoveLineWhenBlank="true"/> <subreportParameter name="O1"><subreportParameterExpression><![CDATA[$F{VAL_1}]]></subreportParameterExpression> </subreportParameter> <subreportParameter name="O2"><subreportParameterExpression><![CDATA[$F{VAL_2}]]></subreportParameterExpression> </subreportParameter> <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression> <subreportExpression class="java.lang.String"><![CDATA["Ex_02_01_sub.jasper"]]></subreportExpression> </subreport> </band> </detail> <columnFooter> <band splitType="Stretch"/> </columnFooter> <pageFooter> <band splitType="Stretch"/> </pageFooter> <summary> <band splitType="Stretch"/> </summary> </jasperReport> Third example
The driving report places a subreport into the <pageHeader> section in order to demonstrate that
by default a subreport is executed for each new page Header.
Ex_02_02_sub.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 ="report name" pageWidth = "100" pageHeight = "13" columnWidth = "100" leftMargin = "0" rightMargin = "0" topMargin = "0" bottomMargin = "0" > <queryString> <![CDATA[ -------------- select dbms_random.value(0,100) rnd from dual -------------- ]]> </queryString> <field name="RND" class="java.math.BigDecimal"/> <detail> <band height="13" splitType="Stretch"> <textField> <reportElement x= "0" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.math.BigDecimal"><![CDATA[$F{RND}]]></textFieldExpression> </textField> </band> </detail> </jasperReport> Ex_02_02.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="Demonstrating Subreports" pageWidth="595" pageHeight="845" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0"> <queryString> <![CDATA[with t as ( select 0 d from dual union all select 1 d from dual ) select t7.d d7, t6.d d6, t5.d d5, t4.d d4, t3.d d3, t2.d d2, t1.d d1, t0.d d0, -- 1 * t0.d + 2 * t1.d + 4 * t2.d + 8 * t3.d + 16 * t4.d + 32 * t5.d + 64 * t6.d + 128 * t7.d n -- from t t0, t t1, t t2, t t3, t t4, t t5, t t6, t t7 --------------]]> </queryString> <field name="D7" class="java.lang.Short"/> <field name="D6" class="java.lang.Short"/> <field name="D5" class="java.lang.Short"/> <field name="D4" class="java.lang.Short"/> <field name="D3" class="java.lang.Short"/> <field name="D2" class="java.lang.Short"/> <field name="D1" class="java.lang.Short"/> <field name="D0" class="java.lang.Short"/> <field name="N" class="java.lang.Short"/> <pageHeader> <band height="26" splitType="Stretch"> <subreport isUsingCache="true"> <reportElement x="0" y="0" width="100" height="13"/> <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression> <subreportExpression class="java.lang.String"><![CDATA["Ex_02_02_sub.jasper"]]></subreportExpression> </subreport> </band> </pageHeader> <columnHeader> <band splitType="Stretch"/> </columnHeader> <detail> <band height="13" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D7}]]></textFieldExpression> </textField> <textField> <reportElement x="10" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D6}]]></textFieldExpression> </textField> <textField> <reportElement x="20" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D5}]]></textFieldExpression> </textField> <textField> <reportElement x="30" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D4}]]></textFieldExpression> </textField> <textField> <reportElement x="40" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D3}]]></textFieldExpression> </textField> <textField> <reportElement x="50" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D2}]]></textFieldExpression> </textField> <textField> <reportElement x="60" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D1}]]></textFieldExpression> </textField> <textField> <reportElement x="70" y="0" width="10" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{D0}]]></textFieldExpression> </textField> <textField> <reportElement x="100" y="0" width="30" height="13"/> <textElement/> <textFieldExpression class="java.lang.Short"><![CDATA[$F{N}]]></textFieldExpression> </textField> </band> </detail> </jasperReport> Fourth example
This example demonstrats a subreport that returns multiple records rather than one.
Ex_02_03_sub.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 ='report name' pageWidth = '595' pageHeight = '13' columnWidth = '100' leftMargin = '0' rightMargin = '0' topMargin = '0' bottomMargin = '0' > <queryString> <![CDATA[ select 'but' col_s from dual union all select 'these' col_s from dual union all select 'come' col_s from dual union all select 'from' col_s from dual union all select 'the' col_s from dual union all select 'subreport' col_s from dual ]]> </queryString> <field name='COL_S' class="java.lang.String"/> <detail> <band height='13'> <textField> <reportElement x= "0" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{COL_S}]]> </textFieldExpression> </textField> </band> </detail> </jasperReport> Ex_02_03.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="Demonstrating Subreports" pageWidth="595" pageHeight="845" columnWidth="595" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0"> <queryString> <![CDATA[ select 'these' col_1 from dual union all select 'values' col_1 from dual union all select 'are' col_1 from dual union all select 'returned' col_1 from dual union all select 'by' col_1 from dual union all select 'the' col_1 from dual union all select 'datasource' col_1 from dual union all select 'that' col_1 from dual union all select 'is' col_1 from dual union all select 'embedded' col_1 from dual union all select 'in' col_1 from dual union all select 'the' col_1 from dual union all select 'driving' col_1 from dual union all select 'report' col_1 from dual]]> </queryString> <field name="COL_1" class="java.lang.String"/> <detail> <band height="61"> <textField> <reportElement x="0" y="0" width="100" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{COL_1}]]></textFieldExpression> </textField> <subreport> <reportElement x="240" y="0" width="100" height="31"/> <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression> <subreportExpression class="java.lang.String"><![CDATA["Ex_02_03_sub.jasper"]]></subreportExpression> </subreport> </band> </detail> </jasperReport> Fifth example
The driving report is not really a report as it has no meaningful query. It's used as a container for subreports. In order
for the subreports to be shown, a dummy query is used.
Ex_02_04_sub.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 ='report name' pageWidth = '595' pageHeight = '13' columnWidth = '100' leftMargin = '0' rightMargin = '0' topMargin = '0' bottomMargin = '0' > <queryString> <![CDATA[ select '*ONE*' col_s from dual union all select 'record' col_s from dual union all select 'in' col_s from dual union all select 'the' col_s from dual union all select '''driving''' col_s from dual union all select 'report' col_s from dual union all select 'causes' col_s from dual union all select '*ONE*' col_s from dual union all select 'execution' col_s from dual union all select 'of' col_s from dual union all select 'the' col_s from dual union all select 'subreport''s' col_s from dual union all select 'query' col_s from dual ]]> </queryString> <field name='COL_S' class="java.lang.String"/> <detail> <band height='13'> <textField> <reportElement x= "0" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{COL_S}]]> </textFieldExpression> </textField> </band> </detail> </jasperReport> Ex_02_04.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 ='report name' pageWidth = '595' pageHeight = '200' columnWidth = '100' leftMargin = '0' rightMargin = '0' topMargin = '0' bottomMargin = '0' > <queryString> <![CDATA[ select dummy from dual ]]> </queryString> <field name='DUMMY' class="java.lang.String"/> <detail> <band height="61" splitType="Stretch"> <!-- <textField> <reportElement x= "0" y="0" width="150" height="13"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{DUMMY}]]> </textFieldExpression> </textField> --> <subreport> <reportElement x="240" y="0" width="100" height="31"/> <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression> <subreportExpression class="java.lang.String"><![CDATA["Ex_02_04_sub.jasper"]]></subreportExpression> </subreport> </band> </detail> </jasperReport>
See also other Jasper examples.
|