Reportes con JasperReports e iReport: pasar parámetros con Datasources sin conexión a una BBDD - Netbeans 8



   En este post vamos a ver como se pasan parámetros desde java al reporte sin necesidad de una conexión a una BBDD, es decir, podemos pasar los parámetros que queramos.

   Vamos a comenzar creando un proyecto nuevo (File/New Project) y una clase en java que utilizaremos para instanciar objetos ( botón derecho en el paquete y New/java Class) y así pasar los datos al datasource. Para usar de ejemplo, hemos creado la clase Asistentes.

public class Asistentes {
    
    private Integer id;
    private String nombre;
    private String apellidos;
    private String dni;

    public Asistentes(){        
    }    
   
    public Asistentes(int id, String nombre, String apellidos, String dni) {
        this.id = id;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.dni = dni;
    }

    public int getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
  
    public String getApellidos() {
        return apellidos;
    }
  
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }
   
    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
}

   Esta clase tiene cuatro atributos, constructor por defecto y constructor parametrizado. También debemos incluir los getters and setters ya que los atributos son privados y necesitaremos asignar esos valores.

   A continuación vamos a crear el reporte. Para ello botón derecho en el paquete y nuevo Empty report.


   Para editar el reporte vamos a utilizar el programa de iReport, que previamente lo tenemos que tener instalado ( a parte del plugin de iReport para netbeans). Os lo podéis descargar del siguiente enlace:



   En nuestro reporte vamos a asignar etiquetas para las columnas y para el nombre del reporte. Esto se hace con Static Text (Paleta que está a la derecha).


   Para asignar los valores que van a ir rellenando las diferentes columnas tenemos que crear unas variables y unos campos. Estos campos se crean pinchando botón derecho en Fields/Agregar Field. Hay que asignarles el tipo de dato (java.lang.String, java.lang.Integer o el que sea), y debe de coincidir con el tipo de dato que le pasemos en el programa principal, en este caso con el tipo de datos de las variables de nuestra clase Asistentes.



   Una vez creados todos, pinchamos y los arrastramos al reporte. Así quedaría el nuestro:



   Muy bien, ahora hay que crear la clase para pasar estos datos. Esta clase tiene que implementar la clase JRDataSource, y tiene dos métodos que son obligatorios sobreescribir, el método next() y getFieldValue(JRField jrf). En el método next incrementará el contador y JasperReport sabrá cuantos Asistentes van a existir. El método getFieldValue asignará los valores a los Fields correspondientes.

   A parte en esta clase vamos a crear una variable que será una lista de Asistentes y también un método para ir agregando cada asistente a la lista. La clase quedaría así:

public class AsistentesDataSource implements JRDataSource{

    private List<Asistentes> listaAsistentes = new ArrayList<Asistentes>();
    private int indiceParticipanteActual = -1;
 
    @Override
    public boolean next() throws JRException {
       return ++indiceParticipanteActual < listaAsistentes.size();
    }
 
    public void addAsistente(Asistentes Asistente){

        this.listaAsistentes.add(Asistente);

    }

    @Override
    public Object getFieldValue(JRField jrf) throws JRException {
       Object valor = null;

        if ("id".equals(jrf.getName())){

            valor = listaAsistentes.get(indiceParticipanteActual).getId();

        }
        else if ("nombre".equals(jrf.getName())){

            valor = listaAsistentes.get(indiceParticipanteActual).getNombre();

        }
        else if ("apellidos".equals(jrf.getName())){

            valor = listaAsistentes.get(indiceParticipanteActual).getApellidos();

        }
        else if ("dni".equals(jrf.getName())){
            valor = listaAsistentes.get(indiceParticipanteActual).getDni();
        }

        return valor;
    }
 
}

   En el main() tenemos que inicializar jasperreport y la clase Asistentes. También crear los objetos y pasarlos al datasource además de crear el reporte. El método main() quedaría de la siguiente forma:

