Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Equivalencia de conexión Delphi - Lazarus. (https://www.clubdelphi.com/foros/showthread.php?t=84560)

hoyosfelix 04-11-2013 15:32:44

Equivalencia de conexión Delphi - Lazarus.
 
Buen día a todos, quiero realizar la siguiente consulta:

En Delphi tenemos este esquema de conexión a la base de datos...

1º En un DataModule el componente de Interbase TIBDatabase para la conexión a la base de datos.

2º En el formulario de ABM el componente TIBTransaction con TIBQuery, TIBUpdateSQL ambos de Interbase.

3º También, en el formulario usamos el TDataSource del DataAccess para nuestras inserciones, borrados y actualizaciones.

4º Para cualquier inserción nos valemos del TIBTransaction.

En Lazarus tengo instalado el paquete de Zeos Access con la siguiente equivalencia:

TIBDatabase -> TZConnection
TIBQuery -> TZQuery
TIBUpdateSQL -> TZUpdateSQL

pero quedo con la duda con TIBTransaction...Cuál sería su equivalente en Lazarus?

O las transacciones se realizan directamente en TZConnection?

Saludos cordiales.

Ñuño Martínez 04-11-2013 17:15:41

Lo que preguntas no es una equivalencia de conexión Delphi - Lazarus sino Delphi - Zeos Access. Por lo que sé, Zeos también funciona en Delphi. Lo digo porque el título llama a engaño.

Respecto a tu pregunta concreta, nunca he usado Zeos así que no puedo responderte.

pacopenin 04-11-2013 17:28:24

Los componentes Zeos funcionan como lo hacían los equivalente componentes nativos BDE de Delphi. No existe ningún equivalente al componente específico de transacciones, sino que el propio TZConnection controla las transacciones.

hoyosfelix 04-11-2013 18:10:24

Gracias a los que han respondido al respecto.

Disculpas por el título no tan descriptivo, el comparativo es realmente con el Interbase y Zeos Access. Pregunté aquí porque lo quiero aplicar en Lazarus.

Supongamos que tenga en un DataModulo un único componente TZConnection con AutoCommit = False y en otras ventanas las Querys que apuntan a la misma conexión.

Si abro la Query1 (para insertar o modificar) y la dejo abierta y luego abro la Query2 y hago un commit a la Query2; esta ya me realiza el commit para la Query1 y 2.

En Delphi tenemos el Transaction para cada Query.

Cómo sería el manejo de transacciones con Zeos?

Saludos cordiales.

pacopenin 04-11-2013 18:20:48

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;

Neftali [Germán.Estévez] 04-11-2013 19:50:03

Es posible que la transacción no tenga componente propio, como pasa con ADO.
La trasacción está implícita o incluída en la conexión, y desde ese componente es desde donde realizas loa START, COMMIT y ROLLBACK.

hoyosfelix 04-11-2013 21:49:39

Hola de nuevo y gracias a todos.

El código enviado por pacopenin es excelente.

Voy a extraer parte del mismo
Código Delphi [-]
      Dat.ZTarifas.Post;             
      QryO.Next;         
    end;        
    try         
    Dat.ZConn.Commit;        
    except

De este código se entiende que tenemos un TZConnection en un DataModulo y a ella están ligadas varias consultas de distintos formularios.

Supongamos que en otro formulario se este Insertando una Factura que ya ha hecho un Post sin Commit todavía, pero que se sigue editando.

En ese momento corremos el procedure:

Código Delphi [-]
 procedure duplicaTarifa(origen, destino: integer; Tipo: String);

y se ejecuta con éxito el Commit del procedure.

Este Commit afecta también a la conexión actual de Factura, es decir que guarda en la base de datos.

La propiedad de TZConnection es Autocommit = False.

Cómo hacer para no afectar a Factura?

Saludos cordiales.

pacopenin 05-11-2013 13:58:36

Al iniciar manualmente una transacción, el commit afecta exclusivamente a los registros modificados dentro de ella. Si tienes una factura en edición, ese proceso habrá creado su propia transacción de forma implicita, por lo que entiendo que funcionarán como dos transacciones distintas. De todas formas, lo mejor es probar.

hoyosfelix 05-11-2013 16:39:32

Buen día a todos.

Gracias pacopenin por las respuestas.^\||/

Una consulta: Cómo están las propiedades AutoCommit y TransactIsolationLevel de tu TZConnection?

Saludos cordiales.

pacopenin 05-11-2013 17:09:22

AutoCommit = True

TransactIsolationLevel = tiReadCommitted


La franja horaria es GMT +2. Ahora son las 16:56:58.

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