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;