E ae galera…
ngm aqui pra me dar uma força hoje ??
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<String, Object> map = new HashMap<String, Object>();
// 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<Abastecimento> relatorio = new ArrayList<Abastecimento>();
relatorio = (ArrayList<Abastecimento>) 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<String, Object> map = new HashMap<String, Object>();
// 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<Abastecimento> relatorio = new ArrayList<Abastecimento>();
relatorio = (ArrayList<Abastecimento>) 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
<td style="padding-left:10px; padding-top:10px;">
<a4j:commandButton id="btnPesquisar" value="Pesquisar" actionListener="#{abastecimentoRelatorioBean.geraRelatorioPassandoListaDeObjetos}" styleClass="button" />
</td>
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]