Buat SubLaporan

Sublaporan adalah salah satu fitur bagus dari JasperReports. Fitur ini memungkinkan penggabungan laporan ke dalam laporan lain, yaitu, satu laporan dapat menjadi sublaporan dari yang lain. Sublaporan membantu kami menjaga desain laporan tetap sederhana, karena kami dapat membuat banyak laporan sederhana dan merangkumnya menjadi laporan master. Sublaporan disusun dan diisi seperti laporan biasa. Templat laporan apa pun bisa digunakan sebagai sublaporan saat dimasukkan ke templat laporan lain, tanpa ada yang diubah di dalamnya (templat laporan).

Sublaporan seperti template laporan biasa. Mereka sebenarnya adalah objek net.sf.jasperreports.engine.JasperReport , yang diperoleh setelah mengompilasi objek net.sf.jasperreports.engine.design.JasperDesign .

Elemen <subreport>

Elemen <subreport> digunakan saat memasukkan sublaporan ke dalam laporan master. Berikut adalah daftar sub-elemen dalam elemen <subreport> JRXML.

  • <reportElement>

  • <parametersMapExpression> - Ini digunakan untuk meneruskan peta yang berisi parameter laporan ke sublaporan. Peta biasanya diperoleh dari parameter dalam laporan master, atau dengan menggunakan parameter REPORTS_PARAMETERS_MAP bawaan untuk meneruskan parameter laporan induk ke sublaporan. Ekspresi ini harus selalu mengembalikan objek java.util.Map dengan kuncinya adalah nama parameter.

  • <subreportParameter> - Elemen ini digunakan untuk meneruskan parameter ke sublaporan. Ini memiliki nama atribut , yang wajib diisi.

  • <connectionExpression> - Ini digunakan untuk meneruskan java.sql.Connection ke subreport. Ini digunakan hanya ketika templat sublaporan membutuhkan koneksi database selama fase pengisian laporan.

  • <dataSourceExpression> - Ini digunakan untuk meneruskan sumber data ke sublaporan. Sumber data ini biasanya diperoleh dari parameter dalam laporan master atau dengan menggunakan parameter REPORT_DATA_SOURCE bawaan untuk meneruskan sumber data laporan induk ke sublaporan.

  • Elemen ( connectionExpression dan dataSourceExpression ) tidak bisa hadir pada saat yang sama dalam deklarasi elemen <subreport>. Ini karena kami tidak dapat menyediakan sumber data dan koneksi ke sublaporan. Kita harus memutuskan salah satunya dan menaatinya.

  • <returnValue> - Ini digunakan untuk menetapkan nilai salah satu variabel sublaporan ke salah satu variabel laporan master. Sub elemen ini memiliki atribut sebagai berikut -

    • subreportVariable - Atribut ini menentukan nama variabel subreport yang nilainya akan dikembalikan.

    • toVariable - Atribut ini menentukan nama variabel laporan induk yang nilainya akan disalin / bertambah dengan nilai dari sublaporan.

    • kalkulasi - Atribut ini dapat mengambil nilai: Nothing, Count, DistinctCount, Sum, Average, Terendah, Tertinggi, Standar Deviasi, Varians. Nilai default untuk kalkulasi atribut adalah "Tidak ada".

    • incrementerFactoryClass - Atribut ini menetapkan kelas pabrik untuk membuat instance incrementer.

  • <subreportExpression> - Ini menunjukkan di mana menemukan templat laporan yang dikompilasi untuk sublaporan. Elemen ini memilikiclassatribut. The kelas atribut dapat mengambil nilai-nilai ini: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. Nilai defaultnya adalah java.lang.String .

  • isUsingCache - Ini adalah atribut dari elemen <subreport>. Ini adalah Boolean, jika disetel ke true , mesin pelaporan akan mencoba mengenali objek template sublaporan yang dimuat sebelumnya, menggunakan sumber yang ditentukan. Fungsionalitas caching ini hanya tersedia untuk elemen sublaporan yang memiliki ekspresi yang mengembalikan objek java.lang.String sebagai sumber template sublaporan, mewakili nama file, URL, atau resource classpath.

