lunes, 17 de noviembre de 2014

Jasper Reports con iReport Multiples Bases de Datos

Al diseñar reportes con Jasper Reports e iReport en ocasiones enfrentamos la problemática de presentar en el detalle múltiples subReportes con un origen de información diferente ó utilizamos múltiples bases de datos, a continuación voy a explicar con un ejemplo como se puede realizar.

Como ejemplo vamos utilizar el caso de un reporte de facturación que tiene que presentar en el mismo detalle de movimientos, datos que se obtienen de diferentes tablas y diferentes bases de datos ya que son datos que se originan en diferentes sistemas, para lo cual diseñamos un reporte con las siguientes características:

  •  Reportes Maestro que recibe como parámetros un rango de fechas

  • El reporte maestro hace un query a una tabla del que se obtiene el listado de todas las sucursales (Oficinas Corporativas y Sucursales) y lo obtienen usando una conexión a una base de datos Microsoft SQL Server.

  • Por cada sucursal se tiene que obtener de una tabla el detalle de facturas generadas el cual se compone de facturas generadas en cada sucursal por ventas  al publico en general y en otra tabla de la misma base de datos se obtiene otras facturas generadas por otros conceptos y de otra base de datos de obtienen las facturas de movimientos del corporativo que se generan por un ERP  para poder presentar el detalle de estas tres fuentes hacemos lo siguiente:

  1. Se van crear 3 Sub-reportes cada uno va recibir como parámetros el rango de fechas global y el id de la sucursal  
      
  2. En el reportes maestro se van crear 3 bandas de detalle y en cada una vamos a colocar uno de los Sub-reportes estos van a ser llamados por cada sucursal desde el reporte maestro:       
      
  3. En cuanto a la conexión a base de datos en los primeros 2 sub-reportes utilizan la misma conexión a base de datos y por default los sub-reportes utilizan la misma conexión no hay mucho que hacer en estos dos casos :   
      
  4. En el caso del tercer sub-reporte utiliza una conexión a una base de datos de MySql y se le asigna al sub-reporte a través del connection expression previamente configurado en el iReport en  Connection o Datasource con un JDBC;    
      
      
  5. Cada uno de los sub-reportes tuvo que ser creado previamente para incluirse dentro del reporte maestro con su propio query, diseño, parámetros y conexión a a base de datos como se muestra a continuación:   
     
El ejemplo anterior tiene como objetivo el mostrar como resolver está problemática usando las herramientas de Jasper Reports e iReport, existen varias formas de realizar los mismo unas pueden ser mas eficientes que otras estaremos publicando ejemplos diferentes próximamente.

1 comentario:

  1. Buenas, necesito una gran ayuda si puede ser.. tengo una ventana en netbeans en donde ingreso dos fechas a travez de jdatechooser, al precionar un boton me tendria que abrir el reporte mostrandome en una grafica las ventas que se realizaron entre dichas fechas, al precionarlo no me muestra nada y me tira error. pero desde ireport funciona bien, es decir, lo ejecuto me pide las dos fechas y me muestra la grafica con los datos..

    TE MUESTRO LO QUE PASO EN EL BOTON:

    Reportes reportes = new Reportes();
    reportes.reporteVentas(fechaUno.getDate(), fechaDos.getDate());
    no se si esta mal pasar .getdate (en el parametreo le doy el formato que tengo en base de datos)

    Y DESDE ACA LLAMO AL REPORTE:

    SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy");
    SimpleDateFormat format2 = new SimpleDateFormat("MM/dd/yyyy");

    public void reporteVentas(Date uno, Date dos) {
    Connection a = null;
    try {
    a = DriverManager.getConnection("jdbc:mysql://localhost/seminario", "root", "");
    } catch (SQLException ex) {
    Logger.getLogger(VerFactura.class.getName()).log(Level.SEVERE, null, ex);
    }
    JasperReport jr = null;
    String archivo = "C:\\SEMINARIO\\seminario\\src\\pdf\\Mensual.jasper";
    try {
    jr = (JasperReport) JRLoader.loadObjectFromFile(archivo);
    } catch (JRException ex) {
    Logger.getLogger(VerFactura.class.getName()).log(Level.SEVERE, null, ex);
    }
    Map parametro = new HashMap();
    System.out.println("Desde: " + format1.format(uno));
    System.out.println("Hasta: " + format2.format(dos));
    parametro.put("desde", format1.format(uno));
    parametro.put("hasta", format2.format(dos));
    try {
    JasperPrint jp = JasperFillManager.fillReport(jr, parametro, a);
    JasperViewer ver = new JasperViewer(jp, false);
    ver.setExtendedState(JasperViewer.MAXIMIZED_BOTH);
    ver.setVisible(true);
    } catch (JRException ex) {
    Logger.getLogger(VerFactura.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    Saludos.

    ResponderEliminar