public static void main(String[] args) {
        // TODO code application logic here
       
        InputStream inputStream = null;
        JasperPrint jasperPrint= null;
        AsistentesDataSource datasource = new AsistentesDataSource();
       
       
        for(int i = 0; i<=5; i++){
           
            Asistentes asist;
            asist = new Asistentes(i, "AsistenteNombre de "+i,"AsistenteApellidos de "+i, "Asistente dni de "+i);
            datasource.addAsistente(asist);
           
        }
       
       try {
            inputStream = new FileInputStream ("src/reportes/reporte01.jrxml");
        } catch (FileNotFoundException ex) {
           JOptionPane.showMessageDialog(null,"Error al leer el fichero de carga jasper report "+ex.getMessage());
        }
       
        try{
            JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
            jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);

            JasperExportManager.exportReportToPdfFile(jasperPrint, "src/reportes/reporte01.pdf");
           
         
        }catch (JRException e){
            JOptionPane.showMessageDialog(null,"Error al cargar fichero jrml jasper report "+e.getMessage());
        }
       

    }

      Ejecutamos el proyecto ya tenemos nuestro reporte:


   Hay problemas con la versión de iReport y Windows. Al ejecutar el proyecto  nos puede aparecer dos tipos de errores.

  • Error uuid: no está permitido que el atributo uuid aparezca en el elemento jasperreport
  • Error cast: can not cast from Integer to String.



   Para el error del uuid simplemente en la vista del xml del reporte hay que borrar todos los campos donde venga el uuid. Para el error del cast, hay que añadir en los <textFieldExpressions> la clase correspondiente (String, Integer,Float,...)


   Podéis descargaros el proyecto en GitHub -> Reportes GitHub

