Alguien que me pueda ayudar con lo siguiente .CRUD con MVC y POO en Java y MySQL

Iniciado por padiuwu, 23 Abril 2019, 05:44 AM

0 Miembros y 1 Visitante están viendo este tema.

padiuwu

Estoy trabajando en proyecto de JAVA con MySQL con MVC, y me ha surgido el siguiente problema. Tengo dos botones para realizar la acción actualizar. Primero, presiono un registro de la tabla y de ahí el botón BUSCAR para que el id del registro aparezca en el formulario.

Después de esto, lleno todos los campos que quiero editar y, al presionar el botón EDITAR, me aparece el mensaje surgió un error al actualizar y otro error com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '13' for key 'PRIMARY'.
Código (java) [Seleccionar]
if (e.getSource() == this.forminventario.btnBuscar) {
        int filaEditar = this.forminventario.tbProducto.getSelectedRow();
        int numfilas = this.forminventario.tbProducto.getSelectedRowCount();

        if(filaEditar>=0 && numfilas==1){
            this.forminventario.txtId.setText(String.valueOf(this.forminventario.tbProducto.getValueAt(filaEditar, 0)));

            this.forminventario.btnBuscar.setEnabled(false);
            this.forminventario.btnEditar.setEnabled(true);
            this.forminventario.btnEliminar.setEnabled(false);
            this.forminventario.btnGuardar.setEnabled(false);
            this.forminventario.btnImprimir.setEnabled(false);
            this.forminventario.btnRefrescar.setEnabled(false);
            this.forminventario.btnRetirar.setEnabled(false);
        } else
            JOptionPane.showMessageDialog(null, "SELECCIONE UN REGISTRO");
    }

if (e.getSource() == forminventario.btnEditar) {
        try {
               int id = Integer.parseInt(this.forminventario.txtId.getText());
               String codigo = this.forminventario.txtCodigo.getText();
               String nombre = this.forminventario.txtNombre.getText();
               String descripcion = this.forminventario.txtDescripcion.getText();
               float precio = Float.parseFloat(this.forminventario.txtPrecio.getText());
               int stock = Integer.parseInt(this.forminventario.txtStock.getText());

               dbproducto.actualizar(producto);
               clean();
               JOptionPane.showMessageDialog(forminventario, "¡REGISTRO ACTUALIZADO!");

            //this.cargarTabla("");
            this.forminventario.btnBuscar.setEnabled(true);
            this.forminventario.btnEditar.setEnabled(false);
            this.forminventario.btnEliminar.setEnabled(true);
            this.forminventario.btnGuardar.setEnabled(true);
            this.forminventario.btnImprimir.setEnabled(true);
            this.forminventario.btnRefrescar.setEnabled(true);
            this.forminventario.btnRetirar.setEnabled(true);

        } catch (Exception ex) {
            Logger.getLogger(ControladorProducto.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

//Metodo actualizar
@Override
public void actualizar(Object objeto) throws Exception {
    ModeloProducto producto = (ModeloProducto) objeto;

    try {

        this.connect();

        String sql = "UPDATE productos SET idProducto = ?, nombre = ?, codigo = ?, descripcion = ?, precio = ?, stock = ?;";

        this.sqlConsulta = this.conexion.prepareStatement(sql);

        this.sqlConsulta.setInt(1, producto.getId());
        this.sqlConsulta.setString(2, producto.getNombre());
        this.sqlConsulta.setString(3, producto.getCodigo());
        this.sqlConsulta.setString(4, producto.getDescripcion());
        this.sqlConsulta.setFloat(5, producto.getPrecio());
        this.sqlConsulta.setInt(6, producto.getStock());
        //this.sqlConsulta.setInt(7, 1);

        // Executa consulta y Cerrar conexion
        this.sqlConsulta.executeUpdate();

    } catch (SQLException e) {
        System.err.println("SURGIO UN ERROR AL ACTUALIZAR");
    }

    this.desconectar();
}

CalgaryCorpus

Sugiero probar esto:
que en vez de hacer UPDATE y un monton de set, hagas set a todos los campos menos al campo id (que supongo es la unico campo que es la llave primaria de esa tabla), y que ese campo id sea parte de la condicion where, que no incluyes, asi que sugiero incluirla.

UPDATE SET campo1 = ?, campo2 = ?, ...
WHERE id = ?
Aqui mi perfil en LinkedIn, invitame un cafe aqui

padiuwu

He realizado lo que me sugeriste y ya no me marca un error y me dice que el registro se ha realizado correctamente pero no se actualiza.
Código (java) [Seleccionar]
//Metodo actualizar
    @Override
    public void actualizar(Object objeto) throws Exception {
        ModeloProducto producto = (ModeloProducto) objeto;
       
        try {

            this.connect();

            String sql = "UPDATE productos SET nombre = ?, codigo = ?, descripcion = ?, precio = ?, stock = ? WHERE idProducto = ?;";

            this.sqlConsulta = this.conexion.prepareStatement(sql);

            //this.sqlConsulta.setInt(1, producto.getId());
            this.sqlConsulta.setString(1, producto.getNombre());
            this.sqlConsulta.setString(2, producto.getCodigo());
            this.sqlConsulta.setString(3, producto.getDescripcion());
            this.sqlConsulta.setFloat(4, producto.getPrecio());
            this.sqlConsulta.setInt(5, producto.getStock());
            this.sqlConsulta.setInt(6, producto.getId());

            // Executa consulta y Cerrar conexion
            this.sqlConsulta.executeUpdate();
            this.sqlConsulta.close();

        } catch (SQLException e) {
            System.err.println("SURGIO UN ERROR AL ACTUALIZAR");
            e.printStackTrace();
        }

        this.desconectar();
       
    }

CalgaryCorpus

Como haces para saber que no se actualiza?
tal vez es que te falta cerrar la conexion (no el preparedStatement, solamente sino tambien la conexion)?

(Sugiero elimina los "this." de cada linea donde aparecen. Son superfluos alli)
Aqui mi perfil en LinkedIn, invitame un cafe aqui