viernes, 17 de abril de 2009

Creación de Reportes con JasperRepots y iReports - Parte 6: Grupos

Visita la parte 1 de este tutorial: Reportes con Conexión a Bases de Datos
Visita la parte 2 de este tutorial: Usando DataSources Personalizados
Visita la parte 3 de este tutorial: Parámetros y Variables
Visita la parte 4 de este tutorial: Reportes en aplicaciones web
Visita la parte 5 de este tutorial: Gráficas en Reportes
Visita la parte 7 de este tutorial: Subreportes

En el tutorial anterior vimos como usar grupos para generar la gráfica de los datos de un reporte. Es esa ocasión los grupos fueron un elemento secundario que usamos para auxiliarnos en la generación de dicha gráfica.

Ahora veremos cómo deben ser usados los grupos para, bueno, agrupar un conjunto de datos relacionados y mostrar estos grupos de forma clara en el reporte. Usaremos la misma idea del tutorial anterior, en la que se mostraron las ventas de las consolas de última generación (Wii, XBox 360, y PS3). Solo que en este caso mostraremos por cada consola el nombre de los jugadores que las han comprado, separados claramente de los que han comprado las otras consolas.


Para comenzar creamos un nuevo proyecto en NetBeans (File -> New Project... -> Java -> Java Application). Damos un nombre y una ubicación a nuestro proyecto y presionamos el botón "Finish" para que la clase Main aparezca en nuestro editor.

Recuerden agregar al nodo "Libraries" del panel "Projects" la biblioteca "JasperReports" que creamos en la primer parte del tutorial y el jar "commons-logging-1.1.1.jar".

Usaremos la misma clase "Jugador" en en el tutorial anterior para mantener los datos que serán mostrados en el reporte. La clase quedó de la siguiente forma:

public class Jugador
{ 
    private int id; 
    private String nombre; 
    private String consola;  

    public Jugador(int id, String nombre, String consola) 
    { 
        this.id = id; 
        this.nombre = nombre; 
        this.consola = consola; 
    }  

    public String getConsola() 
    { 
        return consola; 
    }  

    public void setConsola(String consola) 
    { 
        this.consola = consola; 
    }  

    public int getId() 
    { 
        return id; 
    }  

    public void setId(int id) 
    { 
        this.id = id; 
    }  
    
    public String getNombre() 
    { 
        return nombre; 
    }  

    public void setNombre(String nombre) 
    { 
        this.nombre = nombre; 
    } 
}
El código que colocaremos en la clase Main es el mismo que en el tutorial anterior. Solo que en este caso en vez de tener 100 jugadores, modificaremos los ciclos for para tener solo 10. Por lo tanto quedan de la siguiente forma:

for (int i = 1; i <= 4; i++) 
{ 
    listaJugadores.add(new Jugador(i, "Jugador " + i , "Wii")); 
}  

for(int i = 5; i <= 7; i++) 
{ 
    listaJugadores.add(new Jugador(i, "Jugador " + i , "XBox")); 
}  

for(int i = 8; i <= 10; i++) 
{ 
    listaJugadores.add(new Jugador(i, "Jugador " + i , "PS3")); 
}

El resto de la clase es igual que en el tutorial anterior.

Ahora abrimos iReport y creamos un nuevo reporte vacio (Archivo -> New... -> Empty Report). En la ventana que se abre le damos un nombre al reporte (reporteGrupo.jrxml) y lo guardamos en el directorio raíz del proyecto de NetBeans. Presionamos el botón "Finalizar" para que aparezca la plantilla vacio de nuestro reporte.

Colocamos el título del reporte en la banda "Title" usando un texto estático. También agregamos los fields correspondientes para los datos de los objetos Jugador (id, nombre, y consola). En esta ocasión en la banda "Detail" solamente colocamos los fields id y nombre (ya que los grupos serán formados en base al field consola). Y no colocamos nada en la banda "Column Header":



