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:
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.
Buenas.
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.
Hola Bulld0z3r, gracias por contestar.
rsE se carga con el constructor del JFrame donde estoy trabajando mediante el siguiente método:
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.
Buenas.
La condición del for debería ser i<=fila
Saludos.
Sigue sin funcionar.
En este fragmento:
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)
Asi lo hago yo, a ver si te puede dar un enfoque distinto
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);
}
}
});
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.
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.
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:
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.
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();
}
}
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:
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!
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...
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);
}
Resuelto, estoy hecho un lumbreras.
Estaba haciendo mal el rsE, filtrando por un campo q no existe en esa tabla...