Rapor İfadesi
Rapor ifadeleri, bir raporda hesaplanan verileri görüntülememize olanak tanıyan, JasperReports'un güçlü özellikleridir. Hesaplanan veriler, statik bir veri olmayan ve özellikle bir rapor parametresi veya veri kaynağı alanı olarak aktarılmayan verilerdir. Rapor ifadeleri, rapor parametrelerini, alanları ve statik verileri birleştirerek oluşturulur. Java dili, varsayılan olarak rapor ifadeleri yazmak için kullanılır. Groovy komut dosyası dili, JavaScript veya BeanShell komut dosyası gibi rapor ifadeleri için diğer komut dosyası dilleri, JasperReports derleyicileri tarafından desteklenir.
Bu bölüm size - yalnızca Java dili kullanılarak yazılmış oldukları varsayılarak rapor ifadelerinin nasıl çalıştığını açıklayacaktır. JRXML rapor şablonunda, ifadeleri şu şekilde tanımlayan birkaç öğe vardır:
- <variableExpression>
- <initialValueExpression>
- <groupExpression>
- <printWhenExpression>
- <imageExpression>
- <textFieldExpression>
İfade Beyanı
Temel olarak, tüm rapor ifadeleri, rapor alanlarına, rapor değişkenlerine ve rapor parametrelerine başvurabilen Java ifadeleridir.
İfadede Alan Referansı
Bir ifadede bir rapor alanı referansı kullanmak için, alanın adı arasına yerleştirilmelidir. $F{ve} aşağıda gösterildiği gibi karakter dizileri -
<textfieldexpression>
$F{Name}
</textfieldexpression>
Aşağıda, mevcut JRXML dosyamızdan bir kod parçası verilmiştir ( Rapor Tasarımları bölümü ) -
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
İfadede Değişken Referans
İfadede bir değişkene başvurmak için değişkenin adını arasına koymalıyız $V{ve} aşağıda verilen örnekte gösterildiği gibi -
<textfieldexpression>
"Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>
İfadede Parametre Referansı
Bir ifadede bir parametreye başvurmak için, parametrenin adı arasına yerleştirilmelidir. $P{ve} aşağıda verilen örnekte gösterildiği gibi -
<textfieldexpression>
"ReportTitle : " + $P{Title}
</textfieldexpression>
Aşağıda, bir ifadede parametrenin referansını gösteren mevcut JRXML dosyamızdan bir kod parçası verilmiştir. ( Rapor Tasarımları bölümünden JRXML ) -
<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>
Yukarıda gördüğünüz gibi, parametre, alan ve değişken referansları aslında gerçek Java nesneleridir. Rapor şablonunda yapılan parametre, alan veya değişken bildiriminden sınıflarını bilerek, ifadelerdeki bu nesne referansları üzerinde yöntemler bile çağırabiliriz.
Aşağıdaki örnek - java.lang.String rapor alanı "Ad" dan ilk harfin nasıl çıkarılıp görüntüleneceğini gösterir -
<textFieldExpression>
$F{Name}.substring(0, 1)
</textFieldExpression>
İfadede Kaynak Paketi Referansı
Bir ifadede bir kaynağa referans vermek için, anahtar arasına yerleştirilmelidir.$R{ve} aşağıda verilen örnekte gösterildiği gibi -
<textfieldexpression>
$R{report.title}
</textfieldexpression>
Çalışma zamanı tarafından sağlanan yerel ayara ve report.title anahtarına bağlı olarak, rapor şablonuyla ilişkili kaynak paketi yüklenir. Bu nedenle, Dize değeri kaynak paketinden ayıklanarak raporun başlığı görüntülenir. Uluslararası hale getirilmesi konusunda daha fazla bölüm bulunabilir Uluslararasılaşma .
Hesap makinesi
Hesap makinesi, rapor doldurma zamanında ifadeleri değerlendiren ve değişkenleri veya veri kümelerini artıran JasperReports'taki bir varlıktır. Derleme işlemi sırasında bilgiler derleyici tarafından üretilir ve derleme raporunda saklanır. Bu bilgiler rapor doldurma süresi boyunca net.sf.jasperreports.engine.fill.JRCalculator sınıfının bir örneğini oluşturmak için kullanılır.
Java kaynak dosyası, Java tabanlı rapor derleyicileri tarafından anında oluşturulur ve derlenir. Oluşturulan bu sınıf, JRCalculator'ın bir alt sınıfıdır ve derlenerek üretilen bayt kodu, JasperReport nesnesinin içinde saklanır. Bu bytcode, rapor doldurma zamanında yüklenir ve ortaya çıkan sınıf, ifade değerlendirmesi için gerekli hesap makinesi nesnesini elde etmek için somutlaştırılır.
Koşullu İfadeler
JasperReports, değişken ifadelerini tanımlarken if-else ifadelerini desteklemez. Bunun yerine üçlü operatörleri kullanabilirsiniz.{cond} ? {statement 1} : {statement 2}. Bu operatör, birden çok koşula bağlı olarak istenen çıktıyı elde etmek için bir Java ifadesinin içine yerleştirilebilir.
Rapordaki Koşullu İfade Örneği
Mevcut rapor şablonunu (Bölüm Rapor Tasarımları ) değiştirelim ve alan ülkesi için bir koşullu ifade ekleyelim. Gözden geçirilmiş rapor şablonu (jasper_report_template.jrxml) aşağıdaki gibidir. C: \ tools \ jasperreports-5.0.1 \ test dizinine kaydedin -
<?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>
Rapor doldurma için java kodları aşağıdaki gibidir. Dosyanın içeriğiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java gibi -
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();
}
}
}
POJO dosyasının içeriği C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java gibi -
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;
}
}
Java Bean Listemize country alanı boş olarak yeni bir kayıt ekleyeceğiz. Dosyanın içeriğiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java gibi -
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;
}
}
Rapor oluşturma
Yukarıdaki dosyayı normal ANT oluşturma sürecimizi kullanarak derleyip yürüteceğiz. Build.xml dosyasının içeriği (C: \ tools \ jasperreports-5.0.1 \ test dizinine kaydedilmiştir) aşağıda verilmiştir.
İçe aktarma dosyası - baseBuild.xml, Ortam Kurulumu bölümünden seçilir ve build.xml ile aynı dizine yerleştirilmelidir.
<?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>
Ardından komut satırı penceresini açalım ve build.xml'nin bulunduğu dizine geçelim. Son olarak, komutu yürütünant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport varsayılan hedeftir) as -
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>
Yukarıdaki derlemenin bir sonucu olarak, aşağıda verilen ekranda gösterildiği gibi bir JasperViewer penceresi açılır -
Burada, son kayda göre, ülke alanı için herhangi bir veri iletmediğimizi, "ÜLKE YOK" yazdırıldığını görüyoruz.