Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-04-2009
Avatar de totote
totote totote is offline
Miembro
 
Registrado: oct 2006
Posts: 150
Poder: 18
totote Va por buen camino
Question 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
__________________
¡Oh nooo! no compartas, compartir es pirateria, compartir te llevara a la carcel - Revolution OS
Responder Con Cita
  #2  
Antiguo 14-04-2009
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 14-04-2009
Avatar de totote
totote totote is offline
Miembro
 
Registrado: oct 2006
Posts: 150
Poder: 18
totote Va por buen camino
creo que no se puede hacer, igual hay otros datos que necesito obtener mientras voy recorriendo el TClientDataSet
__________________
¡Oh nooo! no compartas, compartir es pirateria, compartir te llevara a la carcel - Revolution OS
Responder Con Cita
  #4  
Antiguo 14-04-2009
cecam cecam is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona
Posts: 47
Poder: 0
cecam Va por buen camino
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!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Una alternativa a win98? FGarcia Windows 3 16-06-2008 08:39:44
Alternativa TStringGrid lightningdd Gráficos 4 01-03-2008 07:44:23
Alternativa OutLook Io Varios 4 26-12-2007 11:08:19
Alternativa SQL*Plus Alfonsoft Oracle 4 07-10-2007 17:31:14
Alternativa a DbGrid JULIOCTORRESG Varios 2 12-03-2007 15:24:47


La franja horaria es GMT +2. Ahora son las 19:49:52.


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
Copyright 1996-2007 Club Delphi