jueves, 15 de mayo de 2014

Proyecto de gestion de contratos con Java y MySQL

En esta ocasión traigo un proyecto de ejemplo para gestionar una tabla con datos de contratos, para ello se utilizara el motor de bases de datos MySQL y para la parte de insertar, editar y borrar se programara una interfaz gráfica con JAVA.

El programa final se vera de la siguiente forma:



Primero se creara la tabla con la siguiente estructura:

CREATE TABLE IF NOT EXISTS `contratos` (
  `Numero` varchar(60) NOT NULL,
  `DescCorta` varchar(180) NOT NULL,
  `DescLarga` text NOT NULL,
  `Importe` decimal(18,2) NOT NULL,
  `FechaIni` date NOT NULL,
  `FechaFin` date NOT NULL,
  PRIMARY KEY (`Numero`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

El programa constara de cuatro clases que serán necesarias para la correcta ejecución:

  • Clase manejadorBD
  • Clase Contrato
  • Clase ventanaGestion
  • Clase GestionContratos
La clase manejadorBD tiene los métodos para manipular la conexión a la base de datos y la acciones de insertar, actualizar y borrar.


La clase Contrato tiene los atributos y métodos necesarios para manipular los datos del contrato como crear uno nuevo, modificar y borrar.

La clase ventanaGestion es necesaria para crear la interfaz gráfica que vera el usuario.

Por ultimo la clase GestionContratos tiene el método main que es donde iniciara el programa.

Aquí dejo el código final, que casi en su totalidad es propio pero no niego que algunas partes han sido tomadas de foros y de las paginas http://docs.oracle.com/ y http://www.chuidiang.com/ 

import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.DecimalFormat;
import javax.swing.text.NumberFormatter;
import java.text.SimpleDateFormat;
import java.text.ParseException;

/** * @author http:// dataguerrero.blogspot.mx
*/

class manejadorBD {
    String host = "localhost";
    String bd = "obras";
    String usuario = "root";
    String password = "123456admin";    
    String mensajeCorrecto = "La información se almaceno de forma correcta";
        
    public Connection nuevaConexion() throws Exception
    {
        Class.forName("com.mysql.jdbc.Driver");                            
        return DriverManager.getConnection ("jdbc:mysql://" + host + "/" + bd,usuario, password);
    }
    
    public boolean ejecutaQuery(String strQuery)
    {
    boolean resultado = false;
        Connection conexion = null;
        try            
            {            
                conexion = nuevaConexion();
                Statement st = conexion.createStatement();                
                st.executeUpdate(strQuery, Statement.RETURN_GENERATED_KEYS);
                resultado = true;
                st.close();                
            }
        catch (Exception e)
            {            
                resultado = false;
            }
        finally {
            try
            {
                if(conexion != null)
                    conexion.close();
            }
            catch(Exception e)
            {
                resultado = false;
            }
        }
        return resultado;
    }       
}

class Contrato {
String Numero;
String DescCorta;
String DescLarga;
Double Importe;
String FechaIni;
String FechaFin;

public Contrato()
{
this.Numero = "";
this.DescCorta = "";
this.DescLarga = "";
this.Importe = 0.00;
this.FechaIni = "";
this.FechaFin = "";
}

public Contrato(String Numero, String DescCorta, String DescLarga, Double Importe, String FechaIni, String FechaFin)
{
this.Numero = Numero;
this.DescCorta = DescCorta;
this.DescLarga = DescLarga;
this.Importe = Importe;
this.FechaIni = FechaIni;
this.FechaFin = FechaFin;
}

public boolean insertar()
{
String strQuery = "INSERT INTO contratos VALUES('"
+ this.Numero + "','" + this.DescCorta + "','" + this.DescLarga + "'," + this.Importe + ",'" + this.FechaIni + "','" + this.FechaFin + "');";
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery(strQuery);
return resultado;
}

public boolean modificar()
{
String strQuery = "UPDATE contratos SET Numero='"
+ this.Numero + "',DescCorta='" + this.DescCorta + "',DescLarga='" + this.DescLarga + "',Importe=" + this.Importe + ",FechaIni='" 
+ this.FechaIni + "',FechaFin='" + this.FechaFin + "' WHERE Numero='" + this.Numero + "'";
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery(strQuery);
return resultado;
}

public boolean borrar()
{
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery("DELETE FROM contratos WHERE Numero='" + this.Numero + "'");
return resultado;
}

public String toString()
{
return this.Numero;
}
}

class ventanaGestion {
JFrame ventana = new JFrame("Gestion de Contratos");
JPanel panelFormulario = new JPanel();
JPanel panelBotones = new JPanel();
JLabel lblLista = new JLabel("Lista de Contratos");
JComboBox<Contrato> listaContratos = new JComboBox<>();
    DefaultComboBoxModel<Contrato> modeloContratos = new DefaultComboBoxModel<>();
JLabel lblNumero = new JLabel("Numero de Contrato");
JTextField txtNumero = new JTextField();
JLabel lblDescCorta = new JLabel("Descripcion Corta");
JTextField txtDescCorta = new JTextField();
JLabel lblDescLarga = new JLabel("Desc. Completa");
JTextField txtDescLarga = new JTextField();
JLabel lblImporte = new JLabel("Importe");
JFormattedTextField txtImporte;
JLabel lblFechaIni = new JLabel("Fecha de Inicio");
JFormattedTextField txtFechaIni;
JLabel lblFechaFin = new JLabel("Fecha de Conclusion");
JFormattedTextField txtFechaFin;
JButton btnNuevo = new JButton("Contrato Nuevo");
JButton btnModificar = new JButton("Modificar Contrato");
JButton btnQuitar = new JButton("Quitar Contrato");
JButton btnGuardar = new JButton("Guardar");
JButton btnCancelar = new JButton("Cancelar");    
int ancho;
int alto;
int opcion;

ventanaGestion()
{
ancho = 640;
alto = 300;
opcion = 0;
ventana.setSize(ancho,alto);
Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();        
        ventana.setLocation((pantalla.width/2-(ancho/2)),pantalla.height/2-(alto/2));
ventana.setLayout(null);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void interfazGestion()
{
panelFormulario.setLayout(null);
lblLista.setBounds(5,5,120,30);
listaContratos.setBounds(130,5,280,30);
listaContratos.setModel(modeloContratos);
lblNumero.setBounds(5,40,120,30);
txtNumero.setBounds(130,40,280,30);
lblDescCorta.setBounds(5,75,120,30);
txtDescCorta.setBounds(130,75,(ancho - 160),30);
lblDescLarga.setBounds(5,110,120,30);
txtDescLarga.setBounds(130,110,(ancho - 160),30);
lblImporte.setBounds(5,145,120,30);
DecimalFormat NumeroDecimal = new DecimalFormat("0.00");
NumberFormatter formatoImporte = new NumberFormatter(NumeroDecimal);
formatoImporte.setValueClass(Double.class);
formatoImporte.setAllowsInvalid(false);
txtImporte = new JFormattedTextField(formatoImporte);
txtImporte.setBounds(130,145,140,30);
lblFechaIni.setBounds(5,180,120,30);
txtFechaIni = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
txtFechaIni.setValue(new java.util.Date());
txtFechaIni.setBounds(130,180,140,30);
lblFechaFin.setBounds(320,180,120,30);
txtFechaFin = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
txtFechaFin.setValue(new java.util.Date());
txtFechaFin.setBounds(470,180,140,30);
habilitarGuardadoCancelar(false);
panelFormulario.add(lblLista);
panelFormulario.add(listaContratos);
panelFormulario.add(lblNumero);
panelFormulario.add(txtNumero);
panelFormulario.add(lblDescCorta);
panelFormulario.add(txtDescCorta);
panelFormulario.add(lblDescLarga);
panelFormulario.add(txtDescLarga);
panelFormulario.add(lblImporte);
panelFormulario.add(txtImporte);
panelFormulario.add(lblFechaIni);
panelFormulario.add(txtFechaIni);
panelFormulario.add(lblFechaFin);
panelFormulario.add(txtFechaFin);
panelBotones.add(btnNuevo);
panelBotones.add(btnModificar);
panelBotones.add(btnQuitar);
panelBotones.add(btnGuardar);
panelBotones.add(btnCancelar);
panelFormulario.setBounds(0,0,ancho,215);
panelBotones.setBounds(0,215,ancho,60);
ventana.add(panelFormulario);
ventana.add(panelBotones);
}

public void show()
{
interfazGestion();
btnNuevo.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
nuevo();

});

btnModificar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
modificar();

});

btnQuitar.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e){
quitar();
}
});

