miércoles, 7 de septiembre de 2016

049.- Base De Datos - MODIFICACIONES - Java Y NetBeans

Consultas de Acción (Modificaciones):

Las consultas SQL de acción son:

-       INSERT INTO (permiten introducir nuevos registros en las tablas).
-       DELETE (permiten eliminar registros de las tablas).
-       UPDATE (permiten modificar los registros de las tablas).

Estas consultas SQL se ejecutan desde el programa a través del método executeUpdate propio del objeto sentencia.

Estas instrucciones SQL afectan al contenido de las tablas de la base de datos y no devuelven ningún resultado. Es decir, no extraen datos, y por tanto no devuelven un ResultSet.

En las publicaciones anteriores se ha visto como ejecutar consultas INSERT INTO y DELETE. En esta hoja guiada veremos como ejecutar consultas de acción de modificación: UPDATE.




EJERCICIO GUIADO Nº 1

PLANTEAMIENTO:

Se mejorará el proyecto realizado en la entrada anterior de forma que no solo permita añadir y borrar trabajadores de la tabla Trabajadores de la base de datos AMANUVA, sino que también permita realizar modificaciones en los datos de los trabajadores de dicha tabla.

  1. Ejecuta el IDE NetBeans. Abre el proyecto llamado MantenimientoTrabajadores que se programó en el post anterior.

  1. Modifica la ventana principal añadiendo un nuevo panel con los siguientes componentes:





  1. La mejora que se pretende hacer es la siguiente:

-       El usuario introducirá en el cuadro de texto txtModDni el DNI del trabajador cuyos datos se quieren modificar.

-       Al pulsar el botón Buscar, el resto de cuadros de texto se rellenarán con los datos del trabajador al que pertenece dicho DNI. (Si dicho DNI no existiera, se mostraría un mensaje de error).

-       Cuando aparezcan los datos del trabajador en los cuadros de texto, el usuario podrá realizar las modificaciones pertinentes.

-       Al pulsar el botón Modificar se modificarán los datos en la tabla.


  1. Primero programaremos el botón de búsqueda. Entre en el evento actionPerformed de este botón y programe lo siguiente:



Estudiemos atentamente el código anterior:

Lo primero que hace el código es construir una consulta de selección que busque a todos los trabajadores que tengan el DNI introducido en el cuadro de texto txtModDni.

Ejecuta la consulta y almacena el resultado en un típico ResultSet. Luego comprueba a través del siguiente if si no existe un trabajador con dicho DNI en el ResultSet:

