14/1/11

Reportes con iReport y Netbeans [Basico - Parte 2]

Dando continuacion al tutorial "Reportes con iReport [Basico - Parte 1]", en esta segunda parte utilizaremos los archivos generados con iReport, rSample.jasper y rSample.jrxml que vimos en la primera parte y los cuales implementaremos en Netbeans para visualizar estos desde este IDE.

¿Que nececitamos?
  • Los archivos "rSample.jasper" y "rSample.jrxml" vistos en la primera parte de este tutorial
  • Las librerias necesarias para ejecutar un reporte con iReport son:
  1. commons-beanutils-1.8.2.jar
  2. commons-collections-3.2.1.jar
  3. commons-digester-1.7.jar
  4. commons-javaflow-20060411.jar
  5. commons-logging-1.1.jar
  6. groovy-all-1.5.5.jar
  7. iText-2.1.7.jar
  8. jasperreports-3.7.2.jar
Descarga y añade estos JAR en una nueva libreria, si no sabes como, date una vuelta por aqui: Añadir/Instalar nuevas librerias en Netbeans.
  • Tambien necesitamos la libreria : MySQL JDBC Driver. para la conexion a la base de datos.
Para realizar este tutorial se supone que tienes un nivel intermedio en el lenguaje Java, se daran muchas cosas por entendidas ya que si eres un novato en Java y pretendes comenzar este lenguaje haciendo reportes, dejame decirte que aprende primero a gatear y despues ponte a caminar.


El Proyecto.

1. Crea un nuevo proyecto en netbeans, "iReport_Sample".

2. Añade las librerias mencionadas más arriba

3. Crea una clase iReportClass.java

4. Crea una clase conexion.java

5. Los archivos "rSample.jasper" y "rSample.jrxml"debes colocarlos en la misma carpeta del proyecto, osea:
6. Ahora ya debes tener algo como esto en Netbeans:

Si no es asi, revisa los pasos anteriores para poder continuar.

7. El codigo necesario para la clase conexion.java, es:


package ireport_sample;
import java.sql.*;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class conexion {
   static String bd = "dbSample";
   static String login = "USUARIO";
   static String password = "PASSWORD";
   static String url = "jdbc:mysql://localhost/"+bd;

   Connection conn = null;

   /** Constructor de DbConnection */
   public conexion() {
      try{
         //obtenemos el driver de para mysql
         Class.forName("com.mysql.jdbc.Driver");
         //obtenemos la conexión
         conn = DriverManager.getConnection(url,login,password);
         if (conn!=null){
            System.out.println("Conexión a base de datos "+bd+". listo");
         }
      }catch(SQLException e){
         System.out.println(e);
      }catch(ClassNotFoundException e){
         System.out.println(e);
      }
   }
   /* Permite retornar la conexión */
   public Connection getConnection(){
      return conn;
   }
   /* termina la conexion a la base de datos */
   public void desconectar(){
      conn = null;
      System.out.println("La conexion a la  base de datos "+bd+" a terminado");
   }
}

Esta clase es la que nos ayuda a conectarnos con la base de datos, puedes saber mas de ella en: Clase conexion a base de datos.

8. El codigo para la clase iReportClass.java, es:


package ireport_sample;
/* librerias de ireport*/
import java.net.URL;
import java.util.HashMap;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class iReportClass {
    //se estable una conexion con la base de datos
    private conexion con = new conexion();    
     /* reporte sencillo con conexion a base de datos MySQL, 
      * el reporte no cuenta con parametros */
     public void reporte(){         
     JasperReport reporte;
     JasperPrint reporte_view;     
     try{
         //direccion del archivo JASPER
          URL  in = this.getClass().getResource("rSample.jasper");
          reporte = (JasperReport) JRLoader.loadObject( in );           
          reporte_view= JasperFillManager.fillReport( reporte, new HashMap(), con.getConnection() );
          JasperViewer.viewReport( reporte_view ); 
          //terminamos la conexion a la base de datos
          con.desconectar();
   }catch (JRException E){
     E.printStackTrace();
          }
    }
}

Nuestro reporte es sencillo, no cuenta con parametros de entrada ni imagenes, lo unico que hacemos es instanciar nuestro archivo JASPER para luego lanzar el JASPERVIEWER y ver nuesotro reporte desde netbeans.

9.  Finalmente el codigo para llamar esta clase desde el Main, es:


package ireport_sample;
public class Main {

    public static void main(String[] args) {
        new iReportClass().reporte();
    }

}
10. Compilamos y ejecutamos el proyecto,
FIN

Los archivos utilizados para este proyecto estan en el siguiente enlace:


Enlace actualizado al 19 de noviembre de 2011

http://link.jc-mouse.net/?id=IRJAVSAMP7

