Reportes en Java (Parte IV: Parametros)

   Ya explicado todo creo que viene lo mas importante, pasar los parámetros al reporte para que este imprima valores según preguntas que se le hagan al usuario, como debe ser en los reportes, para ello seguimos las líneas de la Parte II del tutorial y ubicados en el inspector hacemos click en "Parameters" y agregamos uno nuevo (Add Parameter), le colocamos el nombre que queramos y modificamos nuestra consulta SQL colocando al final la condición WHERE.
SELECT campos FROM mitabla WHERE campo = $P{MiParametro}
   Y una vez establecido el SQL cambiamos el código anterior con una pequeña variante, haremos un retorno de String para saber el valor del parámetro indicado, el código sería 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(String MiValor){
        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 impresoran", "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 impresoran","Generar Reporte",JOptionPane.ERROR_MESSAGE);
            }
            Map parametro= new HashMap();
            parametro.put("nombre_del_parametro",MiValor);
            JasperPrint jasperPrint= JasperFillManager.fillReport(masterReport,parametro,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 al igual que antes lo podemos llamar de la siguiente forma:
IniciarReporte jasper = new IniciarReporte();
jasper.MiConsultaN("MiValorString");
   Claro, para obtener este valor podemos utilizar un JTextField, un dialogo o cualquier otra cosa que se nos ocurra, ya lo demas queda a nuestra creatividad e imaginación.
   El String "MiValor" agrega al método la cadena para mappearla al parámetro del reporte, con "parametro.put('nombre_del_parametro',MiValor)" es que agregamos este valor, para agregar mas parametro simplemente agregamos mas líneas y mas variables al método, por ejemplo.
public void MiConsultaN(String Valor1,String Valor2,String Valor3){
//...Resto del código
parametro.put("parametro1",Valor1);
parametro.put("parametro2",Valor2);
parametro.put("parametro3",Valor3);
//...Resto del código
   Con esto ya estamos listos para generar los reportes. Ya hasta aquí llega este tutorial de como generar reportes en java... suerte!!

8 Comentarios

Escribir Comentario
Anónimo
AUTOR
11 de abril de 2011, 12:49 delete

@007
gracias carlitox por tu aporte es muy bueno, y gracias a el pude solucionar un problema que tenia al generar reportes con mas de un parametro... muy buen aporte... espero sigas asi...

Responder
avatar
Rocio
AUTOR
18 de mayo de 2011, 17:44 delete

hola, me parece interesante lo del ireport, pero tengo una consulta como lo haria con java web, he hecho una vista preliminar con java e ireport de los registros de mi pagina, el problema es que solo se ejecuta desde el servidor y no del lado del cliente, me han dicho que puedo hacerlo con un applet, pero no se nada de eso. Porfa si tienen algun comentario o posible solucion ;-|. Help

Responder
avatar
18 de mayo de 2011, 17:49 delete

mmmmm.... bueno, puedes hacer la siguiente prueba, en donde indicas la ruta del reporte debes utilizar path relativo, es decir:

getClass().getResource().getPath() o getFile() [según sea el caso]

Colocalo todo dentro del mismo paquete desde el cual ejecutas la clase que genera el reporte, si no funciona coméntame y probamos otra cosa...

En cuanto a lo del applet no entendí.... Un applet es un programa escrito en java que corre desde el navegador, por lo que si es una app web entonces es un applet, si no mal recuerdo es así... Prueba y comenta, saludos!

Responder
avatar
Anónimo
AUTOR
18 de agosto de 2011, 12:37 delete

Gracias mi estimado carlitox esto es muy util y bueno solo para avisar nadamas que le falta cambiarle esto:

JasperPrint jasperPrint= JasperFillManager.fillReport(masterReport,null,conn);

por esto:

JasperPrint jasperPrint= JasperFillManager.fillReport(masterReport,parametro,conn);

le faltaba pasar el parametro al reporte, me imagino que se te ha de ver pasado je je pero exelente aporte carlitox saludos.

Responder
avatar
18 de agosto de 2011, 23:17 delete

Muy cierto, ya corrijo el error, debí enviar los parámetros y de esa forma solo envió un reporte sin parámetro alguno, gracias!!

Responder
avatar
Anónimo
AUTOR
10 de octubre de 2011, 12:16 delete

Nunca lo corrigio O.o
JasperPrint jasperPrint= JasperFillManager.fillReport(masterReport,null,conn);
Muy bueno el aporte D:

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