2012-08-14 29 views
14

que necesito para pasar a un subinforme dataSource con la ayuda del parámetro List<String> del informe principal. No sé qué es un tipo de dataSource es correcto y cómo obtener valor en el subinforme.Al pasar la lista de objetos de tipo primitivo como fuente de datos para el informe integrado

El fragmento de mi informe principal:

<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 informe integrado:

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

aconsejarme cómo pasar la fuente de datos de informe integrado a través del parámetro de informe maestro de java.util.List<String> tipo.

Editar: 08.14 14:20 añadir etiquetas a Java

Editar: 08.14 15:30 se relaciona con How do I print a list of strings contained within another list in iReport? y trabaja para 4.5.0 Y List<String>

+0

Ok, tiene que decir lo que el error que está recibiendo o algo así. Quizás también puedas incluir tu stacktrace. –

+0

@Vyccus Necesito ayuda básica. Doy los errores que dicen, entonces debo especificar el campo, pero ahora no sé cuál. Si trato de "valorar", es triste que para Bean el valor no sea el valor del campo. – Perlos

Respuesta

20

Hay que especificar qué campo que está utilizando en su subReport. Usted está de paso $ F {} y como está de paso un List<String> como origen de datos se debería poner $ F {} _Es. Por supuesto que hay que añadir un campo con ese nombre también, solamente haciendo que se puede utilizar la expresión $ {F} SomeField

+1

Lo intento y me da otro error. El error de nombre de campos no se obtuvo ahora, pero se obtiene: net.sf.jasperreports.engine.JRRuntimeException: subinforme desbordado en una banda que no admite desbordamiento. – Perlos

+0

Esto significa que su subinforme se está expandiendo y no cabe dentro del lugar donde lo ubicó. Pero parece que el campo funcionó. Compruebe esto y dígame qué sucede: http://stackoverflow.com/questions/10172074/sub-report-doesnt-display-when-overflow –

+1

Fui estúpido, no me doy cuenta de lo que significa ese error, solo fue un mal ajuste del componente de subinforme (el subinforme fue más grande que un componente para ellos). Definiendo el campo _THIS está trabajando para 4.5.0 – Perlos

5

Se puede utilizar esta expresión fuente de datos para pasar java.util.List (a través del parámetro) a subreport:

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

La muestra de trabajo, el informe principal:

<?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> 

Th e informe integrado:

<?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 Java para pasarLista:

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):

Generated result in PDF format


Usted puede mirar en las implementaciones de net.sf.jasperreports.engine.JRDataSource. El más adecuado para su caso son: JRBeanCollectionDataSource y JRBeanArrayDataSource. Como puede ver, ambos están basados ​​en frijoles.

Creo que se puede convertir fácilmente su List<String> a la List<StringBean>.

O puede implementar su propio JRDataSource.

+0

No estoy seguro si entiendo correctamente, pero me parece que usted necesita una lista de objetos (Beans con propiedades definidas) como dataSource y poner List como parámetro. Quiero del informe maestro tomar parametr (List ) y ponerlos en el subinforme como dataSource – Perlos

+0

@Perlos Acabo de actualizar mi publicación - agregar comentario sobre la implementación de net.sf.jasperreports.engine.JRDataSource –

+0

Lo busqué correctamente y es lo que quiero decir. Le das a subinforme Lista de objetos con tus propias propiedades. Tengo esto también y trabajo para mí. Pero quiero saber cómo poner la Lista de objetos de tipos primitivos (como Integer, String o BigDecimal) como dataSource para el subinforme. En el subinforme quiero detallar obtener TextField con un valor en esa lista (algo así como F $ {valor}).Sé que si realmente quiero puedo crear un objeto de clase en java y ponerlo en el mapa de parámetros, pero como saber solo hay una forma con el diseñador de informes – Perlos

5

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

Debe declarar un campo en su subinforme denominado "_THIS", escrito con su 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> 
    ... 

A continuación, en este informe integrado en el que desea mostrar el valor de cadena, sólo tiene que utilizar $ {F} _Es.

<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 de los padres proporcionan la lista como el 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> 

que se inspiró here

Cuestiones relacionadas