btnGuardar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
guardar();

});

btnCancelar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
if(listaContratos.getSelectedIndex()>-1)
listaContratos.setSelectedIndex(listaContratos.getSelectedIndex());
opcion = 0;
habilitarGuardadoCancelar(false);

});

listaContratos.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(listaContratos.getSelectedIndex()>-1){
                    Contrato RegSeleccionado = modeloContratos.getElementAt(listaContratos.getSelectedIndex());                    
                    llenaCampos(RegSeleccionado);                  
                }
            }
});
llenarTablaContratos();
ventana.setVisible(true);
}

    public void llenarTablaContratos()
    {
        manejadorBD losContratos = new manejadorBD();
        Connection con = null;
        try
        {
            con = losContratos.nuevaConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM contratos");                        
            while (rs.next())
            {                
                Contrato objeto = new Contrato(
                        rs.getObject("Numero").toString(),
                        rs.getObject("DescCorta").toString(),
                        rs.getObject("DescLarga").toString(),
                        Double.parseDouble(rs.getObject("Importe").toString()),
                        rs.getObject("FechaIni").toString(),
                        rs.getObject("FechaFin").toString());
                modeloContratos.addElement(objeto);
            }
            rs.close();    
        }
        catch (Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un Error", JOptionPane.ERROR_MESSAGE);
            }
        finally 
        {
            try
            {
                if(con != null)
                    con.close();
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un Error", JOptionPane.ERROR_MESSAGE);            
            }
        }
    }

