marcdas
Janeiro 14, 2017, 8:25pm
#1
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 )
marcdas
Janeiro 15, 2017, 1:54pm
#3
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()
.
marcdas
Janeiro 15, 2017, 3:22pm
#5
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
marcdas
Janeiro 15, 2017, 5:50pm
#7
É 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");