continuación 3 de la creación de reportes con jasper report

15
Continuación de la creación de reportes con JasperReport Para poder convertir a otro formato el documento o reporte y mostrarlo mediante un visor, se incorporan las librerías necesarias para ello, se aconseja utilizar las que se encuentran en este enlace LIBRERIAS JAR . (presionar ctrl+click para activar el enlace) En librerías de la ventana de proyecto se importan estas librerías mediante el menú contextual que se genera en la carpeta libreries. Se selecciona el comando add jar/folders y en la ventana que se abre se navega hasta conseguir las librerías, se seleccionan y se presiona el botón abrir Si se abre la carpeta libreries se pueden visualizar estos documentos.

Upload: jbersosa

Post on 19-Feb-2017

953 views

Category:

Healthcare


2 download

TRANSCRIPT

Continuación de la creación de reportes con JasperReport

Para poder convertir a otro formato el documento o reporte y mostrarlo mediante un visor, se

incorporan las librerías necesarias para ello, se aconseja utilizar las que se encuentran en este

enlace LIBRERIAS JAR. (presionar ctrl+click para activar el enlace)

En librerías de la ventana de proyecto se importan estas librerías mediante el menú contextual

que se genera en la carpeta libreries. Se selecciona el comando add jar/folders y en la ventana que

se abre se navega hasta conseguir las librerías, se seleccionan y se presiona el botón abrir

Si se abre la carpeta libreries se pueden visualizar estos documentos.

Ahora se crea en donde está el empaquetado, botón izquierdo y seleccionando new=>Java Class,

se crea una class llamada VisorReporte

En esta clase vamos a crear el código para mostrar el reporte en PDF y enlazarlo al ejemplo

anterior con el botón reporte del formulario.

Ya se habían incorporado a las librerías las necesarias para lograr esto. Si se diseña el código

quedaría algo como esto

public abstract class VisorReporte { private static JasperReport reporte; private static JasperPrint reportecargado; private static JasperViewer visor; public static void crearReporte(String path,Connection c) { try { reporte = (JasperReport) JRLoader.loadObjectFromFile( path ); reportecargado=JasperFillManager.fillReport(reporte,null,c); } catch( JRException ex ) { System.out.println("NO CARGO EL REPORTE"); ex.printStackTrace(); } } public static void MostrarVisor() { visor = new JasperViewer(reportecargado); visor.setVisible(true); JasperViewer ventanaVisor = new JasperViewer(reportecargado,false) ; ventanaVisor.setTitle("LISTADO DE SERVICIOS"); ventanaVisor.setVisible(true); } public static void exportaraPDF( String destination ) { try { JasperExportManager.exportReportToPdfFile(reportecargado,destination); } catch( JRException ex ) { ex.printStackTrace(); } } }

Se pueden observar muchos alertas, esto es debido a las librerías faltantes que hay que importar

para que se puedan ejecutar los métodos.

Si se presiona cada alerta la primera opción es generalmente import librería_que_se_necesita.jar;,

Se clickea esa opción y se va resolviendo el problema.

Si quedan warning (bombillo con triangulito amarillo) no hay problemas

Después de irse incorporando las librerías ya tenemos la clase que permite cargar el reporte con el

método CrearReporte, que lo ensambla con la información de la base de datos. La clase que

monta el reporte PDF ya completo con los datos en el visor, llamada mostrarVisor, y un método

adicional que permite descargarlo en alguna carpeta en el computador , llamado exportaraPDF.

Se vuelve a la class Formulario1, la cual se vio como se creaba en la primera parte de este ejemplo

El botón reporte había sido programado para incorporar un registro a la base de datos, se elimina

ese código (solo el del evento de botón) y se reprograma de la siguiente manera

import java.sql.Connection;

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

/**

*

* @author Usuario

*/

