Me ha pasado que necesite extraer datos de una consulta a una base de datos, procesarlos de alguna manera y mostrarlos en una tabla.
Para ello no sirve JDBCAdapter, puesto que solo me va a mostrar los datos que se puedan llegar a obtener de una consulta. Es por ello que les voy a aprovechar este problema para poner en practica el uso de threads.
Los threads son procesos que podemos ejecutar de manera paralela a hilo principal de la aplicacion, con esto logramos tener un mejor soporte para realizar procesos "pesados". Otro uso muy interesante de los threads, y que al menos yo lo necesite en varias oportunidades, fue utilizarlos cuando se debe atender un puerto por algun motivo, por ejemplo escuchar determinado puerto serie para una lectora de tarjetas.
Volviendo al problema de los datos, este es un breve ejemplo de como utilizar threads para llenar los datos de una tabla a partir de un proceso con datos de una consulta.
Supongamos que tenemos un tabla tickets, con el id del ticket, el cajero y el monto de dicho ticket; y debemos tener un listado de los tickets que tienen un monto entre 100 y 150, la cantidad que son y el monto total.
Abajo les dejo el script sql para crear la tabla con algunos registros a modo de ejemplo.
CREATE TABLE `tickets` (
`id` int(11) NOT NULL default '0',
`cajero_id` int(11) default NULL,
`fecha` date NOT NULL default '0000-00-00',
`hora` time NOT NULL default '00:00:00',
`monto` double(11,2) NOT NULL default '0.00',
PRIMARY KEY (`id`),
KEY `key_pagos_fecha` (`fecha`)
) ;
INSERT INTO `tickets` VALUES (6390, 144, '2008-4-5', '21:59:26', 150.00);
INSERT INTO `tickets` VALUES (6391, 144, '2008-4-5', '22:36:37', 170.00);
INSERT INTO `tickets` VALUES (6392, 144, '2008-4-5', '22:41:03', 28.01);
INSERT INTO `tickets` VALUES (6393, 144, '2008-4-5', '23:09:40', 150.00);
INSERT INTO `tickets` VALUES (6394, 144, '2008-4-5', '23:13:48', 144.70);
INSERT INTO `tickets` VALUES (6395, 144, '2008-4-5', '00:14:58', 400.00);
INSERT INTO `tickets` VALUES (6396, 144, '2008-4-5', '00:58:52', 8.08);
INSERT INTO `tickets` VALUES (6397, 144, '2008-4-5', '01:41:19', 120.13);
INSERT INTO `tickets` VALUES (6398, 144, '2008-4-5', '01:43:01', 100.02);
INSERT INTO `tickets` VALUES (6399, 144, '2008-4-5', '01:43:22', 100.15);
INSERT INTO `tickets` VALUES (6400, 144, '2008-4-5', '01:45:58', 10.01);
INSERT INTO `tickets` VALUES (6401, 144, '2008-4-5', '02:26:20', 145.00);
INSERT INTO `tickets` VALUES (6402, 144, '2008-4-5', '03:32:00', 200.00);
INSERT INTO `tickets` VALUES (6403, 144, '2008-4-5', '03:49:32', 100.05);
INSERT INTO `tickets` VALUES (6404, 144, '2008-4-5', '03:59:35', 664.60);
INSERT INTO `tickets` VALUES (6405, 144, '2008-4-5', '04:18:31', 100.05);
INSERT INTO `tickets` VALUES (6406, 144, '2008-4-5', '04:29:36', 100.20);
Mas alla del proceso que se deba realizar, lo importante del ejemplo es ver como se puede integra un thread con el proceso de datos de una consulta y los resultados mostrarlos en una tabla. El ejemplo:
import java.sql.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class EjemploProcesoDatos extends JFrame {
private JTable tabla;
String[] columnas = { "Rango","Cantidad","Monto total" };
Object[][] datos = { };
DefaultTableModel model;
private EjemploProcesoDatos() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(getPanelControles(),BorderLayout.NORTH);
panel.add(getPanelTabla(),BorderLayout.CENTER);
setContentPane(panel);
setVisible(true);
pack();
}
private JProgressBar barra;
private JPanel getPanelControles() {
JPanel panel = new JPanel(new FlowLayout());
JButton btnBoton = new JButton("Procesar");
btnBoton.addActionListener(new ButtonListener());
panel.add(btnBoton);
barra = new JProgressBar(0,100);
panel.add(barra);
return panel;
}
private JPanel getPanelTabla() {
JPanel panel = new JPanel(new FlowLayout());
model = new DefaultTableModel(datos,columnas);
tabla = new JTable(model);
JScrollPane scrol = new JScrollPane(tabla);
panel.add(scrol);
return panel;
}
public static void main(String[] args) {
EjemploProcesoDatos frame = new EjemploProcesoDatos();
}
public class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Proceso proceso = new Proceso("ayuda","root","","localhost");
proceso.start();
}
}
public class Proceso extends Thread {
public Proceso(String db,String dbUser,String dbPass,String dbHost) {
conectar(db,dbUser,dbPass,dbHost);
}
public void run() {
barra.setValue(0);
//Vacia el contenido de la tabla
Object[][] data = new Object[0][columnas.length];
model.setDataVector(data,columnas);
try {
PreparedStatement pstmt = con.prepareStatement(
"SELECT * FROM tickets"
);
ResultSet rs = pstmt.executeQuery();
String[] fila = new String[3];
String[] titulo = new String[3];
titulo[0] = "Menor a 100";
titulo[1] = "Entre 100 y 200";
titulo[2] = "Mas de 200";
double[] totalMontos = new double[3];
int[] cantidad = new int[3];
while(rs.next()) {
double monto = rs.getDouble("monto");
if(monto >= 200) {
cantidad[2] = cantidad[2] + 1;
totalMontos[2] = totalMontos[2] + monto;
} else if((monto < 200) & (monto >= 100)) {
cantidad[1] = cantidad[1] + 1;
totalMontos[1] = totalMontos[1] + monto;
} else if(monto < 100) {
cantidad[0] = cantidad[0] + 1;
totalMontos[0] = totalMontos[0] + monto;
}
//Se aumenta en 1 la barra
barra.setValue(barra.getValue()+1);
}
barra.setValue(barra.getMaximum());
/*
* Con los datos recolectados construimos la tabla
*/
for (int i = 0; i < 3; i++) {
fila[0] = titulo[i];
fila[1] = ""+cantidad[i];
fila[2] = ""+totalMontos[i];
model.addRow(fila);
}
} catch(SQLException e) {
while (e != null) {
System.err.println("Message: "+ e.getMessage ());
System.err.println("SQLState: "+ e.getSQLState ());
System.err.println("ErrorCode: "+ e.getErrorCode ());
e = e.getNextException();
System.err.println("");
}
}
}
private Connection con;
public void conectar(String db,String dbUser,String dbPass,String dbHost) {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://"+dbHost+"/"+db,dbUser,dbPass);
} catch(SQLException e) {
System.err.println("SQL Exception: "+e.getMessage());
} catch(Exception e) {
System.err.println("Exception: "+e.getMessage());
}
}
}
}
No hay comentarios:
Publicar un comentario