public void nuevo()
{
txtNumero.setText("");
txtDescCorta.setText("");
txtDescLarga.setText("");
txtImporte.setText("0.00");
txtFechaIni.setValue(new java.util.Date());
txtFechaFin.setValue(new java.util.Date());
habilitarGuardadoCancelar(true);
txtNumero.requestFocus(true);
opcion = 1;
}

public void modificar()
{
habilitarGuardadoCancelar(true);
opcion = 2;
}

public void quitar()
{
if(JOptionPane.showConfirmDialog(null, "Realmente desea borrar el contrato?", "Advertencia", JOptionPane.OK_OPTION)==JOptionPane.OK_OPTION)
{
Contrato registro = new Contrato(txtNumero.getText(), txtDescCorta.getText(),
txtDescLarga.getText(), Double.parseDouble(txtImporte.getText()),
txtFechaIni.getText(), txtFechaFin.getText());
boolean resultado = registro.borrar();
if(resultado)
JOptionPane.showMessageDialog(null, "Se quito el contrato con numero: " + registro,"Aviso", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, "Error no se quito el contrato", "Aviso de Error", JOptionPane.ERROR_MESSAGE);

}
}

public void guardar()
{
boolean resultado = false;
String strMensaje = "";
Contrato registro = new Contrato(txtNumero.getText(), txtDescCorta.getText(),
txtDescLarga.getText(), Double.parseDouble(txtImporte.getText()),
txtFechaIni.getText(), txtFechaFin.getText());
switch(opcion)
{
case 1:
resultado = registro.insertar();
if(resultado)
{
strMensaje = "Se agrego el contrato con numero: " + registro;
int fila = listaContratos.getItemCount();
modeloContratos.insertElementAt(registro,fila);
listaContratos.setSelectedIndex(fila);
}
else
strMensaje = "Error con el guardado del contrato";
break;
case 2:
resultado = registro.modificar();
if(resultado)
{
int fila = listaContratos.getSelectedIndex();                                        
strMensaje = "Se actualizo el contrato con numero: " + registro;
modeloContratos.removeElementAt(fila);
modeloContratos.insertElementAt(registro,fila);
listaContratos.setSelectedIndex(fila);
}
else
strMensaje = "Error no se actualizo el contrato";
break;
}
if(resultado)
JOptionPane.showMessageDialog(null, strMensaje,"Aviso", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, strMensaje, "Aviso de Error", JOptionPane.ERROR_MESSAGE);
opcion = 0;
habilitarGuardadoCancelar(false);
}

