Cita:
Iniciado por Profesor_Falken
Buenas,
No tienes porque crear un procedimiento almacenado (y escribir logica aplicativa en la base de datos). Te bastaria con ejecutar las distintas consultas en una transaccion. De esta forma si se falla en alguno punto se hace rollback y los cambios realizados se deshacen. Si todo va bien se hace un commit para persistir los cambios.
https://docs.oracle.com/javase/tutor...nsactions.html
El tutorial que sigues parece correcto. Puedes reutilizarlo casi todo.
La logica quedaria
en pseudocodigo Java como:
Código Java:
Ver originalcon.setAutoCommit(false);
try {
performQuery1(con);
performQuery2(con);
performQuery3(con);
con.commit();
jOptionPane -> "Proceso correcto";
con.rollback();
jOptionPane -> "Ha ocurrido un error";
}
Un saludo
Muchísimas gracias por tu ayuda, la información que me proporcionaste me fue muy útil. Después de investigar un poquito más en el siguiente
enlace para poder adecuar el UPDATE y en este
otro enlace para entender un poco más acerca de las transacciones, mi función en código java quedo así:
Código:
public void tableHacerUnAhorro(String idDeposito, LocalDate fecha, double monto, String idCaja){
//obtenemos la conexión a la base de datos
Connection conexionEstablecida=conexionMysql();
PreparedStatement altaAhorro=null;
PreparedStatement actualizarCaja=null;
try {
//se deshabilita el modo de confirmación automática
conexionEstablecida.setAutoCommit(false);
//se preparan las sentencias mysql a ejecutar
altaAhorro=conexionEstablecida.prepareStatement("INSERT INTO deposito VALUES(?,?,?,?);");
actualizarCaja=conexionEstablecida.prepareStatement("UPDATE caja SET saldo_total=saldo_total+? WHERE id_caja=?");
altaAhorro.setString(1,idDeposito);
//para poder almacenarlo en la bd se tiene que convertir de LocalDate a Date
altaAhorro.setDate(2,Date.valueOf(fecha));
altaAhorro.setDouble(3, monto);
altaAhorro.setString(4, idCaja);
altaAhorro.executeUpdate();
actualizarCaja.setDouble(1,monto);
actualizarCaja.setString(2, idCaja);
actualizarCaja.executeUpdate();
//se indica que se deben aplicar los cambios en la base de datos
conexionEstablecida.commit();
conexionEstablecida.close();
JOptionPane.showMessageDialog(null, "Datos almacenados de forma exitosa");
}
catch(SQLException ex) {
try{
//deshace todos los cambios realizados en los datos
conexionEstablecida.rollback();
}
catch (SQLException ex1) {
//solo para proposito de testeo
//permite mostrar los errores de forma más detallada en el IDE
Logger.getLogger(TableDeposito.class.getName()).log(Level.SEVERE, null, ex1);
}
//solo para proposito de testeo
//permite mostrar los errores de forma más detallada en el IDE
//Logger.getLogger(TableCaja.class.getName()).log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(null, "No se ingreso el ahorro\n"+ex.getMessage(),"Error al ingresar el Ahorro",JOptionPane.ERROR_MESSAGE);
}
}
Aun me faltan acomodar y corregir otras cosillas de mi programa pero con esto ya pude resolver esta parte.
Aparte en este
otro enlace encontré como sumarle el monto a un campo double en el UPDATE si tener que obtener previamente dicho valor para poder usarlo.