Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-11-2004
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.070
Poder: 32
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por rochi
Es decir, antes de hacer un Post, si decido cancelar datos, no tiene sentido hacer RollBack. No veo otros casos....quizás por mi inexperiencia.
Como yo entiendo esto que haz dicho es cierto, pero
te puedo poner un ejemplo de como usar las transacciones(ya que no encuentro la forma de explicar en un ejemplo el Rollback sin poner el StartTransaction o incluso el Commit) desde un punto de vista:

Imaginate que necesitas hacer una aplicacion en la que tienes que guardar una tabla maestra(DOC) y una tabla detalle(DOCDET) (estas relacionadas al "Documento" que el usuario esta digitando) y que ademas deba llenar otras dos tablas(CONTA y CONTADET) que estan relacionadas tambien al mismo "Documento" pero en las cuales guardaras información contable....

En dichas tablas deben haber llaves foraneas(Recuerden que es un ejemplo), indicando por ejemplo que el codigo de IVA que se guardara en la tabla CONTADET debe existir en la tabla llamada IVA.

Nota: Podemos extender un poco mas el ejemplo utiizando Tquery's para guardar los registros en las tablas pero temo que esto se puede poner algo Tedioso haciendolo de esa manera, asi que solo usaremos el DataSet.POST simulando que hemos trabajado con un TTable.

Entonces, supongamos que en el Boton Guardar(btGuardar) ponemos el siguiente codigo.

Código Delphi [-]
procedure TForm1.btnGuardarClick(sender :TObject);
begin
   tblDOC.Post;
   tblDOCDET.Post;
   tblCONTA.Post;
   tblCONTADET.Post;
end;

en teoria, eso guardaria correctamente los registros en dichas tablas, pero ¿que sucede si el codigo de IVA que tiene que guardar en la tabla CONTA no existe en la tabla llamada IVA?

R//.
  1. Pues se guardaran solo los registros de la tabla DOC y DOCDET y los de las tablas CONTA y CONTADET no.
  2. Debido a esto se "Desincronizara" la información que se debe mostrar en posiblemente futuros reportes.
  3. Mostraria un horrible error de INTEG_### que asustaria a cualquiera (De hecho deberia hacerlo).
El tercer problema tiene una solución muy sencilla, podriamos poner por ejemplo:

Código Delphi [-]
procedure TForm1.btnGuardarClick(sender :TObject);
begin
   try
     tblDOC.Post;
     tblDOCDET.Post;
     tblCONTA.Post;
     tblCONTADET.Post;
   except
 
   end;
end;

Y listo, no mostraria el temido error, pero ¿ese en realidad es el verdadero problema?

R//. No, el problema real es que debemos cuidar la integridad de nuestra aplicación y garantizar de que se guardaron correctamente los datos o no.

Para eso podriamos utilizar un "Bloque protegido con transacciones", podria ser algo como esto:

Código Delphi [-]
procedure TForm1.btnGuardarClick(sender :TObject);
begin
   //Donde DB puede ser un componente como un TDataBase
 
   DB.StartTransaction;//Comienza una transacción
   try
     tblDOC.Post;
     tblDOCDET.Post;
     tblCONTA.Post;
     tblCONTADET.Post;
     DB.Commit;//Si todo sale bien...
   except
     DB.RollBack;//Si algo sale mal, no guarde nada en la base de datos.
     raise;//De esta manera mostraria el horrible error ocurrido (De hecho es 
    //necesario que lo muestre). Nota: con un poco mas de investigación 
    //y de ingenio se puede poner mas bonito y 
    //entendible para el usuario final.
   end;
end;

De esta manera podemos garantizar que todos o ninguno de los datos seran guardados.

Espero me haga entender y que ademas te sirva de algo.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 20-11-2004 a las 20:01:34.
Responder Con Cita
  #2  
Antiguo 20-11-2004
rochi rochi is offline
Miembro
 
Registrado: nov 2004
Ubicación: mvd, uruguay
Posts: 57
Poder: 22
rochi Va por buen camino
Clarito, fue un buen ejemplo. Gracias.
Saludos rochi
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 12:07:43.


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