JasperReport com Primefaces

Olhei em vários lugares, mas a maioria não mostra como proceder quando não exitem registros.

Quando o relatório é gerado é aberto em uma nova aba do navegador graças a essa instrução que coloquei no botão esse comando onclick=“this.form.target=’_blank’”, mas quando não ha dados o sistema abre mesmo assim uma nova aba igual a tela anterior e desfaz o thema da tela aumentando a fonte.

Será que alguém pode me dar uma ajuda.

Obs.: Eu verifico se existe registro olhando o .size() do arrayList<> usando um if. Mas mesmo assim a nova tela abre novamente.

<p:commandButton value="Inconsistências" actionListener="#{lancamentoBean.imprimeInconsistencia}" ajax="false" onclick="this.form.target='_blank'"/>
1 curtida

Acredito que o problema aconteça pois o js que abre uma nova guia está no onclick, dessa forma, independente da sua validação, ele vai executar esse js.
O que você pode fazer é remover o onclick e no bean, no método referenciado pelo actionListener, incluir o seguinte código depois da sua validação (na condição de querer abrir essa nova aba):

FacesContext.getCurrentInstance().execute("this.form.target='_blank");

Acho que assim deva funcionar hehe.
Se não for isso, é algo próximo.

(Desculpem se o código ficar sem formatação… estou no celular… é ruim demais por aqui :stuck_out_tongue: )

Cara obrigado pela sua atenção, mas não funcionou não o execute não existe no ‘getCurrentInstance’ não, pelo menos não apareceu pra mim rs.

Segue o código que estou usando no BEAN:

public class GeraRelatorio   
{
        Utilidade utilidade  = new Utilidade();
        private HttpServletResponse response;
        private static String strCaminhoPadrao = "/resources/reports/";
    
        public String imprimeInconsistencia(FacesContext context, Integer intIdConfig)
        {
               String strRet = "";
	       File jasper = new File(FacesContext.getCurrentInstance().getExternalContext().getRealPath(strCaminhoPadrao + "Inconsistencia_lancamento.jasper"));		
		
               InconsistenciaDLO inconsistenciaDLO = new InconsistenciaDLO();
 	       ArrayList<Inconsistencia> lista = inconsistenciaDLO.retInconsistencia(intIdConfig);
		
 	       if(lista.size() > 0)
 	       {
	            byte[] bytes;
		    try 
		    {
	                 bytes = JasperRunManager.runReportToPdf(jasper.getPath(), null, new JRBeanCollectionDataSource(lista));
	
                         response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

                         this.response.setContentType("application/pdf");	
                         this.response.setHeader("Content-disposition","inline; filename=InconsistenciaReport.pdf");
			
                         this.response.setContentLength(bytes.length);
                         ServletOutputStream outStream = response.getOutputStream();
			 outStream.write(bytes, 0 , bytes.length);
			 outStream.flush();
			 outStream.close();
					
			 FacesContext.getCurrentInstance().responseComplete();
			 strRet = "PASSOU";
		  } 
		 catch (JRException | IOException e) 
		 {
				// TODO Auto-generated catch block
				e.printStackTrace();
				strRet = "FALHOU";
		}
 	}
 	else
 	{
 		utilidade.retMensagem("AVISO", "Aviso", "Sem das para exibir!!");
		strRet = "PASSOU";
 	}
 		
 	return strRet;
    }
}


1 curtida

Que loucura.
Olha só a documentação.
Lá tem o método getCurrentInstance().

Desculpa escrevi errado.

No getCurrentInstance não achei o ‘execute()’;

1 curtida

Opa
Eu tb escrevi errado (2x) hahah
Não é FacesContext, mas sim RequestContext.

Dá uma olhada nisso: http://blog.primefaces.org/?p=1234

É não funcionou não. Coloquei como você indicou mas não abre a nova aba com o relatório.
Abriu na mesma aba onde o sistema esta aberto.

Coloquei antes do return do código que postei, mas nada.


RequestContext.getCurrentInstance().execute("this.form.target='_blank");