public class Formulario1 extends javax.swing.JFrame {

/**

* Creates new form Formulario1

*/

public Formulario1(Connection cn) {

VisorReporte.crearReporte("C:\\Users\\Usuario\\Desktop\\Ejemplo\\src\\reporte.jasper",cn);

initComponents();

}

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jButton1 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jButton1.setText("Reporte");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addContainerGap(169, Short.MAX_VALUE)

.addComponent(jButton1)

.addGap(160, 160, 160))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(121, 121, 121)

.addComponent(jButton1)

.addContainerGap(156, Short.MAX_VALUE))

);

pack();

}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

VisorReporte.MostrarVisor();

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

/* Set the Nimbus look and feel */

//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">

/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

*/

try {

for (javax.swing.UIManager.LookAndFeelInfo info :

javax.swing.UIManager.getInstalledLookAndFeels()) {

if ("Nimbus".equals(info.getName())) {

javax.swing.UIManager.setLookAndFeel(info.getClassName());

break;

}

}

} catch (ClassNotFoundException ex) {

java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

} catch (InstantiationException ex) {

java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(Formulario1.class.getName()).log(java.util.logging.Level.SEVERE,

null, ex);

}

//</editor-fold>

/* Create and display the form */

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

// End of variables declaration

}

El constructor de esta clase no solo se usa para inicializar el JFrame, si se observa el código

public Formulario1(Connection cn) {

VisorReporte.crearReporte("C:\\Users\\Usuario\\Desktop\\Ejemplo\\src\\reporte.jasper",cn);

initComponents();

}

El constructor tiene un parámetro tipo Connection para llenar el reporte con los datos de la base

de datos y la ubicación o path del reporte ejecutable extensión jasper.

Dentro del constructor se aprecia el método que llena el reporte llamado crearReporte, este

método se encuentra antecedido del nombre de la clase abstracta que es VisorReporte, ya que

esta no se instancia.

En el evento del botón Reporte se observa el siguiente código

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

VisorReporte.MostrarVisor();

}

Aquí se llama al método que permite mostrar el reporte a través de un visor, este reporte se

muestra como PDF.

Se eliminan las variables que no son necesarias ya que este ejemplo no modifica los datos de la

base de datos, cosa que ya se ha explicado, sino que genera reportes.

La clase Conexcion, donde se establece la conexión con la base de datos, se puede hacer abstracta

para evitar la instanciación y hacerla global, el código cambia a este, donde solo se establecen las

variables como prívate static y la clase como publis abstract

import java.awt.HeadlessException;

import java.sql.*;

import javax.swing.JOptionPane;

public abstract class Conexcion {

private static Connection con=null;

private static Statement stat=null;

private static ResultSet reg=null;

public static Connection conectar(){

try{

Class.forName("com.mysql.jdbc.Driver");

con=DriverManager.getConnection("jdbc:mysql://localhost/bd","root","");

} catch(ClassNotFoundException | SQLException | HeadlessException e){

JOptionPane.showMessageDialog(null,"No Conectado");

System.exit(0);

}

return con;

}

public static void manejar(Connection con, String sql){

try {

stat=con.createStatement();

stat.executeUpdate(sql);

JOptionPane.showMessageDialog(null,"DATOS INCLUIDOS");

}catch(SQLException e){

JOptionPane.showMessageDialog(null,"DATOS NO INCLUIDOS");

}

}

public static ResultSet leer(Connection con,String query) {

try{

stat=con.createStatement();

reg=stat.executeQuery(query);

} catch (SQLException e) {

}

return reg;

}

}

Quedando de esta forma

En la clase principal, llamada public class Main se modifica un poco el código para poder

establecer la conexión a base de datos

import java.sql.Connection;

public class Main {

static Connection c;

public static void main(String[] args) {

c=Conexcion.conectar();

Formulario1 form1=new Formulario1(c);

form1.setVisible(true);

}

}

Y ya está listo

Al ejecutarse el programa se obtiene esto

Se presiona el botón reporte

Y Listo!!!

En la clase VisorReporte está otro método para descargar el reporte PDF en la dirección que el

programador decida.

Prof. Juan Sosa