Contoh

Mari kita ambil contoh sederhana untuk mendemonstrasikan pembuatan sublaporan menggunakan JRDataSource. Pertama-tama, mari kita tulis dua template laporan baru, satu sublaporan dan laporan Master lainnya. Isi template subreport (address_report_template.jrxml) seperti yang diberikan di bawah ini. Simpan ke direktori C: \ tools \ jasperreports-5.0.1 \ test.

<?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 = "address_report_template" pageWidth = "175" pageHeight = "842" 
   columnWidth = "175" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0">

   <field name = "city" class = "java.lang.String"/>
   <field name = "street" class = "java.lang.String"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "20" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "14" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Addresses]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "12" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "12" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "27" splitType = "Stretch">
         
         <textField>
            <reportElement x = "0" y = "0" width = "120" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{city}+" Address:"]]>
            </textFieldExpression>
         </textField>
         
         <textField isStretchWithOverflow = "true">
            <reportElement x = "120" y = "0" width = "435" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{street}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "8" splitType = "Stretch"/>
   </columnFooter>
  
   <pageFooter>
      <band height = "11" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "9" splitType = "Stretch"/>
   </summary>

</jasperReport>

Saat kami menggunakan sumber data, kami perlu menulis file POJO yang sesuai SubReportBean.java seperti gambar dibawah. Simpan ke direktori C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint -

package com.tutorialspoint;

public class SubReportBean {
   private String city;
   private String street;

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   public String getStreet() {
      return street;
   }

   public void setStreet(String street) {
      this.street = street;
   }
}

Di sini, kami telah mendeklarasikan dua bidang 'kota' dan 'jalan' dan masing-masing metode pengambil dan penyetel ditentukan.

Sekarang, mari perbarui yang ada DataBeanmengajukan. Kami akan menambahkan bidang subReportBeanList baru , yang merupakan java.util.List. Bidang ini akan menyimpan daftar objek SubReportBean. Isi dari file DataBean adalah sebagai berikut. Simpan ke direktori C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import java.util.List;

public class DataBean {
   private String name;
   private String country;
   private List<SubReportBean> subReportBeanList;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }

   public List<SubReportBean> getSubReportBeanList() {
      return subReportBeanList;
   }

   public void setSubReportBeanList(List<SubReportBean> subReportBeanList) {
      this.subReportBeanList = subReportBeanList;
   }
}

Sekarang mari perbarui file C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \DataBeanList.java. Isi file ini adalah sebagai -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {

      // Create sub report data
      SubReportBean subBean1 = new SubReportBean();
      subBean1.setCity("Mumbai");
      subBean1.setStreet("M.G.Road");
      SubReportBean subBean2 = new SubReportBean();
      subBean2.setCity("New York");
      subBean2.setStreet("Park Street");
      SubReportBean subBean3 = new SubReportBean();
      subBean3.setCity("San Fransisco");
      subBean3.setStreet("King Street");

      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      // Create master report data
      dataBeanList.add(produce("Manisha", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Dennis Ritchie", "USA",
         Arrays.asList(subBean2)));
      dataBeanList.add(produce("V.Anand", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Shrinath", "California",
         Arrays.asList(subBean3)));

      return dataBeanList;
   }

   /*
    * This method returns a DataBean object,
    * with name, country and sub report
    * bean data set in it.
    */
   private DataBean produce(String name, String country,
      List<SubReportBean> subBean) {
      DataBean dataBean = new DataBean();

      dataBean.setName(name);
      dataBean.setCountry(country);
      dataBean.setSubReportBeanList(subBean);

      return dataBean;
   }
}

Dalam metode produksi () di file di atas, kami menyetel daftar SubReportBean.

Sekarang, mari buat template laporan master baru (jasper_report_template.jrxml). Simpan file ini ke direktoriC:\tools\jasperreports-5.0.1\test. Isi file ini adalah sebagai berikut -

