varias valores tablas subreporte significado reporte por pasar parametros parametro paginas lista jasperreports jasperreport ejemplos consulta java jasper-reports

java - valores - Pasando la Lista de objetos de tipo primitivo como fuente de datos para el subinforme



reporte de varias paginas ireport (3)

Necesito pasar a mi subinforme una fuente de datos con la ayuda del parámetro List<String> del informe maestro. No sé qué tipo de fuente de datos es correcta y cómo obtener valor en un subinforme.

El fragmento de mi informe maestro:

<parameter name="seznamPriloh" class="java.util.List" isForPrompting="false"/> .... <subreport> <reportElement x="0" y="56" width="555" height="76"/> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression> <subreportExpression><![CDATA[cz.alis.keong.jasjdr.reporting.ReportCompiler.compile("R79_SeznamPriloh")]]></subreportExpression> </subreport>

El fragmento de mi subinforme:

<detail> <band height="23"> <textField> <reportElement x="56" y="3" width="100" height="20"/> <textElement/> <textFieldExpression><![CDATA[$F{}]]></textFieldExpression> </textField> </band> </detail>

Por favor, avíseme cómo pasar la fuente de datos al subinforme a través del parámetro del informe maestro de tipo java.util.List<String> .

Edición: 08.14 14:20 Añadir etiquetas a Java

Edición: 08.14 15:30 se relaciona con ¿Cómo imprimo una lista de cadenas contenidas en otra lista en iReport? y trabaja para 4.5.0 y List<String>


Debe especificar qué campo está utilizando en su subinforme. Usted está pasando $F{} y al pasar una List<String> como DataSource, debe poner $F{_THIS} . Por supuesto, también tiene que agregar un campo con ese nombre, solo haciendo eso puede usar la expresión $F{somefield} .


Puede usar esta expresión de fuente de datos para pasar java.util.List (a través de un parámetro) al subinforme:

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression>

La muestra de trabajo, informe maestro:

<?xml version="1.0" encoding="UTF-8"?> <jasperReport ...> <parameter name="listParam" class="java.util.List"/> <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"> <defaultValueExpression><![CDATA["<subreport_dir>"]]></defaultValueExpression> </parameter> <queryString> <![CDATA[SELECT id, street, city FROM address]]> </queryString> <field name="ID" class="java.lang.Integer"/> <field name="STREET" class="java.lang.String"/> <field name="CITY" class="java.lang.String"/> <detail> <band height="57" splitType="Stretch"> <frame> <reportElement x="0" y="0" width="539" height="57"/> <box> <topPen lineWidth="1.0"/> <leftPen lineWidth="1.0"/> <bottomPen lineWidth="1.0"/> <rightPen lineWidth="1.0"/> </box> <subreport> <reportElement x="0" y="32" width="523" height="17"/> <subreportParameter name="cityParam"> <subreportParameterExpression><![CDATA[$F{CITY}]]></subreportParameterExpression> </subreportParameter> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{listParam})]]></dataSourceExpression> <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport_list_as_param.jasper"]]></subreportExpression> </subreport> <textField> <reportElement x="300" y="0" width="208" height="20"/> <box leftPadding="10"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA["City: " + $F{CITY}]]></textFieldExpression> </textField> <textField> <reportElement x="100" y="0" width="200" height="20"/> <box leftPadding="10"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA["Street: " + $F{STREET}]]></textFieldExpression> </textField> <textField> <reportElement x="0" y="0" width="100" height="20"/> <box leftPadding="10"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA["Id: " + $F{ID}]]></textFieldExpression> </textField> </frame> </band> </detail> </jasperReport>

El subinforme :

<?xml version="1.0" encoding="UTF-8"?> <jasperReport ...> <parameter name="cityParam" class="java.lang.String"/> <field name="id" class="java.lang.Integer"/> <field name="station" class="java.lang.String"/> <field name="city" class="java.lang.String"/> <filterExpression><![CDATA[$F{city}.equals($P{cityParam})]]></filterExpression> <title> <band height="39"> <textField> <reportElement x="220" y="14" width="161" height="20"/> <box leftPadding="10"/> <textElement> <font isBold="true" isItalic="true"/> </textElement> <textFieldExpression><![CDATA["City param: " + $P{cityParam}]]></textFieldExpression> </textField> </band> </title> <detail> <band height="20" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="100" height="20"/> <box leftPadding="10"/> <textElement/> <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression> </textField> <textField> <reportElement x="100" y="0" width="100" height="20"/> <box leftPadding="10"/> <textElement/> <textFieldExpression><![CDATA[$F{station}]]></textFieldExpression> </textField> </band> </detail> <noData> <band height="50"> <textField> <reportElement x="220" y="17" width="161" height="20"/> <box leftPadding="10"/> <textElement> <font isBold="true" isItalic="true"/> </textElement> <textFieldExpression><![CDATA["No data for city param: " + $P{cityParam}]]></textFieldExpression> </textField> </band> </noData> </jasperReport>

El código de Java para pasar la lista :

Map<String, Object> params = new HashMap<String, Object>(); List<TestBean> beansList = new ArrayList<TestBean>(); // The TestBean class constructor is: //public TestBean(String city, Integer id, String station) TestBean bean = new TestBean("Dallas", 10, "Central park st."); beansList.add(bean); bean = new TestBean("Dallas", 11, "Railway st."); beansList.add(bean); bean = new TestBean("Dallas", 12, "Market st."); beansList.add(bean); bean = new TestBean("Lyon", 20, "Airport st."); beansList.add(bean); params.put("listParam", beansList); JasperReport jasperReport = JasperCompileManager.compileReport(reportSource); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDemoHsqldbConnection()); JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);

El resultado será (vista del archivo PDF generado) :

Puede ver las implementaciones de net.sf.jasperreports.engine.JRDataSource . Los más apropiados para su caso son: JRBeanCollectionDataSource y JRBeanArrayDataSource . Como puedes ver, ambos están basados ​​en Bean.

Creo que puedes convertir fácilmente tu List<String> a la List<StringBean> .

O puede implementar su propio JRDataSource .


Si, funciona. No está totalmente documentado, pero funciona con jasperreport 4.5.1.

Debe declarar un campo en su subinforme llamado "_THIS", escrito con el tipo primitivo que desea mostrar. En este caso, una cadena.

Subinforme

<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="testSubReport" pageWidth="555" pageHeight="802" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" isSummaryWithPageHeaderAndFooter="true" whenResourceMissingType="Empty"> <queryString> <![CDATA[]]> </queryString> <field name="_THIS" class="java.lang.String"/> <pageHeader> ...

Luego, en este subinforme donde desea mostrar el valor de la Cadena, simplemente use $ F {_THIS}.

<detail> <band height="25"> <textField isStretchWithOverflow="true"> <reportElement x="37" y="5" width="503" height="15"> </reportElement> <textFieldExpression><![CDATA[$F{_THIS}]]></textFieldExpression> </textField> </band> </detail>

Informe principal

El informe principal proporciona la lista como datasourceExpression

<subreport> <reportElement positionType="Float" x="0" y="4" width="554" height="1"/> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{bean}.getListeOfStringsMethode())]]></dataSourceExpression> <subreportExpression><![CDATA[$P{subreportPrimitiveTypeList}]]></subreportExpression> </subreport>

Me inspiré here