JasperReports ::

11 respostas
A

Bom dia,
Desenvolvi um relatório no IReport e criei uma classe java para pegar esse relatório, transformá-lo em PDF e enviar por e-mail.
Só que quando eu tento executar o teste, está aparecendo o seguinte problema:

EventDispatchThread.pumpOneEventForFilters(int) linhe: not avaliable
.

Alguém sabe o que pode ser esse problema?

11 Respostas

rdmardegam

Poderia colocar seu código e todo o trace de erro para podermos analisar melhor?

Verifique se todo os parâmetros que você está passando pro relatório está coerente.
Verifique se oque vc passa como String, está recuperando como String no relatório, oque vc esta passando como int esta recuperando como int.

Abraço.

A
rdmardegam

Parace que estourou a memoria da VM !
Existe muita coisa que você está querendo exportar para este arquivo ?

Tente aumentar a memoria da vm e ver se funciona! Ou tente exportar um arquivo com menor quantidade de registro para ver se o erro está ae mesmo.

Você esta tentando exportar alguma imagem ao relatorio ou algo do tipo?

Posta ae seu codigo, oq vc esta tentando exportar, como que é feito ? A consulta !

Abraço.

A

Pois é, isso são contas telefônicas da nossa empresa que mandamos por e-mail para os funcionários, a quantidade de registros não é muita, inclusive eu já tentei gerar apenas para um usuário o apareceu o mesmo erro. O código que estou usando para realizar a função é o seguinte:

if (lnc.getEmissao().equals("Enviar Por E-mail")) {		
					int cont = 0;
					PreparedStatement ps = Utilities.geraPStatement(Conexao.getConnection(), getUsuariosComEmail());
				    ResultSet rs = Utilities.geraRS(ps);	
				   	if(rs.isFirst()){                
			            	do{
			            		String matricula = rs.getString("ID_MATRICULA");
			 		          	String linha = rs.getString("ID_LINHA");
			 		          	String email = rs.getString("EMAIL");
			 		          	
			 		          	cont = cont+1;
		 		            	System.out.print(cont);
		 		            	System.out.println("\t"+matricula + " - " + linha + " - " + email);
		 		            	
			 		            try {
			 		            	Utilities.geraRelatorioJasperPDF(SistemaProps.getArquivoRelatorio() + "r_conta_celular", 
				 		       	   			new Object[][] {
				 		   						{"DATA_INICIAL", this.getDataInicioFatura()},
				 		   						{"MATRICULA", matricula},
				 		   						{"LINHA", linha},				 		   							
				 		   					}
			 		            	);
			 		            	
			 		            	enviaEmailComAnexo(matricula, linha, email);
								} catch (Exception e1) {
									e1.printStackTrace();
									Tratamentos.trataCampo(e1.getMessage());
								}
			                } 
				while (rs.next()) ;
			               deletaArquivo();
			               rs.close();
			               ps.close(); 
			               Tratamentos.trataCampo("Contas Enviadas por E-mail");
			        }
}
rdmardegam

Alguma vez esse Utilities.geraRelatorioJasperPDF funcionou?

Ele grava o arquivo pdf dentro da classe Utilities para depois enviar por email ?

Não estou vendo na chamada do email anexo a passagem do anexo.

Oque Utilities.geraRelatorioJasperPDF faz ?? Teria como postar ele tb ?
Acredito que o erro possa estar nele.

Entao você está gerando um pdf somente com uma linha, contendo “data”, “matricula” e “linha”.
Oque voce pode tentar fazer é passar os atributos que você quer como parametros.
Entao vc teria um map com esses paramentros:

Map parametros = new Hashmap ();
parametros.put("dataInicial", this.getDataInicioFatura());
parametros.put("matricula", matricula);
parametros.put("linha",linha);

// E poderia usar está classe que criei tente fazer assim:
InputStream arquivoRelatorio = /*input do seu arquivo .jasper*/ ;

exportPdfToByte(null, arquivoRelatorio, parametros);

public static byte[] exportPdfToByte (Collection lista, InputStream arquivoRelatorio, Map parametros)  throws IOException {
			
            // Cria uma colecao obrigatoria para que seja possivel visualizar as informacoes
            if  (lista == null || lista.size() < 1) {
                lista = new ArrayList();
                lista.add("");
            }    		
			// array de bytes
			byte[] bytes = null;
					
			try {
				
				// Transforma em bytes 
				bytes = JasperRunManager.runReportToPdf(arquivoRelatorio,
						parametros, (JRDataSource) new JRBeanCollectionDataSource(lista));
				
			} catch (JRException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
							
			return bytes;
	}

Nisso vc vai ter um array de byte contendo o arquivo pdf, que deve ser enviado para o email em anexo.

Qualquer dúvida, me add no msn: [email removido]

Abraço

A

Sim. Este programa funcionava normalmente, mandando os e-mails com as contas telefônicas em anexo para cada matrícula (colaborador). Ele começou apresentar esse erro agora.

O código do Utilities.geraRelatorioJasperPDF é:

public static void geraRelatorioJasperPDF(java.lang.String relatorio, java.lang.Object[][] parametros){
            java.util.HashMap mapParametros = new java.util.HashMap();
            
            for(int i=0; i<parametros.length; i++){
                mapParametros.put(parametros[i][0], parametros[i][1]);
            }
            
            java.io.FileInputStream arquivoJasper;
            
            try{ /*Abrindo arquivo .jasper*/
                arquivoJasper = new java.io.FileInputStream(new java.io.File(relatorio+".jasper"));  
                exportarRelatorioJasperParaPDF(relatorio, mapParametros);
                return;
            }catch(JRException jre){
                jre.printStackTrace();
            }
         
            }
            
}