56 comentarios: Deja tu comentario

  1. inputStream = new FileInputStream ("src/reporte/reporte01.jrxml");

    tengo un error en esa linea de codigo me dice que no puede ser convertido a inputStream, tiene alguna solución

    ResponderEliminar
    Respuestas
    1. Hola!
      ¿El error te da cuando lo ejecutas o es en el código? Si me puedes poner una captura o lo que sea del error exacto te lo agradecería. ¿El proyecto lo has puesto tal cual lo tengo yo? Si lo has puesto en otra ruta puede ser por eso.
      Un saludo.

      Eliminar
    2. Hola muchas gracias por responder, ya me funciona!, era la tura del archivo.

      ahora cuando lo ejecuto me corre perfecto pero me aparece este mensaje en consola

      log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
      log4j:WARN Please initialize the log4j system properly.

      habra algo que pueda hacer, de ante mano muchas gracias por el Vlog me ha servido mucho y me ha salavado la vida ;)

      Eliminar
    3. Creo que tiene que ver con algun fichero que te falta de la libreria en el classpath.
      Esta es una imágen de la libreria:
      http://es.tinypic.com/view.php?pic=2ymhevb&s=8#.VSOBWuFu6FU

      Te puedes descargar las librerias, las tengo subidas aqui:
      https://www.dropbox.com/sh/d48489l8i4pvecn/AAAp7pg-6T7h0LHhWiSBZguFa?dl=0

      En el anterior tutorial puedes ver como se ponen:
      http://sandritascs.blogspot.com.es/2014/10/instalar-jasperreport-e-ireport-en.html

      Un saludo.

      Eliminar
  2. Muchas gracias por tomarte el tiempo para compartir tus conocimientos, me fue muy útil, en especial la solución al Error uuid.
    Saludos :)

    ResponderEliminar
  3. Respuestas
    1. Te tiene que dejar editarlo, sino es desde netbeans, te tiene que dejar desde el archivo desde fuera de netbeans. ¿Te sale algún error?

      Eliminar
    2. Hola que tal Sandrita a mi tampoco me deja editar el xml :/ se bloquea

      Eliminar
    3. Algo parecido me sucedia cuando en asp.net no cerraba las etiquetas html pero aqui no he checado si es lo mismo, si alguien encuentra la causa se los agradeceria bastante y muchas felicidades por tu blog es de mucha utilidad :D

      Eliminar
    4. Holaa, pero desde donde no os deja editarlo? Porque se puede editar desde dos sitios. Desde el propio netbeans, o sin abrir netbeans, abriendolo con ireport.

      Eliminar
    5. Se bloquea en el Netbeans y pues lo estoy modificando desde el directorio en el explorador de Windows. Pero ahora me gustaria saber como puedo eliminar todos los uuid encontrados en el Notepad++ al mismo tiempo ? He visto que usan una expresion regular y la usan en el replace del Notepad++ pero no me funcionó. Tal vez no lo he hecho de la forma correcta. Espero me puedas ayudar y muchas gracias por responder Saludos :)

      Eliminar
    6. Hola yo los uuid los quito a mano, buscando en notepad y reemplazando (es un poco mierda si pero es como lo hago). No sé por qué no tedeja modificarlo desde netbeans, pero de todas formas yo siempre lo hago desde el directorio.
      Un saludo.

      Eliminar
  4. Buen tutorial, apenas estoy empezando a ocupar esto de iReport y es interesante pero me surgio una duda, al crear mi emptyReport me sale codigo no la parte visual como en tu captura y no se a que se deba agradeceria que me ayudaras con esto porfavor

    ResponderEliminar
    Respuestas
    1. Hola, te tiene que salir unos botones como menú parecido a esto:

      http://es.tinypic.com/r/15i4zuc/9

      Y tienes que pulsar en vista Diseño.

      Eliminar
  5. Disculpa me sale este error al correrlo podrias ayudarme a aclar porque sucede porfavor:
    net.sf.jasperreports.engine.xml.JRBandFactory createObject
    ADVERTENCIA: The 'isSplitAllowed' attribute is deprecated. Use the 'splitType' attribute instead.

    ademas tengo duda de en donde guardo mi reprote de ireport que creo porque no se que poner en esa parte de la ruta para abrirlo y despues pasarlo a pdf como en tu código dice :
    inputStream = new FileInputStream ("src/pruebasirve/solicitudServicioSocial.jrxml");
    JasperExportManager.exportReportToPdfFile(jasperPrint, "src/pruebasirve/reporteprimero.pdf");

    ResponderEliminar
    Respuestas
    1. Pues el error te está diciendo que uno de los atributos en el xml es "deprecated" amos que está obsoleto, y que pongas el nuevo que es "splitType"

      En la parte de la ruta tienes que poner la ruta del directorio donde quieres guardar tu reporte, en tu sistema de ficheros. En el ejemplo puse pues mi ruta. Tienes que poner la que tu quieras.

      Un saludo.

      Eliminar
  6. Tengo un problema, a la hora de crear el reporte me crea un reporte por cada objeto que agrego a la lista y nose por que, talvez tu puedas ayudarme.

    ResponderEliminar
    Respuestas
    1. Hola, quizás porque tienes dentro del bucle el crear el reporte y debería estar fuera. Si pones el trozo de código te podría ayudar mejor.

      Un saludo.

      Eliminar
  7. Que gran aporte Sandrita, una pregunta: al momento de cerrar el informe me cierra todo?

    ResponderEliminar
    Respuestas
    1. Gracias por el comentario. ¿A qué te refieres con lo de cerrar todo? :P

      Eliminar
  8. Hola, agradeceria una respuesta super rapidopor favor :( jaja , para el error uuid tu dices borrar toda la linea donde esta el uuid? , o solo te refieres al campo uuid=""?

    ResponderEliminar
    Respuestas
    1. Buenas, sólo me refiero al campo uuid, no toda la línea.
      Un saludo.

      Eliminar
  9. Ayuda!!
    no se deja eliminar el uuid---
    cuando elimino la parte del codigo, al ejecutar el reporte vuelve a aparecer!

    ResponderEliminar
    Respuestas
    1. Creo recordar si hacías algún cambio desde la vista diseño o si lo volvías a abrir desde netbeans y no desde iReport volvía salir.

      Eliminar
  10. Gracias me soluciono lo del error ''uuid'' pero es la única solución? tengo mas de 30 tipos de reportes en mi proyecto y cada reporte tengo que quitarle como 20 atributos ''uuid'' jajaja lo irónico es que el error UUID no me salia con el jasperreports5.6.0 pero me salia un error de jasperprint , cambie a jasperreports3.5.3 me soluciono el error de ''jasperprint'' pero ahi me trajo el del UUID ,empiezo a pensar que es magia negra

    ResponderEliminar
    Respuestas
    1. Hola, a mi también me pasó lo mismo. La verdad que es un coñazo jeje es la única forma. No sé por qué a veces pasa eso porque tengo un equipo en el que están las mismas versiones que otro y en uno pasa y otro no :P
      Un saludo.

      Eliminar
  11. Muchas gracias, me fue de gran ayuda,al fin pude solucionar el error que me aparecía en el uuid y el de cast en el netbeans

    ResponderEliminar
  12. disculpa, a mi no me abre la opcion de la vista de arrastrar los elementos, solo aparece la parte de codificacion pero no para arrastrar los elementos, podrias ayudarme?

    ResponderEliminar
    Respuestas
    1. No sé por qué es eso, a mi no me pasa, pero te tiene que salir esa opción, busca a ver si está en otro lado.

      Eliminar
  13. Excelente!!! me sirvió mucho.

    ResponderEliminar
  14. Bueno tu tutorial pero me pide un log4j el netbeans, que no encuentra el archivo y no puede ejecutar , y solo hice un copia y pega tu ejemplo para probar si funcionaba, agradecería mucho tu ayuda ..
    Atte : Jc

    ResponderEliminar
  15. Buena,tengo un problema con :jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);

    entra al catch y se queda como en un bucle infinito

    ResponderEliminar
    Respuestas
    1. Si entra en el catch te tiene que mostrar la excepción, ¿Cuál es? Y si es un bucle infinito es porque tienes que tener puesto algo que lo haga. Revisalo. Un saludo.

      Eliminar
  16. alguien que me auxilie
    ago 09, 2017 12:41:35 PM org.apache.commons.digester.Digester error
    GRAVE: Parse Error at line 2 column 473: cvc-complex-type.3.2.2: No está permitido que el atributo 'uuid' aparezca en el elemento 'jasperReport'.
    org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 473; cvc-complex-type.3.2.2: No está permitido que el atributo 'uuid' aparezca en el elemento 'jasperReport'.

    ResponderEliminar
    Respuestas
    1. Justamente aqúi te explico que tienes que quitar el parámetro uuid y te digo como hacerlo. Un saludo.

      Eliminar
  17. me sirvio de mucho muchas gracias sos una proo

    ResponderEliminar
  18. Anthony Davis, Yeren Martinez18 de marzo de 2018, 3:16

    Hola que tal Sandra, hize lo de borrar los uuid pero me sigue saliendo el error...ayudame un favor, gracias.

    ResponderEliminar
  19. Hola buenas tardes una pregunta. Estoy trabjando en un reporte (jasperReport) en el cual recibira como parametro una imagen que continue una firma, esta imagen la debo de colocar en el reporte. Ya he creado un parametro de tipo (java.lang.Object) y luego lo agregue a mi plantilla, hasta aca aparentemente todo bien. El problema que tengo es que al intentar generar una visualizacion previa (Preview) de Jasper no me pide que ingrese la imagen y por lo tanto lo sale en el reporte. Que estare haciendo mal, o es porque no en el Preview de jasper no se pueden recibir este tipo de objetos (imagen) como parametros? gracias por tu ayuda Sandrita, saludos...

    ResponderEliminar
    Respuestas
    1. Buenas, no lo he probado, así que no puedo decirte con seguridad.

      Eliminar
  20. hola sandra estoy trabajando con jasper report y vi tu tutorial y lo e implementado pero me sale un error en la siguente linea de codigo
    jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);


    error
    no suitable method found for fillReport(JasperReport,,AsistentesDataSource)
    method JasperFillManager.fillReport(String,Map,Connection) is not applicable
    (argument mismatch; JasperReport cannot be converted to String)
    method JasperFillManager.fillReport(InputStream,Map,Connection) is not applicable
    (argument mismatch; JasperReport cannot be converted to InputStream)
    method JasperFillManager.fillReport(JasperReport,Map,Connection) is not applicable
    (argument mismatch; AsistentesDataSource cannot be converted to Connection)
    method JasperFillManager.fillReport(String,Map,JRDataSource) is not applicable
    (argument mismatch; JasperReport cannot be converted to String)
    method JasperFillManager.fillReport(InputStream,Map,JRDataSource) is not applicable
    (argument mismatch; JasperReport cannot be converted to InputStream)
    method JasperFillManager.fillReport(JasperReport,Map,JRDataSource) is not applicab


    y no e podido solucionarlo te agradecería tu opinion

    ResponderEliminar
    Respuestas
    1. No conozco ese error. No sé si será algo con el paso de parámetros.
      Lo siento.

      Eliminar
  21. hola Sandra, excelente tuto, oye tengo una duda dudosa, vieras que cuando le doy al botón generar reporte de x formulario, el se queda procesando y hasta ahí, no me devuelve errores ni nada... me podrías ayudar?

    ResponderEliminar
  22. Hola Sandra;

    Te entendí a la perfección, tengo un problemita, al cerrar el reporte me cierra toda la aplicación en la que estoy trabajando, no lo eh solucionado, te agradecería la ayuda <3

    ResponderEliminar
  23. Hola, en esta linea
    jasperPrint = JasperFillManager.fillReport(jasperReport, null,datasource);
    no me reconoce el datasource creado mas arriba

    ResponderEliminar
  24. netbeans 8,2 jdk 8
    plugins ireport 5.6.0

    ResponderEliminar
  25. hola el problema que al cerrar el pdf, se me cierra todo el proyecto

    ResponderEliminar
  26. Hola excelente el tutorial, podrias mostrar como cargar los datos a un subreporte, intente hacerlo con los pasos que muestras pero el subreporte solo muestra valores null al mostrar el pdf

    ResponderEliminar