19 comentarios:

  1. xfa necesitamos saber como llamamos un Reporte, desde un formulario, con elementos de menu...

    ResponderEliminar
  2. lo hice tal cual como está y no funciona :(

    ResponderEliminar
  3. este es el error

    Exception in thread "main" java.lang.NullPointerException
    at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1666)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1322)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:141)
    at ireport_sample.iReportClass.reporte(iReportClass.java:26)
    at ireport_sample.Main.main(Main.java:4)
    Java Result: 1

    ResponderEliminar
  4. el error te sale porque no encuentra las librerias para los reportes, te esta pidiendo la libreria llamda "reporte, que es como yo llame a la libreria de jaspert,si tu tienes las librerias con otro nombre con otro nombre debes llamarla con ese nombre y eliminar la referencia a "reporte"

    ResponderEliminar
  5. Por favor explicanos un poco mas sobre el error, creo que todos los que lo hemos intentado nos hemos topado con el mismo problema, ayudanos por favor

    ResponderEliminar
  6. Bueno ya lo logre, es el mejor tutorial que encontre y revise muchisimos, para los que no les funcione revisen que la versión de ireports sea la misma de jasperreports, y descarguen el jasperreports.zip completo y usen las librerias que vienen ahi, gracias

    ResponderEliminar
  7. esta bueno tu tuto.. pero el link ya no existe seria bueno k lo volvas a subir...

    ResponderEliminar
  8. hola e exo too = pero me salen estos errorres:

    Conexión a base de datos Alumno. listo
    Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/callsite/CallSiteArray
    at null_1308597235046_417097.$createCallSiteArray(calculator_null_1308597235046_417097)
    at null_1308597235046_417097.$getCallSiteArray(calculator_null_1308597235046_417097)
    at null_1308597235046_417097.(calculator_null_1308597235046_417097)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    Java Result: 1
    GENERACIÓN CORRECTA (total time: 17 seconds)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

    ResponderEliminar
  9. Hola

    muchas gracias por el tutorial
    me salio todo bien pero al implementar el código de la clase main me sale este error:

    error: cannot find symbol
    new ireportClass1().reporte();
    symbol: method reporte()
    location: class ireportClass1

    por favor si puedes decirme que esta mal

    gracias¡¡¡¡

    ResponderEliminar
  10. Alert!

    http://freakshare.com/files/iusdlkkm/iReportSample.rar.html

    Podrias remplazar el link por que en este no Existe el archivo de descarga.


    Nomas esi acerte notar .. Una OjEada con el link

    ResponderEliminar
  11. Ya encontre la solucion efectivamente, el error sale porque yo lo editaba en ireport 4.1.3 y estaba hecho era en 3.7.2 y las librerias no son las mismas haganlo en 3.7.2 y solo editenlo

    ResponderEliminar
  12. MUCHAS GRACIAS POR ESTE TUTORIAL, me detengo para agradecerte a usted por este blog, ya que me salvo con este problema para la escuela...

    me gustaria que todo sepan que para realizar este ejmplo: deben de contar con la version 3.7.2 del jasper y las librerias 3.7.2.... yo tambien lo hize con la mas reciente y marca error.. saludos

    ResponderEliminar
  13. Hola muchas gracias por el tutorial, a la primera no me funcionó, e intentando una y otra vez como siempre suele sucederme, copie el codigo que venia para descargar y lo pegue tal como está lo unico que hay que cambiar es el usuario y el pass para la conexion con mysql.
    Gracias la verdad siempre vi este proceso muy engorroso, ahora lo veo mas compresible gracias a usted.
    Saludos.

    Atte.
    Pablo

    ResponderEliminar
  14. oye una pregunta y para crearlo jar como le haces para los reportes.

    ayudame porfavor

    ResponderEliminar
  15. HOLA JC RESPONDE ESTE COMENTARIO..DANDOLE VUELTAS A ESTE ERROR Y NO LO ENCUENETRO CON BASE D DATOS CONECTADA Y SIGUIENDO TUS PASOS INCLUYENDO TODAS LAS LIBRERIAS NO SE DOND ESTA EL ERROR X FA AYUDA..



    Conexión a base de datos dbfactura. listo
    Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/callsite/CallSiteArray
    at null_1369677276840_534773.$createCallSiteArray(calculator_null_1369677276840_534773)
    at null_1369677276840_534773.$getCallSiteArray(calculator_null_1369677276840_534773)
    at null_1369677276840_534773.(calculator_null_1369677276840_534773)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at java.lang.Class.newInstance0(Class.java:374)
    at java.lang.Class.newInstance(Class.java:327)
    at net.sf.jasperreports.engine.design.JRAbstractJavaCompiler.loadEvaluator(JRAbstractJavaCompiler.java:98)
    at net.sf.jasperreports.engine.design.JRAbstractCompiler.loadEvaluator(JRAbstractCompiler.java:320)
    at net.sf.jasperreports.engine.JasperCompileManager.loadEvaluator(JasperCompileManager.java:240)
    at net.sf.jasperreports.engine.fill.JRFillDataset.createCalculator(JRFillDataset.java:421)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:428)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:76)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:86)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:56)
    at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:142)
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:52)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
    at iReportClass.reporte(iReportClass.java:32)
    at iReportClass.main(iReportClass.java:43)
    Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.callsite.CallSiteArray
    at java.lang.ClassLoader.findClass(ClassLoader.java:522)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 22 more
    Java Result: 1
    BUILD SUCCESSFUL (total time: 1 second)

    ResponderEliminar
  16. nunca me salio ese error. pèro podria deberse a la incompatibilidad de versiones, hacemos el reporte en una version y desde netbeans usamos otra version y ahi es donde salen los errores :/

    ResponderEliminar
  17. No son muy conocedor del tema, pero si les aclaro algo, la version del iReport que usan para crear el reporte, debe ser igual a las versiones de los iReport.jar de las librerias que se carguen en Netbeans
    Att Juank

    ResponderEliminar
  18. amigo me sale que no tiene paginas y mi reporte si tiene

    ResponderEliminar
  19. Gracias por el aporte, este si me funciono :D

    ResponderEliminar