Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
6
respuestas

El update no es confiable

Buenas tardes, como estan? Estoy batallando con el campo modificar. El codigo funciona; pero por alguna razon, solo modifica y mantiene las modificacione sbajo cietras condiciones; por ejemplo: si s emodifican los 3 campos de un mismo registro, el update impacta. Pero si modificamos solo la cantidad, esa mdoficacion desparece al hacer una nueva modificacion en otro campo. A que puede deberse este comportamiento??

adjunto codigo; desde ya muchas gracias

 private void modificar() {
        if (tieneFilaElegida()) {
            JOptionPane.showMessageDialog(this, "Por favor, elije un item");
            return;
        }

        Optional.ofNullable(modelo.getValueAt(tabla.getSelectedRow(), tabla.getSelectedColumn()))
                .ifPresentOrElse(fila -> {
                    Integer id = Integer.valueOf(modelo.getValueAt(tabla.getSelectedRow(), 0).toString());
                    String nombre = (String) modelo.getValueAt(tabla.getSelectedRow(), 1);
                    String descripcion = (String) modelo.getValueAt(tabla.getSelectedRow(), 2);
                    Integer cantidad = Integer.valueOf(modelo.getValueAt(tabla.getSelectedRow(), 3).toString());

                    int filasModificadas;
                    try {
                         filasModificadas = this.productoController.modificar(nombre, descripcion, cantidad, id);
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block

                        throw new RuntimeException(e);
                    }
                    JOptionPane.showMessageDialog(this, String.format("%d item modificado con éxito!", filasModificadas));
                }, () -> JOptionPane.showMessageDialog(this, "Por favor, elije un item"));
    }


    public class ProductoController {

    public int modificar(String nombre, String descripcion,Integer cantidad, Integer id) throws SQLException {

        Connection con = new ConnectionFactory().recuperaConexion();
        Statement statement = con.createStatement();

        statement.execute("UPDATE PRODUCTO SET " 
                + " NOMBRE = '" + nombre + "'"  
                + ", DESCRIPCION = '"+ descripcion + "'" 
                + ", CANTIDAD = " + cantidad 
                + " WHERE ID = "+ id);




         int updateCount = statement.getUpdateCount();  // metodo para saber si algo fue realmente cambiado

         con.close();
         System.out.println(updateCount);

         return updateCount;


    }
6 respuestas

Hola! a m me funcionó cambiando la sintaxis de la query SQL.Especificamente , La cuarta linea:

  • ", CANTIDAD = ' " + cantidad + " ' "

Tambien es importante darle ok al promp ("la ventana con el mensaje de éxito cuando haces click en el boton modificar)

Saludos

Gracias adrian, probe eo; aunque no hace sentido, ya que despues convertimos el valor d ecantidad a sting con el valueOf. El prompt le doy ok siempre, asi y todo no me esta guardando en todas las mdificaciones

Hola Juan, a mi me pasaba lo mismo, pero después me di cuenta que hacia click en modificar con el campo en modo de edición o sea sin terminar de editar, luego probe editar, apretar enter y recién el boton modificar y ahi recién me funcionó, creo que ese debe ser tu problema

Hola Luciano, esta buena la alternativa. La probe, pero no me funciona. Ya revise el codigo un monton de veces. Voy a seguir avanzando con el curso y despues volveré a esto, quizas ahi encuentro la solucion.

Gracias por la ayuda

Hola, qué tal, tuve un problemas también, me equivoqué en varias cosas, y veo que te faltó algo que a mí también, a tu código sql le falta ser cerrado con un punto y coma, el cual deberá estar entre comillas para que se reconozca como parte del argumento para sql quedando así:

";"

es decir:

statement.execute("UPDATE PRODUCTO SET NOMBRE = '" + nombre + "', DESCRIPCION = '" + descripcion + "' , CANTIDAD = " + cantidad

            + " WHERE ID = " + id + " ;");

Importante, una vez que modifiques y antes de hacer clik en el botón modificar, haz clic en algún otro espacio vacío para que concluya la edición, evitando que el campo esté seleccionado mientras ejecutas el comando del btón. Saludos de México.

según lo que pude leer para que no se tenga errores de sintaxis de la Query de MySQL lo mejor es utilizar consultas parametrizadas o preparadas. Con este tipo de método me funciono.

public int modificar(Integer id, String nombre, String descripcion, Integer cantidad) throws SQLException {
    Connection con = new ConnectionFactory().recuperaConexion();
    PreparedStatement stmt = con.prepareStatement("UPDATE PRODUCTO SET NOMBRE = ?, DESCRIPCION = ?, CANTIDAD = ? WHERE ID = ?");
    stmt.setString(1, nombre);
    stmt.setString(2, descripcion);
    stmt.setInt(3, cantidad);
    stmt.setInt(4, id);
    int updateCount = stmt.executeUpdate();
    con.close();
    return updateCount;
}    

Lo estudias y analizas para ver como es que te funciona. Saludos