Relatório do Jasper Report não Abrindo (RESOLVIDO)

5 respostas
jasperjava
AntonioCardoso
Boa tarde pessoal.

Estou com um problema em um relatório gerado pelo Jasper Report.

Criei uma tela com parâmetros do relatório que ao pressionar o botão chama o método abaixo.

`	public void imprimir() {

try {

RpFolhaDePagamentoDAO dao = new RpFolhaDePagamentoDAO();

List resultado = dao.gerarSQL(folhaDePagamento, dataInicial, dataFinal, eventosSelecionados, funcionariosSelecionados);
JRBeanCollectionDataSource colecao = new JRBeanCollectionDataSource(resultado);

		String caminho = Faces.getRealPath("/reports/folhaDePagamento.jasper");
		
		Map<String, Object> parametros = new HashMap<>();
		parametros.put("dataInicial", dataInicial);
		parametros.put("dataFinal", dataFinal);

		JasperPrint relatorio = JasperFillManager.fillReport(caminho, parametros, colecao);
		byte[] buffer = JasperExportManager.exportReportToPdf(relatorio);
		Faces.sendFile(buffer, "folhaDePagamento.pdf", false);
	} catch (JRException | IOException erro) {
		String mensagemCapturada = TratadorDeErros.capturarMensagem(erro);
		Messages.addGlobalWarn("Erro ao emitir relatorio da Folha de Pagamento " + mensagemCapturada);
		erro.printStackTrace();
	}
}`

Ao final não da erro de execução, o SQL me retorna informações, mas não é aberto a aba com o relatório em PDF.
Tenho vários outros relatórios que seguem o mesmo padrão e neste tive problema.
Detalhe. Este relatório foi criado em uma nova versão do Eclipse e do JasperSoftStudio 6.6.0

5 Respostas

darlan_machado

Qual o erro?

AntonioCardoso

Darlan, ele não da erro nenhum. Debuguei o método e ele não cai no catch.
Simplesmente ele gera o SQL, gera o JasperPrint e o buffer. Mas não cria a aba com o relatório. Eu ja confirmei que retorna dados no SQL.

darlan_machado

E você tem tratamento de erro para o trecho de código onde consta a geração do relatóri?

AntonioCardoso
Da Minha tela ao clicar no botão ele cai no método abaixo, que tem o tratamento.

try {

RpFolhaDePagamentoDAO dao = new RpFolhaDePagamentoDAO();

List resultado = dao.gerarSQL(folhaDePagamento, dataInicial, dataFinal, eventosSelecionados, funcionariosSelecionados);
JRBeanCollectionDataSource colecao = new JRBeanCollectionDataSource(resultado);

		String caminho = Faces.getRealPath("/reports/folhaDePagamento.jasper");
		
		Map<String, Object> parametros = new HashMap<>();
		parametros.put("dataInicial", dataInicial);
		parametros.put("dataFinal", dataFinal);

		JasperPrint relatorio = JasperFillManager.fillReport(caminho, parametros, colecao);
		byte[] buffer = JasperExportManager.exportReportToPdf(relatorio);
		Faces.sendFile(buffer, "folhaDePagamento.pdf", false);
	} catch (JRException | IOException erro) {
		String mensagemCapturada = TratadorDeErros.capturarMensagem(erro);
		Messages.addGlobalWarn("Erro ao emitir relatorio da Folha de Pagamento " + mensagemCapturada);
		erro.printStackTrace();
	}
}

E deste método é chamado o DAO para criar o SQL e gerar o DTO.