Ahora crearemos el grupo correspondiente a las consolas. Para esto hacemos click derecho en el nodo "report name" del panel "Report Inspector". Y en el menú contextual que aparece seleccionamos la opción "Add Report Group":

Con esto se abrirá la ventana "New group wizard". En ella debemos introducir el nombre del grupo, que en este caso será "CONSOLAS" y el campo sobre el cual se crearán los grupos que, como habiamos dicho, será el campo "consola":


Presionamos el botón "Siguiente >". En la pantalla siguiente dejamos seleccionadas las dos opciones ("Add the group header" y "Add the group footer"). Presionamos en botón "Finalizar" con lo que veremos que en la plantilla de nuestro reporte han aparecido dos nuevas bandas, "CONSOLAS Group Header" y "CONSOLAS Group Footer", además de una nueva variable, CONSOLAS_COUNT:


Agregaré un cuadro negro ("Rectangle" de la paleta de elementos del reporte) en la banda "CONSOLAS Group Header" para poder distinguirlo en el momento de generar el reporte final. Además arrastraré a esta banda el field $F{consola} que creamos anteriormente. Al arrastrar este field se nos preguntará qué es lo que queremos mostrar: el valor del campo ("The field value") o el resultado de una función de agregación ("The result of an aggregation fuction"). Como lo que queremos mostrar es el valor del campo dejamos seleccionada la primera opción (si queremos mostrar el número de los elementos del grupo podemos volver a arrastrar este field a la banda).


Si, al igual que yo, agregaron el cuadro negro en la banda, será neccesario que cambien el color de la letra del campo (Forecolor) a blanco para poder verlo.

El reporte final debe verse más o menos así:


Ahora cambiamos a la pestaña "Preview" para que se compile nuestro reporte y genere, en el mismo directorio en el que colocamos nuestro archivo "reporteGrupo.jrxml", el archivo "reporteGrupo.jasper".

Ahora regresamos al NetBeans y ejecutamos nuestra aplicación. Esto generará un archivo PDF en el mismo directorio que los archivos .jrxml y .jasper. El contenido del reporte el siguiente:



Como podemos ver, los tres grupos (uno por cada consola) se muestran de forma independiente uno de otro. Además en cada grupo se listan solo los jugadores que tienen la consola del grupo.

El código final de la clase Main es el siguiente:

public class Main
{ 
public static void main(String[] args) throws Exception 
  {     
        List listaJugadores = new ArrayList();      
    
        for (int i = 1; i <= 4; i++)     
        {         
            listaJugadores.add(new Jugador(i, "Jugador " + i, "Wii"));     
        }      

        for (int i = 5; i <= 7; i++)     
        {         
            listaJugadores.add(new Jugador(i, "Jugador " + i, "XBox"));     
        }      
        for (int i = 8; i <= 10; i++)     
        {         
            listaJugadores.add(new Jugador(i, "Jugador " + i, "PS3"));     
        }      

        JasperReport reporte = (JasperReport) JRLoader.loadObject("reporteGrupo.jasper");
        JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaJugadores));      

        JRExporter exporter = new JRPdfExporter();     
        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);     
        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("reporte grafica.pdf"));      

        exporter.exportReport(); 
    }
}


Bueno, espero que este tutorial les sirva. No olviden dejar sus dudas, comentarios, y sugerencias.

Saludos.

Visita la parte 1 de este tutorial: Reportes con Conexión a Bases de Datos
Visita la parte 2 de este tutorial: Usando DataSources Personalizados
Visita la parte 3 de este tutorial: Parámetros y Variables
Visita la parte 4 de este tutorial: Reportes en aplicaciones web
Visita la parte 5 de este tutorial: Gráficas en Reportes
Visita la parte 7 de este tutorial: Subreportes

