viernes, 24 de junio de 2011

Como crear reportes java con IReport y JCreator

Dudas
Crear reporte con Jasper desde Jcreator pro 4.5
- Librerias a utilizar
- envio de parametros
Muchas gracias.
web www.juanperezu.com

 R:\
En este primer ejemplo usaremos un arreglo de beans para llenar el reporte.

Lo primero que vamos a hacer es crear la plantilla del reporte en IReport.


En la plantilla del reporte se definieron los siguientes parametros que seran pasados desde java en el mapa de parametros del reporte:

  • TITULO
  • NOMBRE_CLIENTE
  • TELEFONO
  • DIRECCION
Tambien se definieron los siguientes campos que son el nombre de las propiedades de los beans con que se populara el datasource desde java:

  • id
  • name
  • qty
  • unitCost
  • subTotal
Despues creamos una variable para calcular el total del reporte en este caso es una variable que suma el campo subTotal.


Ahora procedemos a crear el bean en JCreator. Posteriormente adicionamos las librerias que requiere jasper report para funcionar haciendo lo siguiente:

package co.edu.politecnicojic.reportes.dto;


public class Product {
 private String id;
 private String name;
 private int qty;
 private double unitCost;
 private double subTotal;

 
 public void setId(String id) {
  this.id = id; 
 }

 public void setName(String name) {
  this.name = name; 
 }

 public void setQty(int qty) {
  this.qty = qty; 
 }

 public void setUnitCost(double unitCost) {
  this.unitCost = unitCost; 
 }

 public void setSubTotal(double subTotal) {
  this.subTotal = subTotal; 
 }

 public String getId() {
  return (this.id); 
 }

 public String getName() {
  return (this.name); 
 }

 public int getQty() {
  return (this.qty); 
 }

 public double getUnitCost() {
  return (this.unitCost); 
 }

 public double getSubTotal() {
  return (this.subTotal); 
 }
}







Y agregamos los siguientes jars:

  • iText-2.1.7.jar
  • jasperreports-4.0.2.jar
  • commons-beanutils-1.8.0.jar
  • commons-collections-2.1.1.jar
  • commons-logging-1.0.4.jar
  • poi-3.6.jar
  • commons-digester-1.7.jar
  • groovy-all-1.7.5.jar


Ahora creamos la clase que se encargara de llenar el reporte.

/**
 * @(#)EjemploJasperReport.java
 *
 * EjemploJasperReport application
 *
 * @author Luis Carlos
 * @version 1.00 2011/6/24
 */
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import co.edu.politecnicojic.reportes.dto.Product;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;

public class EjemploJasperReport {
    
    public static void main(String[] args) throws JRException{ 
     Map parameters = new HashMap();
  parameters.put("TITULO", "Factura de Ejemplo");
  parameters.put("NOMBRE_CLIENTE", "Luis Carlos Sanchez Gonzalez");
  parameters.put("TELEFONO", "5555555");
  parameters.put("DIRECCION", "Cll 2 # 36 - 52");
  JasperFillManager.fillReportToFile("C:/Users/Luis Carlos/Documents/JCreator Pro/MyProjects/EjemploJasperReport/classes/Reports/EjemploSQL.jasper", parameters, new JRBeanCollectionDataSource(getProductos()) );
  JasperExportManager.exportReportToPdfFile("C:/Users/Luis Carlos/Documents/JCreator Pro/MyProjects/EjemploJasperReport/classes/Reports/EjemploSQL.jrprint");
    }
    
    public static ArrayList getProductos(){
     ArrayList productos = new ArrayList();
     Product p1 = new Product();
     p1.setId("770123456");
     p1.setName("Producto 1");
     p1.setQty(5);
     p1.setSubTotal(72835);
     p1.setUnitCost(14567);
     Product p2 = new Product();
     p2.setId("770123457");
     p2.setName("Producto 2");
     p2.setQty(5);
     p2.setSubTotal(72835);
     p2.setUnitCost(14567);
     Product p3 = new Product();
     p3.setId("770123458");
     p3.setName("Producto 3");
     p3.setQty(5);
     p3.setSubTotal(72835);
     p3.setUnitCost(14567);
     productos.add(p1);
     productos.add(p2);
     productos.add(p3);
     return productos;
    }
}
El metod public static ArrayList getProductos() se encarga de generar una coleccion con 3 beans de tipo Producto que van a ser usados para popular el detalle del reporte, y en el metodo main se llena el Map de parametros que van a ser enviados al reporte se popula el datasource, se llena el reporte y se genera el archivo pdf del reporte. En este ejemplo se genera un archivo pdf si lo que se desea es que el reporte sea visualizado una vez generado remplazamos las sentencias que se encuentran despues del mapa de parametros en el metodo main por las siguientes:

JasperPrint print = JasperFillManager.fillReport("C:/Users/Luis Carlos/Documents/JCreator Pro/MyProjects/EjemploJasperReport/classes/Reports/EjemploSQL.jasper", parameters, new JRBeanCollectionDataSource(getProductos()) );
JasperExportManager.exportReportToPdfFile(print, "C:/Users/Luis Carlos/Documents/JCreator Pro/MyProjects/EjemploJasperReport/classes/Reports/EjemploSQL.pdf");
JasperViewer.viewReport(print, false);
Y agregamos las siguientes sentencias import:

