Erro ao chamar relatório

2 respostas
dlsilva1812

Bom dia galera.

Estou fazendo um relatório usando iReport usando o Hibernate e Eclipse como IDE.

Meu problema está em:

1º - Se eu faço a conexão com o Banco no relatório, faço o sql passando um valor inteiro para o minha id, ele gera o relatório normalmente, mas eu precisaria trazer do Java 2 listas e o Id da solicitação como parâmetros este id tem q substituir o valor inteiro que mencionei;

2º - Como eu faço para enviar os objetos prontos do Java e manipulá-los no iReport?

Procurei algo na Internet e achei isso:

public void gerarRelatorio() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        ServletContext context = (ServletContext) externalContext.getContext();
        String arquivo = context.getRealPath("relatorios/relatorio.jasper");
        JRDataSource jrds = new JRBeanCollectionDataSource(listarCidades());
        
        gerarRelatorioWeb(jrds, null, arquivo);
    }
 
    private void gerarRelatorioWeb(JRDataSource jrds, Map<Object, Object> parametros, String arquivo) {
        ServletOutputStream servletOutputStream = null;
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
 
        try {
            servletOutputStream = response.getOutputStream();
            JasperRunManager.runReportToPdfStream(new FileInputStream(new File(arquivo)), response.getOutputStream(), parametros, jrds);
            response.setContentType("application/pdf");
            servletOutputStream.flush();
            servletOutputStream.close();
            context.renderResponse();
            context.responseComplete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    private List<Cidade> listarCidades() {
    	int id = (Integer)JsfHelper.getSessionAttribute( "idSolGer" );
		TsSolGer solGer = (TsSolGer) new BaseDao().getObject( new TsSolGer(), id );
    	this.listaCidades = new TsRotaPadDao().getListaCidades( solGer.getIdViagem().getRota().getIdRotaPad() );
        Cidade cidade = new Cidade();
        
        TsSolGer solicitacao = new TsVeiculoDao().carregarSolicitacao(id);
        	
        for (int i = 0; i < listaCidades.size(); i++) {
			cidade = listaCidades.get(i);
			if (cidade.getNome().equals(solicitacao.getVeiculo().getCidade().getNome())
					&& cidade.getNome().equals(solicitacao.getVeiculo().getCidadeAux().getNome())){
				listaCidades.remove(i);
			}
		}
        
        return listaCidades;
    }
	
	private List<TsEntrega> listarEntregas() {
		int id = (Integer)JsfHelper.getSessionAttribute( "idSolGer" );
		TsSolGer solGer = (TsSolGer) new BaseDao().getObject( new TsSolGer(), id );
		this.entregas = new TsEntregaDao().getRotById( solGer.getIdViagem().getIdViagem() );
		
		return entregas;
	}

Vejam que existem 2 métodos abaixo que geram listas, estas 2 listas são as q eu preciso enviar para o Relatório.
No JSP eu estou chamando assim:

<h:commandButton action="#{detalhes.gerarRelatorio}" value="Relatório" onclick="this.form.target='_blank'" />

Estou com o relatório parado, alguém poderia me dar uma ajuda?

Desde já agradeço.
Cordialmente
Diego Silva

2 Respostas

marlonfa

Não sei se entendi bem sua explicação, mas se for oq eu entendi, vc não passa um MAP para o seu gerarRelatorioWeb:

gerarRelatorioWeb(jrds, null, arquivo);

Vc está passando null.

O uso do map é para facilitar você passar valores do seu objeto para o seu relatório.

Exemplo:

Map parametros = new HashMap();
parametros.put("nomeDoSeuParametroNoRelatorio", nomeDoSeuAtributo); 
gerarRelatorioWeb(jrds, parametros, arquivo);

Caso for isso que você quer, tenta ai, se não for posta novamente.
Se for isso e tiver dificuldades ainda, posta qual é a entidade que vc ta usando para facilitar no entendimento.

Abraços.

dlsilva1812

marlonfa:
Não sei se entendi bem sua explicação, mas se for oq eu entendi, vc não passa um MAP para o seu gerarRelatorioWeb:

gerarRelatorioWeb(jrds, null, arquivo);

Vc está passando null.

O uso do map é para facilitar você passar valores do seu objeto para o seu relatório.

Exemplo:

Map parametros = new HashMap();
parametros.put("nomeDoSeuParametroNoRelatorio", nomeDoSeuAtributo); 
gerarRelatorioWeb(jrds, parametros, arquivo);

Caso for isso que você quer, tenta ai, se não for posta novamente.
Se for isso e tiver dificuldades ainda, posta qual é a entidade que vc ta usando para facilitar no entendimento.

Abraços.

Boa tarde amigo

Assim eu implementei o que vc mencionou, ficou assim…

public void gerarRelatorio() {
		int id = (Integer) JsfHelper.getSessionAttribute("idSolGer");
		ExternalContext externalContext = FacesContext.getCurrentInstance()
				.getExternalContext();
		ServletContext context = (ServletContext) externalContext.getContext();
		String arquivo = context.getRealPath("relatorios/relatorio.jasper");
		JRDataSource jrds = new JRBeanCollectionDataSource(listarCidades());
		
		JRDataSource jrds2 = new JRBeanCollectionDataSource(listarEntregas());

	        
	    Map<String, Integer> parametros = new HashMap<String, Integer>();  
	    parametros.put("idSolGer", id);   
		
		gerarRelatorioWeb(jrds, parametros, arquivo);
	}

Porém eu preciso enviar o jrds2 também.
o meu relaório está com um SQL imbutido lá… q se eu colocando o um ID manualemnte, me pede o parâmentro da cidades, das entregas.
Se vc me passar um e-mail eu te envio os arquivos e vc dá uma olhada
Outra coisa, o erro tá dando no segundo métodos agora…

private void gerarRelatorioWeb(JRDataSource jrds, Map<String, Integer> parametros, String arquivo) {
		ServletOutputStream servletOutputStream = null;
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context
				.getExternalContext().getResponse();

		try {
			servletOutputStream = response.getOutputStream();
			JasperRunManager.runReportToPdfStream(new FileInputStream(new File(
					arquivo)), response.getOutputStream(), parametros, jrds); // Nesta linha está dando o erro NullPointerException
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
			context.renderResponse();
			context.responseComplete();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Desde já agradeço.

Criado 6 de maio de 2013
Ultima resposta 7 de mai. de 2013
Respostas 2
Participantes 2