JasperReports: Representación de sub informe -- jasper-reports campo con ireport camp Relacionados El problema

JasperReports: Sub Report Rendering


1
vote

problema

Español

Estoy usando JasperReports con Spring MVC para informar en mi solicitud. Básicamente, primero diseñé informes de diseño en Ireport 4.1.1 y luego coloque el archivo .jasper resultante en la ruta de mi clase a través de Jasper-View.xml

Cuando llega la solicitud, el controlador pone los parámetros requeridos de la sesión al mapa de parámetros y genera informe.

El escenario es que hay alrededor de 15 subinformes en mi informe principal. De todos estos informes, solo los informes que coincidan con los criterios (pasados ​​como parámetros) se imprimen (controlados a través de "imprimir cuando" de la banda)

y mi pregunta es: Si no se imprima mi informe, ¿se ejecuta (es decir, la consulta dentro de él)? ¿O simplemente se saltó?

Mi razón para hacer esta pregunta es que la generación de informes lleva bastante tiempo (alrededor de 2s, que es demasiado largo para mi solicitud de acuerdo con mí).

gracias.

Original en ingles

I am using JasperReports with Spring MVC for reporting in my application. Basically I first design reports in iReport 4.1.1 and then put the resulting .jasper file in my class path via jasper-view.xml

When the request comes, the controller puts the required parameters from Session to Parameter Map and generates report.

The scenario is there are about 15 subreports in my main report. Out of all these reports, only reports which match the criteria (passed as parameters) are printed (controlled via "Print When" option of the Band)

And my question is: if my report is not to be printed does it gets executed (i.e. the query inside it)? or is it simply skipped?

My reason for asking this question is that report generation takes quite a long time (around 2s, which is too long for my application according to me).

Thanks.

     

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Si observa el código fuente de 'Jasper Reports', la lógica dice que la 'PRINCIPLA DE PRIMPUESTA' se evalúa primero y luego se llena el elemento del informe, si se va a imprimir.

A continuación se muestra un método llamado ' Fillnodata ' de jrverticalfiller.java (versión 4.0), que dice:

  private void fillNoData() throws JRException     {         if (log.isDebugEnabled() && !noData.isEmpty())         {             log.debug("Fill " + fillerId + ": noData");         }          noData.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);          if (noData.isToPrint())         {             while (noData.getBreakHeight() > pageHeight - bottomMargin - offsetY)             {                 addPage(false);             }              noData.evaluate(JRExpression.EVALUATION_DEFAULT);              JRPrintBand printBand = noData.fill(pageHeight - bottomMargin - offsetY);              if (noData.willOverflow() && noData.isSplitPrevented() && isSubreport())             {                 resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);                 resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);                 resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);                 scriptlet.callBeforePageInit();                 calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);                 scriptlet.callAfterPageInit();                  addPage(false);                  printBand = noData.refill(pageHeight - bottomMargin - offsetY);             }              fillBand(printBand);             offsetY += printBand.getHeight();              while (noData.willOverflow())             {                 resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);                 resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);                 resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);                 scriptlet.callBeforePageInit();                 calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);                 scriptlet.callAfterPageInit();                  addPage(false);                  printBand = noData.fill(pageHeight - bottomMargin - offsetY);                  fillBand(printBand);                 offsetY += printBand.getHeight();             }              resolveBandBoundElements(noData, JRExpression.EVALUATION_DEFAULT);         }     }   

Lo que necesita para investigar, es cómo el uso de los subinportes afecta el rendimiento y el uso de la memoria. Parece que tiene demasiados subinformes incrustados en el informe principal. Aquí hay algo de este enlace JasperForge :

¿Existe problemas de rendimiento con los subinformes?

La respuesta a esto depende de su sistema, la fuente de datos y su informe diseño. Algunos puntos a tener en cuenta en los subportes:

  • Cada ejecución de subrayados puede generar un nuevo hilo (ver más abajo).
  • A medida que se creará el subreport ejecuta más objetos en la memoria del montón.

