iReport - Dificuldades para abrir relatório a partir da classe java

Pessoal, boa tarde.

Sou iniciante em java e desenvolvi um relatório utilizando o iReport para a minha fábrica a partir de uma query em um banco de dados que está configurada no arquivo jasper.

Eu preciso criar uma rotina que abra o relatório dentro de um aplicativo java para enviar o relatório por e-mail em determinados horários para determinados destinos, o que será feito schedulando a tarefa para abrir o aplicativo. Então o aplicativo precisa gerar o .pdf quando aberto e enviar o e-mail, nada mais.

Pesquisei no fórum mas tenho dúvidas e meu código java não funciona (ainda tenho dificuldades com os conceitos básicos da linguagem):

  • Será necessário criar uma connectionfactory para passar a conexão com o banco de dados como parâmetro para o jasper, mesmo esta ja estando configurada no momento da criação do relatório dentro do ireport?

Segue o meu código:


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package relatorio_atrasospedidos;

import java.sql.Connection;
import java.util.HashMap;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

/**
 *
 * @author Fernando
 */
public class Relatorio_AtrasosPedidos {
    
    public JasperPrint gerarRelAtrasos() throws Exception {
        JasperPrint rel = null;
        try {
            String arquivoJasper = "AtrasoPedidos.jasper";
            rel = JasperFillManager.fillReport("AtrasoPedidos.jasper", new HashMap());
            JasperExportManager.exportReportToPdfFile(rel, "Atrasos.pdf");
        } catch (JRException e) {
            e.printStackTrace();
        }
        return rel;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Relatorio_AtrasosPedidos relat = new Relatorio_AtrasosPedidos();
        relat.gerarRelAtrasos();
    }
}

Segue o stacktrace do erro:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/digester/Rule at net.sf.jasperreports.components.ComponentsExtensionsRegistryFactory.<clinit>(ComponentsExtensionsRegistryFactory.java:91) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:247) at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForRealName(JRClassLoader.java:157) at net.sf.jasperreports.engine.util.JRClassLoader.loadClassForName(JRClassLoader.java:115) at net.sf.jasperreports.engine.util.ClassUtils.instantiateClass(ClassUtils.java:53) at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.instantiateRegistry(DefaultExtensionsRegistry.java:236) at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:213) at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.loadRegistries(DefaultExtensionsRegistry.java:162) at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getRegistries(DefaultExtensionsRegistry.java:132) at net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:104) at net.sf.jasperreports.engine.util.JRStyledTextParser.<clinit>(JRStyledTextParser.java:81) at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:182) at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:77) at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:87) at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:57) at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:142) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:114) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:435) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:271) at relatorio_atrasospedidos.Relatorio_AtrasosPedidos.gerarRelAtrasos(Relatorio_AtrasosPedidos.java:24) at relatorio_atrasospedidos.Relatorio_AtrasosPedidos.main(Relatorio_AtrasosPedidos.java:38) Caused by: java.lang.ClassNotFoundException: org.apache.commons.digester.Rule at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 22 more Java Result: 1

esta faltando bibliotecas para o ireport funcionar direito

Rafaelviny,

Obrigado pela resposta. Neste caso, a IDE me avisaria se o problema fosse algum import

sabe me dizer quais bibliotecas estão faltando?

fernando.zambone ta faltando as bibliotecas da commons-digester.
Segue o erro:

Caused by: java.lang.ClassNotFoundException: org.apache.commons.digester.Rule  

Link para download: Download

fernando.zambone

desculpa, tive que sair

mas o jweibe vai resolver seu problema, se continuar dando erro posta ai

Rafelviny, jweibe

Resolveu sim, além desta estava faltando também a groovy-all, mas já resolveu. Porém, como eu já imaginava, o relatório foi gerado em branco pois não passei a connection como parâmetro, vou trabalhar na modificação do código para passar a connection ao relatório e ver se resolve, acho que sim.

Então respondendo minha pergunta: Sim, preciso passar a connection como parâmetro mesmo tendo configurado ela no .jasper.

eu acho otimo passar a connection ai vc tem 2 opção

1- parametersCompra.put("REPORT_CONNECTION", con);
2-

ResultSet rs = stm.executeQuery(queryCompra);
JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
JasperPrint impressao = JasperFillManager.fillReport(System.getProperty("user.dir") + "\\Relatorios\\RelatorioCompras.jasper", parameters, jrRS);

explicaçao breve

1- passando diretamente pelo parametro.
2- passando indiretamente pero resultSet

Pessoal,
Estou agora com dificuldades na formatação do relatório ao salvar em pdf, no viewer do iReport a formatação está perfeita, mas vejam na foto o que acontece quando eu salvo em pdf.
http://imageshack.us/photo/my-images/30/formatacao.jpg/

Seria esse um bug do ireport?

Isso tem uma baita cara de problema de fonte… não é bug do iReport não.
Nas propriedades do relatório, marque o checkbox “PDF embedded”.
Assim a fonte vai ‘junto’ do PDF e não faz essa desgrama aí.
Principalmente quando usar fontes true type, não deixe de marcar esse opção.
Se quiser se aprofundar no tema pra saber qual a origem do teu problema, procure sobre text measure.

Abraço!

leoramos,

Valeu a dica, mas não funcionou. O único que eu consegui fazer funcionar foi adicionando um espaço em branco no final do field, daí resolveu.