Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-12-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Deshacer accion realizada por un ADOCOmmand

Hola a todos, uso C++Builder y me encuentro en la fase de depuración de un programita que estoy haciendo.

El caso es que se me ha ocurrido que puede darse el caso de que el usuario se equivoque a la hora de seleccionar una opcion y desee deshacer el ultimo cambio hecho. El caso es que depende de la opcion seleccionada el ADOCommand que utilizo realiza unas acciones u otras.

De momento se me ha ocurrido sacar una ventana de notificación de los cambios para que el usuario acepte.

Pero.... sabeis si existe la posibilidad de deshacer los ultimos cambios realizados por el ADOCommand? (Teniendo en cuenta que el componente sigue teniendo la propiedad CommandText intacta aún)


Muchas gracias y un saludo!
Responder Con Cita
  #2  
Antiguo 17-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola mizzard.

Mi conocimiento de los componentes ADO es muy pobre, pero... ¿ Has probado con el método RollbackTrans del TADOConnection ?

Según la ayuda de Builder:
Cita:
Description
Call RollbackTrans to cancel any changes made during the current transaction and to end the transaction.
...
Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 19-12-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Hola, hasta donde tengo entendido eso es para poder realizar varios cambios con ADOCommand como si fuera uno único y si alguno de ellos da error, se cancelan todos. Para ello se sigue la siguiente estructura:

Código:
frmPrincipal->DBConnectionTiMesDB->BeginTrans();
     try{
		strSQL = "UPDATE Digitalizado SET FechaOut = " +  fecha  + ", HoraOut= " + hora + " WHERE Id= " + frmPrincipal->DBtxtContador->Caption;
		frmPrincipal->cmdTiMes->CommandText = strSQL;
		frmPrincipal->cmdTiMes->Execute();

		// Restamos las fechas para calcular el tiempo de proceso
		resultadoProceso = restarFechas();

		// Metemos el resultado en la base de datos
		strSQL = "UPDATE Digitalizado SET TiempoTotal = " +  resultadoProceso + " WHERE Id= " + frmPrincipal->DBtxtContador->Caption;
		frmPrincipal->cmdTiMes->CommandText = strSQL;
		frmPrincipal->cmdTiMes->Execute();
		frmPrincipal->DBConnectionTiMesDB->CommitTrans();
		}
		catch(...){
                    	frmPrincipal->DBConnectionTiMesDB->RollbackTrans();
		}
Yo lo que quisiera es mediante un boton cancelar la operación realizada (y se supone que exitosa).

Otra duda que me surge es como probar si el rollbackTrans que he implementado funciona o no. He probado a provocar un error en el segundo command (cambiando un TiempoTotal por TiemoTotal) y me salta un error en access pero no salta el catch ni se activa el rollback.

Ideas??

Muchas gracias y un abrazo!
Responder Con Cita
  #4  
Antiguo 19-12-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Cita:
Empezado por mizzard Ver Mensaje
Hola, hasta donde tengo entendido eso es para poder realizar varios cambios con ADOCommand como si fuera uno único y si alguno de ellos da error, se cancelan todos. Para ello se sigue la siguiente estructura:

Código:
frmPrincipal->DBConnectionTiMesDB->BeginTrans();
     try{
		strSQL = "UPDATE Digitalizado SET FechaOut = " +  fecha  + ", HoraOut= " + hora + " WHERE Id= " + frmPrincipal->DBtxtContador->Caption;
		frmPrincipal->cmdTiMes->CommandText = strSQL;
		frmPrincipal->cmdTiMes->Execute();

		// Restamos las fechas para calcular el tiempo de proceso
		resultadoProceso = restarFechas();

		// Metemos el resultado en la base de datos
		strSQL = "UPDATE Digitalizado SET TiempoTotal = " +  resultadoProceso + " WHERE Id= " + frmPrincipal->DBtxtContador->Caption;
		frmPrincipal->cmdTiMes->CommandText = strSQL;
		frmPrincipal->cmdTiMes->Execute();
		frmPrincipal->DBConnectionTiMesDB->CommitTrans();
		}
		catch(...){
                    	frmPrincipal->DBConnectionTiMesDB->RollbackTrans();
		}
Yo lo que quisiera es mediante un boton cancelar la operación realizada (y se supone que exitosa).

Otra duda que me surge es como probar si el rollbackTrans que he implementado funciona o no. He probado a provocar un error en el segundo command (cambiando un TiempoTotal por TiemoTotal) y me salta un error en access pero no salta el catch ni se activa el rollback.

Ideas??

Muchas gracias y un abrazo!
Si que funciona el rollback en este código, que al probarlo en modo debug no se ve, pero cuando se prueba el ejecutable si que funciona.

Lo que no consigo es deshacer el último cambio por boton de deshacer...
Responder Con Cita
  #5  
Antiguo 19-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Lo que no consigo es deshacer el último cambio por boton de deshacer...
Hola mizzard.

No entiendo bién eso último, ¿ es decir que no te funciona si haces ?
Código:
void __fastcall TForm1::btnDeshacerClick(TObject *Sender)
{
  frmPrincipal->DBConnectionTiMesDB->RollbackTrans();
}
Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 19-12-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola mizzard.

No entiendo bién eso último, ¿ es decir que no te funciona si haces ?
Código:
void __fastcall TForm1::btnDeshacerClick(TObject *Sender)
{
  frmPrincipal->DBConnectionTiMesDB->RollbackTrans();
}
Un saludo.

Hola, el caso es q haciendo pruebas intenté eso mismo y no funcionaba y debugeando código llegue a la siguiente conclusion:

Basandonos en el trozo q he puesto con try y catch si se produce algun error (no llega a ejecutarse el CommitTrans) por lo que el RollbackTrans sí que funciona. Si todo se efectua correctamente (se ejecuta todo el codigo del try incluyendo el commitTrans -> que es cuando se llevan a cabo todas las modificaciones en la base de datos) si luego intentas ejecutar el RollbackTrans, el compilador da error de que no existe ninguna transaccion abierta (Ya que se ha validado todo con el CommitTrans).

Mmm, no se si me he explicado del todo bien, pero básicamente en el momento que se ejecuta el CommitTrans y se actualiza todo no consigo ver la forma de deshacer los cambios.


Un saludo!
Responder Con Cita
  #7  
Antiguo 19-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Si ahora entendí. Y es totalmente lógico, ya que CommitTrans almacena todos los cambios y finaliza la transacción actual.

Creo que para lograr el efecto que buscas deberías comenzar la transacción, permitir todos los cambios que desee el usuario y dejarle la opción de cancelar (RollBackTrans) o aceptar (CommitTrans) por el medio que consideres adecuado; botones, cuadro de diálogo, etc.


Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 08-01-2012
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 14
mizzard Va por buen camino
, lo mismo que habia pensado.

Muchas gracias, un abrazo!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ultima accion realizada en una BD access principiante22 Conexión con bases de datos 3 24-10-2008 15:55:31
ADOCommand con parámetros que no los toma saldanaluis Tablas planas 11 12-09-2007 17:05:33
ADOCommand carols018 SQL 1 06-12-2006 19:59:25
AdoCommand Asincrono... Xianto Conexión con bases de datos 2 31-05-2005 19:28:58
Parametros del ADOCommand murrai Conexión con bases de datos 4 13-03-2005 18:26:34


La franja horaria es GMT +2. Ahora son las 10:40:05.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi