Boa noite pessoal, tenho um relatório no jasper que faz a exibição de uma listagem de movimentos e seus valores. Até agora está tudo bem, porém tenho que logo após esse relatório mostrar um segundo relatório contendo um resumo sintético dos dados apresentados no anterior. No primeiro eu criei um relatório no iReport e alimentei uma coleção de beans que correspondem a cada ocorrência da banda detalhe, criei o bean com os campos, fiz um sql para filtrar os dados do BD e em seguida criei uma coleção de beans com esse resultset, passei para o relatório e pronto, funcionou legal. A questão agora é que preciso ter no final da exibição desse primeiro relatório o segundo relatório, no caso o sintético o qual já tá feito e vai ser alimentado de forma independente do 1º, vai ser uma outra query que vai gerar uma nova coleção de beans para serem exibidos. Como faço pra ter mais de um relatório na mesma chamada exibido em sequência ? No caso só posso fazer isso usando subreport ? Tem algum exemplo que possam me passar ?
Consegui resolver com a dica do pessoal do PBJUG, onde criei uma lista com os meus relatórios já processados e mandei o jasper exportar essa lista pro meu formato escolhido
//preparo tudo aqui
String[] listaNomesRelatrorio = {ConstantesRelatorio.RELATORIO_RCC_EMITIDOS,ConstantesRelatorio.RELATORIO_RCC_EMITIDOS_SINTETICO_ORDEM_VALOR ,ConstantesRelatorio.RELATORIO_RCC_EMITIDOS_SINTETICO_ORDEM_QUANTIDADE};
RelatorioDataSource[] relatorioDataSources = {new RelatorioDataSource(lista),new RelatorioDataSource(listaSinteticoOrdemValor),new RelatorioDataSource(listaSinteticoOrdemQuantidade)};
//mando processar e trago os bytes
byte[] dados = GeraDadosRelatorio.gerarListaRelatorio(listaNomesRelatrorio , parametros,relatorioDataSources, tipo);
//mando pro response
response.setContentLength(dados.length);
OutputStream output = response.getOutputStream();
output.write(dados);
output.flush();
output.close();
//metodo na classe GeraDadosRelatorio
public static byte[] gerarListaRelatorio(String [] nomeRelatorio, Map parametrosRelatorio,
RelatorioDataSource []relatorioDataSource, int tipoSaidaRelatorio)
throws JRException, IOException, Exception {
// valor de retorno
ByteArrayOutputStream retorno = new ByteArrayOutputStream();
byte[] retornoArray = null;
// cria uma instância da classe JasperReport que vai conter o relatório
// criado
JasperReport [] jasperReport = new JasperReport[nomeRelatorio.length];
InputStream [] stream = new InputStream[nomeRelatorio.length];
JasperPrint []jasperPrint = new JasperPrint[nomeRelatorio.length];
List jasperPrintList = new ArrayList();
// try {
for (int i = 0; i < nomeRelatorio.length; i++) {
// carrega o arquivo do relatório (jasper) já compilado
stream[i] = (ConstantesRelatorio.getURLRelatorio(nomeRelatorio[i])).openStream();
// carrega o relatório compilado
jasperReport[i] = (JasperReport) JRLoader.loadObject(stream[i]);
stream[i].close();
jasperPrint[i] = JasperFillManager.fillReport(jasperReport[i],
parametrosRelatorio, relatorioDataSource[i]);
jasperPrintList.add(jasperPrint[i]);
}
// Verifica qual o tipo de relatório para definir a geração
switch (tipoSaidaRelatorio) {
case TIPO_TXT:
JRTextExporter exporterTxt = new JRTextExporter();
exporterTxt.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
exporterTxt.setParameter(JRExporterParameter.OUTPUT_STREAM,retorno);
exporterTxt.setParameter(JRTextExporterParameter.CHARACTER_WIDTH,new Integer(9));
exporterTxt.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, new Integer(9));
exporterTxt.exportReport();
break;
case TIPO_PDF:
JRPdfExporter exporterPDF = new JRPdfExporter();
exporterPDF.setParameter(JRExporterParameter.JASPER_PRINT_LIST,jasperPrintList);
exporterPDF.setParameter(JRExporterParameter.OUTPUT_STREAM,retorno);
exporterPDF.setParameter(JRPdfExporterParameter.IS_CREATING_BATCH_MODE_BOOKMARKS, Boolean.TRUE);
exporterPDF.exportReport();
break;
case TIPO_RTF:
JRRtfExporter exporterRTF = new JRRtfExporter();
exporterRTF.setParameter(JRExporterParameter.JASPER_PRINT_LIST,
jasperPrintList);
exporterRTF.setParameter(JRExporterParameter.OUTPUT_STREAM,
retorno);
exporterRTF.exportReport();
break;
case TIPO_XLS:
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRExporterParameter.JASPER_PRINT_LIST,
jasperPrintList);
exporterXLS.setParameter(JRExporterParameter.OUTPUT_STREAM,
retorno);
exporterXLS.setParameter(
JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
Boolean.TRUE);
exporterXLS.exportReport();
break;
case TIPO_HTML:
// Para evitar problemas de concorrência, o nome do arquivo html
// gerado possui um número aleatório no nome
int numeroNomeRelatorio = new Double((Math.random() * 10000))
.intValue();
//JasperExportManager.exportReportToHtmlFile(jasperPrintList,
// "relatorio" + numeroNomeRelatorio + ".html");
JRHtmlExporter exporter = new JRHtmlExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "relatorio " + numeroNomeRelatorio + ".html");
exporter.exportReport();
// pegar o arquivo, zipar pasta e arquivo e escrever no stream
try {
// criar o arquivo zip
File arquivoZip = File.createTempFile("zipHtml"
+ numeroNomeRelatorio, ".zip");
ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream(arquivoZip));
// Pega o arquivo gerado do relatório
File pagina = new File("relatorio" + numeroNomeRelatorio
+ ".html");
// Pega a pasta que acompanha o arquivo do relatório gerado
File pastaDeImagens = new File("relatorio"
+ numeroNomeRelatorio + ".html_files");
GeraDadosRelatorio.adicionarArquivo(zos, pagina);
GeraDadosRelatorio.adicionarPasta(pastaDeImagens, zos);
// // close the stream
zos.close();
FileInputStream inputStream = new FileInputStream(
arquivoZip);
int INPUT_BUFFER_SIZE = 1024;
byte[] temp = new byte[INPUT_BUFFER_SIZE];
int numBytesRead = 0;
while ((numBytesRead = inputStream.read(temp, 0,
INPUT_BUFFER_SIZE)) != -1) {
retorno.write(temp, 0, numBytesRead);
}
inputStream.close();
inputStream = null;
// Apaga todo o conteúdo gerado
pagina.delete();
arquivoZip.delete();
} catch (Exception e) {
// handle exception
}
break;
default:
throw new Exception("Escolha um tipo de relatório");
}
retornoArray = retorno.toByteArray();
// retorna o relatório gerado
return retornoArray;
}
Obrigado !!!