Poxa ta difícil para o meu lado aqui.
Eu tenho telas para gerar relatórios, que se usuário informar parâmetros que não são encontrados no banco o relatório não deve aparecer.
Em todos os lugares que eu pesquisei para gerar o relatório para download na tela não posso usar ‘ajax=true’ no ‘commandButton’, até ai tudo bem. Se os parâmetros informados retornam dados no banco o PDF é gerado normalmente para download, mas caso seja ao contrario eu emito uma mensagem informando a falta de dados, ela até aparece mas acaba com todo o layout css da tela, aumenta todas as fontes e etc.
Se eu informar ‘ajax=true’ a mensagem aparece do jeito que eu quero, mas o relatório não gera por nada o download.
É mais ou menos isso que ta acontecendo aqui, poxa não sei resolver isso eu não queria deixar o usuário sem mensagem na tela.
Alguém pode dar uma olhada no meu código e se possível me dar uma ajuda. Obrigado.
Código que gera o relatório
public String imprimeUnidadeEscolar(UnidadeEscolarRelatorio unidadeEscolarRelatorio) throws JRException, IOException
{
String strRet = "NAOPASSOU";
String caminhoRelatorio = FacesContext.getCurrentInstance().getExternalContext().getRealPath(strCaminhoPadrao + "UnidadeEscolar.jasper");
File arquivo = new File(caminhoRelatorio);
InputStream stream = new FileInputStream(arquivo);
Map<String, Object> params = new HashMap<String, Object>();
JasperReport report = (JasperReport) JRLoader.loadObject(stream);
ArrayList<UnidadeEscolar> lista = new UnidadeEscolarDLO().retUnidadeEscolar(unidadeEscolarRelatorio);
if (lista.size() > 0)
{
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(lista);
JasperPrint print = JasperFillManager.fillReport(report, params, beanColDataSource);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JasperExportManager.exportReportToPdfStream(print, baos);
response.reset();
response.setContentType("application/pdf; name=\"UnidadeEscolar.pdf\"");
response.setContentLength(baos.size());
response.setHeader("Content-Disposition", "attachment; filename=UnidadEscolar.pdf");
response.getOutputStream().write(baos.toByteArray());
response.getOutputStream().flush();
response.getOutputStream().close();
context.responseComplete();
strRet = "PASSOU";
}
return strRet;
}
Metodo que chama a geração do relatório
public void imprimir() throws IOException, JRException
{
if (validaSelecaoTela() == "PASSOU")
{
GeraRelatorio relatorio = new GeraRelatorio();
String strRet = relatorio.imprimeUnidadeEscolar(this.unidadeEscolarRel);
if (strRet.equals("NAOPASSOU"))
{
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Aviso", "Sem dados para emitir.");
PrimeFaces.current().dialog().showMessageDynamic(message);
}
}
}
Botão no xHTML
<p:commandButton id = "btnImprimir"
value = "Imprimir"
icon="ui-icon-print"
ajax="false"
actionListener="#{unidadeEscolarRelatorioBean.imprimir()}"
update="@([id$=pnFormCadastro], [id$=message] )">
Essa é a tela certinha
Essa é como fica com ajax = false
Essa é como deveria ficar. Abaixo eu coloco ajax=true fica direito, mas também se os parâmetros retornarem dados na lista o PDF não gera para download. Executa todo o método de geração do pdf, mas nada aparece na tela.


