Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Alternativa a Locate (https://www.clubdelphi.com/foros/showthread.php?t=64677)

totote 14-04-2009 17:19:07

Alternativa a Locate
 
Buenas gente del foro, quería consultar si hay alguna alternativa a la función locate de los TClientDataSet, reulta que tengo dos bases de datos con dos tablas iguales, una en Firebird y otra en Paradox, y tengo que comprar los datos de las tablas si hay alguna modificación en alguno de los registros debo actualizarlo, y en el caso de que no lo encuentre lo ingreso, para ello recorro todos los registros de una tabla y hago un Locate en la otra en donde si lo encuentra lo modifica y si no lo ingresa.

Esta solución es viable cuando son pocos registros pero cuando son aproximadamente 90.000 registros, esta operación puede tardar varias horas, necesitaría si conocen alguna solución alternativa.

Saludos :D

delphi.com.ar 14-04-2009 17:29:07

Yo buscaría alguna solución del lado del motor, por ejemplo crear un DBLink entre ambas bases (No se si es posible en FB), y ejecutar todo desde un SQL.

Saludos!

totote 14-04-2009 17:37:41

creo que no se puede hacer, igual hay otros datos que necesito obtener mientras voy recorriendo el TClientDataSet

cecam 14-04-2009 18:18:31

Hoooola!!

Hace tiempo hice algo parecido para ver las diferencias que tenia entre un Paradox y un MySQL :

Código:

  TComparaCDS = class
    cdsDiferencies:TClientDataSet;
    constructor Create;
    procedure Compara(const taula:string; cdsOrigen, cdsDesti:TClientDataSet);
    destructor Destroy;override;
  private
  public
  end;

constructor TComparaCDS.Create;
begin
  inherited Create;
  cdsDiferencies:=TClientDataSet.Create(Application);
  with cdsDiferencies.FieldDefs do begin
      Clear;
      Add('taula',  ftString,  15,False);
      Add('clau',    ftString,  100,False);
      Add('origen',  ftString,  2,False);
      Add('desti',  ftString,  2,False);
  end;
  cdsDiferencies.CreateDataSet;
  cdsDiferencies.FieldByName('clau').DisplayWidth:=15;
  cdsDiferencies.Open;
  cdsDiferencies.IndexFieldNames:='taula;clau';
end;

procedure TComparaCDS.Compara(const taula:string; cdsOrigen, cdsDesti:TClientDataSet);
var
  o:string;
  d:string;
begin
  cdsOrigen.First;
  cdsDesti.First;
  while not cdsOrigen.Eof
    or not cdsDesti.Eof do begin
        if  cdsOrigen.Eof
        then o:='ZZZZZZZZZZZZZZZZZZZZZZ'
        else o:=registreAsString(cdsOrigen);
        if  cdsDesti.Eof
        then d:='ZZZZZZZZZZZZZZZZZZZZZZ'
        else d:=registreAsString(cdsDesti);

        if  o=d
        then begin
            cdsOrigen.Next;
            cdsDesti.Next;
        end
        else
        if  (o<d)
        then begin
            cdsdiferencies.Insert;
            cdsDiferencies.FieldByName('taula').AsString:=taula;
            cdsDiferencies.FieldByName('clau').AsString:=o;
            cdsdiferencies.FieldByName('origen').AsString:='->';
            cdsdiferencies.FieldByName('desti').Clear;
            cdsdiferencies.Post;
            cdsOrigen.Next;
        end
        else
        if  (o>d)
        then begin
            cdsdiferencies.Insert;
            cdsDiferencies.FieldByName('taula').AsString:=taula;           
            cdsdiferencies.FieldByName('clau').AsString:=d;
            cdsdiferencies.FieldByName('origen').Clear;
            cdsdiferencies.FieldByName('desti').AsString:='<-';
            cdsdiferencies.Post;
            cdsDesti.Next;
        end;
  end;
end;

destructor TComparaCDS.Destroy;
begin
  if  cdsDiferencies.Active
  then cdsDiferencies.EmptyDataSet;
  cdsDiferencies.Free;
  inherited Destroy;
end;

La funcion registreAsString(cdsDesti) ahora mismo no la encuentro, pero es muy facil de hacer y basicamente lo que hace es transformar todos los campos de un registro en un string.

Para que funcione necesitas tener ordenados los clientdataset por el mismo indice.

Con este objeto lo que tengo es un registro de las diferencias, no hace la sincronización, pero es facil de modificar para que la haga.


Saludos!!


La franja horaria es GMT +2. Ahora son las 12:16:25.

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