Zmienne raportu
Zmienne raportu to specjalne obiekty utworzone na podstawie wyrażenia raportu.
Zmienne raportu upraszczają następujące zadania -
Wyrażenia raportu, które są często używane w szablonie raportu. Te wyrażenia można zadeklarować tylko raz, używając zmiennych raportu.
Zmienne raportu mogą wykonywać różne obliczenia na podstawie odpowiednich wartości wyrażeń, takich jak liczba, suma, średnia, najniższa, najwyższa, wariancja itp.
Jeśli zmienne są zdefiniowane w projekcie raportu, można do nich odwoływać się za pomocą nowych zmiennych w wyrażeniach. Dlatego kolejność, w jakiej zmienne są deklarowane w projekcie raportu, jest ważna.
Deklaracja zmiennej
Deklaracja zmiennej wygląda następująco -
<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
incrementGroup = "CityGroup" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
Jak widać powyżej, element <variable> zawiera wiele atrybutów. Te atrybuty są podsumowane poniżej -
Atrybut nazwy
Podobnie jak w przypadku parametrów i pól , atrybut name elementu </variable> jest obowiązkowy. Umożliwia odwoływanie się do zmiennej poprzez jej zadeklarowaną nazwę w wyrażeniach raportu.
Atrybut klasy
Klasa atrybut jest również obowiązkowe, które określa nazwę klasy dla wartości zmiennych. Jego domyślną wartością jest java.lang.String . Można to zmienić na dowolną klasę dostępną w ścieżce klas, zarówno w czasie kompilacji raportu, jak i podczas wypełniania raportu. Silnik dba o rzutowanie typów w wyrażeniach raportu, w których używany jest token $ V {}, dlatego ręczne rzutowanie typów nie jest wymagane.
Obliczenie
Ten atrybut określa - jakie obliczenia wykonać na zmiennej podczas wypełniania raportu. W poniższych podrozdziałach opisano wszystkie możliwe wartości atrybutu obliczeniowego elementu <variable>.
Średnia - wartość zmiennej jest średnią wszystkich niezerowych wartości wyrażenia zmiennej. Dotyczy tylko zmiennych numerycznych.
Licznik - wartość zmiennej to liczba niezerowych wystąpień wyrażenia zmiennej.
First - Wartość zmiennej to wartość pierwszego wystąpienia wyrażenia zmiennej. Kolejne wartości są ignorowane.
Najwyższa - wartość zmiennej to najwyższa wartość wyrażenia zmiennej.
Najniższa - wartość zmiennej to najniższa wartość wyrażenia zmiennej w raporcie.
Nic - na zmiennej nie są wykonywane żadne obliczenia.
Odchylenie standardowe - wartość zmiennej jest odchyleniem standardowym wszystkich wartości innych niż null pasujących do wyrażenia raportu. Dotyczy tylko zmiennych numerycznych.
Suma - wartość zmiennej to suma wszystkich wartości innych niż null zwróconych przez wyrażenie raportu.
System - wartość zmiennej jest obliczeniem niestandardowym (samodzielne obliczanie wartości tej zmiennej przy użyciu funkcji skryptletów JasperReports).
Wariancja - wartość zmiennej to wariancja wszystkich wartości innych niż null zwracanych przez ocenę wyrażenia zmiennej raportu.
Incrementer FactoryClass
Ten atrybut określa klasę używaną do obliczania wartości zmiennej podczas wypełniania bieżącego rekordu w raporcie. Wartością domyślną byłaby implementacja dowolnej klasynet.sf.jasperreports.engine.fill.JRIncrementerFactory. Klasa fabryczna będzie używana przez silnik do tworzenia instancji obiektów przyrostowych w czasie wykonywania w zależności od atrybutu obliczeń ustawionego dla zmiennej.
IncrementType
To określa, kiedy ponownie obliczyć wartość zmiennej. Ten atrybut używa wartości, jak poniżej -
Kolumna - wartość zmiennej jest ponownie obliczana na końcu każdej kolumny.
Grupa - wartość zmiennej jest obliczana ponownie, gdy zmienia się grupa określona przez parametr IncrementGroup.
Brak - wartość zmiennej jest ponownie obliczana z każdym rekordem.
Strona - wartość zmiennej jest obliczana ponownie na końcu każdej strony.
Raport - wartość zmiennej jest przeliczana raz, na koniec raportu.
IncrementGroup
Określa to nazwę grupy, w której wartość zmiennej jest ponownie obliczana, gdy typ inkrementacji to Group . To przyjmuje nazwę dowolnej grupy zadeklarowanej w szablonie raportu JRXML.
ResetType
Określa, kiedy wartość zmiennej jest resetowana. Ten atrybut używa wartości, jak poniżej -
Kolumna - wartość zmiennej jest resetowana na początku każdej kolumny.
Grupa - wartość zmiennej jest resetowana, gdy zmienia się grupa określona przez parametr IncrementGroup.
Brak - wartość zmiennej nigdy nie jest resetowana.
Strona - wartość zmiennej jest resetowana na początku każdej strony.
Raport - wartość zmiennej jest resetowana tylko raz, na początku raportu.
ResetGroup
Określa nazwę grupy, w której wartość zmiennej jest resetowana, gdy resetType jest Group . Wartością tego atrybutu byłaby nazwa dowolnej grupy zadeklarowanej w szablonie raportu JRXML.
Wbudowane zmienne raportu
Istnieje kilka wbudowanych zmiennych systemowych, gotowych do użycia w wyrażeniach, jak poniżej -
S.NO | Nazwa i opis zmiennej |
---|---|
1 | PAGE_NUMBER Wartością tej zmiennej jest numer bieżącej strony. Może być używany do wyświetlania zarówno bieżący numer strony oraz całkowitą liczbę stron wykorzystujących specjalną funkcję elementów pole tekstowe JasperReports, w evaluationTime atrybutu. |
2 | COLUMN_NUMBER Ta zmienna zawiera aktualny numer kolumny. |
3 | REPORT_COUNT Ta zmienna raportu zawiera całkowitą liczbę przetworzonych rekordów. |
4 | PAGE_COUNT Ta zmienna zawiera liczbę rekordów, które zostały przetworzone podczas generowania bieżącej strony. |
5 | COLUMN_COUNT Ta zmienna zawiera liczbę rekordów, które zostały przetworzone podczas generowania bieżącej kolumny. |
6 | GroupName_COUNT Nazwa tej zmiennej pochodzi od nazwy grupy, której odpowiada, zakończonej sekwencją _COUNT. Ta zmienna zawiera liczbę rekordów w bieżącej grupie. |
Przykład
Dodajmy zmienną (countNumber) do naszego istniejącego szablonu raportu (Chapter Report Designs ). Będziemy prefiksować liczbę do każdego rekordu. Zmieniony szablon raportu (jasper_report_template.jrxml) jest następujący. Zapisz go w katalogu 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>
<variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
<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}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x = "0" y = "0" width = "136" height = "15" />
<textElement textAlignment = "Center" verticalAlignment = "Middle" />
<textFieldExpression class = "java.lang.String">
<![CDATA[" " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Kody java do wypełniania raportów pozostają niezmienione. Zawartość plikuC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java są jak podano poniżej -
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();
}
}
}
Zawartość pliku POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java są jak podano poniżej -
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;
}
}
Zawartość pliku C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java są jak podano poniżej -
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"));
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;
}
}
Generowanie raportów
Skompilujemy i uruchomimy powyższy plik przy użyciu naszego zwykłego procesu budowania ANT. Zawartość pliku build.xml (zapisanego w katalogu C: \ tools \ jasperreports-5.0.1 \ test) jest taka, jak podano poniżej.
Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i należy go umieścić w tym samym katalogu co 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>
Następnie otwórzmy okno wiersza poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Na koniec wykonaj polecenieant -Dmain-class=com.tutorialspoint.JasperReportFill (domyślnym celem jest viewFullReport) jako -
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 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.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: 18 seconds
W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak na poniższym ekranie -
Tutaj widzimy, że liczba jest poprzedzona prefiksem dla każdego rekordu.