Variáveis de relatório
Variáveis de relatório são objetos especiais construídos sobre a expressão de relatório.
Variáveis de relatório simplificam as seguintes tarefas -
Expressões de relatório, que são amplamente utilizadas em todo o modelo de relatório. Essas expressões podem ser declaradas apenas uma vez usando as variáveis do relatório.
As variáveis de relatório podem realizar vários cálculos com base nos valores de expressões correspondentes, como contagem, soma, média, menor, maior, variância, etc.
Se as variáveis forem definidas em um design de relatório, elas podem ser referenciadas por novas variáveis nas expressões. Portanto, a ordem em que as variáveis são declaradas em um design de relatório é importante.
Declaração de Variável
Uma declaração de variável é a seguinte -
<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
incrementGroup = "CityGroup" calculation = "Count">
<variableExpression>
<![CDATA[Boolean.TRUE]]>
</variableExpression>
</variable>
Como visto acima, o elemento <variable> contém vários atributos. Esses atributos estão resumidos abaixo -
O Atributo de Nome
Semelhante aos parâmetros e campos , o atributo name do elemento </variable> é obrigatório. Permite referenciar a variável pelo seu nome declarado nas expressões do relatório.
O atributo de classe
O atributo class também é obrigatório e especifica o nome da classe para os valores das variáveis. Seu valor padrão é java.lang.String . Isso pode ser alterado para qualquer classe disponível no caminho de classe, tanto no momento da compilação do relatório quanto no momento do preenchimento do relatório. O mecanismo cuida da conversão de tipo em expressões de relatório nas quais o token $ V {} é usado, portanto, a conversão de tipo manual não é necessária.
Cálculo
Este atributo determina - qual cálculo realizar na variável ao preencher o relatório. As subseções a seguir descrevem todos os valores possíveis para o atributo de cálculo do elemento <variable>.
Média - o valor da variável é a média de todos os valores não nulos da expressão da variável. Válido apenas para variáveis numéricas.
Contagem - o valor da variável é a contagem de instâncias não nulas da expressão da variável.
Primeiro - o valor da variável é o valor da primeira instância da expressão da variável. Os valores subsequentes são ignorados.
Mais alto - o valor da variável é o valor mais alto para a expressão da variável.
Mais baixo - o valor da variável é o valor mais baixo para a expressão da variável no relatório.
Nada - nenhum cálculo é executado na variável.
StandardDeviation - O valor da variável é o desvio padrão de todos os valores não nulos que correspondem à expressão do relatório. Válido apenas para variáveis numéricas.
Soma - o valor da variável é a soma de todos os valores não nulos retornados pela expressão de relatório.
Sistema - O valor da variável é um cálculo personalizado (calculando o valor dessa variável por conta própria, usando a funcionalidade scriptlets do JasperReports).
Variância - o valor da variável é a variação de todos os valores não nulos retornados pela avaliação da expressão da variável do relatório.
Incrementer FactoryClass
Este atributo determina a classe utilizada para calcular o valor da variável no preenchimento do registro atual do relatório. O valor padrão seria qualquer implementação de classenet.sf.jasperreports.engine.fill.JRIncrementerFactory. A classe de fábrica será usada pelo mecanismo para instanciar objetos incrementadores em tempo de execução, dependendo do atributo de cálculo definido para a variável.
IncrementType
Isso determina quando recalcular o valor da variável. Este atributo usa valores, conforme abaixo -
Coluna - O valor da variável é recalculado no final de cada coluna.
Grupo - O valor da variável é recalculado quando o grupo especificado por incrementGroup muda.
Nenhum - o valor da variável é recalculado a cada registro.
Página - O valor da variável é recalculado no final de cada página.
Relatório - O valor da variável é recalculado uma vez, ao final do relatório.
IncrementGroup
Isso determina o nome do grupo no qual o valor da variável é recalculado, quando incrementType é Grupo . Leva o nome de qualquer grupo declarado no modelo de relatório JRXML.
ResetType
Isso determina quando o valor de uma variável é redefinido. Este atributo usa valores, conforme abaixo -
Coluna - O valor da variável é redefinido no início de cada coluna.
Grupo - O valor da variável é redefinido quando o grupo especificado por incrementGroup muda.
Nenhum - o valor da variável nunca é redefinido.
Página - O valor da variável é redefinido no início de cada página.
Relatório - O valor da variável é zerado apenas uma vez, no início do relatório.
ResetGroup
Isso determina o nome do grupo no qual o valor da variável é redefinido, quando resetType é Grupo . Os valores para este atributo seriam o nome de qualquer grupo declarado no modelo de relatório JRXML.
Variáveis de relatório integradas
Existem algumas variáveis de sistema integradas, prontas para uso em expressões, como segue -
S.NO | Nome e descrição da variável |
---|---|
1 | PAGE_NUMBER O valor desta variável é o número da página atual. Ele pode ser usado para exibir tanto o número da página atual eo número total de páginas utilizando um recurso especial de elementos de campo JasperReports texto, o evaluationTime atributo. |
2 | COLUMN_NUMBER Esta variável contém o número da coluna atual. |
3 | REPORT_COUNT Esta variável de relatório contém o número total de registros processados. |
4 | PAGE_COUNT Esta variável contém o número de registros que foram processados ao gerar a página atual. |
5 | COLUMN_COUNT Esta variável contém o número de registros que foram processados ao gerar a coluna atual. |
6 | GroupName_COUNT O nome desta variável é derivado do nome do grupo ao qual corresponde, com o sufixo da sequência _COUNT. Esta variável contém o número de registros no grupo atual. |
Exemplo
Vamos adicionar uma variável (countNumber) ao nosso modelo de relatório existente (Chapter Report Designs ). Iremos prefixar a contagem para cada registro. O modelo de relatório revisado (jasper_report_template.jrxml) é o seguinte. Salve-o no diretório 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>
Os códigos java para preenchimento de relatório permanecem inalterados. O conteúdo do arquivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java são os dados abaixo -
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();
}
}
}
O conteúdo do arquivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java são os dados abaixo -
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;
}
}
O conteúdo do arquivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java são os dados abaixo -
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;
}
}
Geração de relatório
Vamos compilar e executar o arquivo acima usando nosso processo normal de construção ANT. O conteúdo do arquivo build.xml (salvo no diretório C: \ tools \ jasperreports-5.0.1 \ test) é fornecido a seguir.
O arquivo de importação - baseBuild.xml é escolhido no capítulo Configuração do ambiente e deve ser colocado no mesmo diretório do 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>
A seguir, vamos abrir a janela da linha de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport é o destino padrão) como -
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
Como resultado da compilação acima, uma janela JasperViewer se abre como na tela abaixo -
Aqui, vemos que a contagem é prefixada para cada registro.