Ver Mensaje Individual
  #13  
Antiguo 22-11-2022
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Reputación: 20
amadis Va por buen camino
Que tal colegas, finalmente le he dado un giro a todo este tema y lo he resuelto de la siguiente manera, que me resulta transparente para chequear y agregar cambios y practico.

A todo lo planteado anteriormente lo reoslvi, creando una tabla SQLITE con un campo ID (UNTEGER) y STRING (BLOB).
En el ID voy agregando el Nº de version de la base de datos, y en el campo STRING, agrego el string SQL necesario para pasar de la version anterior.

Suponiendo que la version inicial es 1

en la tabla tengo

Código SQL [-]
2  |  ALTER TABLE CLIENTES
       ADD INACTIVO BOOLEAN
       DEFAULT FALSE

A la tabla Sqlite le iré agregando todos los cambios siguientes

Luego en delphi, DESCARGO A ARCHIVO EL SQLITE.DB

Código Delphi [-]
VAR
 ResStream: TResourceStream;

begin
        // guardo dbversion

 ResStream := TResourceStream.Create(HInstance, 'DBVER', RT_RCDATA);
  try
    ResStream.Position := 0;
    ResStream.SaveToFile('DbVer.db');
    finally
    ResStream.Free;
  end;

luego de crear el programa, cargo a un query el archivo sqlite


Hago una consulta para obtener el Nº de version actual y lo guardo en la variable DBVer

y luego ejecuto una funcion que hace todo el chequeo y luego continua la carga del sistema

Código Delphi [-]

Function TDatos.VersionBD : boolean;
var
 MaxVer : integer;

begin

DMVersion.QVersion.Last;   //query que esta en un datamodule de control de version este es el que tiene la tabla SQLITE se abre al iniciar y carga toda la taba
MaxVer := DMVersion.QVersionID.Value;

if DBVer < MaxVer
  then
    begin
     if MessageDlg('Su versión de la Base de Datos es :'+ Inttostr(DbVer)+' y la esperada por el Sistema es : '+InttoStr(MaxVer)+#10#13+
     '¿Desea actulizar la Base de datos antes de continuar?',MtInformation,[mbyes,mbno],0)=mryes
      then
        begin
            while DBVer < MaxVer
            do
               begin  // aqui tengo otro query  conectado a firebird con transaccion update que se encargara de hacer los cambios
               DmVersion.QVersion.Locate('ID',DbVer+1);
                QactDB.Connection.StartTransaction;
                QactDB.SQL.Clear;
                 Try
                   QactDB.SQL.Append(Dmversion.QVersionSTRING.Value);
                   QactDB.OpenOrExecute;
                   QactDB.Close;
                   QactDB.SQL.Clear;
                   QactDB.SQL.Append('update config set version = :v');
                   QactDB.ParamByName('v').AsInteger := DmVersion.QVersionID.Value;
                   QactDB.OpenOrExecute;
                   QactDB.Connection.Commit;
                   DbVer := DmVersion.QVersionID.Value;
                 
                  Except
                   On E: Exception
                    do
                      begin
                        QactDB.Connection.Rollback;     
                        MessageDlg('No se ha podido actualizar a la Version :'+DmVersion.QVersionID.AsString+#10#13+
                        E.Message,mterror,[mbok],0);
                        Break;
                      end;


                 End;
               end;
        end;
    end;
result := true;

De esa forma he resuelto sin tener que parsear textos ni recorrer archivos manualmente

Cada vez que agrego un cambio debo agregar a los recursos del ejecutable la nueva tabla SQLITE con los cambios

Espero sirva de ayuda

Gracias a todos por sus aportes
Responder Con Cita