Reportes en Java (Parte III: Enlace)

   Una vez explicadas las partes de Instalación y Diseño de este tutorial, solo falta el código necesario para llamar el reporte generado, para ello crearemos una nueva clase, llamemosla "IniciarReporte", una vez en la clase el código es el siguiente:
package reportes;

import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.*;
import net.sf.jasperreports.view.save.JRPdfSaveContributor.*;
import net.sf.jasperreports.view.JRViewer.*;
import net.sf.jasperreports.view.save.JRMultipleSheetsXlsSaveContributor.*;
/**
 *
 * @author Carlos Martinez
 */
public class IniciarReporte {
    Connection conn;
    public IniciarReporte(){
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            conn = DriverManager.getConnection(URL_MYSQL,USUARIO_MYSQL,CLAVE_MYSQL);
        } catch (SQLException ex) {
            Logger.getLogger(IniciarReporte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(IniciarReporte.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void MiConsultaN(){
        try{
            String archivo = System.getProperty ("user.dir")+"\\src\\reportes\\MiReporte.jasper";
            System.out.println("Cargando desde: " + archivo);
            if(archivo == null){
                JOptionPane.showMessageDialog(null,"Error al generar reporte, verifique impresora\n", "Generar Reporte",JOptionPane.ERROR_MESSAGE);
            } JasperReport masterReport= null;
            try {
                masterReport= (JasperReport) JRLoader.loadObject(archivo);
            } catch (JRException e) {
                System.out.println("Error cargando el reporte maestro: " + e.getMessage());
                JOptionPane.showMessageDialog(null,"Error al generar reporte, verifique impresora\n","Generar Reporte",JOptionPane.ERROR_MESSAGE);
            }
            JasperPrint jasperPrint= JasperFillManager.fillReport(masterReport,null,conn);
            JasperViewer jviewer= new JasperViewer(jasperPrint,false);
            jviewer.setTitle("Titulo de mi Reporte");
            jviewer.setVisible(true);
        }catch (Exception j){
            System.out.println("Mensaje de Error:"+j.getMessage());
        }
    }
}
   Y para llamarlo colocamos en cualquier evento lo siguiente:
IniciarReporte jasper = new IniciarReporte();
jasper.MiConsultaN();
   Lo mas importante a destacar es lo siguiente: "System.getProperty ("user.dir")+"\\src\\reportes\\MiReporte.jasper", esto es para indicarle al programa donde esta el archivo del reporte, una vez creado el programa y compilado, deberemos copiar dentro de la carpeta el paquete o archivos de reportes y cambiar la línea de código por la siguiente: "System.getProperty ("user.dir")+"\\carpeta\\MiReporte.jasper", con esto ya estamos listos para generar los reportes.

26 Comentarios

Escribir Comentario
Anónimo
AUTOR
31 de octubre de 2010, 21:51 delete

Hola, en principio muy bueno el tutorial. Te quiero consultar sobre un problema que estoy teniendo: ya generé mi reporte lo tengo asignado y lo llamo, pero cuando lo quiero ver desde una terminal se me abre en el servidor y no en la terminal que estoy ejecuntando la aplicación por ende no lo puedo ver (el reporte se abre/muestra en el servidor y no en la terminal donde estoy ejecutando la aplicación). Sim e podrías dar una mano con esto te agradecería. Desde ya muchas gracias,

Hector

Responder
avatar
1 de noviembre de 2010, 7:40 delete

Hola, con respecto a que lo ejecutas desde el servidor entonces estas utilizando un acceso directo o ASP, si utilizas un acceso directo entonces debes tener en el terminal las carpetas con los archivos del reporte o especificar su ruta desde una conexión en red, en esta línea de código es donde se hace:

System.getProperty ("user.dir")+"\\src\\reportes\\MiReporte.jasper";

Quiere decir que en la carpeta desde donde ejecuto el sistema (la ruta de la barra de direcciones) tengo otra que se llama "src", dentro otra con nombre "reportes" y dentro el archivo "MiReporte.jasper"...

Eso es lo primero que entendí, lo segundo que entiendo es que le das a generar reporte y se abre alla y no aquí, pero es extraño, como llamas al sistema??

Saludos

Responder
avatar
juan
AUTOR
29 de diciembre de 2010, 18:50 delete

hola amigo adapte tu codio a un ejemplo que tengo, cuando le doy en generar reporte me sale k no tiene paginas, y el reporte en relidad si las tiene sabes pk me sale eso?

Responder
avatar
juan
AUTOR
29 de diciembre de 2010, 18:56 delete

HAA SE ME PASABA DESPUES K ME MUESTRA K NO TIENE PAGINAS ME SALE ESTE ERROR
Cargando desde: D:\Documents\TEC\6 Semestre\Desarrollo De Sistemas\Version 1.7\Biblioteca_Final\Biblioteca_ramiro\src\reportes\REPORTES.jasper
29/12/2010 04:52:18 PM net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
ADVERTENCIA: The supplied java.sql.Connection object is null.

Responder
avatar
30 de diciembre de 2010, 12:35 delete

Hola Juan, disculpa la demora en responder pero me encontraba ausente, a lo mejor será alguna consulta SQL que estés realizando con X parámetro y no se ha definido, si puedes postear el código de la consulta sería bueno, saludos.

Responder
avatar
victor
AUTOR
1 de mayo de 2011, 2:59 delete

Hola, tengo un problema.
Primero, cree un reporte, le doy vista previa y todo sale perfecto. Luego le doy CompileReport y me genera el archivo .jasper, pero al momento de mostrar el Objeto JasperViewer me sale que el reporte no tiene paginas. El reporte es un reporte sencillo sin parametros, solo muestra los datos de una tabla.

try{
//direccion del archivo JASPER
URL in = this.getClass().getResource("report1.jasper");
reporte = (JasperReport) JRLoader.loadObject( in );


reporte_view= JasperFillManager.fillReport( reporte, null, con.getConnection() );

JasperViewer jviewer = new JasperViewer(reporte_view,false);
jviewer.setVisible(true);

//terminamos la conexion a la base de datos
// con.desconectar();
}catch (JRException E){
E.printStackTrace();
}

Responder
avatar
2 de mayo de 2011, 8:52 delete

Hola... disculpa la demora, si es un reporte normal sin parámetros, con la sentencia SQL y los campos bien ordenados deberías poder verlo sin problemas, de cualquier forma postea el log del error para ver donde esta el problema... Saludos!!!

Responder
avatar
fminguetch
AUTOR
9 de septiembre de 2011, 0:22 delete

Buenas..
Se puede crear una instancia a un report creado en iReport (.jasper) desde una pagina en asp.net

Responder
avatar
9 de septiembre de 2011, 8:50 delete

Claro que se puede, recuerda que esto es una clase cualquiera a la que se llama mediante un método, incluso puedes hacerlo si quieres dinámico, de modo que el método de la impresión del reporte reciba un parámetro "String" el cual utilizaría para definir el nombre del reporte, así solo tendrías un único método

Para llamarlo sería algo así (en caso de envíarle el String):
String reporte = "MiReporte.jasper";
IniciarReporte jasper = new IniciarReporte();
jasper.MiConsultaN(reporte);
Cambiando la línea que define la ruta del archivo o reporte por algo como esto:
String archivo ="direccion/del/archivo/"+reporte;

Responder
avatar
Anónimo
AUTOR
1 de noviembre de 2011, 11:40 delete

Hola que tal, tengo un gran problema, tngo q llamar un reporte desde una jsp, desde una clase, que debería de cambiar de este código para que me fucione en la web. Gracias

Responder
avatar
1 de noviembre de 2011, 15:04 delete

¿Como estas? Verás, si estas usando JSP lo que debes modificar no es mucho.... Fijat en este ejemplo sencillo

File reportFile = new File(application.getRealPath("MI_REPORTE.jasper"));

Map parameters = new HashMap();

byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,conn);

response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();

Responder
avatar
Anónimo
AUTOR
2 de noviembre de 2011, 22:53 delete

hola de nuevo, gracias por la ayuda, me costo un poco pero cabe resaltar que fue por no adjuntar todas las librerías necesarias de jasperreport, pero ya funciona, gracias por la ayuda!!

Responder
avatar
Anónimo
AUTOR
4 de octubre de 2012, 22:53 delete

Sos grande me sirvio mucho !!!

Responder
avatar
Anónimo
AUTOR
9 de octubre de 2012, 12:58 delete

Hola, yo solo tengo una duda, puedo invocar un reporte creado en ireport dentro de una aplicación creada en asp.net??????????''

Responder
avatar
Anónimo
AUTOR
9 de octubre de 2012, 13:09 delete

Alguien me puede pasar las librerias necesarias para usar Ireport dentro de asp.net.
Se los agradeceria muchisimo.....

Responder
avatar
9 de octubre de 2012, 13:11 delete

Hola, supongo eres el del comentario anterior, verás, esto no es un foro, es un blog... Ya dejaste una pregunta y pronto publicare como hacerlo, mientras puedes conseguir la info necesaria aquí: http://www.javaworld.com/community/node/1468.... Saludos!!

Responder
avatar
Anónimo
AUTOR
9 de octubre de 2012, 14:23 delete

Muchisimas gracias..............

Responder
avatar
Anónimo
AUTOR
14 de octubre de 2012, 21:43 delete

Saludos, he estado usando tu codigo y al parecer conecta pero me da un error yo estoy usando access como base de datos un jpanel de los que se desarrollan con drag and drop(soy un total novato) y llamo el metodo desde un boton, en el preview del ireport trabaja bien pero no me abre desde el boton. Te agradeceria cualquier ayuda.

Esto es parte del log
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Lorg/apache/commons/logging/Log;

Responder
avatar
Anónimo
AUTOR
14 de octubre de 2012, 22:05 delete

Saludos nuevamente ya resolvi era que me faltaban las librerias, es un gran blog me sirvio de mucha ayuda llevo mas de tres semanas buscando en la web. La direccion de las librerias que me faltaban es esta por si le hacen falta a alguien http://commons.apache.org/logging/download_logging.cgi

Responder
avatar
15 de octubre de 2012, 10:00 delete

Me alegra que funcionara, disculpa la demora en responder pero no estuve el fin de semana disponible... Cualquier otra duda no dudes en dejar un comentario... Saludos!!!

Responder
avatar
Anónimo
AUTOR
21 de octubre de 2012, 12:35 delete

Una Pregunta luego de compilado el programa, como debo de manejar el directorio para que el programa compilado encuentre el reporte.
Esta connectado a una base de datos en access le agradeceria si me puede ayudar con esto.

Responder
avatar
21 de octubre de 2012, 12:57 delete

En la variable que contiene la ruta del reporte (archivo) puedes hacer lo siguiente... Crea una carpeta dentro de tu directorio principal del programa, sistema o proyecto y llamala "reportes", entonces haces algo como esto:

String slash = System.getProperty("file.separator"), directorio = System.getProperty ("user.dir");
String archivo = directorio+slash+"reportes"+slash+"Mi_Archivo.jasper";

Espero se entienda.... Saludos!!

Responder
avatar
Anónimo
AUTOR
22 de octubre de 2012, 16:37 delete

Gracias. Me trabaja en netbeans pero fuera de netbeans no. Pero gracias por tu tiempo.

Responder
avatar
22 de octubre de 2012, 18:15 delete

Lo mas seguro es que no te funciona por esta línea:

String archivo = System.getProperty ("user.dir")+"\\src\\reportes\\MiReporte.jasper";

Debes cambiarla a la ruta de tu reporte, por ejemplo, si tienes los reportes dentro de la misma carpeta del proyecto entonces debes colocarlo así:

String archivo = System.getProperty("user.dir")+"\\MiReporte.jasper";

O creas dentro de tu proyecto una carpeta llamada "src", dentro de esta "reportes", y en ella colocas todos los reportes... Saludos!!

Responder
avatar
21 de marzo de 2013, 20:58 delete

Hola te comento que quiero usar Reportes para una aplicacion que estoy haciendo es un reloj checador pero no tengo idea de como poder generar reportes desde la aplicacion ya corriendo suponiendo que quiero un reporte semanal de la fecha X a la Y que el usuario pueda poner la fecha que quiere que comprenda el reporte y este se mande a una consulta para que el reporte pueda ser hecho por medio de consultas SQl me podrias ayuda

Responder
avatar
21 de marzo de 2013, 21:10 delete

Para hacer lo que quieres de forma rápida y sencilla necesitas lo siguiente:

- Crea la aplicación en cuestión usando consultas SQL.
http://carlitoxenlaweb.blogspot.com/2011/09/consultas-sql-dinamicas-en-java.html

- Muestra los datos que quieres llevar a físico (papel) en una tabla
http://carlitoxenlaweb.blogspot.com/2008/12/mostrar-datos-de-mysql-en-tablas.html

- Pasa esa tabla en forma de arreglo o lista a tu clase de iReport, sin utilizar SQL, simplemente recorre el arreglo desde iReport
http://carlitoxenlaweb.blogspot.com/2010/09/reportes-en-java-parte-iv-parametros.html


Este último paso puedes cambiarlo por pasar la cadena SQL que ejecutas para mostrar la tabla y la ejecutas como SQL en el reporte

PD: si quieres mas info en el blog hay muchos ejemplos, sino comienza con el código y deja tus dudas de que no te sale bien... Saludos y suerte!!!!

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión EmoticonEmoticon