import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

jueves, 16 de junio de 2011

Conectar Java a MySQL codificando en JCreator

¿Quien me pude decir como hago para conectar una base de datos hecha en MY SQl con un proyecto hecho en java con el IDE Jcreator?, se lo agradecería.....

R:\
Lo mejor que pueden hacer es centralizar el manejo de las conexiones a la base de datos en una sola clase esta clase debe cargar un archivo de propiedades los parametros para la conexion, en las librerias del proyecto deben poner el jar del driver de conexion a la bd a continuacion describo los pasos en JCreator.

1. Creamos la clase que se encargara de las conexion, la definicion de la clase podria ser la siguiente:
package co.edu.politecnicojic.utils.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ConnectionManager {
 private static final String driverClassName;
 private static final String dataBaseURL;
 private static final String userName;
 private static final String password; 
  
 static{
  Properties props = new Properties();
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("appconfig.properties");
        try {
         props.load(inputStream);
            Logger.getLogger(ConnectionManager.class.getName()).log(Level.INFO, "appconfig.properties sucessfully loaded");
            driverClassName = props.getProperty("database.driver");
         dataBaseURL = props.getProperty("database.url");
         userName = props.getProperty("database.username");
         password = props.getProperty("database.password");
         try {
             Class.forName(driverClassName);
         } catch (ClassNotFoundException ex) {
             Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, "Error regitering driver class", ex);
             throw new ExceptionInInitializerError("Error inicializando la clase del driver");
         }
  } catch (IOException ex) {
         Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, "appconfig.properties can't be loaded", ex);
            throw new ExceptionInInitializerError("Error al cargar el archivo de configuracion");
        } catch (Exception ex) {
         Logger.getLogger(ConnectionManager.class.getName()).log(Level.SEVERE, "appconfig.properties can't be loaded", ex);
         throw new ExceptionInInitializerError("Error inesperado al cargar el archivo de configuracion");
        }
 }
 /**
  * Method getConnection
  *
  *
  * @return
  *
  */
 public static Connection getConnection() throws SQLException{
  return DriverManager.getConnection(dataBaseURL, userName, password);
 }

 /**
  * Method disconnect
  *
  *
  */
 public static void disconnect(Connection connection) throws SQLException{
  connection.close();
 } 
}
2. Agregamos las librerias del driver de conexion a la base de datos: 
  •  Click en Project > Project Settings...
  •  Click en required libraries y en new

  • Diligenciamos un nombre para la libreria y despues le damos a add archive, despues seleccionamos el archivo .jar con las librerias de conexion de MySQL en mi caso use mysql-connector-java-3.1.11-bin.jar


  • Compilamos el proyecto

  • Ahora creamos el archivo de configuracion que usaremos para cargar los parametros de conexion a la base de datos, este archivo se debe llamar appconfig.properties este archivo debe tener el siguiente contenido:
    database.url=jdbc:mysql://localhost:3306/CURSOS
    database.driver=com.mysql.jdbc.Driver
    database.username=root
    database.password=zxzxzx
    el archivo lo debemos poner en carpeta classes que se encuentra en la carpeta del proyecto que estamos trabajando.

La forma de usar la clase centralizada para el manejo de las conexiones es la siguiente:
  • el metodo getConnection() nos da la conexion a la bd que configuramos en el archivo.
  • el metodo disconnect(Connection) cierra la conecxion a la bd.
A continuacion pongo un ejemplo de su uso:

import co.edu.politecnicojic.utils.jdbc.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class ConnectioManagerExample {
    
    public static void main(String[] args) {
     System.out.println("Ejecuto");
     Connection con = null;
     PreparedStatement ps = null;
     ResultSet rs = null;
     ResultSetMetaData rsmd = null;
     try{
      con = ConnectionManager.getConnection();
      ps = con.prepareStatement("show processlist");
      rs = ps.executeQuery();
      rsmd = rs.getMetaData();
      for(int i =1; i<=rsmd.getColumnCount();i++){
       System.out.print(rsmd.getColumnName(i)+"\t\t\t");
      }
      while(rs.next()){
       System.out.println();
       for(int i =1; i<=rsmd.getColumnCount();i++){
        System.out.print(rs.getString(i)+"\t\t\t");
       }
      }
     }catch(Exception e){
      e.printStackTrace();
     }finally{
      try{
       if(rs != null){
        rs.close();
       }
      }catch(Exception e){
      }
      try{
       if(ps != null){
        ps.close();
       }
      }catch(Exception e){
      }
      try{
       ConnectionManager.disconnect(con);
      }catch(Exception e){
       e.printStackTrace();
      }
     }
    }
}

A continuacion les dejo un link donde podran encontrar el proyecto sobre el que hice las pruebas si tienen algun inconveniente posteen para poder revisarlo.

ConnectionManagerExample