Variables de informe

Las variables de informe son objetos especiales construidos sobre la expresión del informe.

Las variables de informe simplifican las siguientes tareas:

  • Expresiones de informe, que se utilizan mucho en toda la plantilla de informe. Estas expresiones se pueden declarar solo una vez utilizando las variables de informe.

  • Las variables de informe pueden realizar varios cálculos basados ​​en los valores de las expresiones correspondientes, como recuento, suma, promedio, mínimo, máximo, varianza, etc.

Si las variables se definen en un diseño de informe, entonces se pueden hacer referencia a estas mediante nuevas variables en las expresiones. Por tanto, el orden en el que se declaran las variables en el diseño de un informe es importante.

Declaración de variable

Una declaración de variable es la siguiente:

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

Como se vio anteriormente, el elemento <variable> contiene varios atributos. Estos atributos se resumen a continuación:

El atributo de nombre

De manera similar a los parámetros y campos , el atributo de nombre del elemento </variable> es obligatorio. Permite hacer referencia a la variable por su nombre declarado en las expresiones del informe.

El atributo de clase

El atributo de clase también es obligatorio que especifica el nombre de la clase para los valores de las variables. Su valor predeterminado es java.lang.String . Esto se puede cambiar a cualquier clase disponible en la ruta de clases, tanto en el momento de la compilación del informe como en el momento de completar el informe. El motor se encarga de la conversión de tipos en las expresiones de informes en las que se utiliza el token $ V {}, por lo que no es necesaria la conversión de tipos manual.

Cálculo

Este atributo determina qué cálculo realizar en la variable al completar el informe. Las siguientes subsecciones describen todos los valores posibles para el atributo de cálculo del elemento <variable>.

  • Promedio : el valor de la variable es el promedio de cada valor no nulo de la expresión de la variable. Válido solo para variables numéricas.

  • Recuento : el valor de la variable es el recuento de instancias no nulas de la expresión de variable.

  • Primero : el valor de la variable es el valor de la primera instancia de la expresión de la variable. Los valores posteriores se ignoran.

  • Más alto : el valor de la variable es el valor más alto para la expresión de la variable.

  • Más bajo : el valor de la variable es el valor más bajo para la expresión de la variable en el informe.

  • Nada : no se realizan cálculos en la variable.

  • Desviación estándar : el valor de la variable es la desviación estándar de todos los valores no nulos que coinciden con la expresión del informe. Válido solo para variables numéricas.

  • Suma : el valor de la variable es la suma de todos los valores no nulos devueltos por la expresión del informe.

  • Sistema : el valor de la variable es un cálculo personalizado (calculando el valor de esa variable usted mismo, utilizando la funcionalidad scriptlets de JasperReports).

  • Varianza : el valor de la variable es la varianza de todos los valores no nulos devueltos por la evaluación de la expresión de la variable del informe.

Clase Fábrica Incrementadora

Este atributo determina la clase utilizada para calcular el valor de la variable al llenar el registro actual en el informe. El valor predeterminado sería cualquier clase que implementenet.sf.jasperreports.engine.fill.JRIncrementerFactory. El motor utilizará la clase de fábrica para crear instancias de objetos incrementadores en tiempo de ejecución, según el atributo de cálculo establecido para la variable.

IncrementType

Esto determina cuándo recalcular el valor de la variable. Este atributo utiliza valores, como se muestra a continuación:

  • Columna : el valor de la variable se vuelve a calcular al final de cada columna.

  • Grupo : el valor de la variable se vuelve a calcular cuando cambia el grupo especificado por incrementGroup.

  • Ninguno : el valor de la variable se vuelve a calcular con cada registro.

  • Página : el valor de la variable se vuelve a calcular al final de cada página.

  • Informe : el valor de la variable se vuelve a calcular una vez, al final del informe.

IncrementGroup

Esto determina el nombre del grupo en el que se recalcula el valor de la variable, cuando incrementType es Group . Toma el nombre de cualquier grupo declarado en la plantilla de informe JRXML.

ResetType

Esto determina cuándo se restablece el valor de una variable. Este atributo utiliza valores, como se muestra a continuación:

  • Columna : el valor de la variable se restablece al principio de cada columna.

  • Grupo : el valor de la variable se restablece cuando cambia el grupo especificado por incrementGroup.

  • Ninguno : el valor de la variable nunca se restablece.

  • Página : el valor de la variable se restablece al principio de cada página.

  • Informe : el valor de la variable se restablece solo una vez, al comienzo del informe.

ResetGroup

Esto determina el nombre del grupo en el que se restablece el valor de la variable, cuando resetType es Group . Los valores de este atributo serían el nombre de cualquier grupo declarado en la plantilla de informe JRXML.

Variables de informe integradas

Hay algunas variables de sistema integradas, listas para usar en expresiones, de la siguiente manera:

S.NO Nombre y descripción de la variable
1

PAGE_NUMBER

El valor de esta variable es su número de página actual. Se puede usar para mostrar tanto el número de página actual como el número total de páginas usando una característica especial de los elementos de campo de texto de JasperReports, el atributo EvaluationTime .

2

COLUMN_NUMBER

Esta variable contiene el número de columna actual.

3

REPORT_COUNT

Esta variable de informe contiene el número total de registros procesados.

4

PAGE_COUNT

Esta variable contiene el número de registros que se procesaron al generar la página actual.

5

COLUMN_COUNT

Esta variable contiene el número de registros que se procesaron al generar la columna actual.

6

GroupName_COUNT

El nombre de esta variable se deriva del nombre del grupo al que corresponde, con el sufijo de la secuencia _COUNT. Esta variable contiene el número de registros en el grupo actual.

Ejemplo

Agreguemos una variable (countNumber) a nuestra plantilla de informe existente ( Diseños de informe de capítulo ). Prefijaremos el recuento a cada registro. La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio 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>

Los códigos de Java para el llenado de informes no se modifican. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:

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();
      }
   }
}

El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los que se indican a continuación:

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;
   }
}

El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los que se indican a continuación:

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;
   }
}

La generación del informe

Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) es como se indica a continuación.

El archivo de importación, baseBuild.xml, se selecciona del capítulo Configuración del entorno y debe colocarse en el mismo directorio que 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 continuación, abramos la ventana de la línea de comandos y vayamos al directorio donde se coloca build.xml. Finalmente, ejecute el comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) 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 de la compilación anterior, se abre una ventana de JasperViewer como en la siguiente pantalla:

Aquí, vemos que el recuento tiene un prefijo para cada registro.