Foro de elhacker.net

Programación => Java => Mensaje iniciado por: |Miguel| en 21 Febrero 2012, 16:02 pm



Título: [RESUELTO]No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 21 Febrero 2012, 16:02 pm
Hola a todos, ¿qué tal?

Bueno, llevo un par de días como un loco y no doy con el fallo en mi programa... os cuento un poco de qué va la historia. Tengo una BBDD de empleados y departamentos con una relación 1:N donde cada empleado tiene un solo departamento y los departamentos de 0 a N empleados... Pues bien, estoy programando en Java un aplicación sencilla que permita añadir, eliminar y modificar datos de cualquier empleado/departamento.

Lo tengo todo acabado, excepto un JFrame en el que arriba tengo un JTextField con el nombre de un departamento y debajo de éste un JTable en el que se muestran los datos de todos los empleados de ese departamento. Hay también botones para pasar al siguiente, anterior, primer y último departamento, con sus eventos correspondientes que vacían y rellenan de nuevo la tabla con los empleados correspondientes al departamento activo.

Y por último tengo un botón que me permitiría borrar de la BBDD el empleado que esté seleccionado. Este es el código:

Código
  1. private void jtblEmpleMouseClicked(java.awt.event.MouseEvent evt) {
  2.        System.out.println("Entro en evento");
  3.        int fila=jtblEmple.getSelectedRow();
  4.        System.out.println("Fila seleccionada: "+fila);
  5.        if(fila >= 0){
  6.            System.out.println("entro en if");
  7.            try{
  8.                System.out.println("entro en el try");
  9.                for(int i=0; i<fila+1; i++){
  10.                    System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
  11.                    rsE.next();                    
  12.                }
  13.                System.out.println("Voy a borrar");
  14.                //rsE.deleteRow(); línea comentada para no borrar registros en pruebas y quedarme con 0 empleados... xD
  15.                //(aún así, esta línea me da unas veces la excepción de 'No data found' y otras la de 'estado del cursor no válido').
  16.                System.out.println("He borrado.");
  17.            }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error de borrado", JOptionPane.PLAIN_MESSAGE);}
  18.            finally{
  19.                System.out.println("llego al finally");
  20.                limpiaTabla();
  21.                rellenaTabla();
  22.                System.out.println("salgo del finally");
  23.            }
  24.        }
  25.        else
  26.            JOptionPane.showConfirmDialog(null, "Seleccione un departamento para eliminarlo.", "Error de borrado", JOptionPane.PLAIN_MESSAGE);
  27.    }
  28.  

Donde rsE es un ResultSet con todos los empleados del departamento activo y rsD es otro ResultSet con todos los departamentos. Todos esos println sobran, los he usado para ver qué hace la aplicación y esta me devuelve lo siguiente:

Cita de: NetBeans
run:
Entro en evento
Fila seleccionada: 1
entro en if
entro en el try
// aquí me salta la Excepción e
llego al finally
salgo del finally
BUILD SUCCESSFUL (total time: 10 seconds)

Este código funcionaba perfectamente para borrar departamentos... Y así llevo un par de días. Hoy he pedido ayuda al profesor y ha estado una hora  mirando y tocando sin sacar absolutamente nada, lo cual me hace pensar que seguramente será algún fallo bastante estúpido...

Gracias a todos.


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: HdM en 21 Febrero 2012, 16:39 pm
Buenas.

Código
  1. for(int i=0; i<fila+1; i++){
  2.                    System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
  3.                    rsE.next();                    
  4.                }
  5.                System.out.println("Voy a borrar");
  6.                //rsE.deleteRow(); línea comentada para no borrar registros en pruebas y quedarme con 0 empleados... xD
  7.                //(aún así, esta línea me da unas veces la excepción de 'No data found' y otras la de 'estado del cursor no válido').
  8.                System.out.println("He borrado.");

