Test Foro de elhacker.net SMF 2.1

Programación => Programación General => 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 (java) [Seleccionar]

private void jtblEmpleMouseClicked(java.awt.event.MouseEvent evt) {
       System.out.println("Entro en evento");
       int fila=jtblEmple.getSelectedRow();
       System.out.println("Fila seleccionada: "+fila);
       if(fila >= 0){
           System.out.println("entro en if");
           try{
               System.out.println("entro en el try");
               for(int i=0; i<fila+1; i++){
                   System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
                   rsE.next();                    
               }
               System.out.println("Voy a borrar");
               //rsE.deleteRow(); línea comentada para no borrar registros en pruebas y quedarme con 0 empleados... xD
               //(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').
               System.out.println("He borrado.");
           }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error de borrado", JOptionPane.PLAIN_MESSAGE);}
           finally{
               System.out.println("llego al finally");
               limpiaTabla();
               rellenaTabla();
               System.out.println("salgo del finally");
           }
       }
       else
           JOptionPane.showConfirmDialog(null, "Seleccione un departamento para eliminarlo.", "Error de borrado", JOptionPane.PLAIN_MESSAGE);
   }


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 (java) [Seleccionar]
for(int i=0; i<fila+1; i++){
                    System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
                    rsE.next();                   
                }
                System.out.println("Voy a borrar");
                //rsE.deleteRow(); línea comentada para no borrar registros en pruebas y quedarme con 0 empleados... xD
                //(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').
                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 (java) [Seleccionar]

static void cargaEmpleados(){
        try{
            int id_dep = rsD.getInt("dept_no");
            seleccionaEmple(id_dep);
            rsE.first();
        }catch(Exception e){System.out.println("Error capturando depto para la tabla --> "+e);}
       
    }


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 (java) [Seleccionar]

System.out.println("entro en el try");
for(int i=0; i<=fila; i++){
            System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);

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 (java) [Seleccionar]
jButtonEliminarUsuario.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {

ModeloJTableUsuario modelo = getModeloJTableUsuario();

int index = getJTableUsuario().getSelectedRow();

// Si se selecciona un elemento en la lista
if (  index >= 0 ) {
modelo.eliminarUsuario(index);
}
}
});
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 (java) [Seleccionar]
dbResulSet = dbStatement.executeQuery("SELECT * from disfruta where usuarioDni = '" + dni2 + "'");
//recorremos la consulta
while(dbResulSet.next()){
//obtengo el identificador
String dni  = dbResulSet.getString(1);
System.out.println(dni);
//obtengo el descripcion
int codigo = dbResulSet.getInt(2);
try {
myData.add(new Disfruta(dni, codigo));
} catch (Exception e) {
e.printStackTrace();
}

}
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 (java) [Seleccionar]

if(jtblEmple.getSelectedRow() >= 0){
            int id_emp=Integer.parseInt(String.valueOf(jtblEmple.getValueAt(jtblEmple.getSelectedRow(), 0)));
            System.out.println("Borrando al emp. no: "+id_emp);
            try{
                System.out.println("entramos en el try");
                stBorrar = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
                System.out.println("Estatement creado");
                rsBorrar = stBorrar.executeQuery("select * from emple where dept_no="+id_emp+";");
                System.out.println("resultset creado");
                rsBorrar.first();
                System.out.println("Estoy en el primer registro");
                rsBorrar.deleteRow();
                System.out.println("borrado");
                limpiaTabla();
                rellenaTabla();
            }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error borrando", JOptionPane.PLAIN_MESSAGE);}
        }
        else
            JOptionPane.showConfirmDialog(null, "Debe seleccionar algún empleado a eliminar", "Error borrando", JOptionPane.PLAIN_MESSAGE);


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 (java) [Seleccionar]

    private void jbtnEliminarMouseClicked(java.awt.event.MouseEvent evt) {
        cargaEmpleados();
        System.out.println("Entro en evento del botón:");
        int fila=jtblEmple.getSelectedRow();
        System.out.println("Fila seleccionada: "+fila);
        if(fila >= 0){
            System.out.println("entro en if");
            try{
                System.out.println("entro en el try");
                for(int i=0; i<=fila; i++){
                    System.out.println("entro en for");
                    System.out.println("Empleado: '"+rsE.getString("APELLIDO")+"'. Vuelta número: "+i);
                    rsE.next();                   
                }
                System.out.println("Voy a borrar");
                rsE.deleteRow();
                System.out.println("He borrado.");
            }catch(Exception e){JOptionPane.showConfirmDialog(null, e, "Error de borrado", JOptionPane.PLAIN_MESSAGE);}
            finally{
                System.out.println("llego al finally");
                limpiaTabla();
                rellenaTabla();
                System.out.println("salgo del finally");
            }
        }
        else
            JOptionPane.showConfirmDialog(null, "Seleccione un departamento para eliminarlo.", "Error de borrado", JOptionPane.PLAIN_MESSAGE);
    }
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...