<?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 = "jasper_report_template" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth ="555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "SUBREPORT_DIR" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression>
         <![CDATA["C:\\tools\\jasperreports-5.0.1\\test\\"]]>
      </defaultValueExpression>
   </parameter>
   
   <field name = "country" class = "java.lang.String"/>
   <field name = "name" class = "java.lang.String"/>
   <field name = "subReportBeanList" class = "java.util.List"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "35" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "204" height = "34"/>
            
            <textElement>
               <font size = "26" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Contact Report]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "17" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "21" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "112" splitType = "Stretch">
            
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Name:]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "20" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Country:]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "104" y = "0" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "104" y = "20" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <subreport>
            <reportElement positionType = "Float" x = "335" y = "25" width = "175"
               height = "20" isRemoveLineWhenBlank = "true" backcolor = "#99ccff"/>

            <dataSourceExpression>
               new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
                  ($F{subReportBeanList})
            </dataSourceExpression>
            
            <subreportExpression class = "java.lang.String">
               <![CDATA[$P{SUBREPORT_DIR} + "address_report_template.jasper"]]>
            </subreportExpression>
         </subreport>
         
         <line>
            <reportElement x = "0" y = "50" width = "550" height = "1"/>
         </line>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "19" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "18" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "14" splitType = "Stretch"/>
   </summary>

</jasperReport>

Dalam template di atas, kami telah menetapkan parameter baru "SUBREPORT_DIR", yang menentukan jalur sublaporan. Kami telah mendefinisikan subReportBeanList bidang jenis java.util.List, yang sesuai dengan properti di file DataBean. Elemen <subreport> memiliki sub-elemen <dataSourceExpression>. Kami telah meletakkan daftar subReportBeanList dalam sebuah instance JRBeanCollectionDataSource. Di sub-elemen <subreportExpression />, kami telah memberikan nama sublaporan (AddressReport.jasper).

Sekarang, mari kita menulis kelas baru CreateReportuntuk mengkompilasi dan menjalankan templat laporan kami. Isi fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java seperti yang diberikan di bawah ini -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class CreateReport {

   public static void main(String[] args) {
      String masterReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.jrxml";
      String subReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/AddressReport.jrxml";
      String destFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.JRprint";
			
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      try {
         /* Compile the master and sub report */
         JasperReport jasperMasterReport = JasperCompileManager
            .compileReport(masterReportFileName);
         JasperReport jasperSubReport = JasperCompileManager
            .compileReport(subReportFileName);

         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("subreportParameter", jasperSubReport);
         JasperFillManager.fillReportToFile(jasperMasterReport, 
            destFileName, parameters, beanColDataSource);

      } catch (JRException e) {

         e.printStackTrace();
      }
      System.out.println("Done filling!!! ...");
   }
}

Di sini, kita melihat bahwa kita sedang mengompilasi template master dan sub report dan meneruskan file master report (.jasper) untuk pengisian laporan.

Pembuatan Laporan

Sekarang, semua file kita sudah siap, mari kita kompilasi dan jalankan menggunakan proses build ANT reguler kita. Isi dari file build.xml (disimpan di bawah direktori C: \ tools \ jasperreports-5.0.1 \ test) seperti yang diberikan di bawah ini.

File impor - baseBuild.xml diambil dari bab Pengaturan Lingkungan dan harus ditempatkan di direktori yang sama dengan build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the 
      report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
   </target>
   
   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">
      
      <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath" />
      </taskdef>
      
      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>
		
   </target>

</project>

Selanjutnya, buka jendela baris perintah dan buka direktori tempat build.xml ditempatkan. Terakhir, jalankan perintahant -Dmain-class=com.tutorialspoint.CreateReport (viewFullReport adalah target default) sebagai berikut -

Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28: 
      warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 7 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\
      jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.CreateReport
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done filling!!! ...

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 72 minutes 13 seconds

Sebagai hasil dari kompilasi di atas, jendela JasperViewer terbuka seperti yang ditunjukkan pada layar di bawah ini -

Di sini, kita dapat melihat atribut Name, Country, dan Address yang ditampilkan.