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