public void habilitarGuardadoCancelar(boolean opcion)
{
listaContratos.setEnabled(!opcion);
txtNumero.setEnabled(opcion);
txtDescCorta.setEnabled(opcion);
txtDescLarga.setEnabled(opcion);
txtImporte.setEnabled(opcion);
txtFechaIni.setEnabled(opcion);
txtFechaFin.setEnabled(opcion);
btnCancelar.setEnabled(opcion);
btnGuardar.setEnabled(opcion);
btnNuevo.setEnabled(!opcion);
btnModificar.setEnabled(!opcion);
btnQuitar.setEnabled(!opcion);
}

public void llenaCampos(Contrato RegSeleccionado)
{
SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
txtNumero.setText(RegSeleccionado.Numero);
txtDescCorta.setText(RegSeleccionado.DescCorta);
txtDescLarga.setText(RegSeleccionado.DescLarga);
txtImporte.setText(String.valueOf(RegSeleccionado.Importe));
java.util.Date fechaInicio = null;
try {
fechaInicio = formatoFecha.parse(RegSeleccionado.FechaIni); 
txtFechaIni.setValue(fechaInicio);
}
catch (ParseException ex) { 
txtFechaIni.setValue(new java.util.Date());
}        
txtFechaFin.setText(RegSeleccionado.FechaFin);
}
}

public class GestionContratos { 
public static void main(String[] args) {
ventanaGestion ventana = new ventanaGestion();
ventana.show();
}
}

Como nota final debo mencionar que el programa no esta terminado, ya que requiere de validación de datos que se capturan, manejos de excepciones y otros ajustes, pero la intención es de mostrar un poco del uso de MySQL y JAVA.

lunes, 12 de mayo de 2014

Programación con JAVA

Ahora comenzare a publicar sobre otro tema en el blog, últimamente he estado programando con el lenguaje de programación JAVA, por lo que iré compartiendo los programas que he realizado.

Para comenzar un simple ejemplo de como mostrar una ventana sencilla con un pequeño botón, que por el momento no realiza nada al ser pulsado.

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent;

public class MiVentana {
public static void main(String[] args) {
JFrame ventana = new JFrame("Ventana");
JButton boton = new JButton("Clic");
ventana.setLayout(null);
boton.setBounds(10,10,180,30);
boton.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){ 
System.out.print("Haz hecho clic"); 
}); 
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ventana.add(boton);
ventana.setSize(320,180);
ventana.setVisible(true);
}
}

Este es el resultado después de compilar y ejecutar


miércoles, 2 de abril de 2014

Coursera lanza app para Android para sus cursos online

Coursera es una plataforma educativa asociada con las universidades y organizaciones más renombradas de todo el mundo. Por medio de esta colaboración, ofrece cursos gratuitos en línea que cualquiera puede tomar. (texto tomado de su portal www.coursera.org)

Ahora Coursera ofrece la posibilidad de instalar de manera gratuita en dispositivos con sistema operativo Android su aplicación para que puedas tomas una gran cantidad de cursos de los que ofrece, esto me parece muy útil para esos momentos de espera en lo que ya te cansaste de los típicos juegos y quieren emplear tu tiempo.

Como comentario adicional no tiene mucho tiempo la fundación Carlos Slim y Coursera se unieron para ampliar las oportunidades de aprendizaje de toda América Latina (para mayor información dejo los enlaces).







Enlaces:

martes, 1 de abril de 2014

Microsoft apoya el software libre

Como dicen en ocasiones es necesario darle un giro a la tuerca, y creo que Microsoft esta haciendo lo propio, primero se anuncia que alguno de los modelos de smartphones Nokia lumia podria permitir el sistema operativo Android, bueno en parte esto es comprensible ya que existen miles de aplicaciones disponibles para Android lo que beneficiaria a las ventas de estos smartphones, pero después anuncia que ha puesto de manera gratuita las aplicaciones del Office para el iPad, lo que lleva a incursionar en otro sistema operativo y otro ámbito de usuarios.

Por último por increible que parezca Microsoft llevara a cabo el openness fest de software libre en sus instalaciones de Santa Fe en la ciudad de México y traerá al creador de php Rasmus Lerdorf.
Ahora si que Microsoft me ha dejado sorprendido y esperemos un tiempo para ver que resulta de estos ajustes.

lunes, 31 de marzo de 2014

Fin del primer trimestre 2014

