Crear subinformes

En el caso más simple, la posibilidad de creación de subinformes de JasperReports permite imprimir datos asociados para cada elemento de línea de un informe, desde la misma tabla, desde otra tabla de la misma base de datos o desde otro origen de datos. Los casos más complejos escapan al ámbito de este tema, y deberá consultar la documentación de JasperReports para obtener tal información.

En casos complejos, probablemente necesitará un manejador de informes que suministre datos para el subinforme; consulte la sección Crear un manejador de informes de EGL. En algunos casos sencillos, puede añadir un subinforme en sólo dos pasos:
  1. Añada código de subinforme al archivo de diseño del informe principal.
  2. Cree uno o varios archivos de diseño para los subinformes.
A continuación figura un ejemplo básico de este proceso. Dado un informe que imprime todos los clientes de la tabla CUSTOMER, puede añadir un subinforme que muestre todas las facturas de cada cliente, obtenidas de la tabla ORDERS.
  1. Esta es una sección de código del archivo de diseño de informe principal. Este código se escribió originariamente para imprimir una línea para cada cliente de la tabla CUSTOMER. Añada el código que figura en negrita en el ejemplo siguiente:
    	<queryString><![CDATA[SELECT * FROM ADMINISTRATOR.CUSTOMER]]></queryString>
    	<field name="CUST_NO" class="java.lang.Integer">
    	</field>
    	<field name="CUST_NAME" class="java.lang.String">
    	</field>
    	<detail>
    		<band height="100">
    			<subreport>
    				<reportElement positionType="Float" mode="Opaque" x="0" y="31" width="709" height="12" isRemoveLineWhenBlank="true"/>
    				<subreportParameter name="CURRENT_CUST">
    					<subreportParameterExpression><![CDATA[$F{CUST_NO}]]></subreportParameterExpression>
    				</subreportParameter>
    				<connectionExpression>
    					<![CDATA[$P{REPORT_CONNECTION}]]>
    				</connectionExpression>
    				<subreportExpression class="java.lang.String"><![CDATA[new String("C:\\workspace\\report_project\\bin\\report_package\\my_subreport.jasper")]]></subreportExpression>
    			</subreport>
    			<textField>
    				<reportElement positionType="Float" x="57" y="11" width="304" height="20"/>
    				<textElement/>
    				<textFieldExpression class="java.lang.String"><![CDATA[$F{CUST_NO} + " " +  $F{CUST_NAME}]]></textFieldExpression>
    			</textField>
    		</band>
    	</detail>
    El código <subreport> suministra a JasperReports la información necesaria para ejecutar el subinforme:
    • información de colocación (el mismo parámetro que encontrará en el informe principal)
    • parámetros que desea pasar al subinforme; en este caso, el número del cliente actual, que será necesario en la sentencia SQL SELECT del subinforme
    • información de conexión, ya que el controlador de informes de este informe especifica un origen de datos de DataSource.databaseConnection
    • la ubicación de un archivo de diseño de informa compilado para el subinforme; en este caso, my_subreport.jasper
  2. El archivo de diseño de subinforme no es de tipo diferente a los demás archivos de diseño .jasper. Incluya el siguiente código crucial en ese archivo:
    <parameter name="CURRENT_CUST" class="java.lang.Integer"/>
    	<queryString><![CDATA[SELECT * FROM ADMINISTRATOR.ORDERS WHERE CUST_NO = $P{CURRENT_CUST}]]></queryString>
    	<field name="CUST_NO" class="java.lang.Integer">
    	</field>
    	<field name="INVOICE_NO" class="java.lang.Integer">
    	</field>
    	<field name="ORDER_TOTAL" class="java.lang.Float">
    	</field>
    	<detail>
    		<band height="100">
    			<textField>
    				<reportElement positionType="Float" x="50" y="10" width="300" height="20"/>
    				<textElement/>
    				<textFieldExpression class="java.lang.String"><![CDATA["Invoice # " + $F{INVOICE_NO} + " total: " +  $F{ORDER_TOTAL}]]></textFieldExpression>
    			</textField>
    		</band>
    	</detail>
    Aunque haya pasado el parámetro CURRENT_CUST al subinforme, debe indicar al informe de qué tipo de parámetro se trata, mediante el class= attribute del código <parameter>. A continuación figura la serie de consulta (JasperReports es muy particular con respecto al orden de los códigos dentro del archivo). Aquí se hace referencia al valor de CURRENT_CUST como $P{CURRENT_CUST}. Los nombres de campo hacen referencia a nombres de columna de la tabla ORDERS, a los que luego puede hacer referencia dentro del código <textFieldExpression>.

Estos son los únicos cambios que debe efectuar para añadir un subinforme; no es necesario cambiar ningún código del programa de controlador de informes de EGL. Sin embargo, si desea incluir otros orígenes de datos o cálculos complejos, deberá crear un manejador de informes (consulte la sección Crear un manejador de informes de EGL).

Puede crear subinformes anidados. Por ejemplo, puede llamar a elementos de línea para cada factura de una tercera tabla. Esto implicará añadir la información dentro de un código <subreport> al archivo de subinforme my_subreport.jasper, y crear un archivo de diseño independiente para el subinforme anidado (puede denominarlo my_invoice_subreport.jasper). No hay límite en la profundidad a la que puede anidar subinformes.

Tareas relacionadas
Crear un manejador de informes de EGL
Crear el archivo de diseño de informe

Consulta relacionada
Manejador de informes de EGL

Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.