Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
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 12-08-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Falta iniciar una transacción y acabarla.

El componente TDatabase tiene un procedimiento "StartTransaction" que sirve para iniciar la transacción. Cuando acabes de hacer todas las operaciones que consideres oportunas, para acpetar los cambios se usa el procedimiento del mismo componente "Commit", si quieres cancelar los cambios, "Rollback", es decir:

Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // copia una factura a la otra
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin     
         Close;     
         SQL.Clear;
         SQL.Add('INSERT INTO detfacturafinal');
         SQL.Add('SELECT * FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except      
      DataBase1.Rollback;
   end;
end;

procedure TForm14.SpeedButton3Click(Sender: TObject);//limpia la tabla detfactura
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin
         Close;
         SQL.Clear;
         SQL.Add('DELETE FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except      
      DataBase1.Rollback;
   end;
end;
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #2  
Antiguo 12-08-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 16
DOS Va por buen camino
Ok pero debo poner el rollback en un boton, como un cancel, seria algo asi.
Botón cancel
Código Delphi [-]
   begin
DataBase1.Rollback;
   end;
No se si esta bien esto, nunca use este comando, agradezco tu ayuda.
Responder Con Cita
  #3  
Antiguo 12-08-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Tal y como tú tenías pensado el proceso no creo que haga falta un botón nuevo, yo lo haría como te he puesto. El propio proceso, si es correcto hace commit y si ocurre algún error, rollback.

Tal y como lo he puesto se come el mensaje de error, te lo muestro completo:
Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // copia una factura a la otra
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin     
         Close;     
         SQL.Clear;
         SQL.Add('INSERT INTO detfacturafinal');
         SQL.Add('SELECT * FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except            
      on E:Exception do begin
         DataBase1.Rollback;         
         MessageDlg('Error:' + E.Message, mtError, [mbOK], 0);
      end;
   end;
end;

procedure TForm14.SpeedButton3Click(Sender: TObject);//limpia la tabla detfactura
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin
         Close;
         SQL.Clear;
         SQL.Add('DELETE FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except      
      on E:Exception do begin
         DataBase1.Rollback;         
         MessageDlg('Error:' + E.Message, mtError, [mbOK], 0);
      end;
   end;
end;

Saludos
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #4  
Antiguo 13-08-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 16
DOS Va por buen camino
me tira el siguiente error [Error] Unit14.pas(326): Undeclared identifier: 'Database1'
[Error] Unit14.pas(336): Missing operator or semicolon
Responder Con Cita
  #5  
Antiguo 13-08-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
Le he llamado Database1 como ejemplo, mira a ver como se llama tu componente TDatabase. Tiene que ser el mismo TDatabase al que estén asociados los querys.
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #6  
Antiguo 14-08-2013
DOS DOS is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 173
Poder: 16
DOS Va por buen camino
ozsWizzard, se que me has ayudado muchisimo y te topaste con un inexperto mal, te pido un ultimo esfuerzo con tu ayuda los querys los tengo relacionados co TDataSource y si reemplazo TDataBase por los TDataSource correspondientes no funciona, ¿el DB es otro componente?
jejeje lo acabo de encontrar esta en BDE, voy a buscar sobre este componente(odio todo lo que no me enseñaron) y a ver si puedo hacer algo, nuevamente agradesco tu ayuda.
Responder Con Cita
  #7  
Antiguo 14-08-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 23
ozsWizzard Va por buen camino
La asociación con TDatasource es al margen de la base de datos. El problema es que en la propiedad "DatabasName" no tendrás un TDatabase, sino la base de datos directamente (hablo a ciegas, nunca he tratado los Querys sin TDatabase)

Y la verdad, no sé como forzar el commit. Sólo se me ocurre que ejecutes commit por medio de sentencia SQL, que no sé si funcionará

Código Delphi [-]
procedure TForm14.HazCommit;
begin
   with Query1 do
   begin     
      Close;     
      SQL.Clear;
      SQL.Add('COMMIT');
      ExecSQL;
   end;
end;

procedure TForm14.HazRollBack;
begin
   with Query1 do
   begin     
      Close;     
      SQL.Clear;
      SQL.Add('ROLLBACK');
      ExecSQL;
   end;
end;

procedure TForm14.BitBtn1Click(Sender: TObject);  
begin
   try
      with Query1 do
      begin     
         Close;     
         SQL.Clear;
         SQL.Add('INSERT INTO detfacturafinal');
         SQL.Add('SELECT * FROM detfactura');
         ExecSQL;
      end;
      HazCommit;
   except            
      on E:Exception do begin
         HazRollback;         
         MessageDlg('Error:' + E.Message, mtError, [mbOK], 0);
      end;
   end;
end;
//Y lo mismo para el otro procedimiento
__________________
La Madurez se llama...
~~~Gaia~~~
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Copiar registro de una Tabla a otra Tabla, sin repetirse MaMu Conexión con bases de datos 22 11-04-2013 15:29:11
Mysql: copiar los campos de una tabla de una base de datos a otra tabla de otra base? patriram MySQL 4 02-11-2007 16:00:24
copiar datos de una tabla en otra fedelphi Firebird e Interbase 6 24-08-2007 03:59:36
Copiar un registro de una tabla en otra... JuanErasmo SQL 6 10-07-2007 23:08:15
Copiar Tabla de una BD a Otra BD en Firebird pcicom SQL 3 14-02-2005 16:31:15


La franja horaria es GMT +2. Ahora son las 00:30:57.


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