Hoy ya es 31 de marzo de 2014 y se ha acabado el primer trimestre de este año, en Chilpancingo la capital de mi estado de Guerrero ha pasado de todo, por una parte los trabajos de recuperación por los daños ocasionados por el paso de la tormenta Manuel han avanzado, aunque se esperaría que fuera mayor el avance y que en el aspecto de la vialidad se pudiera hablar de que ya se puede transitar al 100% por todo el encauzamiento del río Huacapa, pero no es así, aun existen tramos que siguen sin arreglarse sobre la margen izquierda en dirección de norte a sur.

En el aspecto de alcantarillado sanitario la cosa es mas critica, ya que todavía no han terminado de arreglar los dos emisores (margen izquierda y derecha) por lo que los colectores que conectan con estos están descargando aguas crudas al encauzamiento del río Huacapa, lo que provoca una fuerte contaminación y  malos olores que se perciben a grandes distancias.

Por otro lado también se tienen cosas buenas, el presidente municipal Mario Moreno Arcos ha seguido entregando obras para la ciudadanía como áreas para hacer ejercicio y parques para esparcimiento familiar, que se agradece ya que son pocos los lugares donde se puede ir a pasar un rato con la familia.

Trabajos del gobierno municipal:

domingo, 30 de marzo de 2014

Feria del libro y eventos en Chilpancingo por año de Octavio Paz

Ayer en la plaza primer congreso de Anahuac aqui en Chilpancingo se ha instalado una feria del libro por parte del  Instituto Politécnico Nacional, donde mas de 20 librerías se encuentran mostrando sus contenidos para todos los gustos, por otra parte se presentaron varios grupos de danzas de gran renombre.








miércoles, 12 de marzo de 2014

Pintura de paisaje de practica con photoshop

Pintura de un paisaje campestre creada con photoshop desde cero

Pintura de un paisaje campestre creada con photoshop desde cero y con un filtro de oleo

domingo, 9 de marzo de 2014

Paisaje con photoshop

Aquí dejo otra imagen de una pintura hecha con photoshop, es algo de lo que he estado practicando.



viernes, 7 de marzo de 2014

Pintura de paisaje con photoshop

En días pasados he querido escribir una nueva nota para compartir y pensaba si sobre programación o alguna fotografia, pero bueno me he puesto ha practicar un poco de photoshop y aqui el resultado de mi practica, una pintura totalmente desde cero, la comparto y quien guste deje un comentario y le mando el archivo psd, aunque ya no es tan modificable ya que combine algunas capas.

Pintura con photoshop
Pintura hecha con photoshop desde cero
Ahora la misma pintura, pero ahora con un efecto oleo.

Pintura desde cero con photoshop
Pintura hecha con photoshop y con un filtro de oleo

sábado, 15 de febrero de 2014

Efecto de transición en botón con JQuery

Código para generar un efecto de transición al pasar por encima de un botón, lo primero es tener dos imágenes del botón, la primera sera la imagen del botón en un estado normal y el otro botón es la imagen en el estado cuando el cursor del mouse esta encima (evento mousehover).

Los botones serian algo como estos:

Botón que se usara cuando el cursor del mouse pase por encima

Botón que se usara cuando el cursor del mouse este fuera

Ahora el código css

<style type="text/css">
#barraNavegacion{
background-color:#e7e7e7;
height: 60px;
width: 150px;
border: 1px solid #bbb;
}

#boton{
left: 20px;
top: 20px;
position: absolute;
width: 84px;
height: 36px;
background-color: #e7e7e7;
border: 1px solid #7c7c7c;
clip:rect(0,86,38,0);
}

#imagen
{
position: absolute;
left: 0px;
background-color: #e7e7e7;
text-align:center;
padding:2px;
}
#imagen_hover
{
position: absolute;
left: -86px;
background-color: #696969;
text-align:center;
padding:2px;
}
</style>

El código javascript

<script languague="javascript">
$(document).ready(function(){
$('#boton').mouseenter(function(){
$("#imagen").animate({"left": "86px"},500);
$("#imagen_hover").animate({"left": "0px"},500);
});
$('#boton').mouseleave(function(){
$("#imagen_hover").animate({"left": "-86px"},500);
$("#imagen").animate({"left": "0px"},500);
});
});
</script>

El código html

<div id="barraNavegacion">
<div id="boton">
<span id="imagen"><img src="imagenes/inicio.png"></span>
<span id="imagen_hover"><img src="imagenes/inicio-hover.png"></span>
</div>
</div>

El resultado es como se ve a continuación, pasa el cursor del mouse por encima del bóton