Ver Mensaje Individual
  #5  
Antiguo 04-11-2013
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Reputación: 14
pacopenin Va por buen camino
Si no haces nada, cada operación con cada tabla o query lleva su propia transacción.
Para operaciones que afecten a varias tablas o varios registros debes iniciar tu las transacciones y darles commit o rollback según corresponda. Te adjunto un trozo de código :

Código Delphi [-]
procedure duplicaTarifa(origen, destino: integer; Tipo: String);
var
  QryO, QryD: TZQuery;
  s : String;
begin
  s := '';
  QryO := TZQuery.Create(nil);
  QryD := TZQuery.Create(nil);

  Dat.ZConn.StartTransaction;

  try
    QryO.Connection := Dat.ZConn;
    QryD.Connection := Dat.ZConn;
    QryO.SQL.Text := 'SELECT * FROM TARIFAS WHERE ID_CLIENTE = ' + IntToStr(origen) +
                     ' AND INOUT = ' + QuotedStr(Tipo) + 'ORDER BY TRAMO';
    QryO.open;
    if buscaTarifaCliente(destino, tipo) then
     if Confirm('Borrar tarifa existente?') then
      begin
        QryD.SQL.Text := 'DELETE FROM TARIFAS WHERE ID_CLIENTE = ' + IntToStr(destino) +
                         ' AND INOUT = ' + QuotedStr(Tipo);
        QryD.ExecSQL;
      end;
    while not QryO.Eof do
     begin
       nuevaLineaTarifa;
       Dat.ZTarifasID_CLIENTE.Value := destino;
       Dat.ZTarifasTRAMO.asInteger := QryO.FieldByName('TRAMO').asInteger;
       Dat.ZTarifasTIPO.asString := QryO.FieldByName('TIPO').asString;
       Dat.ZTarifasINOUT.Value := Tipo;
       Dat.ZTarifasPrecio1.asFloat := QryO.FieldByName('Precio1').asFloat;
       Dat.ZTarifasPrecio2.asFloat := QryO.FieldByName('Precio2').asFloat;
       Dat.ZTarifasPrecio3.asFloat := QryO.FieldByName('Precio3').asFloat;
       Dat.ZTarifasPrecio4.asFloat := QryO.FieldByName('Precio4').asFloat;
       Dat.ZTarifasPrecio5.asFloat := QryO.FieldByName('Precio5').asFloat;
       Dat.ZTarifasPrecio6.asFloat := QryO.FieldByName('Precio6').asFloat;
       Dat.ZTarifasPrecio7.asFloat := QryO.FieldByName('Precio7').asFloat;
       Dat.ZTarifasPrecio8.asFloat := QryO.FieldByName('Precio8').asFloat;
       Dat.ZTarifasPrecio9.asFloat := QryO.FieldByName('Precio9').asFloat;
       Dat.ZTarifas.Post;
       QryO.Next;
     end;
    try
     Dat.ZConn.Commit;
    except
     on e : exception do
      begin
        mensaje('Se produjo un error al copiar tarifa : ' + E.Message);
        Dat.ZConn.Rollback;
      end;
    end;
  finally
    QryO.close;
    QryO.Free;
    QryD.close;
    QryD.Free;
  end;
end;
__________________
http://www.gestionportable.com
Responder Con Cita