if (!rs.first()) {

En ese caso muestra un mensaje de error indicando que no se ha encontrado dicho trabajador.

En caso contrario muestra los datos del trabajador encontrado en los cuadros de texto. Para ello, se extrae del ResultSet cada campo y se coloca en el cuadro de texto correspondiente. Por ejemplo:

txtModNombres.setText(rs.getString("nombres"));

Recoge el valor del campo nombres, y lo sitúa en el cuadro de texto txtModNombres.

En el caso de la fecha de entrada del trabajador, se extrae la fecha y luego se extrae de la cadena el día, el mes y el año, situando cada dato en su cuadro de texto correspondiente.

fecha = rs.getString("fecha_entrada");
dia = fecha.substring(8, 10);
mes = fecha.substring(5, 7);
anio = fecha.substring(0, 4);
txtModDia.setText(dia);
txtModMes.setText(mes);
txtModAnio.setText(anio);

Recuerda que cuando se extrae una fecha de un ResultSet, su formato es:

año-mes-dia-hora:minutos

Por ejemplo: 2016-09-07-00:00

Así pues, si el DNI introducido pertenece a uno de los trabajadores de la tabla, sus datos aparecerán en los cuadros de texto cuando se pulse el botón Buscar.


  1. Ejecuta el programa y comprueba su funcionamiento. Escribe un DNI en el cuadro del DNI de búsqueda y pulsa Buscar.



  1. Se supone que cuando aparezcan los datos del trabajador en los cuadros de texto el usuario los modificará según le interese. Luego, al pulsar el botón Modificar los nuevos datos serán actualizados en la tabla.

  1. Para hacer esto, entre en el evento actionPerformed del botón Modificar y programe lo siguiente:



Se va a analizar este código. Estúdielo con detenimiento:

Debe observar que lo primero que se hace en este código es crear una consulta de actualización (UPDATE) a través de una concatenación de cadenas.

Si observa la concatenación, verá que el resultado es una instrucción SQL de tipo UPDATE en la que los datos que se actualizan son precisamente los datos introducidos en los cuadros de texto del panel de modificación.

Por ejemplo, si estos fueran los valores de los cuadros de texto del panel de modificación:

txtModDni             55555555
txtModNombres    JUANA
txtModApellidos    CASTRO
txtModSueldo       6000.00
txtModDia             16
txtModMes            12
txtModAnio           2015
txtModPlaca          P0005


La instrucción ya construida por concatenación sería la siguiente:

UPDATE Trabajadores
SET nombres = 'JUANA',apellidos = 'CASTRO',sueldo = 6000.00,fecha_entrada = '16/12/2015',placa = 'P0005'
WHERE dni = '55555555'


Esta instrucción SQL de tipo UPDATE incluye una cláusula WHERE con una condición de forma que solo se modifica aquel trabajador que tenga el DNI introducido en el cuadro de texto txtModDni.

Una vez construida la consulta UPDATE, esta se ejecuta usando el objeto sentencia y luego se muestra el contenido de la tabla Trabajadores en el panel a través de una llamada al método mostrarTodosLosTrabajadores.

Todo este código está rodeado de un try...catch para evitar errores inesperados.


  1. Comprueba el funcionamiento del programa ejecutándolo. Debes introducir un DNI y pulsar el botón Buscar para que se rellenen los cuadros de texto con los datos del trabajador.

Luego cambia algún dato de los que han aparecido en los cuadros de texto y pulsa el botón Modificar.

Si observas el panel de texto deberá aparecer la lista completa de trabajadores y en ella podrás observar la modificación que se ha realizado en el trabajador correspondiente.






CONCLUSIONES:

Se pueden ejecutar instrucciones SQL del tipo UPDATE (modificar registros) usando el objeto sentencia.

Para este tipo de instrucciones hay que usar el método executeUpdate.

Normalmente, será necesario construir una cadena de consulta UPDATE a través de la concatenación de subcadenas y datos introducidos por el usuario en cuadros de texto.

Este tipo de instrucción SQL no devuelve ningún ResultSet, ya que no extraen datos de las tablas, sino que modifican el contenido de éstas.

Es una buena idea dar alguna opción de búsqueda que permita encontrar al registro a modificar y que sus datos aparezcan en varios cuadros de texto, de forma que el usuario tenga más facilidad a la hora de realizar la modificación de los datos.

martes, 6 de septiembre de 2016

048.- Base De Datos - BAJAS - Java Y NetBeans

Consultas de Acción (Bajas):

En el post anterior se vio como se podían ejecutar consultas SQL de acción del tipo INSERT INTO (para insertar registros en las tablas de la base de datos).

En esta publicación se practicará con otras consultas SQL de acción. Concretamente con las del tipo DELETE (usadas para eliminar registros de las tablas de la base de datos).

Al igual que ocurre con las consultas INSERT INTO, las consultas DELETE se ejecutan usando el método executeUpdate del objeto sentencia.

sentencia.executeUpdate(“DELETE …”);


Al ejecutar estas consultas se cambiará el contenido de las tablas de la base de datos y no se devolverá ningún ResultSet.




EJERCICIO GUIADO Nº 1

PLANTEAMIENTO:

Se mejorará el proyecto realizado en el post anterior de forma que no solo admita la inserción de nuevos trabajadores en la tabla Trabajadores de la base de datos AMANUVA, sino que también permita eliminar a trabajadores de la tabla.


  1. Ejecuta el IDE NetBeans. Abre el proyecto llamado MantenimientoTrabajadores que se programó en la entrada anterior.

  1. Añade en la parte inferior de la ventana un nuevo panel:



  1. La mejora que se pretende hacer es la siguiente:

-       El usuario introducirá en el cuadro de texto txtDniEliminar el DNI del trabajador que quiere eliminar.

-       Al pulsar el botón Eliminar el trabajador con dicho DNI se eliminará de la tabla.

-       Antes de eliminar al trabajador, se le pedirá al usuario una confirmación, para evitar un borrado accidental.

-       Si el DNI introducido no se correspondiera con ningún trabajador de la tabla, entonces se mostrará un mensaje indicándolo.



  1. Para hacer esto, entre en el actionPerformed del botón Eliminar y programe lo siguiente:



Se va a analizar este código. Estúdielo con detenimiento:

Lo primero interesante que encontrará es la construcción de una consulta de selección (SELECT) usando la típica concatenación de cadenas:

consulta = "SELECT * FROM Trabajadores WHERE dni = '" + txtDniEliminar.getText() + "'";
ResultSet rs = sentencia.executeQuery(consulta);


Esto se hace para extraer aquellos trabajadores que tengan el DNI introducido en el cuadro de texto txtDniEliminar. La idea es saber si existe en la tabla algún trabajador con dicho DNI. Al ejecutar esta consulta, el ResultSet rs se llenará con trabajadores que tengan ese DNI.

Observe el código que viene a continuación:

if (!rs.first()) {


Este if significa: “si no puedo colocarme en el primer elemento del ResultSet rs”.

Si no es posible colocarse en el primer elemento del resultado de la consulta será porque no hay un primer elemento, o dicho de otra forma, porque el ResultSet está vacío, o dicho de otra forma más, porque no se encontró a nadie que tuviera el DNI indicado.

Si esto fuera así, no existe un trabajador con dicho DNI y por tanto no puede ser borrado. Así pues se muestra un mensaje con un JOptionPane indicando dicha circunstancia.

En caso contrario, existe ese trabajador y por tanto podemos borrarlo. Observa el contenido del else:

respuesta = JOptionPane.showConfirmDialog(null, "¿Confirma el Borrado?", "Aviso", JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_OPTION) {


En estas líneas de código primero pregunta al usuario si quiere borrar realmente al trabajador; luego si la respuesta es sí (YES_OPTION) se efectuará el borrado tal como se indica a continuación:

consulta = "DELETE FROM Trabajadores WHERE dni = '" + txtDniEliminar.getText() + "'";
sentencia.executeUpdate(consulta);
mostrarTodosLosTrabajadores();


Como puedes observar, se construye a través de una concatenación, una consulta de acción SQL del tipo DELETE, que nos permitirá borrar el trabajador con el DNI introducido.

Luego se ejecuta dicha instrucción usando el método executeUpdate del objeto sentencia (recuerde que usará siempre executeUpdate para ejecutar consultas de acción: altas, eliminación y modificación).

Finalmente se llama de nuevo al método que creamos en la publicación anterior que muestra todo el contenido de la tabla Trabajadores, y de esta forma podremos comprobar el borrado del trabajador.

En caso de que el usuario no haya confirmado el borrado, el código muestra un mensaje “Borrado Cancelado por el Usuario.”.

Por otro lado, todo este código es susceptible de sufrir errores inesperados, por lo que está rodeado por un try ... catch.


  1. Ejecuta el programa y prueba a eliminar trabajadores de la tabla. Se recomienda que pruebes a introducir DNIs inexistentes, para ver que ocurre. Pruebe también la confirmación del borrado: responda a veces que sí y otras veces que no.





CONCLUSIONES:
Se pueden ejecutar instrucciones SQL del tipo DELETE (borrar registros) usando el objeto sentencia.

Para este tipo de instrucciones hay que usar el método executeUpdate.

Normalmente, será necesario construir una cadena de consulta DELETE a través de la concatenación de subcadenas y datos introducidos por el usuario en cuadros de texto.

Este tipo de instrucciones SQL no devuelven ningún ResultSet, ya que no extraen datos de las tablas, sino que modifican el contenido de éstas.

Para realizar borrados será necesario habitualmente el comprobar que los registros a borrar existen en la tabla. Esto se hará ejecutando una consulta SELECT y comprobando si el ResultSet resultante contiene algún registro, usando el método first.

También se recomienda pedir confirmación al usuario antes de realizar borrados en las tablas.

domingo, 4 de septiembre de 2016

047.- Base De Datos - ALTAS - Java Y NetBeans

Consultas de Selección y Consultas de Acción:

Al estudiar SQL, vimos que existían dos tipos de instrucciones.

-       Consultas de selección (SELECT):
Estas consultas permiten extraer datos de la base de datos. Dicho de otro modo, permiten visualizar información de la base de datos que cumpla un criterio.
Estas consultas no afectan a la base de datos, simplemente muestran información sobre la propia base de datos.

-       Consultas de acción (INSERT, DELETE, UPDATE):
Estas consultas realizan una acción sobre la base de datos. Esta acción puede ser:
o   Insertar un nuevo registro en una tabla (INSERT).
o   Borrar uno o varios registros de una tabla (DELETE).
o   Modificar los datos de uno o varios registros de la tabla (UPDATE).


Ejecución de consultas de selección y de consultas de acción:
Hasta ahora se han realizado programas java que ejecutaban consultas de selección sobre la base de datos.
Recuerda que para ejecutar estas consultas se usa el método executeQuery del objeto sentencia y el resultado de la consulta se almacena en un objeto ResultSet:

ResultSet rs = sentencia.executeQuery(“SELECT …”);


En esta publicación de mi blog veremos la ejecución de consultas de acción sobre la base de datos desde una aplicación java. Este tipo de consultas se ejecutan usando el método executeUpdate del objeto sentencia, y no devuelven un resultado, ya que simplemente actúan sobre la base de datos modificando de alguna manera su contenido.

Así pues, para realizar un alta en la base de datos se usará:

sentencia.executeUpdate(“INSERT …”);


Para realizar una modificación en la base de datos se usará:

sentencia.executeUpdate(“UPDATE …“);


Para realizar una eliminación en la base de datos se usará:

sentencia.executeUpdate(“DELETE …“);



EJERCICIO GUIADO Nº 1

PLANTEAMIENTO:

Se quiere realizar una aplicación de base de datos que manipule los datos de los trabajadores de la base de datos AMANUVA. Esta aplicación permitirá ver el listado de trabajadores y además permitirá introducir nuevos trabajadores.

  1. En el IDE NetBeans haz lo siguiente: Crea un nuevo proyecto llamado MantenimientoTrabajadores. Dentro de este proyecto crea un paquete principal llamado paquetePrincipal y dentro de él agrega un JFrame llamado VentanaPrincipal:



  1. Añade por ahora a la ventana un JTextPane y un botón:



El botón se llamará btnVerTrabajadores y el JTextPane se llamará panelTexto:



  1. Para que este programa pueda trabajar con la base de datos AMANUVA tendrá que prepararlo haciendo lo siguiente:
-       Añadir al programa los objetos conexion (Connection) y sentencia (Statement) como globales.
-       Crear el procedimiento realizarConexionBaseDatos y llamarlo desde el método constructor.
-       Cerrar la conexión desde el evento windowClosing.

Realice estos tres pasos que se han indicado antes de continuar.

  1. Ya se puede programar el botón btnVerTrabajadores. Se pretende que al pulsar este botón aparezca en el panel panelTexto el contenido de la tabla Trabajadores.

Para ello, en el evento actionPerformed del botón btnVerTrabajadores programe lo siguiente:



  1. Como puede ver, es una llamada a un método al que se le ha nombrado mostrarTodosLosTrabajadores (aparece subrayado en rojo debido a que no se ha creado todavía). Este método se encargará de mostrar todos los trabajadores en el panelTexto.

Programe el método mostrarTodosLosTrabajadores de la siguiente forma:



El código de este método no debe resultarle ya desconocido.
Básicamente lo que hace es ejecutar una consulta SQL que recoge todos los datos de la tabla Trabajadores y luego muestra dichos datos en el panel de la ventana.
Se muestra el listado procurando que las fechas aparezcan con el formato día/mes/año y que si el campo placa fuera nulo o una cadena vacía “”, entonces aparezca el texto “sin coche”.

La razón por la que se ha programado este código en un método aparte llamado mostrarTodosLosTrabajadores en vez de hacerlo directamente en el evento actionPerformed del botón se entenderá más adelante, cuando avancemos en el ejercicio guiado.

  1. Ejecute el programa y pruebe el botón btnVerTrabajadores. Compruebe que realiza su cometido.

  2. Ahora que ya tenemos un programa capaz de visualizar a los trabajadores, añada los siguientes elementos a la ventana principal:



  1. El objetivo de estos elementos es el siguiente:
El usuario introducirá los datos de un nuevo trabajador en las casillas indicadas.
Luego, al pulsar el botón de Alta, se introducirá en la tabla Trabajadores los datos del nuevo trabajador y aparecerá en el panel la lista actualizada de trabajadores incluyendo al nuevo que se ha añadido.

Para ello tendrás que programar en el botón Alta lo siguiente:



Analicemos este código detenidamente.
Lo primero que hay que tener en cuenta es que se realiza una concatenación de cadenas dentro de la variable consulta.
Observa el uso de += para concatenar. Ten en cuenta que es lo mismo poner esto:

consulta += “’”+txtDni.getText()+”’,”;

que poner esto:

consulta = consulta + “’”+txtDni.getText()+”’,”;

Solo que el uso de += acorta las instrucciones.

Si se analiza la concatenación de las cadenas, se observará que el resultado es una instrucción SQL del tipo INSERT INTO. Es decir, una instrucción SQL que permite la inserción de un nuevo registro en la tabla Trabajadores.

Por ejemplo, supongamos que introducimos los siguientes valores en los cuadros de texto:

txtDni                    88888888
txtNombres           ANTERO
txtApellidos          OLIVERA
txtSueldo              8080
txtDia                    31
txtMes                   01
txtAnio                  2017
txtPlaca                 (vacío)

La concatenación en la variable consulta resultaría así (en azul los valores de los cuadros de texto, en naranja las cadenas que se concatenan):

INSERT INTO Trabajadores VALUES (‘88888888’,‘ANTERO’,‘OLIVERA’,8080,‘31/01/2017’,‘’)


Es decir, se sigue la misma estrategia que en la publicación anterior. Se concatenan trozos de cadenas y datos introducidos por el usuario hasta conseguir una cadena con forma de instrucción SQL.

En este ejemplo, la instrucción SQL construida por concatenación es una instrucción INSERT INTO que permite introducir en la tabla Trabajadores los datos de un nuevo trabajador.

El objeto que se encarga de ejecutar dentro de la base de datos la instrucción SQL recién construida es el objeto sentencia:

sentencia.executeUpdate(consulta);

Como se puede observar, para ejecutar instrucciones SQL de acción ya no se usa el método executeQuery, sino que se usa el método executeUpdate.

Una vez ejecutada la introducción del nuevo registro en la base de datos, se llama al procedimiento mostrarTodosLosTrabajadores el cual se encarga de mostrar todo el contenido de la tabla Trabajadores en el panel de texto. Gracias a este método, veremos como se rellena el panel y observaremos al nuevo registro recién introducido.

La razón de que se programara aparte el método mostrarTodosLosTrabajadores para mostrar el listado completo de trabajadores ha sido debido a la intención de llamar a este método desde otros lugares del programa. Es decir, la intención ha sido centralizar código y evitar su repetición.

Hay que tener en cuenta que todo este código está rodeado de un try ... catch para evitar cualquier error inesperado. Ten en cuenta que pueden producirse errores fácilmente si introducimos valores incorrectos en los cuadros de texto.

  1. Finalmente ejecuta el programa y comprueba su funcionamiento añadiendo varios trabajadores a la tabla:

 


CONCLUSIONES:
Se pueden ejecutar instrucciones SQL del tipo INSERT INTO (insertar registros) usando el objeto sentencia.
Para este tipo de instrucciones hay que usar el método executeUpdate.

Normalmente, será necesario construir una cadena de consulta a través de la concatenación de subcadenas y datos introducidos por el usuario en cuadros de texto.

Este tipo de instrucciones SQL no devuelven ningún ResultSet, ya que no extraen datos de las tablas, sino que modifican el contenido de éstas.