sobre el tema de los hilos. El apoyo a las continuaciones de Java ha sido añadido como alternativa a los hilos. Esto se hizo usando el Yakarta. Biblioteca Commons Javaflow. La propiedad JasperReports: net.sf.jasperreports.subreport.runner.factory se puede utilizar con el Siguiendo dos configuraciones:

  • net.sf.jasperreports.engine.Fill.jrcontinuationsuPreportRunnerFactory
  • net.sf.jasperreports.engine.fill.jrthreadsuReportRunnerFactoryFactory

por defecto net.sf.jasperreports.engine.fill.jrthreadsuReportRunnerFactory es utilizado, sin embargo, si net.sf.JasperReports.Engine.Fill.jrcontinuationsubreporRunnerFactoryFactory se establece, entonces se utilizará un enfoque de Javaflow para llenar los informes en lugar de hilos. Si se elige esta opción, entonces la jakarta El frasco de Commons Javaflow debe incluirse en la aplicación de la aplicación. Este frasco se puede encontrar en el directorio LIB de los informes de Jasperreport Paquete de distribución de proyectos. Los jasperreports-javaflow.properties archivo ilustra cómo esta propiedad se puede establecer en un real implementación. Otras alternativas para procesar diferentes consultas en El mismo informe es el uso del elemento de la lista y los conjuntos de datos secundarios.

 

If you look at the source code for 'Jasper Reports', the logic says that the 'printWhenExpression' is evaluated first and then the report element is filled, if it is to be printed.

Below is a method called 'fillNoData' from JRVerticalFiller.java (version 4.0), which says so:

private void fillNoData() throws JRException     {         if (log.isDebugEnabled() && !noData.isEmpty())         {             log.debug("Fill " + fillerId + ": noData");         }          noData.evaluatePrintWhenExpression(JRExpression.EVALUATION_DEFAULT);          if (noData.isToPrint())         {             while (noData.getBreakHeight() > pageHeight - bottomMargin - offsetY)             {                 addPage(false);             }              noData.evaluate(JRExpression.EVALUATION_DEFAULT);              JRPrintBand printBand = noData.fill(pageHeight - bottomMargin - offsetY);              if (noData.willOverflow() && noData.isSplitPrevented() && isSubreport())             {                 resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);                 resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);                 resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);                 scriptlet.callBeforePageInit();                 calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);                 scriptlet.callAfterPageInit();                  addPage(false);                  printBand = noData.refill(pageHeight - bottomMargin - offsetY);             }              fillBand(printBand);             offsetY += printBand.getHeight();              while (noData.willOverflow())             {                 resolveGroupBoundElements(JRExpression.EVALUATION_DEFAULT, false);                 resolveColumnBoundElements(JRExpression.EVALUATION_DEFAULT);                 resolvePageBoundElements(JRExpression.EVALUATION_DEFAULT);                 scriptlet.callBeforePageInit();                 calculator.initializeVariables(ResetTypeEnum.PAGE, IncrementTypeEnum.PAGE);                 scriptlet.callAfterPageInit();                  addPage(false);                  printBand = noData.fill(pageHeight - bottomMargin - offsetY);                  fillBand(printBand);                 offsetY += printBand.getHeight();             }              resolveBandBoundElements(noData, JRExpression.EVALUATION_DEFAULT);         }     } 

What you need to look into, is how the usage of subreports affects performance and memory usage. It looks like you have too many subreports embedded in the main report. Here's something from this JasperForge link:

Is there performance concerns with Subreports?

The answer to this depends on your system, data source and your report design. A few points to note on Subreports:

  • Each subreport execution may spawn a new thread (see below).
  • As the subreport executes more objects will be created in Heap Memory.

On the subject of threads. Support for Java continuations has been added as an alternative to threads. This was done using the Jakarta Commons Javaflow library. The JasperReports property: net.sf.jasperreports.subreport.runner.factory can be used with the following two settings:

  • net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory
  • net.sf.jasperreports.engine.fill.JRThreadSubreportRunnerFactory

