Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Error "Transaction is not Active" (https://www.clubdelphi.com/foros/showthread.php?t=50465)

Mfi 19-11-2007 13:06:55

Error "Transaction is not Active"
 
Bueno, estoy haciendo un procedimiento que verifica la versión de la base de datos (almacenada en un registro de la tabla IbTableInfo) y que si no es la versión mas reciente la actualiza mediante scripts. El caso es que todo funciona bien hasta que voy a cambiar el registro de la base de datos para decirle que ya es la nueva version, al hacer el post me salta una excepcion de "Transaction is not active" y si hago un Transaction.StartTransaction me salta "Transaction is active" :confused:...
Código Delphi [-]
 begin
    //DataModule2.IBMgDB.CloseDataSets;
    DataModule2.IbScript1.Script.Clear;
    //sacamos la versión actual de la Base de DAtos
    try
    IbTableInfo.Active:=true;
    version:=strtofloat(IbtableInfo.FieldByName('VERSIONDB').AsString);
    except
      version:=0;
    end;
    //Si hace falta actualizar se procede.
    showmessage(ultimaversion());
    if (version < strtofloat(UltimaVersion())) then
    begin
      //Cargamos el script para actualizar la BD
      DataModule2.IBScript1.Script.Text := LeerScript('BDS'+floattostr(version));
      showmessage (DataModule2.IBScript1.Script.Text);
      if (DataModule2.IbScript1.ValidateScript) then
        begin
        //DataModule2.IbScript1.ExecuteScript;
        showmessage ('Script Ejecutado');
        IBMgDB.Close;
        IBMgDB.Open;
        IBTableInfo.open;
        IBTableInfo.Transaction.CommitRetaining;
        IBTableInfo.Edit;
        IBTableInfo.FieldByName('VERSIONDB').value:=sigVersion(floattostr(version));
        IBTableInfo.Post;
        IBTableInfo.Transaction.commitretaining;
        showmessage(IBTableInfo.FieldByName('VERSIONDB').AsString);
        end else ShowMessage ('El escript no es válido, se cancela la Actualización.');
    end;
    end;

como podeis ver en el código cierro la base de datos y la abro, he puesto algunos showmessage para ir controlando lo que se ejecutay he desactivado la linea que hace la actualización propiamente dicha solo para intentar localizar este error, pero nada.. al hacer el post me salta la excepcion.

La transaccion la tengo configurada con la base de datos y puesta como transaccion por defecto en la IbTableInfo, esa transaccion no se usa para nada mas. EStá como saCommitRetaining y como TACommit y el autostart a true, en propiedades read commited... :confused::confused::confused::confused::confused:

Gracias por anticipado.

Lepe 19-11-2007 14:53:23

El IBScript ¿tiene asignado el Transaction?

Yo usaría este código:
Código Delphi [-]
if Datamodule.Transaction.Intransaction then
  Datamodule.Transaction.Commit;

Datamodule.Transaction.StartTransaction;
        IBTableInfo.Edit;
      IBTableInfo.FieldByName('VERSIONDB').value:=sigVersion(floattostr(version));
        IBTableInfo.Post;
if Datamodule.Transaction.Intransaction then
  Datamodule.Transaction.Commit;

No es un código optimizado, pero si es muy seguro en cuanto a transacciones activas.

Lo hago así, porque al hacer un post, puede que se haga un Commit en la transacción, (por el AutoCommit del TDatabase) o tu configuración

Saludos

Mfi 19-11-2007 17:04:05

Pues muchas gracias.. ya está, si te soy sincero al ver tu respuesta pensé que no serviría, pues había probado practicamente lo mismo sin el if y el error me seguía dando en el post... :D peeeero.. he probado tu codigo al que he tenido que añadir un IbTableInfo.open; despues del transaction.StartTransaction y tatachaaaan!!!..

Por si a alguien le interesa mi codigo final ha quedado así, ni me molesto en depurar pues esta operación posiblemente se ejecute una vez al año :rolleyes: con que funcione vale.
Código Delphi [-]
   if IbTransaction1.Intransaction then
              IbTransaction1.Commit;
        IbTransaction1.StartTransaction;    
        IBTableInfo.open;
        IBTableInfo.Edit;
        IBTableInfo.FieldByName('VERSIONDB').value:=sigVersion(floattostr(version));
        IBTableInfo.post;
        IBTableInfo.Transaction.commitretaining;
        showmessage(IBTableInfo.FieldByName('VERSIONDB').AsString);

Bueno.. muchisimas gracias otra vez :D


La franja horaria es GMT +2. Ahora son las 09:16:11.

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