Creo que es debido a que antes de empezar el for, no sabes en qué posición se encuentra el rsE, de modo que después de salir del bucle y tras los sucesivos rsE.next() te deja el resultset en EOF, sin registro activo y por eso, al intentar eliminar te salta el error. Creo que antes de empezar el bucle, deberías comprobar que el rsE contiene registros y hacer un movefirst. Ése podría ser un error. Otro podría ser la condición del for, ¿no debería ser i < fila en vez de i < fila +1?

Saludos.


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 21 Febrero 2012, 16:51 pm
Hola Bulld0z3r, gracias por contestar.

rsE se carga con el constructor del JFrame donde estoy trabajando mediante el siguiente método:
Código
  1. static void cargaEmpleados(){
  2.        try{
  3.            int id_dep = rsD.getInt("dept_no");
  4.            seleccionaEmple(id_dep);
  5.            rsE.first();
  6.        }catch(Exception e){System.out.println("Error capturando depto para la tabla --> "+e);}
  7.  
  8.    }
  9.  

A ese método lo llamo, como he dicho, en el constructor del JFrame así como en todos los eventos de los botones primero, último, anterior y siguiente. Así me aseguro que rsE tenga siempre datos y además me posiciono en el primero de ellos.

En cuanto a la condición del for, antes la tenía así pero el método getSelectedRow() devuelve enteros a partir del 0 (éste incluido) si hay algo seleccionado, es decir, si cambio la condición y está seleccionada la primera fila no entro en el bucle, ¿me equivoco?

Saludos.


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: HdM en 21 Febrero 2012, 17:19 pm
Buenas.

La condición del for debería ser i<=fila

