Estoy usando JasperReports y me llene el JRDataSource por sus informes.
Ahora, quiero pasar los principales REPORT_DATA_SOURCE para el subinforme. ¿Cómo puedo hacer esto?

Que yo sepa el REPORT_DATA_SOURCE es un objeto consumible, por lo que sólo puede ser utilizado una vez, ¿verdad?. Puedo copiar esta fuente de datos y pasarlos?

BTW: yo uso iReport para crear el diseño.

InformationsquelleAutor adis | 2011-12-13

6 Comentarios

  1. 37

    Puede pasar datasource a través de la incorporada en REPORT_DATA_SOURCE parámetro.

    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>

    Se puede crear una nueva instancia de datasource basado en la variable, parámetro o en el 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>

    Otro ejemplo:

    <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 el datasource 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 (con informe maestro) datasource en subinforme puede causar la efecto de perder la primera fila en el subinforme. Usted puede leer ¿Por qué es el primer registro que faltan de mi subinforme? post para la comprensión de cómo evitar este problema.

  2. 1

    Sí, usted necesita tener cuidado acerca de cómo pasar de un origen de datos. Con una conexión de SQL, sólo se puede pasar de una Conexión de Expresión como $P{REPORT_CONNECTION}. A continuación, el subinforme tiene su propia consulta SQL.

    En su caso, usted desea pasar los datos reales. Dependiendo de los detalles, podría ser tan simple como la definición de un Mapa de Parámetros de Expresión como $P{REPORT_PARAMETERS_MAP}. Es en una ficha diferente en la misma ventana donde se establece el subinforme conexión en iReport. A menudo esto es suficiente para pasar los datos de origen.

    Pero usted puede ser que necesite un poco de código para manejar las cosas. Considere este ejemplo con un origen de datos CSV re-utilizados en los subinformes. La razón por la que usted no sólo puede utilizar el JRParameter.REPORT_DATA_SOURCE objeto es debido a que el índice de puntero de fila nunca se restablece, por lo que pasa que el objeto original en el subinforme traerá el conjunto de registros para su cierre antes de tiempo. Hemos resuelto esto con un mínimo de clase auxiliar:

    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; 
        } 
    }
  3. 0

    suponemos que el origen de datos del parámetro es «dataSourceParam» y el valor de origen de datos (lista) es «dataSourceList»
    en la clase de java ponemos :

    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 el informe principal de la plantilla que hemos puesto en los parámetros de la declaración :

    <parameter name="dataSourceParam" class="net.sf.jasperreports.engine.JRDataSource"/>

    , a continuación, en el subinforme etiqueta 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>
  4. 0

    «REPORT_DATA_SOURCE» es un consumible objeto, puede utilizarse tanto tiempo como desee.

    Tengo prueba el origen de datos como xml Archivo de origen de datos, y no se apareció como dijo ALEX.

    «esto no va a ser perder la primera fila en el subinforme.»

    Creo que puede ser que el uso de xpath para seleccionar, así que cada vez que no será la pérdida de registros.

    Si el uso de Base de datos JDBC como el origen de datos, pealse pasar el sql como parámetro para subinforme.

    Si utiliza el conjunto de resultados como parámetro, tal vez la pérdida de uno de los records como la definición del subinforme en bandas de detalle.

  5. 0

    Es una vieja pregunta ya respondida, pero tengo para pasar el undelying bean para el subinforme, evitando la pérdida del primer registro o de paso a todos los registros a subinforme.
    Esta solución tiene la ventaja de que el subinforme puede ser utilizado como informe principal y es «simplemente» pasar el registro real como subinforme origen de datos (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>
    • En mi versión antigua de Java, al menos, .data no es visible campo.
    • sí, groovy le permite acceder a los campos privados, no se si hay una manera de leer con java
  6. 0

    Tuve una situación donde había una mesa en un subinforme. El subinforme sólo tiene una banda de título y un resumen de la banda, con la tabla en el resumen. Yo quería usar el subinforme origen de datos para la tabla, pero no se pudo obtener cualquiera de los enfoques en respuesta a trabajar. Así que aquí como un enfoque alternativo que está funcionando muy bien en la versión 6.6.0:

    En el informe principal:

            <subreport>
                <reportElement x="0" y="0" width="468" height="0" uuid="c057b890-3889-43dd-8634-bbf2e857cc0d"/>
                <subreportParameter name="partsList">
                    <subreportParameterExpression><![CDATA[$F{drawingRevision}.getPartsList()]]></subreportParameterExpression>
                </subreportParameter>
                <subreportExpression><![CDATA["static/engineering/drawings/subreports/DrawingPartsList.jasper"]]></subreportExpression>
            </subreport>

    La clave aquí es que la List se pasa como parámetro y NO como un origen de datos como:

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

    El subinforme, a continuación, incluye:

    ...
    <parameter name="partsList" class="java.util.List" isForPrompting="false"/>
    ...
    <summary>
        <band height="60" splitType="Stretch">
            <componentElement>
                <reportElement key="table" style="table" x="0" y="0" width="468" height="60" uuid="09499b35-b122-4fe4-a2b3-d91d6a19b2ab"/>
                <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" whenNoDataType="AllSectionsNoDetail">
                    <datasetRun subDataset="PartList" uuid="87fcbcc9-f0f0-4397-87f2-237201fc1857">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{partsList})]]></dataSourceExpression>
                    </datasetRun>
    ...

    Tenga en cuenta que en el subinforme también deberá incluir la propiedad whenNoDataType="AllSectionsNoDetail" o algo por el estilo, de lo contrario éste será en blanco porque no tiene datos.

Dejar respuesta

Please enter your comment!
Please enter your name here