Laporkan Ekspresi
Ekspresi laporan adalah fitur canggih JasperReports, yang memungkinkan kami menampilkan data yang dihitung pada laporan. Data yang dihitung adalah data yang bukan merupakan data statis dan tidak secara khusus diteruskan sebagai parameter laporan atau kolom sumber data. Ekspresi laporan dibuat dari menggabungkan parameter laporan, bidang, dan data statis. Bahasa Java digunakan untuk menulis ekspresi laporan secara default. Bahasa skrip lain untuk ekspresi laporan seperti bahasa skrip Groovy, JavaScript, atau skrip BeanShell didukung oleh kompiler JasperReports.
Bab ini akan menjelaskan kepada Anda - bagaimana cara kerja ekspresi laporan, dengan asumsi bahwa ekspresi tersebut telah ditulis menggunakan bahasa Java saja. Dalam templat laporan JRXML, ada beberapa elemen yang mendefinisikan ekspresi sebagai -
- <variableExpression>
- <initialValueExpression>
- <groupExpression>
- <printWhenExpression>
- <imageExpression>
- <textFieldExpression>
Pernyataan Ekspresi
Pada dasarnya, semua ekspresi laporan adalah ekspresi Java, yang dapat mereferensikan bidang laporan, variabel laporan, dan parameter laporan.
Referensi Bidang dalam Ekspresi
Untuk menggunakan referensi bidang laporan dalam sebuah ekspresi, nama bidang harus diletakkan di antara $F{dan} urutan karakter, seperti yang ditunjukkan di bawah ini -
<textfieldexpression>
$F{Name}
</textfieldexpression>
Berikut ini adalah bagian kode dari file JRXML kami yang sudah ada ( Desain Laporan bab ) -
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
Referensi Variabel dalam Ekspresi
Untuk mereferensikan variabel dalam ekspresi, kita harus meletakkan nama variabel di antaranya $V{dan} seperti yang ditunjukkan pada contoh yang diberikan di bawah ini -
<textfieldexpression>
"Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>
Referensi Parameter dalam Ekspresi
Untuk mereferensikan parameter dalam ekspresi, nama parameter harus diletakkan di antara $P{dan} seperti yang ditunjukkan pada contoh yang diberikan di bawah ini -
<textfieldexpression>
"ReportTitle : " + $P{Title}
</textfieldexpression>
Berikut ini adalah potongan kode dari file JRXML kami yang ada, yang menunjukkan referensi parameter dalam ekspresi. (JRXML dari Desain Laporan bab ) -
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA["Title"]]>
</anchorNameExpression>
</textField>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "40" width = "515" height = "20"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
Seperti yang Anda lihat di atas, parameter, kolom, dan referensi variabel sebenarnya adalah objek Java yang sebenarnya. Mengetahui kelas mereka dari parameter, bidang, atau deklarasi variabel yang dibuat dalam templat laporan, kita bahkan dapat memanggil metode pada referensi objek tersebut dalam ekspresi.
Contoh berikut menunjukkan - cara mengekstrak dan menampilkan huruf pertama dari kolom laporan java.lang.String "Nama" -
<textFieldExpression>
$F{Name}.substring(0, 1)
</textFieldExpression>
Referensi Paket Sumber Daya dalam Ekspresi
Untuk mereferensikan sumber daya dalam ekspresi, kunci harus diletakkan di antara$R{dan} seperti yang ditunjukkan pada contoh yang diberikan di bawah ini -
<textfieldexpression>
$R{report.title}
</textfieldexpression>
Berdasarkan lokal yang disediakan waktu proses dan kunci report.title , paket sumber daya yang terkait dengan template laporan dimuat. Oleh karena itu, judul laporan ditampilkan dengan mengekstrak nilai String dari paket sumber daya. Lebih lanjut tentang internasionalisasi dapat ditemukan di bab Internasionalisasi .
Kalkulator
Kalkulator adalah entitas di JasperReports, yang mengevaluasi ekspresi dan menambahkan variabel atau kumpulan data pada waktu pengisian laporan. Selama proses kompilasi, informasi diproduksi dan disimpan dalam laporan kompilasi oleh penyusun. Informasi ini digunakan selama waktu pengisian laporan untuk membuat instance kelas net.sf.jasperreports.engine.fill.JRCalculator.
File sumber Java dibuat dan dikompilasi oleh penyusun laporan berbasis Java dengan cepat. Kelas yang dihasilkan ini adalah subkelas JRCalculator, dan bytecode yang dihasilkan dengan mengompilasinya disimpan di dalam objek JasperReport. Bytcode ini dimuat pada waktu pengisian laporan dan kelas yang dihasilkan dibuat untuk mendapatkan objek kalkulator yang diperlukan untuk evaluasi ekspresi.
Ekspresi Bersyarat
JasperReports tidak mendukung pernyataan if-else saat mendefinisikan ekspresi variabel. Sebagai gantinya, Anda dapat menggunakan operator terner{cond} ? {statement 1} : {statement 2}. Operator ini dapat ditempatkan di dalam ekspresi Java untuk mendapatkan keluaran yang diinginkan berdasarkan beberapa kondisi.
Contoh Ekspresi bersyarat dalam Laporan
Mari memodifikasi templat laporan yang ada ( Desain Laporan Bab ) dan menambahkan ekspresi kondisional untuk negara bidang. Template laporan yang direvisi (jasper_report_template.jrxml) adalah sebagai berikut. Simpan ke direktori C: \ tools \ jasperreports-5.0.1 \ test -
<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
"//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<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" pageWidth = "595" pageHeight = "842"
columnWidth = "515" leftMargin = "40" rightMargin = "40"
topMargin = "50" bottomMargin = "50">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<field name = "country" class = "java.lang.String">
<fieldDescription><![CDATA[country]]></fieldDescription>
</field>
<field name = "name" class = "java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<sortField name = "country" order = "Descending"/>
<sortField name = "name"/>
<title>
<band height = "70">
<line>
<reportElement x = "0" y = "0" width = "515" height = "1"/>
</line>
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA["Title"]]>
</anchorNameExpression>
</textField>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "40" width = "515" height = "20"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
</band>
</title>
<columnHeader>
<band height = "23">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
backcolor = "#70A9A9" />
<box>
<bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
</box>
<textElement />
<text>
<![CDATA[]]>
</text>
</staticText>
<staticText>
<reportElement x = "414" y = "3" width = "121" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true" />
</textElement>
<text><![CDATA[Country]]></text>
</staticText>
<staticText>
<reportElement x = "0" y = "3" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font isBold = "true" />
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height = "16">
<staticText>
<reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
backcolor = "#E5ECF9" />
<box>
<bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
</box>
<textElement />
<text>
<![CDATA[]]>
</text>
</staticText>
<textField>
<reportElement x = "414" y = "0" width = "121" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle">
<font size = "9" />
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}.isEmpty() ? "NO COUNTRY" : $F{country}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle" />
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Kode java untuk pengisian laporan adalah sebagai berikut. Isi fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java adalah sebagai -
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.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
Isi file POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java adalah sebagai -
package com.tutorialspoint;
public class DataBean {
private String name;
private String country;
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;
}
}
Kami akan menambahkan rekor baru dengan bidang negara sebagai kosong di Daftar kacang Java kami. Isi fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java adalah sebagai -
package com.tutorialspoint;
import java.util.ArrayList;
public class DataBeanList {
public ArrayList<DataBean> getDataBeanList() {
ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
dataBeanList.add(produce("Manisha", "India"));
dataBeanList.add(produce("Dennis Ritchie", "USA"));
dataBeanList.add(produce("V.Anand", "India"));
dataBeanList.add(produce("Shrinath", "California")); dataBeanList.add(produce("Tanmay", ""));
return dataBeanList;
}
/**
* This method returns a DataBean object,
* with name and country set in it.
*/
private DataBean produce(String name, String country) {
DataBean dataBean = new DataBean();
dataBean.setName(name);
dataBean.setCountry(country);
return dataBean;
}
}
Pembuatan Laporan
Kami akan mengkompilasi dan mengeksekusi file di atas menggunakan proses build ANT reguler kami. Konten file build.xml (disimpan di bawah direktori C: \ tools \ jasperreports-5.0.1 \ test) 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.JasperReportFill (viewFullReport adalah target default) sebagai -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
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 build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 3 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.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
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: 5 minutes 5 seconds
C:\tools\jasperreports-5.0.1\test>
Sebagai hasil dari kompilasi di atas, jendela JasperViewer terbuka seperti yang ditunjukkan pada layar di bawah ini -
Di sini, kita bisa melihat, sebagai record terakhir, kita tidak melewatkan data apapun untuk field country, "NO COUNTRY" sedang dicetak.