miércoles, 7 de diciembre de 2011

Ingreso de Autos de Personas.

Autor: Felipe Andres Lagos Morapasten
Competencia: Creatividad e innovación. (Nivel 1)
Palabras Clave: Cliente-Servidor, Java, Listas, Base de Datos.

Descripción de la Actividad

Finalizando la competencia de Creatividad e innovación, quiero otra vez compartir con ustedes mi resolución del segundo problema de la prueba número 1 del curso Desarrollo de Aplicaciones Cliente Servidor que consiste en poder ingresar autos de una persona a una base de datos todo esto comienza, mostrando las personas que existen en la tabla “persona” para que el usuario sepa que personas existen para registrar sus autos, seguido de pedir el rut, que nos permite ingresar el auto para esa persona, los datos del autos son patente(con una excepción en el ingreso, la marca, el modelo, y el año del auto) . La resolución cuenta con los ejemplos de entrada y salida, el análisis de la solución, los diagramas de clases y actividades, concluyendo con el código fuente con su respectiva captura de pantalla.

Resolución:

Paso 1: Ejemplos.

Sintaxis de ingreso: Rut, Patente ,Marca Modelo, Año
123-4, 111, 334, 556,2010 > [P] > “Ingrese nuevamente su rut, patente mal ingresada.
134-5, HGFR, Hyundai, Galloper,DosMilDiez  > [P] > “Error, por el tipo de dato de la edad que es entero, se ingresó un String”.
 765-3, HGRT, Hyundai, Galloper, 2010  > [P] >  “Datos correctamente ingresados“
 765-3, HGRT, Hyundai, Galloper, 2010> [P] >  “Datos duplicados, no se ingresan”
123, _ , _, _ , _ > [P] >  “Error debe ingresar todos los datos” // _ = espacio
345-3, @@@@@, Nissan, V16, 2000> [P] >  “Error en la patente”
345-4, HGTY, Chetvrolet, Corsa, 12345678901> [P] > “Error en la edad sobrepasó la capacidad de los enteros( integer)”
678-2, 56CO, Chetvrolet, CorsaXL, 2000 > [P] > “Ingrese nuevamente su Rut ya que ha ingresado mal la patente”
765-3, TICO4, Nissan, 350Z, 2012> [P] > “Ingrese nuevamente su Rut ya que ha ingresado mal la patente”  // Cinco caracteres.
765-3, TICO4, Jeep, Hola, 2033> [P] >  “Datos duplicados, no se ingresan”
765-3, JUIO, Hyundai, GranNomade,555 > [P] > ““Error, Rut ya existe”
RUT, QERT, Nissan,Camaro, 2000> [P] > “Error, Rut mal ingresado”
_ , _ , _, _, _> [P] > ““Error, debe ingresar valores”
456-3, YTUE, Hyundai, Tuckson, 5000-3000>  [P] > “Error, en el ingreso del año”
1111, 1111, 1111, 1111,1111 > [P] > ““Error, en el tipo de dato que ha ingresado”

Paso 2: Análisis y Diseño.
La solución del problema lo fui resolviendo paso a paso, lo primero fue crear la conexión  a la base de datos que se ubica en phpMyAdm, para después hacer una consulta a la base mediante una sentencia SQL con el ResultSet que va a contener todos los registros de la tabla persona para luego guardarlos en una colección de tipo TreeSet y pasar a ser mostrado.
           
Lo siguiente fue pedir los datos por teclado que serán ingresados a la base de datos mediante el Preparement Statement, validando solo la patente, al superar la validación los datos están contenidos en un arrayList que nos permite tener todos los datos hasta los duplicados, después de eso preguntar si quiere repetir la operación de ingresar, de no ser así cierra la conexión.


- Hacer la conexión a la base de datos mediante un objeto con de tipo Connection:       Conexion con = new Conexion();
-Ejecutar el ResultSet que contiene la consulta que nos muestra todos los datos de la tabla persona :  SQL= select * from personas.