Saludos.


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 21 Febrero 2012, 17:28 pm
Sigue sin funcionar.
En este fragmento:
Código
  1. System.out.println("entro en el try");
  2. for(int i=0; i<=fila; i++){
  3.             System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
  4.  
imprime la línea de "entro en el try", pero no la otra. Es decir, salta la excepción al intentar rsE.getString("APELLIDO"), supongo. Revisaré mi forma de controlar los resultSet a ver...

Dejo aquí el código completo, por si alguien tiene mucho tiempo libre XD
http://www.mediafire.com/?xnn2pfkdkxfz15e (http://www.mediafire.com/?xnn2pfkdkxfz15e)
Versión en .txt: http://www.mediafire.com/?4vtdket2nuer36w (http://www.mediafire.com/?4vtdket2nuer36w)


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: jperezmonge en 21 Febrero 2012, 17:55 pm
Asi lo hago yo, a ver si te puede dar un enfoque distinto

Código
  1. jButtonEliminarUsuario.addActionListener(new java.awt.event.ActionListener() {
  2. public void actionPerformed(java.awt.event.ActionEvent e) {
  3.  
  4. ModeloJTableUsuario modelo = getModeloJTableUsuario();
  5.  
  6. int index = getJTableUsuario().getSelectedRow();
  7.  
  8. // Si se selecciona un elemento en la lista
  9. if (  index >= 0 ) {
  10. modelo.eliminarUsuario(index);
  11. }
  12. }
  13. });


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 21 Febrero 2012, 17:58 pm
jperezmonge, si no me equivoco, eso me borra sólo la fila del JTable, ¿no? Todo lo que estoy haciendo va contra una base de datos.


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: jperezmonge en 21 Febrero 2012, 18:05 pm
Ahhmmm, yo es que en el modelo del jTable cargo los datos de la base de datos a una colección y desde hay trabajo, lo siento te he ayudado hasta donde yo llego, si no te sirve de nada, lo siento.


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 21 Febrero 2012, 18:08 pm
Gracias, no te preocupes... de todas formas con lo que has dicho estoy pensando otra posibilidad que tal vez funcione... a ver que pasa  :silbar:


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: jperezmonge en 21 Febrero 2012, 18:11 pm
De esta forma no debería de lanzarte excepción ni estar pendiente de si en la siguiente vuelta esta apuntando a null o no.

prueba a recorrer la consulta de este modo.

Código
  1. dbResulSet = dbStatement.executeQuery("SELECT * from disfruta where usuarioDni = '" + dni2 + "'");
  2. //recorremos la consulta
  3. while(dbResulSet.next()){
  4. //obtengo el identificador
  5. String dni  = dbResulSet.getString(1);
  6. System.out.println(dni);
  7. //obtengo el descripcion
  8. int codigo = dbResulSet.getInt(2);
  9. try {
  10. myData.add(new Disfruta(dni, codigo));
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14.  
  15. }


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 24 Febrero 2012, 12:54 pm
No entiendo eso, ahora lo miro más despacio. Aún así, me ha dado por probar otra cosa y tampoco funciona, os pongo el código del evento del botón Eliminar:
Código
  1. if(jtblEmple.getSelectedRow() >= 0){
  2.            int id_emp=Integer.parseInt(String.valueOf(jtblEmple.getValueAt(jtblEmple.getSelectedRow(), 0)));
  3.            System.out.println("Borrando al emp. no: "+id_emp);
  4.            try{
  5.                System.out.println("entramos en el try");
  6.                stBorrar = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
  7.                System.out.println("Estatement creado");
  8.                rsBorrar = stBorrar.executeQuery("select * from emple where dept_no="+id_emp+";");
  9.                System.out.println("resultset creado");
  10.                rsBorrar.first();
  11.                System.out.println("Estoy en el primer registro");
  12.                rsBorrar.deleteRow();
  13.                System.out.println("borrado");
  14.                limpiaTabla();
  15.                rellenaTabla();
  16.            }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error borrando", JOptionPane.PLAIN_MESSAGE);}
  17.        }
  18.        else
  19.            JOptionPane.showConfirmDialog(null, "Debe seleccionar algún empleado a eliminar", "Error borrando", JOptionPane.PLAIN_MESSAGE);
  20.  

Cuando llega a la línea de rsBorrar.deleteRow(); es cuando casca, igual que antes, hasta ahí lo hace todo bien (lo sé por los println).



Estoy apunto de ingresar en un manicomio!


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 26 Febrero 2012, 20:34 pm
Este código puesto como evento llamado al hacer clic en la tabla funcionaba, lo he movido para que se ejecute al pulsar en el botón eliminar y ya no funciona....

¿Alguien sabe qué estoy pasando por alto? Gracias...

Código
  1.    private void jbtnEliminarMouseClicked(java.awt.event.MouseEvent evt) {
  2.        cargaEmpleados();
  3.        System.out.println("Entro en evento del botón:");
  4.        int fila=jtblEmple.getSelectedRow();
  5.        System.out.println("Fila seleccionada: "+fila);
  6.        if(fila >= 0){
  7.            System.out.println("entro en if");
  8.            try{
  9.                System.out.println("entro en el try");
  10.                for(int i=0; i<=fila; i++){
  11.                    System.out.println("entro en for");
  12.                    System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
  13.                    rsE.next();                    
  14.                }
  15.                System.out.println("Voy a borrar");
  16.                rsE.deleteRow();
  17.                System.out.println("He borrado.");
  18.            }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error de borrado", JOptionPane.PLAIN_MESSAGE);}
  19.            finally{
  20.                System.out.println("llego al finally");
  21.                limpiaTabla();
  22.                rellenaTabla();
  23.                System.out.println("salgo del finally");
  24.            }
  25.        }
  26.        else
  27.            JOptionPane.showConfirmDialog(null, "Seleccione un departamento para eliminarlo.", "Error de borrado", JOptionPane.PLAIN_MESSAGE);
  28.    }
  29.  


Título: Re: No encuentro error, intentando borrar de un resultset
Publicado por: |Miguel| en 27 Febrero 2012, 13:59 pm
Resuelto, estoy hecho un lumbreras.

Estaba haciendo mal el rsE, filtrando por un campo q no existe en esa tabla...