Código do método exportarRelatorioJasperParaPDF:

public static void exportarRelatorioJasperParaPDF(java.lang.String relatorio, Map mapParametros) throws JRException,java.io.FileNotFoundException{
    	JasperFillManager.fillReportToFile(relatorio+".jasper", mapParametros, Conexao.getConnection());
        JasperExportManager.exportReportToPdfFile(relatorio+".jrprint");
}
rdmardegam

Amigo.

Aqui você está gravando pdf no disco:
JasperExportManager.exportReportToPdfFile(relatorio+".jrprint");

Neste caso a extensao nao seria “.pdf” ao inves de “.jrprint” ?

// Aconselharia alterar a chamada do: public static void geraRelatorioJasperPDF(java.lang.String relatorio, java.lang.Object[][] parametros)

Para:

public static void geraRelatorioJasperPDF(java.lang.String relatorio, Map parametros)

Para que nao precise ficar fazendo o :

for(int i=0; i<parametros.length; i++){

mapParametros.put(parametros[i][0], parametros[i][1]);

}

Simplesmente na chamada ja passaria o map populado com as informacoes.

Enfim !!

Sua classe de enviar email le o arquivo pdf gravado no disco e anexa ele ? Você viu exatamente em que ponto está ocorrendo a excecao ?

Aparentemente vc não faz pesquisa pelo Ireport, e sim pelo java passando os parametros. Entao não é necessario ter o Conexao.getConnection() passado para o metodo JasperFillManager.fillReportToFile.

Se quiser me add no msn: [email removido]

Tente ver exatamente em que ponto do programa esta dando a excecao em modo debug e me informe.

Abraço

A

Olha só, eu criei um relatório de teste bem simples, o programa agora já está passando por esse ponto que estava o problema, mas agora está dando erro em outra linha:

public void enviaEmailComAnexo(String matricula, String linha, String email) throws EmailException, SQLException, Exception{
		String txtConteudo;
		String txtTitulo = "Conta Telefônica - Celular" + " - " + getDataInicioFatura().substring(3);		
		txtConteudo = "Segue em anexo Conta de Linha Celular referente ao mês "; 
		
    	// cria o anexo 
    	EmailAttachment anexo = new EmailAttachment();  
        anexo.setPath(SistemaProps.getArquivoRelatorio()+"nome_relatorio.pdf"); //caminho do arquivo (RAIZ_PROJETO/teste/teste.txt)  
        anexo.setDisposition(EmailAttachment.ATTACHMENT);  
        anexo.setDescription("ContaCelular");  
        anexo.setName("nome_relatorio.pdf"); 
        
        // configura o email  
        MultiPartEmail contaEmail = new MultiPartEmail();  
        contaEmail.setHostName("mail.empresa.com"); // o servidor SMTP para envio do e-mail 
        contaEmail.addTo("[email removido]"); //destinatário
        contaEmail.setFrom("[email removido]", "Suporte"); // remetente  
        contaEmail.setSubject("Conta Celular " + getDataInicioFatura().substring(3)); // assunto do e-mail 
        contaEmail.setMsg(txtConteudo); //conteudo do e-mail 
        contaEmail.setSmtpPort(25);  
          
        // adiciona arquivo(s) anexo(s)  
        contaEmail.attach(anexo);  
        // envia o email  
        try {
        	contaEmail.send();    
		} catch (Exception e) {
			e.printStackTrace();
		} 
    }

O erro está acontecendo na linha: contaEmail.attach(anexo);

rdmardegam

Amigo então aparentemente o sistema já está gerando o pdf, agora o problema está no anexo do documento ao email para envio.

Verifique se o arquivo “nome_relatorio.pdf” se encontra realmente no diretório “C:\nome_relatorio.pdf” ante de ser anexado.

Caso não funcione, tente passar o caminho desta maneira do documento desta maneira “c:\nome_relatorio.pdf” .

Depois diga se funcionou.

Acredito que talvez possa estar ocorrendo do arquivo está sendo gerado no diretório e ao mesmo tempo já está tentando ser anexado, mas ele ainda n existe no diretório.

tente fazer um teste, apontado para um arquivo qualquer ja existente em algum diretorio e anexa-lo para o email e ver se funciona.

Abraço.

A

realmente o problema era na linha :
anexo.setName(“nome_relatorio.pdf”);

eu tinha colocado um nome diferente, a situação agora é a seguinte:
o relatório simples que eu criei foi enviado por e-mail normalmente, porém o que quero mandar não vai, agora eu vou desenvolvê-lo passo a passo e ver onde está o problema.

rdmardegam

Então !! Faça passo a passo !!

Faça em modo debug
Gere o arquivo.pdf no local desejado !!
Após isso verifique se ele está no local que você determinou!

Contiunue com seu debug e veja se na hora de recuperar este arquivo, o mesmo está lendo do local correto!

Acredito que deva funcionar. Abraço

Criado 4 de maio de 2010
Ultima resposta 5 de mai. de 2010
Respostas 11
Participantes 2