2010-04-08 258 views
6

Estoy evaluando JasperReport y iReport, un requisito es la posibilidad de generar un informe de varias páginas en el que cada página contenga un informe diferente.Informe de varias páginas de JasperReports con contenido diferente

Ejemplo:
Page 1 contiene una factura real por un cliente
Page 2 contiene la lista de facturas para el cliente
Page 3 contiene un gráfico de la cantidad de facturas por año
Page 4 contiene sólo texto fijo (decir instrucciones de operador ...)

Es posible crear un informe único en lugar de crear cuatro informes independientes y luego fusionar los pdfs.

Muchas gracias.

Francesco

Respuesta

1

Sí, es posible. Puede crear el informe completo como una composición de cuatro subinformes separados. Esto permitirá su reutilización y separación de preocupaciones.

0

Sí, incluso puede incluir informes que no tienen relación con el cliente "si eso tiene sentido".

Además, para hacer las cosas aún más entretenidas, después de completar este informe, puede ponerlo en otro padre informe, entonces obtendrá el mismo informe para múltiples clientes.

8

Probé algo diferente.

He utilizado Ireport 4.1.3 y si hace clic derecho en la sección de detalle1 puede agregar otra sección de detalle.

Agregue una página de pico y ya está.

espero que ayude :) Saludos

+0

Esto no funcionará para una cantidad variable de secciones de detalle ¿verdad? – CodeMonkey

3

Sí se puede mediante la creación de un origen de datos y parámetros mapa para cada sub informe en su informe principal,

Fuente de datos contiene la lista que se muestra como una mesa en el informe

Parámetros mapa contiene las claves y valores de campos de texto en el informe

la buena noticia es que se puede includ e todos los parámetros de todas sus páginas en los parámetros de cada mapa a continuación, en el informe de procesar cada página va a extraer sus parámetros y se olvida de los demás :)

Ejemplo:

List<Map<String, Object>> ParamList = new ArrayList<Map<String, Object>>(); 
List<JRDataSource> SourceList = new ArrayList<JRDataSource>(); 

Map<String, Object> params = new HashMap<String, Object>(); 
params.put("Page1_param1", "value1_1"); 
params.put("Page1_param2", "value1_2"); 
params.put("Page1_param3", "value1_3"); 
.. 
params.put("Page2_param1", "value2_1"); 
params.put("Page2_param2", "value2_2"); 
params.put("Page2_param3", "value2_3"); 
.. 
params.put("Page3_param1", "value3_1"); 
params.put("Page3_param2", "value3_2"); 
params.put("Page3_param3", "value3_3"); 
.. 
.. 
List listResult_1 = //select table sql for example 
List listResult_2 = //select table sql for example 
List listResult_3 = //select table sql for example 

JRDataSource dataSource_1 = new ListOfArrayDataSource(
listResult_1, new String[] {"LastName", "FirstName", "address"}); 

JRDataSource dataSource_2 = new ListOfArrayDataSource(
listResult_2, new String[] {"LastName", "FirstName", "address"}); 

JRDataSource dataSource_3 = new ListOfArrayDataSource(
listResult_3, new String[] {"LastName", "FirstName", "address"}); 

// Yes i know ! :D , we put the same params list then as i said befor every sub report will take its own parameters values, so don't worry about this task ;) 
ParamList.add(params); 
ParamList.add(params); 
ParamList.add(params); 

SourceList.add(dataSource_1); 
SourceList.add(dataSource_2); 
SourceList.add(dataSource_3); 

File reportFile = // the jrxml file template of the report 

// We can use also a list of reportFile, so that every page uses his own template :D 


CreateReport(jasperReport, ParamList, SourceList); 

} 

Ahora vamos a crear cada sub informe y lo añaden a la informe principal:

Public void CreateReport(File reportFile, List<Map<String, Object>> ParamList, List<JRDataSource> SourceList){ 

    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath()); 
    Map<String, Object> parameters = paramList.get(0); 
    JRDataSource datasource = datasourceList.get(0); 
    jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, datasource); 

    if(paramList.size()>1){ 
     for(int i=1; i < paramList.size(); i++) 
     { 
      JasperPrint jasperPrint_next = JasperFillManager.fillReport(jasperReport, paramList.get(i), datasourceList.get(i)); 
      List pages = jasperPrint_next.getPages(); 
      for (int j = 0; j < pages.size(); j++) { 
       JRPrintPage object = (JRPrintPage) pages.get(j); 
       jasperPrint.addPage(object); 
      } 
     } 
    } 

} 
Cuestiones relacionadas