public class RpFolhaDePagamentoDAO {
public List<RpFolhaDePagamentoDTO> gerarSQL(FolhaDePagamento folhaDePagamento, Date dataInicial, 
	Date dataFinal, List<EventoDaFolhaDePagamento> eventos, List<Pessoa> funcionarios) {
	StringBuilder sql = new StringBuilder();
	sql.append("SELECT\n");
	sql.append("    fp.mesEanoDeReferencia              MESEANO,\n");
	sql.append("    fp.dataDoPagamento                  DATADEPAGAMENTO,\n");
	sql.append("    pes.nome                            FUNCIONARIO,\n");
	sql.append("    lfp.totalDosItens                   TOTALDOSITEMS,\n");
	sql.append("    ev.descricao                        DESCRICAODOITEM,\n");
	sql.append("    ifp.quantidade                      QUANTIDADE,\n");
	sql.append("    ifp.valorUnitario                   VALORUNITARIO,\n");
	sql.append("    case ev.tipoDeEvento when 'D' THEN\n");
	sql.append("        ((ifp.quantidade * ifp.valorUnitario) * -1)\n");
	sql.append("    else\n");
	sql.append("        (ifp.quantidade * ifp.valorUnitario)\n");
	sql.append("    END as TOTALDOITEM\n");
	sql.append("FROM\n");
	sql.append("    FolhaDePagamento fp INNER JOIN LancamentoDaFolhaDePagamento lfp on fp.codigo = lfp.folhaDePagamento_codigo\n");
	sql.append("    INNER JOIN Funcionario func ON lfp.funcionario_codigo = func.codigo\n");
	sql.append("    INNER JOIN Pessoa pes ON func.pessoa_codigo = pes.codigo\n");
	sql.append("    INNER JOIN ItemDaFolhaDePagamento ifp ON lfp.codigo = ifp.lancamentoDaFolhaDePagamento_codigo\n");
	sql.append("    INNER JOIN EventoDaFolhaDePagamento ev ON ifp.eventoDaFolhaDePagamento_codigo = ev.codigo\n");
	sql.append("WHERE 1=1");		
	
	if (folhaDePagamento != null){
		sql.append("\n AND fp.codigo = " + folhaDePagamento.getCodigo());
	}else{
	
		SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");

		if (dataInicial != null) {
			sql.append("\n AND dataDoPagamento >= '" + formato.format(dataInicial) + "'");
		}

		if (dataFinal != null) {
			sql.append("\n AND dataDoPagamento <= '" + formato.format(dataFinal) + "'");
		}

		if (funcionarios.size() > 0) {
			sql.append("\n AND lfp.funcionario_codigo in " + criarListaDeFuncionarios(funcionarios));
		}
	}

	if (eventos.size() > 0) {
		sql.append("\n AND ifp.eventoDaFolhaDePagamento_codigo in " + criarListaDeEventos(eventos));
	}
	sql.append("\nORDER BY fp.dataDoPagamento asc, pes.nome asc");

	Connection conexao = null;
	PreparedStatement comando = null;
	ResultSet resultado = null;

	try {
		conexao = HibernateUtil.getConexao();
		comando = conexao.prepareStatement(sql.toString());
		resultado = comando.executeQuery();

		List<RpFolhaDePagamentoDTO> lista = new ArrayList<>();
		while (resultado.next()) {
			RpFolhaDePagamentoDTO dto = new RpFolhaDePagamentoDTO();
			dto.setDATADEPAGAMENTO(resultado.getDate("DATADEPAGAMENTO"));
			dto.setDESCRICAODOITEM(resultado.getString("DESCRICAODOITEM"));
			dto.setFUNCIONARIO(resultado.getString("FUNCIONARIO"));
			dto.setMESEANO(resultado.getString("MESEANO"));
			dto.setQUANTIDADE(resultado.getDouble("QUANTIDADE"));
			dto.setVALORUNITARIO(resultado.getBigDecimal("VALORUNITARIO"));
			dto.setTOTALDOITEM(resultado.getBigDecimal("TOTALDOITEM"));
			lista.add(dto);
		}

		resultado.close();
		comando.close();
		conexao.close();

		return lista;
	}catch(SQLException erro){
		throw new RuntimeException(erro);
	}
	
}
AntonioCardoso

Acabei achando um jeito de resolver o problema. Quando chamo o relatório, eu precisava desabilitar o Ajax no botão. Segue abaixo um exemplo.

<p:commandButton title="Print"
										actionListener="#{rpFolhaDePagamentoBean.imprimir}" ajax="false"
										onclick="this.form.target='_blank'" icon="fa fa-print" />
Criado 19 de setembro de 2018
Ultima resposta 27 de set. de 2018
Respostas 5
Participantes 2