-Esto es lo que nos devuelve la tabla persona, lo que se muestra que serán luego guardados en una colección TreeSet, en la una lista mediante el ResultSet que contiene la información mediante un ciclo que lo recorre todo el rs.
      while (rs.next()) {
                lista.add(new persona(rs.getString("rut"), rs.getString("nombre"), rs.getInt("edad")));


-Después el Usuario debe ingresar los datos del auto y de él : su rut de tipo String, la patente del auto de tipo String que debe contener 4 letras., la marca y modelo también de tipo String y por último el año del auto de tipo entero.
- Al ingresar estos datos se debe validar la patente que quedo especificada.

Rut: 123-4 Patente: HFGT Marca:Toyota Modelo:Corolla Año:2010

-La validación de la patente comienza revisando la primera letra de la patente comprobando si  efectivamente es una letra, si es así revisa las demás, de no ser una letra, vuelve al ingreso de datos, enviando un mensaje de que ingreso mal la patente.

Char letra = patente.charAt(i);
if (!Character.isLetter(letra)

Se pregunta si la primera letra de la patente es distinto de un carácter o letra de ser así vuelvo a la opción de ingresar, recordar que lo hace para todas las letras gracias a un ciclo for

for (int i = 0; i < patente.length(); i++)

-Al terminar de comprobar la patente, que esta sea correcta pasa a guardar los datos a un arreglo, este será nuevamente almacenado en un ArrayList, en la lista2 en este caso.

Auto car = new Auto(arrayDatos[0], arrayDatos[1], arrayDatos[2], Integer.parseInt(arrayDatos[3].trim()), rut); // Aquí es donde se le agregan los datos a los autos.
 List<Auto> lista2 = new ArrayList<Auto>();

-Teniendo todos los datos las pasamos a agregar a la base de datos mediante un Preparement Statement  con una secuencia sql.
SQL= "insert into autos (patente, marca, modelo,year,rut_propietario) values(?,?,?,?,?)";
Los signos de preguntas se solucionan con el método setString que posee los Preparement Statement

ps.setString(1, car.getPatente().trim());
Esto nos dice donde encuentre el primer signo de interrogación lo inserte en la patente, en la base de datos.
Con esto nos aseguramos que se ha insertado los datos a la BD.

Para finalizar se pregunta al usuario si quiere volver a insertar los datos si es así, pasa de nuevo a preguntar información sobre el el(rut) y de los autos, si no desea seguir ingresando, se cierra la conexión dándose por terminado la aplicación.

Esto es lo que se ha ingresado a la base de datos Auto.



Paso 3:
Especificación en Diagrama.

Clases:






Código de la clase que soluciona el programa,la clase ExcepciónPatente que hereda los atributos y métodos de la clase Exceptión, y por último la clase Verificar que comprueba  la patente todo en Java.

Clase Problema :

import utilidades.persona;//
import utilidades.Conexion;
import utilidades.Auto;// Clases anexas en el mismo proyecto para usarlas
import java.sql.Connection;
import java.sql.ResultSet;// Librería de la Conexion de la BD con Java
import java.sql.Statement;
import java.sql.SQLException;
import java.util.TreeSet;// Libreria de las Coleccion Tree Set y ArrayList
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; // Libreria del escaner.
import java.sql.PreparedStatement;

public class Problema {

    public Connection con;

    public static void main(String[] args) throws ExcepcionPatente {
        boolean seguir = true;
        Conexion con = new Conexion(); // Objeto con de tipo conexion, la cual la contiene.
        Scanner leer = new Scanner(System.in); // Escaner


        while (seguir) { // Para que el programa acepte continuar ingresando registros.
            System.out.println("Guardando los personas en un TreeSet");
            mostrarPersonas(); // Llamado al metodo donde se muestran las personas y despues se guardan en el TreeSet
            System.out.println("Ingrese su rut");
            String rut = leer.nextLine();
            ingresarDatos(rut);
            System.out.println("Datos correctamente ingresados");
            System.out.print("Ingresar mas autos (s/n): ");
            String res = leer.nextLine();

            if (res.equalsIgnoreCase("s")) // Si la respuesta es s o S continua ingresando datos
            {
                seguir = true;
            } else {
                seguir = false;  // Si no es se termina la Aplicación
                System.out.println("Fin de la Aplicación");
            }
        } // Cierre del while
    }

    public static void mostrarPersonas() { // Metodo que la muestra y guarda en un Tree Set
        try {

            Conexion con = new Conexion();
            Statement s = con.obtener().createStatement();
            ResultSet rs = s.executeQuery("select * from personas"); // Consulta sql que nos muestra todos los datos de la tabla persona.
            TreeSet<persona> lista = new TreeSet<persona>(); // Creacion de la lista TreeSet.

            while (rs.next()) {
                lista.add(new persona(rs.getString("rut"), rs.getString("nombre"), rs.getInt("edad")));
            } // Aqui es donde se guardan los datos de una persona
            Iterator it = lista.iterator(); // Para acceder a la lista
            System.out.println("La tabla contiene " + lista.size() + " registros"); // Se muestra el numero de registros que posee la lista
            while (it.hasNext()) {
                System.out.println(it.next().toString());
            } // Mostrar el contenido de la lista, los datos de las personas.
        }// Cierre try
        catch (SQLException e) { // En caso de que la consulta sql este mal, se encuentra este mensaje.
            System.out.println("Error en la consulta a la Base de Datos: " + e.getMessage());
        }

    }  // Cierre Metodo MostrarPersonas

    public static String ingresarDatos(String rut) throws ExcepcionPatente // Metodo para ingresar los autos a la base
    {
        String respuesta = null;
        Conexion con = new Conexion(); // Obtener la conexion con esto.
        Scanner ingresar = new Scanner(System.in);
        System.out.println("Sintaxis de ingreso: <Patente>, <Marca>, <Modelo>, <Año> "); // Nos muestra como se deben ingresar los datos de los autos.
        System.out.println(" *Patente=Solo 4 letras; HGBF,    Toyota,   Nissan,   2010");
        System.out.print("Ingrese datos de su Auto: ");
        String datos = ingresar.nextLine();


        try {
            String[] arrayDatos = datos.split(","); // Marca la diferencia de variable, inicio terminio mediante el ,
            String pa = arrayDatos[0];
            Verificar.verificarPatente(pa);
            Auto car = new Auto(arrayDatos[0], arrayDatos[1], arrayDatos[2], Integer.parseInt(arrayDatos[3].trim()), rut);// Aqui es donde se le agregan los datos a los autos.
            List<Auto> lista2 = new ArrayList<Auto>(); // Se crea la coleccion de tipo ArrayList
            lista2.add(car); // Se le agrega el car de tipo Auto a la lista de ArrayList
            String sql = "insert into autos (patente, marca, modelo,year,rut_propietario) values(?,?,?,?,?)";
            PreparedStatement ps = con.obtener().prepareStatement(sql); // Aca es donde realizamos la consulta sql a la Base de Datos.
            ps.setString(1, car.getPatente().trim());
            ps.setString(2, car.getMarca().trim());
            ps.setString(3, car.getModelo().trim()); // Cada ? se ingresa segun el orden como por ejemplo el primer ? corresponde a la patente.
            ps.setInt(4, car.getAnio());
            ps.setString(5, car.getRut().trim());

            int totalColumnasMod = ps.executeUpdate();
            respuesta = "Total de registros ingresados: " + totalColumnasMod;

        } catch (SQLException ex) {
            respuesta = "Error al ingresar el automovil: " + ex.getMessage();
        } catch (ExcepcionPatente e) {
            System.out.println("Error");
        } finally { // Al final de todo esto cierra la conexión.
            con.cerrar();
        }
        return respuesta;

    } // Fin del Metodo
}// Fin de la Clase

Clase Verificar: // Comprobación de la patente
import java.util.Scanner; // Libreria del escaner

public class Verificar {

    public static void verificarPatente(String patente) throws ExcepcionPatente { // Metodo de la excepcion para la patente
        char letra = '0';
        for (int i = 0; i < patente.length(); i++) { // Para recorrer toda la patente que se ingresó
            letra = patente.charAt(i);
            if (!Character.isLetter(letra)) { // Compara si el primer caracter es distinto de una letra

                Scanner leer = new Scanner(System.in);
                System.out.println("INGRESE NUEVAMENTE SU RUT"); // Pide que se ingresa el rut
                System.out.println("YAQUE HA INGRESADO MAL LA PATENTE");
                System.out.println("su Rut es");
                String nuevorut = leer.nextLine(); // El rut que se ingresó, se pasa como parametro
                Problema.ingresarDatos(nuevorut); // al metodo de ingresarDatos.
            }




        }
    }
}

Clase ExcepcionPatente: //  Hereda los atributos y metodos de la clase Exception

package conexionbd;

/**
 * @autor Felipe Lagos
 * Usada para poder crear el método que verifica
 * la patente, extiende de la clase genérica Exception
 */
public class ExcepcionPatente extends Exception { // Hereda de Exception

    public ExcepcionPatente(String msn) { // Constructor de la clase
        super(msn);// Acá es donde hereda de la clase Exception
    }
}


 Se puede destacar de este código fuente el uso de listas en Java de dos tipos uno de ArrayList y otro de tipo TreeSet ambos con cualidades distintas, para usos distintos, además del uso de una clase que vereda todos los métodos y atributos de otro, en este caso de la clase Exception.

Captura en Pantalla sobre la Aplicación:


 

Reflexión
La principal dificultad de esta resolución para el problema fue entender lo que realmente pide el problema, así plantear una posible solución ya que el único conflicto que se me generó fue no saber la verdadera función que debía cumplir en este caso permite que el usuario ingrese autos en una base de datos de una persona.

Te invito a que si tienes dudas o quieres complementar esta actividades mediante opiniones, otras informaciones no tengas miedo de emitir tus comentarios, a participar donde cada comentario hará que se haga más interactivo este espacio.

No hay comentarios:

Publicar un comentario