miércoles, 23 de noviembre de 2011

"SQL PARA LA CREACIÓN DE BASE DE DATOS" (PUNTOS EXTRAS)

Ahora hablare un poco sobre el  lenguaje para la creación de base de datos, como todos sabemos para kla creación de bases de datos existen diferentes formas, por ejemplo con la herramienta de office de microssft Access que se podría considerar como la mas fácil, pero a nivel solamente académico por decirlo de alguna forma, a si como MySQL que bien se podría decir que es un derivado del SQL, que al parecer es el lenguaje natural para la creación de estructuras de datos.

Decidí hablar de este tema por que me di cuenta que algunos de mis compañeros tanto de taller como de la materia de POO necesitarían conectarse a una base de datos para guardar informacion que anteriormente se solicitara en su programa, en lo personal yo utilice el programa de Access que nos proporciona el officce de Microsotf, y es por eso que quiero ver las diferencias y el funcionamiento de  SQL eso.

  • El lenguaje de consulta estructurado ( SQL) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones en estas.
  • Una de sus características es el manejo del álgebra y el cálculo relacional permitiendo efectuar consultas con el fin de recuperar -de una forma sencilla- información de interés de una base de datos, así como también hacer cambios sobre ella.
Como sabemos el lenguaje SQL se maneja principalmente por código para la creación de tablas de datos a si como consultas echas de esas tablas.

Para poder observar un ejemplo de creación de tablas para posteriormente llenarlas con los datos de lo que se requiera en el momento o el sistema. Aquí muestro el cogido que se tendría que hacer para la creación de una tabla en SQL:

                            TRUNCATE TABLE ''TABLA_NOMBRE1''

Y despues se muestra el código para insertar una tabla de otra manera, con una sentencia:

Una sentencia INSERT de SQL agrega uno o más registros a una (y sólo una) tabla en una base de datos relacional. De la siguiente forma: 

        INSERT INTO ''tabla'' (''columna1'', [''columna2,... '']) VALUES (''valor1'', [''valor2,...''])

Ahora aqui se muestra como ingresar datos a la tabla creada mediante la sentencia INSERT:

INSERT INTO agenda_telefonica (nombre, numero) VALUES ('Roberto Jeldrez', 4886850);

Creo que una de las cosas que mas importa en este caso de utilizar bases de datos en SQL,
es como conectar una base de datos creada en SQL, a un programa en java en cualquier,
compilador de java que se tenga, que es una de las dudas que tuve durante la programación en mi proyecto.

En este caso presentare un ejemplo como MySQL que como ya había mencionado es un derivado del SQL.

Lo primero que tenemos que hacer es asegurarnos que el Driver se inicializa y se registra, para ello:
 
try
{
   Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e)
{
   e.printStackTrace();
}
Para establecer la conexión, la clase DriverManager tiene métodos getConnection(). Usaremos uno de ellos:

// Establecemos la conexión con la base de datos. 
Connection conexion = DriverManager.getConnection ("jdbc:mysql://localhost/prueba","root", "la_clave");

El primer parámetro del método getConnection() es un String que contiene la url de la base de datos.

Este seria el código para la colección a la base de datos desde el código en java.

Para realizar cualquier acción sobre la base de datos (consulta, insertar nuevos registros, modificar los existentes o borrar), necesitamos una clase Statement. Para obtenerla, se le pide dicha clase a la conexión. La forma de hacerlo, para una consulta, es la siguiente:

// Preparamos la consulta 
Statement s = conexion.createStatement(); 
ResultSet rs = s.executeQuery ("select * from persona");

Otra cosa que se necesita en un sistema es que los datos que hemos capturado en nuestra base de datos se puedan leer para saber la información, a si que aquí va un ejemplo para esto.

El ResultSet contiene dentro los registros leidos de la base de datos. Inicialmente, tal cual nos lo devuelve el Statement.executeQuery(), tiene internamente un "puntero" apuntando justo delante del primer registro. Por tanto, una forma de ir leyendo los registros en meternos en un while:

// Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla. 
while (rs.next()) 

    System.out.println (rs.getInt (1) + " " + rs.getString (2)+ " " + rs.getDate(3)); 
}

Y por ultimo otra cosa que yo utilice en mi proyecto (claro con Access) es la de cerrar la conexión a la base de datos al momento de ya no utilizarla, por cualquier inconveniente que se presente, es por eso que aquí dejo un ejemplo de como hacer esto.

Una vez que terminamos de usar la conexión, se debería cerrar, o bien terminar el programa, con lo que se cierra automáticamente y en si no es muy difícil:

// Cerramos la conexion a la base de datos. 
conexion.close();

Espero y esta información pueda servir de algo al momento de trabajar con el lenguaje SQL y con aplicaciones de en JAVA.

"HILOS O SUBPROCESOS" (PUNTOS EXTRAS)

Esta ocacion quiero hablar de como funcionan los hilos también llamados "subprocesos" en la creación de programas principalmente en juegos que son los problemas que mas se presentan en un sistema de este tipo.

Un hilo es una característica que permite a una aplicación realizar varias tareas a la vez (concurrente-mente). Como bien se sabe o al menos por mis compañeros que hicieron su proyecto basado en algún juego para aplicar el suyo, los hilos se utilizan para procesos o programas que necesitan realizar varias tareas o ejecuciones de funciones simultáneamente, es decir, realizar varios procesos por separado al mismo tiempo, pero para un mismo fin, en este caso, al estar jugando un determinado juego deben estar pasando varias cosas a la vez para que se vea mas vistoso y tenga mayor grado de complejidad.

Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Los hilos de ejecución que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso.



Algunos de los principales estados de los hilos son ejecucion, listo y bloqueado que se mencionara y definiran acontinuacion.

Cambio de estados

  • Creación: Cuando se crea un proceso se crea un hilo para ese proceso. Luego, este hilo puede crear otros hilos dentro del mismo proceso, proporcionando un puntero de instrucción y los argumentos del nuevo hilo. El hilo tendrá su propio contexto y su propio espacio de la columna, y pasará al final de los Listos.
  • Bloqueo: Cuando un hilo necesita esperar por un suceso, se bloquea (salvando sus registros de usuario, contador de programa y punteros de pila). Ahora el procesador podrá pasar a ejecutar otro hilo que esté en la final de los Listos mientras el anterior permanece bloqueado.
  • Desbloqueo: Cuando el suceso por el que el hilo se bloqueó se produce, el mismo pasa a la final de los Listos.
  • Terminación: Cuando un hilo finaliza se liberan tanto su contexto como sus columnas.

Construir hilos dentro de algún programa lógicamente tiene sus ventajas, como podrían ser que el código o el proceso no tenga algunos problemas de compilación o de procesamiento al momento de ejecutar nuestro código 

Cabe mencionar que para implementar los hilos o procesos de las funciones del codigo de dicho programa se tiene que implementar. Un ejemplo de implementar un metodo para el proceso de un hilo seria por ejemplo de esta manera:

primeramente se declara la clase:

public class AplicHilo {

y el metodo seria:

public void run ()

Un ejemplo:


public class ThreadEjemplo extends Thread { 
public ThreadEjemplo(String str) { 
    super(str); 
 } 
public void run() { 
    for (int i = 0; i < 10 ; i++) 
   System.out.println(i + " " + getName()); 
  System.out.println("Termina thread " + getName()); 
 } 
public static void main (String [] args) { 
    new ThreadEjemplo("Pepe").start(); 
    new ThreadEjemplo("Juan").start(); 
  System.out.println("Termina thread main"); 
 } 
}

Es un ejemplo de como construir un método de hilo, junto con un ciclo for para imprimir una lista de datos.


Si se compila y ejecuta el programa, podrá obtenerse una salida como la siguiente: 

0 Pepe 
1 Pepe 
2 Pepe 
3 Pepe 
0 Juan 
4 Pepe 
1 Juan 
5 Pepe 
2 Juan 
6 Pepe 
3 Juan 
7 Pepe 
4 Juan 
8 Pepe 
5 Juan 
9 Pepe 
6 Juan 
Termina thread Pepe 
7 Juan 
8 Juan 
9 Juan 
Termina thread Juan

martes, 22 de noviembre de 2011

"AUTO-GENERACIÓN DE CÓDIGO MEDIANTE UMBRELLO"

Clase Cliente

/**
 * Class clientes
 */
public class clientes {

  //
  // Fields
  //

  private String nombre;
  private String apellidos;
 
  //
  // Constructors
  //
  public clientes () { };
 
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of nombre
   * @param newVar the new value of nombre
   */
  private void setNombre ( String newVar ) {
    nombre = newVar;
  }

  /**
   * Get the value of nombre
   * @return the value of nombre
   */
  private String getNombre ( ) {
    return nombre;
  }

  /**
   * Set the value of apellidos
   * @param newVar the new value of apellidos
   */
  private void setApellidos ( String newVar ) {
    apellidos = newVar;
  }

  /**
   * Get the value of apellidos
   * @return the value of apellidos
   */
  private String getApellidos ( ) {
    return apellidos;
  }

  //
  // Other methods
  //

}


Clase aerolineas

/**
 * Class aerolineas
 */
public class aerolineas {

  //
  // Fields
  //

  public String empresa;
  public String avion;
 
  //
  // Constructors
  //
  public aerolineas () { };
 
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of empresa
   * @param newVar the new value of empresa
   */
  public void setEmpresa ( String newVar ) {
    empresa = newVar;
  }

  /**
   * Get the value of empresa
   * @return the value of empresa
   */
  public String getEmpresa ( ) {
    return empresa;
  }

  /**
   * Set the value of avion
   * @param newVar the new value of avion
   */
  public void setAvion ( String newVar ) {
    avion = newVar;
  }

  /**
   * Get the value of avion
   * @return the value of avion
   */
  public String getAvion ( ) {
    return avion;
  }

  //
  // Other methods
  //

}


clase destinos

/**
 * Class destinos
 */
public class destinos {

  //
  // Fields
  //

  public short precio;
  private String destino;
 
  //
  // Constructors
  //
  public destinos () { };
 
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of precio
   * @param newVar the new value of precio
   */
  public void setPrecio ( short newVar ) {
    precio = newVar;
  }

  /**
   * Get the value of precio
   * @return the value of precio
   */
  public short getPrecio ( ) {
    return precio;
  }

  /**
   * Set the value of destino
   * @param newVar the new value of destino
   */
  private void setDestino ( String newVar ) {
    destino = newVar;
  }

  /**
   * Get the value of destino
   * @return the value of destino
   */
  private String getDestino ( ) {
    return destino;
  }

  //
  // Other methods
  //

}


clase reservaciones

/**
 * Class reservaciones
 */
public class reservaciones {

  //
  // Fields
  //

  public clientes nombre;
  public clientes apellidos;
  public aerolineas empresa;
  public destinos destino;
 
  //
  // Constructors
  //
  public reservaciones () { };
 
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of nombre
   * @param newVar the new value of nombre
   */
  public void setNombre ( clientes newVar ) {
    nombre = newVar;
  }

  /**
   * Get the value of nombre
   * @return the value of nombre
   */
  public clientes getNombre ( ) {
    return nombre;
  }

  /**
   * Set the value of apellidos
   * @param newVar the new value of apellidos
   */
  public void setApellidos ( clientes newVar ) {
    apellidos = newVar;
  }

  /**
   * Get the value of apellidos
   * @return the value of apellidos
   */
  public clientes getApellidos ( ) {
    return apellidos;
  }

  /**
   * Set the value of empresa
   * @param newVar the new value of empresa
   */
  public void setEmpresa ( aerolineas newVar ) {
    empresa = newVar;
  }

  /**
   * Get the value of empresa
   * @return the value of empresa
   */
  public aerolineas getEmpresa ( ) {
    return empresa;
  }

  /**
   * Set the value of destino
   * @param newVar the new value of destino
   */
  public void setDestino ( destinos newVar ) {
    destino = newVar;
  }

  /**
   * Get the value of destino
   * @return the value of destino
   */
  public destinos getDestino ( ) {
    return destino;
  }

  //
  // Other methods
  //

}


martes, 1 de noviembre de 2011

EVENTOS Y EXCEPCIONES EN MI PROYECTO

Los siguientes codigos se refieren a algunos de los eventos y excepciones que llevo en mi proyecto hasta el momento.



 public class cliente extends javax.swing.JInternalFrame {

    
    public cliente() {
        initComponents();
    }


private void conectarActionPerformed(java.awt.event.ActionEvent evt) {                                      
     
try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         
String db="jdbc:odbc:Driver=Microsoft Access Driver

(*.mdb);DBQ=C:/Users/Victor/Desktop/base";
         
Connection cn = DriverManager.getConnection(db,"","");
         
Statement s = cn.createStatement();
         
String sql="insert into



clientes(Nombre_cliente,Apellidos_cliente,Tel_cliente,Dir_cliente) 



values('"+this.cnom.getText()+"','"+this.cape.getText()+"','"

+this.ctel.getText()+"','"+this.cdir.getText()+"')";

s.executeUpdate(sql);
         
JOptionPane.showMessageDialog(rootPane, "Guardado con Exito");
     
} catch (Exception ex) {
            JOptionPane.showMessageDialog(rootPane,"El error es "+ ex);
        }
}                



  • El código anterior lo utilizo para ingresar los datos de un cliente y que se guarden directamente en la base de datos, esta parte del código esta dentro de un "try catch" al momento de presionar el botón nuevo podre ingresar los datos de un cliente para poder consultarlos y utilizarlos después en la base de datos, si me llega a aparecer algún error entra en función la excepción que muestro en el siguiente código:   


JOptionPane.showMessageDialog(rootPane, "Guardado con Exito");
     
} catch (Exception ex) {
            JOptionPane.showMessageDialog(rootPane,"El error es "+ ex);
        }

  • Y la excepción me mostrara cualquier error que se presente, ya sea como error en el nombre de la base de datos o en la ubicación de ella o bien si algún atributo no tiene el mismo conjunto de valores que ya había definido en la base de datos, etc.


  • El siguiente código es para la conexion a la base de datos, al momento de presionar el boton actalizar o conectar me aparecera un mensaje de "conexión correcta" como muestro en el codigo:



private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {


String db="jdbc:odbc:Driver=Microsoft Access Driver 



(*.mdb);DBQ=C:/Users/Victor/Desktop/base";
            
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   
         Connection cn = DriverManager.getConnection(db,"","");

            JOptionPane.showMessageDialog(rootPane, "Conexion Correcta");

        } catch (Exception ex) {
           JOptionPane.showMessageDialog(rootPane,"El error es "+ ex); 
        }

  • Y el código para algún error en la conexión es prácticamente el mismo que el anterior, me mostrara la excepción "ex" cualquier error que se me pueda presentar.
          •               





  • Otro evento es el de buscar, algún cliente para hacer una nueva reservacion el código es como se muestra:








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


    if(sql.existe("clientes","Id_cliente",getText(cid,12))){
     

      String data[] = sql.getDatosCliente(getText(cid,12));

     
   
       cnom.setText(data[1]);
   
       cdir.setText(data[2]);

       ctel.setText(data[3]);        
 
        cid.setEnabled(false);          

        }else{
   
                   JOptionPane.showMessageDialog(this,msg.getNoExiste());
    }
}



  • En esta parte el boton buscar buscara mediante el identificador del cliente, para esto se pone la Id del cliente que queremos buscar y nos mostrara los datos de dicho cliente, como su nombre, direccion, telefono, etc. 


  • Otro evento es el de eliminar entrara en acción al presionar este botón en cualquiera de las ventanas y como dice su nombre eliminara algún registro o alguna reservacion que ya no se desea, el código es el siguiente:

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

    if(sql.Eliminar_Cliente(getText(cid,12))){
   
         JOptionPane.showMessageDialog(this,msg.getEliminado());
    
             limpiar_controles();
    }
}                         


  • Que utiliza tambien este metodo:

public boolean Eliminar_Cliente(String ic){
      boolean ok=false;
  
       ok = Eliminar_Registro("clientes", "Id_cliente='"+cid+"'");
   
       return ok;}  

  • A si es como se eliminaran los registros capturados que queramos.

  • El ultimo evento hasta lo que llevo de proyecto es el de cerrar las ventanas, el código: 

private void cmdCerrarActionPerformed(java.awt.event.ActionEvent evt) {                                          
    
    sql.Cerrar_Access();
    
       dispose();


Estos son algunos eventos que estoy utilizando y las excepciones para los errores que pudiera tener.




INTERFAZ GRÁFICA DE MI PROYECTO

Estas son algunas de mis ventanas que ya tengo creadas que forman parte de mi proyecto de agencia de viajes, son la ventana menú principal, la ventana para clientes, ventana para nuevas reservaciones y ventana para ver la información de los destinos.


Ventana de Menu Principal




Muestra la barra de Menú con la opción de Clientes e ingresar un nuevo cliente.



Muestra la barra de Menu cno la opcion de Reservaciones y crear una nieva reservacion. 





Muestro la ventana de Clientes con algunos de los eventos que puede realizar como por ejemplo, actualizar información de clientes, ingresar un nuevo cliente, eliminar a un cliente ( información de un determinado cliente), el botón cerrar para cerrar la ventana y la mas importante la acción de buscar algún determinado cliente mediante su identificador.  





Esta ventana es la de Reservaciones de clientes para poder crear una nueva reservacion, eliminar alguna reservacion ya antes creada y el botón de cerrar la ventana que se muestra.




A qui se muestra la ventana de menú principal con el sub-menú de la ventana Destinos para poder la información de algún destino determinado, para después realizar la reservacion.




Esta ventana es la de Destinos para poder ver la informacion de los destinos disponibles para los clientes para a si poder hacer su reservacion si a si lo desean.