[RESOLVIDO ] Ireport gera relatorio, mas como faz para download?

E ae galera…

ngm aqui pra me dar uma força hoje ??

Bom dia galera,

bem a forma que eu fiz agora está funcionando.

Eu tive que retirar o Ajax para funcionar, ou seja, eu troquei o a4j:commandButton, pelo h:commandButton,

e coloquei tudo dentro de um <h:form>.

e abaixo está o meu método que gera o relatório:



	public void geraRelatorioPassandoListaDeObjetos() throws ClassNotFoundException, SQLException, JRException, IOException {
			
		// Conexão com o banco para o segundo relatório
		this.criaConexao();
		conexao = getConexao();
		
		// criação dos parametros
		Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();
		
		
		// conexão com o banco que será utilizada pelo subrelatório
		map.put("REPORT_CONNECTION", conexao);
		//map.put("IMAGE",diretorioReal+"/images/loma.jpg");
		
		// pego o caminho do diretório onde se encontra o subrelatório
		
		//map.put("SUBREPORT_DIR", getDiretorioReal("/pages/relatorios/relatorios/"));
		
		ArrayList&lt;Abastecimento&gt; relatorio =  new ArrayList&lt;Abastecimento&gt;(); 
			
		relatorio = (ArrayList&lt;Abastecimento&gt;) abastecimentoService.retrieveAll();
			
			//getListaAlunos(conexao);
		
		JRBeanCollectionDataSource ds = new
		JRBeanCollectionDataSource(relatorio);
		
		
		/*
		* Mando o jasper gerar o relatório. Nesse caso passo o map,
		* já que ele tem dois parâmetros que serão utilizados
		*/
		
		
		  
		FacesContext context = FacesContext.getCurrentInstance();  
		  
		HttpSession session = (HttpSession) context.getExternalContext().getSession(false);  
		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();  
		  
		String diretorioReal = session.getServletContext().getRealPath("");  
		  
		String caminhoRelatorio = diretorioReal+ "/pages/relatorios/relatorios/RelatorioAbastecimento.jasper";  
	
		JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio, map, ds);
		
		JasperExportManager.exportReportToPdfFile(print, diretorioReal+ "/pages/relatorios/relatorios/RelatorioAbastecimento.pdf");
		
		response.setContentType("application/octet-stream");
		
		response.setHeader("Content-Disposition", "attachment; filename=RelatorioAbastecimento.pdf");
		
		response.sendRedirect(context.getExternalContext().getRequestContextPath()
				 +
	                    "/pages/relatorios/relatorios/RelatorioAbastecimento.pdf");
		
		context.responseComplete();
		
		//	gerarRelatorio(caminhoRelatorio,print);
		
		//return "/RelatorioAbastecimento.pdf";
		}
	

Só tenho 2 observações a fazer ( para mim, ainda são 2 problemas)

Primeiro: ele só abre, depois que eu dou 2 cliques no botão. Ou seja,

se eu clicar a primeira vez, ele não faz nada. Mas na segunda, ele abre o relatório.

Segundo: O botão só funciona no FIREFOX, ou seja, eu testei no google Chrome, e ele não aparece … ele apenas da um refresh na página.

Vocês poderiam me ajudar ??

Bom galera,

agora funcionou.

Primeiramente eu tirei o a4j commandButton, e troquei pelo h:commandButton,

e é claro, para que isso funcionasse, eu tive que colocar tudo dentro de um h:form,

que antes não existia, pois era tudo facelets, sem o h:form.

Bom, enfim …

Só tem 2 observações a fazer:

a primeira é que, eu preciso dar 2 cliques para que “a ação” funcione, ou seja, se eu der apenas o primeiro clique, nada acontece …

tenho que dar um segundo clique…

a segunda observação é que, ele abre no firefox, mas no google chrome ele não abre.

Aqui ficou meu método

public void geraRelatorioPassandoListaDeObjetos(ActionEvent event) throws ClassNotFoundException, SQLException, JRException, IOException {

			

		// Conexão com o banco para o segundo relatório

		this.criaConexao();

		conexao = getConexao();

		

		// criação dos parametros

		Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();

		

		

		// conexão com o banco que será utilizada pelo subrelatório

		map.put("REPORT_CONNECTION", conexao);

		//map.put("IMAGE",diretorioReal+"/images/loma.jpg");

		

		// pego o caminho do diretório onde se encontra o subrelatório

		

		//map.put("SUBREPORT_DIR", getDiretorioReal("/pages/relatorios/relatorios/"));

		

		ArrayList&lt;Abastecimento&gt; relatorio =  new ArrayList&lt;Abastecimento&gt;(); 

			

		relatorio = (ArrayList&lt;Abastecimento&gt;) abastecimentoService.retrieveAll();

			

			//getListaAlunos(conexao);

		

		JRBeanCollectionDataSource ds = new

		JRBeanCollectionDataSource(relatorio);

		

		

		/*

		* Mando o jasper gerar o relatório. Nesse caso passo o map,

		* já que ele tem dois parâmetros que serão utilizados

		*/

		

		

		  

		FacesContext context = FacesContext.getCurrentInstance();  

		  

		HttpSession session = (HttpSession) context.getExternalContext().getSession(false);  

		HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();  

		  

		String diretorioReal = session.getServletContext().getRealPath("");  

		  

		String caminhoRelatorio = diretorioReal+ "/pages/relatorios/relatorios/RelatorioAbastecimento.jasper";  

	

		JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio, map, ds);

		

		JasperExportManager.exportReportToPdfFile(print, diretorioReal+ "/pages/relatorios/relatorios/RelatorioAbastecimento.pdf");

		

		response.setContentType("application/octet-stream");

		

		response.setHeader("Content-Disposition", "attachment; filename=RelatorioAbastecimento.pdf");

		

		response.sendRedirect(context.getExternalContext().getRequestContextPath()

				 +

	                    "/pages/relatorios/relatorios/RelatorioAbastecimento.pdf");

		

		context.responseComplete();

		

		//	gerarRelatorio(caminhoRelatorio,print);

		

		//return "/RelatorioAbastecimento.pdf";

		}

	

E aqui está meu botão com evento


	

			&lt;td style="padding-left:10px; padding-top:10px;"&gt;

				&lt;a4j:commandButton id="btnPesquisar" value="Pesquisar" actionListener="#{abastecimentoRelatorioBean.geraRelatorioPassandoListaDeObjetos}" styleClass="button" /&gt;

			&lt;/td&gt;

Dessa forma, o relatorio abre dentro do proprio navegador.

Abraços, e agradeço a atenção de todos.

Pessoal,

Desculpem reabrir esse tópico mas vou pegar o gancho.

Alguém saberia uma forma de depois de chamar o relatório recarregar a página?

Tenho por exemplo uma lista de boletos que são impressos em PDF, preciso que logo em seguida a “lista” seja mostrada vazia para o usuário, e o único jeito que consigo pensar é gerar ele vazia e mostrar a tela novamente, uma vez que o botão de relatório não é chamado por Ajax.

Meu relatório é mostrado assim:

[code] protected void gerarArquivo(byte[] bytes, String nomeAquivo) throws IOException {

	FacesContext facesContext = FacesContext.getCurrentInstance();

	HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
	ServletOutputStream servletOutputStream = response.getOutputStream();

	response.setContentType("application/pdf");
	response.setHeader("Content-Disposition", "attachment;filename=\"" + nomeAquivo + "\"");

	servletOutputStream.write(bytes);
	servletOutputStream.flush();
	servletOutputStream.close();
	facesContext.responseComplete();
}

[/code]