By default net.sf.jasperreports.engine.fill.JRThreadSubreportRunnerFactory is used, however if net.sf.jasperreports.engine.fill.JRContinuationSubreportRunnerFactory is set, then a Javaflow approach will be used to fill the reports rather than threads. If this option is choosen, then the Jakarta Commons Javaflow jar must be included in the application classpath. This jar can be found in the lib directory of the JasperReport reports project distribution package. The jasperreports-javaflow.properties file illustrates how this property could be set in a actual implementation. Other alternatives for processing different queries in the same report are usage of the List element and Sub Datasets.

 
 

Relacionados problema

2  Cambia la posición de la leyenda del gráfico utilizando iReport  ( Change the position of the graph legend using ireport ) 
¿Hay alguna forma de cambiar la posición de la leyenda del gráfico en JasperReports? Se muestra en la parte inferior del gráfico. ¿Hay alguna forma de persona...

2  iReport con Hibernate, no se pudo instanciar la clase de dialecto  ( Ireport with hibernate could not instantiate dialect class ) 
Estoy trabajando con Hibernate e Ireport, configure bien la Classpath Well, pero obtengo este error no se pudo instanciar la clase de dialecto, Esoty trabajan...

0  JasperReports / PDF: problema para posicionar el elemento genérico incluido en un componente de lista  ( Jasperreports pdf issue for positioning generic element included in a list comp ) 
Estoy trabajando en un PDF en el que estoy tratando de tener una casilla de verificación frente a cada línea de un componente JR "Lista". Ya tengo algunos c...

1  JasperReports: Cómo agregar la fecha en HH: MM: Formato SS en el eje X de la tabla XY LINE?  ( Jasperreports how to add date in hhmmss format to the x axis of the xy line c ) 
Quiero agregar fecha en el formato HH: MM: SS en el eje X de la tabla de líneas XY. Estoy usando el siguiente código para hacerlo: <xValueExpression>![CDAT...

9  Cómo usar el mismo DataSource dos veces en JasperReports / Ireport  ( How to use the same datasource twice in jasperreports ireport ) 
Estoy tratando de hacer ejercicio de la mejor manera de hacer los informes con un gráfico y luego una tabla que representa el mismo conjunto de datos. Necesit...

3  Subport de iReport en la lista con frijoles  ( Ireport sub report on list using beans ) 
Estoy usando un objeto de frijol para un DataSource. La fuente de datos contiene varias propiedades: una de las cuales es una lista de elementos de línea que ...

1  ¿Cómo consultar las sumas múltiples en varias columnas de la misma consulta SQL en iReport?  ( How to query multiple sums into multiple columns of the same sql query in irepor ) 
es este eficiente? ¿Cómo podría mejorarse? Estaba tratando de obtener datos de un conjunto de columnas en dos conjuntos de columnas de acuerdo con una condi...

-1  ¿Alguien puede mostrarme un buen tutorial sobre cómo hacer informes complejos de iReport y exportarlos al navegador?  ( Can anyone show me good tutorial about how to make complex ireport reports and e ) 
Estoy trabajando en iReport en netbeans IDE . Quiero hacer informes que se pueden exportar en el navegador en formato pdf o Excel . ¿Puede alguien m...

2  ¿Cómo configurar el punto de partida del eje de rango en JasperReports Barcchart?  ( How to set the starting point of range axis in jasperreports barchart ) 
Necesito cambiar el punto de inicio del valor de origen en la tabla de barras Jasperreports. Por ejemplo, las barras deben comenzar desde 100 en lugar de 0. ...

4  JasperReports y compatibilidad de actualización de iReport  ( Jasperreports and ireport upgrade compatibility ) 
He estado trabajando con JasperReports durante muchos años y muchas versiones han sido lanzadas. Mi pregunta es: Tengo dos informes simples en Jasper utiliz...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos