jasper reports - valores - ¿Cómo pasar el origen de datos del informe principal al subinforme(JasperReports)?
reporte de varias paginas ireport (5)
"REPORT_DATA_SOURCE" es un objeto consumible, puedes usar todo el tiempo que quieras.
He probado la fuente de datos como una fuente de datos del archivo xml, y no aparecerá como ALEX dijo.
"esto no perderá la primera fila en el subinforme".
Creo que puedo usar el xpath para seleccionar, así que cada vez no habrá registros de pérdidas.
Si usa la base de datos JDBC como la fuente de datos, presione pasar el sql como parámetro al subinforme.
Si usa ResultSet como parámetro, quizás pierda un registro a medida que define el subinforme en las bandas de detalle.
Estoy usando JasperReports y relleno el JRDataSource
para el informe correspondiente. Ahora, quiero pasar el REPORT_DATA_SOURCE
principal al subinforme. ¿Cómo puedo hacer esto?
Por lo que sé, REPORT_DATA_SOURCE
es un objeto consumible, por lo que solo se puede usar una vez, ¿no? ¿Puedo copiar esta fuente de datos y pasarla?
Por cierto: yo uso iReport para crear el diseño.
Es una pregunta antigua que ya se respondió, pero puedo pasar el bean undelying al subinforme, evitando la pérdida del primer registro o pasando todos los registros al subinforme. Esta solución tiene la ventaja de que el subinforme se puede utilizar como informe principal y "simplemente" pasa el registro real como fuente de datos del subinforme (usando groovy como informe lang):
<subreport>
<reportElement x="261" y="25" width="200" height="100"/>
<dataSourceExpression><![CDATA[new JRBeanCollectionDataSource(
$P{REPORT_DATA_SOURCE}.data.toList().subList($V{REPORT_COUNT}-1,$V{REPORT_COUNT})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]></subreportExpression>
</subreport>
Puede pasar la REPORT_DATA_SOURCE
datos a través del parámetro REPORT_DATA_SOURCE
.
El ejemplo:
<subreport>
<reportElement x="261" y="25" width="200" height="100"/>
<dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]></subreportExpression>
</subreport>
Puede crear una nueva instancia de fuente de datos basada en variable, parámetro o campo.
La muestra:
<variable name="HeadingsCollection" class="java.util.Collection" calculation="System">
<initialValueExpression><![CDATA[new java.util.ArrayList()]]></initialValueExpression>
</variable>
...
<subreport>
<reportElement x="0" y="0" width="515" height="20"/>
<subreportParameter name="ReportTitle">
<subreportParameterExpression><![CDATA[$P{ReportTitle}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($V{HeadingsCollection})]]></dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA["HeadingsReport.jasper"]]></subreportExpression>
</subreport>
Otra muestra:
<field name="cast" class="java.util.Collection"/>
...
<subreport>
<reportElement positionType="Float" x="15" y="25" width="245" height="20" isRemoveLineWhenBlank="true" backcolor="#99CCFF"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cast})]]></dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA["JRMDbCastSubreport.jasper"]]></subreportExpression>
</subreport>
O puede pasar la fuente de datos a través del parámetro:
<parameter name="SubreportDataSource" class="net.sf.jasperreports.engine.JRDataSource"/>
...
<subreport>
<reportElement positionType="Float" x="15" y="25" width="245" height="20" isRemoveLineWhenBlank="true"/>
<dataSourceExpression>$P{SubreportDataSource}</dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA["Subreport.jasper"]]></subreportExpression>
</subreport>
Nota: El uso de la misma fuente de datos (con el informe maestro) en el subinforme puede causar el efecto de perder la primera fila en el subinforme . Puede leer ¿Por qué falta el primer registro de mi subinforme? Publicar para entender cómo evitar este problema.
Sí, debe tener cuidado sobre cómo pasar una fuente de datos. Con una conexión SQL, puede pasar una expresión de conexión como $P{REPORT_CONNECTION}
. Entonces el subinforme tiene su propia consulta SQL.
En su caso usted quiere pasar los datos reales. Dependiendo de los detalles, puede ser tan simple como definir una expresión de mapa de parámetros como $P{REPORT_PARAMETERS_MAP}
. Se encuentra en una pestaña diferente en la misma ventana en la que establece la conexión del subinforme en iReport. A menudo esto es suficiente para pasar la fuente de datos.
Pero es posible que necesite un pequeño código para manejar las cosas. Considere este ejemplo con un origen de datos CSV reutilizado en subinformes. La razón por la que no puede usar el objeto JRParameter.REPORT_DATA_SOURCE es porque el puntero de la fila del índice nunca se restablece, por lo que pasar ese objeto original al subinforme hará que el juego de registros se cierre prematuramente. Resolvimos esto con una clase de ayuda mínima:
package com.jaspersoft.untested_unsupported;
import java.io.File;
import java.io.FileNotFoundException;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRCsvDataSource;
public class CsvDataSourceFactory {
public static JRDataSource getDataSource(String fileName, boolean firstRowHeaders) throws FileNotFoundException {
JRCsvDataSource csvDs = new JRCsvDataSource(new File(fileName));
csvDs.setUseFirstRowAsHeader(firstRowHeaders);
return csvDs;
}
}
Suponemos que el parámetro fuente de datos es "dataSourceParam" y el valor de la fuente de datos (lista) es "dataSourceList" en la clase java que colocamos:
final Map<String, Object> params = new HashMap<String, Object>();
JRDataSource dataSource = new ListOfArrayDataSource( dataSourceList,
new String[] {"date", "age", "adress", "email"});
params.put("dataSourceParam",dataSourceList);**
En la plantilla de informe principal ponemos en declaración de parámetros:
<parameter name="dataSourceParam" class="net.sf.jasperreports.engine.JRDataSource"/>
Luego en la etiqueta de subinforme ponemos:
<subreport isUsingCache="true">
<reportElement key="subreport-1" stretchType="RelativeToTallestObject" isPrintRepeatedValues="false" x="112" y="45" width="338" height="29"/>
<subreportParameter name="otherParameter">
<subreportParameterExpression><![CDATA[$P{sumM1}]]></subreportParameterExpression>
</subreportParameter>
<dataSourceExpression><![CDATA[$P{dataSourceParam}]]></dataSourceExpression>
<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[$P{subReportFile}]]></subreportExpression>
</subreport>