41 comentarios:

  1. Imagina que tengo en el informe una especie de tabla con las siguientes columnas: aplicación, puntuacion y empresa, (donde la empresa es la que hizo la aplicación y puntuación es la puntuación que tiene esa aplicación).Yo quiero mostrar la puntuación promedio por empresa, seria crear un grupo por empresas, y luego sumar las puntuaciones para cada una de las empresas. ¿Cómo puedo indicar en una variable que haga la suma de la columna puntuación pero perteneciente a cada empresa?

    ResponderEliminar
  2. Hola, efectivamente, tendrías que crear un grupo por cada empresa.

    Para indicar la variable de la que hablas basta con definirla en el panel "Report inspector" en la sección de variables y colocarla dentro de la banda del grupo que acabas de crear, colocando en sus propiedades que sea una suma de tu columna puntuación. Con esto lograras que esa variable tenga la suma de la puntuación de cada empresa.

    Saludos

    ResponderEliminar
  3. Esto de los grupos está pudiendo conmigo. A ver estoy tratando de hacer primero algo más sencillo, como es un grafico pie. Tengo en el informe la siguiente información( que recupero desde un java con JasperFillManager.fillReport): Aplicacion, criticidad y empresa, tengo los tres field definidos, en el informe que genrero muestro el valor de esos tres campos y quiero mostrar un gráfico tipo pie con el % de aplicaciones en funcion de la criticidad (hay criticas, altas, medias y bajas); me he generado un grupo para el campo criticidad (grupocriticidad) y tengo la variable grupocriticidad_COUNT que se genera con el grupo. Los datos que pongo en el chart son: en key expresion el campo criticidad ($F{criticidad}) y en el valor el valor de la variable grupocriticidad_COUNT ($V{grupocriticidad_COUNT}), tengo de datos 6 aplicaciones, 2 criticas, 2 medias, 1 alta y 1 baja, y en el gráfico siempre me salen 4 porciones cada una con un 25% (indicando que sólo hay una de cada). ¿Podrías decirme que estoy hacuendo mal?

    Gracias x anticipado.Aún no he probado lo del comentario anterior,xq no e conseguido que me funcione esto. Ya te comento algo

    ResponderEliminar
  4. Parece ser que si los ordeno por el grupo (pongo todas las criticas juntas, todas las altas, etc.), si me pinta el gráfico bien. ¿Es obligatorio tener los registros ordenados por el grupo para que los pinte bien?

    ResponderEliminar
  5. Hola Ro;

    Efectivamente, los registros deben estar ordenados por el atributo que te interese graficar (que en tu caso me parece que es criticidad) para que el gráfico lo muestre de manera correcta.

    Saludos

    ResponderEliminar
  6. A ver porque me surge otra duda, yo tengo en el informe mostrado los campos aplicacion, criticidad, puntuación, y empresa. Y quiero sacar dos gráficos distintos, por un lado el tipo pie en el que hablé en el comentario anterior, lo cual ya he conseguido ordenando los datos por el campo criticidad. Pero ahora quiero otra gráfica, de barras en el que en el eje de las x se encuentren las empresas y en el eje de las y la puntuación promedio por empresa, para ello necesito generar otro grupo (empresa), y una variable que sume las puntuaciones asociadas a cada empresa y divida por el numero de aplicaciones de la empresa, pero claro los datos de la empresa no están ordenados por empresa (ya que los había ordenado por criticidad), ¿como arreglo eso?

    ResponderEliminar
  7. Al final lo he resuelto usando subinformes, no se si es la opción más óptima, pero funciona. Una cosilla más, ¿cómo puedo personalizar los gráficos? En concreto quiero ponerle el color a los campos en función del valor que tienen, por ejemplo en el de barras, si la puntuación es mayor de un valor que ponga un color ... Y otra cosilla, ¿que libreria necesito para poder modificar el tema del grafico y ponerlo como estilo aegean?

    Perdona por tanta pregunta, pero es que no encuentro mucha documentación al respecto.

    Saludos y gracias

    ResponderEliminar
  8. Hola Ro;

    Que bueno que por fin lograste que tus graficas salieran. En cuanto a tus preguntas no estoy muy seguro de como hacer ninguna de las dos cosas.

    Respecto a lo de los colores de las gráficas parece que no hay ninguna forma directa de hacerlo. Parece que debes escribir una clase para personalizar tu gráfica. Parece no ser muy complicado. En estas dos paginas explican más o menos como:


    http://jasperforge.org/plugins/espforum/view.php?group_id=83&forumid=101&topicid=37527

    http://jasperforge.org/plugins/espforum/view.php?group_id=83&forumid=101&topicid=43040

    Una vez creada tu clase parece que debes agregarla, en iReport, a tu grafica en la propiedad "Customizer class".


    Sobre lo del cambio de tema a aegean, no se que versión de iReport estes usando. En la que yo tengo (3.5.2) en el panel de propiedades de la gráfica, en la categoría "Common chart properties" hay una propiedad llamada Theme y ahi aparece "aegean".

    Segun vi en un foro pasa lo que supongo puede estarte pasando a ti, que cuando se genera el reporte en iReport la grafica se ve bien, pero al generar el PDF del mismo, el tema de la grafica se pierde. No dan ninguna solución así que tampoco estoy seguro de cómo resolverlo. ¿No te arroja ninguna pista en consola?.


    Disculpa por no poder haber ayudado mucho a resolver tus dudas, en la noche que tenga un poco más de tiempo voy a meterme más a fondo para ver cómo se pueden solucionar =(.

    Saludos.

    ResponderEliminar
  9. muchas gracias, voy a leerme los link que me enviaste a ver si lo soluciono. Ya te contaré que tal.

    Saludos y gracias again

    ResponderEliminar
  10. Bueno ya he conseguido lo de los colores, y lo del tema ya no me ha hecho falta, pues he modificado las propiedades que necesitaab en la clase customizada para darle el aspecto que quería. Muchas gracias por la ayuda.

    Un par de cosillas más que tengo dudas: Cómo puedo poner que los datos que se muestren salgan en una tabla (no quiero un crosstab sino sólo a modod de presentación). He intentado hacerlo con lineas montandomela yo pero no consigue que quede muy bien, quería saber si había alguna manera rápida de hacerlo.

    Y por último, yo en mi informe muestro una tabla con unos datos, y luego en el sumary quiero mostrar unas cuentas gráficas sacadas de los datos de la tabla, el problema que tengo es que el tamaño máximo de la banda es 800 y poco, y no me cabe todo lo que quiero poner, ¿Cómo puedo resolver ésto?

    Saludos y gracias de nuevo

    ResponderEliminar
  11. Y otra última cosilla que se me olvidó poner, en la banda summary no se repite el page header ni el page footer, ¿hay alguna manera de conseguir que se repita?

    ResponderEliminar
  12. Hola Ro, que bueno que ya pudiste resolver lo de los colores de la gráfica.

    Sobre lo de la tabla. Si lo que quieres es solo mostrarlos de esa forma, creo que lo estas haciendo bien, con líneas, solo deberás tener cuidado en colocarlas bien.

    Sobre lo de modificar el tamaño máximo de la banda, me parece que no pudes superar ese tamaño, ya que de alguna forma limita a que sea a lo más lo que cabe en una página del tamaño que definas (que me parece que por default es letter), descontando en encabezado y el píe de página y de columna.

    Sobre lo de la banda summary no hay forma de hacer eso, si quieres que se repitan el header y el footer deberías poner los textos a mano en donde quieres que aparezcan, ya que la finalidad de esta banda es que aparezca solo al final del reporte o del subreporte.

    Saludos

    ResponderEliminar
  13. Ok, gracias, pues entonces necesito ayuda a ver como lo hago, porque en la banda sumary no me cabe todo. El caso es que yo tengo en mi informe, en la column header los titulos de las columnas, tengo creado un grupo por empresa, en la cabecera del grupo pongo el campo empresa, y en la banda sumary tengo los campos aplicación, puntuación y criticidad. Y en el footer del grupo tengo la puntuación total. De esta manera el informe se me muestra por empresa, las aplicaciones que hat y la puntuación q ue tienen. El caso es que al final quiero mostrar varuas graficas en relación a la información de todas las empresas, y no me cabe en la banda de sumary. Estaba pensando poner otro grupo (que englobara todos los registros, añadi un campo y a todos los valores q devuelvo de la base de datos le di el mismo valor), y cree un grupo agrupado por dicho campo. El problema es que ese grupo se me muestra a la vez que el otro, es como si primero agrupara por el grupo anterior y luego por este. No se si es que no se pueden tener dos grupos a la vez, si es obligado hacer un subinforme o como soluconarlo. Si me puedieras dar alguna pista.

    Y otra cosilla que no tiene nada que ver con esto, ¿por qué cuando convierto a pdf pierdo el estilo escogido para la letra?No le hace caso al negrita, cursova.... sin embargo en rtf si.

    Muchas gracias por la ayuda

    ResponderEliminar
  14. He conseguido cambiar la ubicación de la banda del grupo de manera que ya me sale como quiero, el problema es que me repite el column header en todas las páginas, lo cual es normal segun la definición de la banda, pero ¿hay alguna manera de evitar que salga la cabecera?o otra manera de hacer lo que quiero?

    ResponderEliminar
  15. Hola Ro. Que bueno que poco a poco tu reporte va saliendo.

    Sobre porque cuando exportas a PDF no respeta algunos estilos, esto tiene que ver con el convertidor que usa JasperReports para la conversión PDF (que es iText). Los formatos que puedes usar dependen de esta API. Supogo que esta no soporta la negrita y cursiva (tal vez por separado si lo haga).

    Y sobre cómo mostrar o no o no la cabecera (la banda column header) esto puedes hacerlo mediante una de las propiedades de la banda. En el panel de propiedades todas las bandas tienen una propiedad llamada "Print When Expression". En esta propiedad puedes poner una condición que, si es verdadera, mostrará la banda y de lo contrario no lo hará. La condición depende de la lógica de tu reporte, solo recuerda que debe ser un valor booleano. Entonces la expresión puede ser un valor == null o una cadena vacia o algo por el estilo.

    Saludos

    ResponderEliminar
  16. Muchas gracias, el "print when expression" no tenia ni idea de para que servía. Ya tengo el reporte como quiero. Muchas gracias por todo, me has sido de gran ayuda. Te voy a pregutar una ultima cosa, ¿cómo se especifican rutas relativas? Es que tengo una imagen, y ahora todo me va bien, porque estoy en local, pero cuando suba al servdor la aplicación (y el informe) no me a va a encontrar

    ResponderEliminar
  17. Hola Ro, que bueno que ya tu reporte esta funcionando.

    Sobre tu pregunta de las rutas en realidad cuando haces una aplicación standalone para las rutas puedes poner solo la parte referente al poyecto (si tu imagen está en "C:\proyectos\proyecto1\imagenes\imagen1.jpg" en el reporte puedes poner solo "imagenes\imagen1.jpg"). Sin embargo cuando se trabaja en web, si no recuerdo mal, siempre debes darle la ruta absoluta (http://tuservidor:puerto/contexto/img/imagen1.jpg). De lo contrario, y si no recuerdo mal, no puede encontrar dónde estan las imagenes.

    Afortunadamente existe una forma para remediar esto. Puedes darle a tu reporte la ruta de dónde está la imagen en tu proyecto (img/imagen1.jpg) y pasar el resto de la ruta (http://tuservidor:puerto/contexto) como un parámetro y al final concatenas estos dos valores de esta forma:

    $P{ruta} + "img/imagen1.jpg"

    Así en tus pruebas locales te aseguras de pasarle la ruta de tu localhost y en producción le pasas la ruta final.

    Espero que esto te ayude. Saludos

    ResponderEliminar
  18. OK, voy a probarlo, seguro que funciona:). Muchisimas gracias por todo.

    ResponderEliminar
  19. ¿funcionaria en el caso de que fuera https?

    ResponderEliminar
  20. Hola Ro.

    En realidad no estoy muy seguro, nunca lo he usado sobre https pero no veo por qué no habría de funcionar.

    Saludos

    ResponderEliminar
  21. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  22. Hola, te felicito por tu tutorial, me resultó bastante util, pero tengo una pregunta que espero me puedas ayudar por favor.

    Mira tengo un jFrame, dentro de este un jPanel y necesito mostar el reporte dentro del Jpanel y no en una ventana separada como sale el reporte, me puedes ayudar

    Gracias de antemano

    ResponderEliminar
  23. Hola Vero, una pregunta sobre tu aplicación. ¿Estas mostrando tu reporte usando un JasperViewer?

    Saludos

    ResponderEliminar
  24. Hola, si estoy usando un JasperViewer, pero quisiera que eso se mostrara en la ventana que hice dentro de un panel, es posible?

    ResponderEliminar
  25. Hola Vero;

    Podrías mostrarme exactamente cómo es que estas usando el JasperViewer para visualizar tu reporte?

    ResponderEliminar
  26. en pagoVentana.java la ventana tiene un JScrool Panel y dentro de este un jPanel el evento actionPerformed contiene:


    try {
    reporte = (JasperReport) JRLoader.loadObject("reportes/ComprobanteEgresoReporte.jasper");
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);
    JasperViewer jviewer = new JasperViewer(jasperPrint,false);
    jviewer.viewReport(jasperPrint);
    jScrollPane.add("prueba1",jasperPrint);
    } catch (JRException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }


    se que esta linea no es posible por el tipo de componentes que son:jScrollPane.add("prueba1",jasperPrint);

    pero necesito saber si hay alguna manera de hacerlo, gracias por responder

    ResponderEliminar
  27. Hola Vero;

    Revisando el javadoc de JasperViewer me di cuenta de que este extiende de JFrame, es por eso que se muestra como una ventana independiente.

    Si quieres mostrar el reporte dentro de un panel prueba usar JRDesignViewer, el cual extiende de JPanel

    Saludos.

    ResponderEliminar
  28. Hola, excelente tu tutorial pero tengo una pequeña duda, resulta que tengo un field (resultado del Sql) que trae un valor que es mas grande que el static field donde se muestra, y necesito mostrarlo completamente, ¿hay alguna forma de que el static field se adapte al valor que contenga?

    ResponderEliminar
  29. Hola Kotetsu;

    Pues me parece que eso no se puede hacer. Las bandas siempre se quedan del tamaño que la defines en pixeles. Se me ocurre que podrías usar un scriptlet para tratar de ajustar el ancho dependiendo del texto, pero la verdad no estoy muy seguro de que aún así sea posible.

    Saludos

    ResponderEliminar
  30. Kotetsu, si entiendo bien lo q tu necesitas es q el dato q viene de tu campo en la tabla no se corte debido al tamaño q tiene tu $F{NOMBRE_CAMPO} y q tampoco dependa del tamaño q le diste a tu datail si es asi entonces selecciona el campo q necesitas q no se corte, luego vas al apartado de text field properties y encontraras una opcion q dice Stretch with overflow seleccionas el chequesito.... y listo tu campo no importa lo grande q sea el texto q viene en el toda la fila se ajustara al tamaño de tu texto y no te cortara el mismo.

    Salu2

    ResponderEliminar
  31. Oscar te pasaste!!
    realmente muchísimas gracias
    lo probare y les cuento

    ResponderEliminar
  32. Oscar muchas gracias por el aporte, nunca habia visto esa propiedad, pero estoy seguro que será de mucha utilidad para todos nosotros =D.

    ResponderEliminar
  33. Alex, por nada alli probando q hacia cada campo lo encontre jejejeejje, mira ahora soy yo el q necesita de ayuda... es sobre otro tema pero no se a donde poder escribirte. el problema q tengo actualmente es que necesito trabajar con plantillas dentro de un JSP o llamar a una plantilla desde un JSP, estuve buscando y lo unico q encontre es algo q hace referencia a jtpl pero no logro hacerlo correr, no se si tu has visto algo de eso?

    Saludos y espero me puedas dar una manita...

    ResponderEliminar
  34. Hola Oscar; Pues JTPL es un motor de plantillas para Servlets, pero mensionas que vas a trabajar con JSPs, así que me parece que no te sirve mucho, además de que me parece, si no me estoy confundiendo, que es poco viejo.

    Para trabajar con plantillas en JSPs existen varios métodos. JSPs tiene uno propio muy sencillo si es que quieres trabajar con cosas simples (busca algo llamado prelude y coda). Además existen otros más elavorador como Velocity, FreeMarker o Tiles.

    Dependiendo de que es lo que necesites alguno de estos frameworks de plantillas se ajustará mejor a tus necesidades.

    Si tienes alguna duda puedes escribirme un correo a:

    programadorjavablog@gmail.com

    y con todo gusto trataré de ayudarte.

    Saludos

    ResponderEliminar
  35. Hola gracias por el aporte sobre ireport, tengo una consulta, quiero tener un campo field cuyo ancho sea variable, es decir a lo largo, porq con la propiedad overflow se amplia hacia abajo pero yo quiero que se amplie hacia la derecha, y q los datos q estan al lado se muevan...abra una forma de hacer eso?

    ResponderEliminar
  36. Hola, gracias por el aporte bien interesante y util, pero tengo un problemaque espero me puedas ayudar. es con los reportes que no se me abren me sale:java.ioFileNotFoundException: /images/comprobanteEgresoReporte.jasper


    al inicio se generaban los sources y los bin la misma carpeta c:\proyecto\ y se abrian normalmente los archivos jasper

    de ahi decidí cambiar por una carpeta separada src para souces y bin para binarios
    pero cuando ejecuto el modulo que llama y envía los parametros al archivo jasper para presentar por pantalla me sale ese error, tengo tambien imagenes y otras cosas a la que no les afectó el cambio. que puedo hacer para solucionar esto

    ResponderEliminar
  37. por cierto olvide decir que estoy usando eclipse

    ResponderEliminar
  38. Hola Vero;

    ¿Estas haciendo una aplicación standalone o web?.

    Si la aplicación es web, debes colocar la ruta completa de la ubicación del reporte en tu disco duro (c:\algo\algo\algo.jasper).

    Si la aplicación es standalone puedes usar rutas relativas (../carpeta/algo.japer) y el archivo .jasper se busca a partir de la raíz de tu proyecto (fuera de cualquier paquete), por eso cuando estaba en el mismo directorio todo funcionaba bien. Tal vez te funcione haciendo ../src/imagenes/archivo.jasper, o cualquiera que sea la ubicación de tu archivo

    Saludos

    ResponderEliminar
  39. Gracias ya lo solucione olvide que debo agregar la carpeta bin al path en el código quedo asi
    bin/reportes/ComprobanteEgresoReporte.jasper, pero tengo una duda adicional tengo un reporte con un subreporte,se como enviar los datos al reporte padre como tu indicaste en este tutorial pero necesito saber como le paso los parametros al subreporte saludos

    ResponderEliminar
  40. Hola info; Perdón pero yo tampoo he encontrado una ofrma de hacer esto. Sigo buscando una forma de hacerlo, en cuanto lo logre lo publicaré en el blog ya que veo que es una pregunta que se repite frecuentemente.

    Saludos

    ResponderEliminar
  41. Este tutorial ha llegado a los 40 comentarios, así que aplicaré la regla de los 40 comentarios y desactivaré los comentarios. Si tienen alguna duda pueden enviarla a:

    programadorjavablog@gmail.com

    Saludos

    ResponderEliminar