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)
-   -   Intercambio de datos entre 2 DB Interbase (https://www.clubdelphi.com/foros/showthread.php?t=60060)

Cecilio 18-09-2008 13:16:11

Intercambio de datos entre 2 DB Interbase
 
Hola.
Estoy haciendo un programa que actualice datos entre dos DB's en interbase.
Por ejemplo para altas nuevas.

Lo que yo hago es que tengo una consulta en un TSqlQuery(Lazarus) de la db origen, una vez obtenidos los registros nuevos.

creo una consulta de alta en un TSqlQuery de destino y registro por registro creo el string con el alta.

Nunca he probado a usar los Parameter y no se si me ahorrarían tiempo y código, ya que son varias tablas con altas y modificaciones.

¿ como se haría ? o
¿ como sería la mejor forma de sincronizar por ejemplo las altas ?

duilioisola 18-09-2008 13:23:42

Si las tablas son iguales en su estructura, te ahorrarías algo de código en la asignación de los parámetros.
En la tabla origen haces el
Código SQL [-]
select campo_pk,campo1,campo2,campo3 from tabla where cambio=1
En la tabla destino haces el update
Código SQL [-]
update tabla 
set campo1=?campo1,campo2=?campo2,campo3=?campo3 
where campo_pk=?campo_pk
luego haces un for en delphi/lazarus que asigne los parámetros

Código:

{pseudocodigo}
for i := 1 to ParamCount do
  TDestino.Param[i] := TOrigen.Param[i];


duilioisola 18-09-2008 14:06:33

Tambien puedes hacer un procedimiento que se encargue de ver cuales son los campos de una tabla y rellene los parámetros

En las tablas :
- RDB$RELATIONS están las tablas
- RDB$RELATION_FIELDS estan los campos.
- RDB$INDICES contiene los indices y PKs

Enlace para averiguar PK
Enlace para averiguar campos de una tabla
Enlace para listar tablas

Cecilio 18-09-2008 16:33:39

Cita:

Empezado por duilioisola (Mensaje 314920)
Si las tablas son iguales en su estructura, te ahorrarías algo de código en la asignación de los parámetros.
En la tabla origen haces el
Código SQL [-]select campo_pk,campo1,campo2,campo3 from tabla where cambio=1

En la tabla destino haces el update
Código SQL [-]update tabla set campo1=?campo1,campo2=?campo2,campo3=?campo3 where campo_pk=?campo_pk

luego haces un for en delphi/lazarus que asigne los parámetros

Cuando es agregar uso los insert en Sql.

Las dos tablas son identicas en ambas DB's pero solo se usan unos cuantos campos.

Mi nueva duda: Defino el insert con los campos. ¿ como paso un registro de la tabla origen a la tabla destino ?
¿ con el for que me has puesto de ejemplo con los parameters?

Me Explico:
Tengo dos TSqlQuery: TOrigen y TDestino.
Paso 1. en Torigen hago el Select campo1, compo2,campo2 from tabla where nuevo=1
Paso 2. Pensaba que tras hacer el Select, fijaba la propiedad sql del Torigen con el Insert.
Paso 3. Pensaba tambien que En TOrigen, fijaba la base de datos de destino y la transacción y ejecutaba ExecSql.

Con lo cual todos los registros que hay en Torigen se insertaban en la db de destino.

duilioisola 18-09-2008 17:04:22

Esto es un ejemplo.

Habría que :
- meter algunas cosas en un bloque try .. .except.
- hacer comprobaciones de que no haya fallado el abrir la base de datos

Podrías tomar el ejemplo y enviarle como parámetros, la tabla y la lista de los parámetros. Con esto generarías el select y el insert.

Código Delphi [-]
procedure TFMPrueba.Button1Click(Sender: TObject);
var
   i : integer;
begin
   {Abir Base de Datos}
   with TOrigen do
   begin
      Database.Open;
      Transaction.StartTransaction;
   end;
   with TDestino do
   begin
      Database.Open;
      Transaction.StartTransaction;
   end;

   {Select de origen e Insert en destino}
   TOrigen.SQL.Text := 'Select campo1, compo2, campo3 from tabla where nuevo=1';
   TDestino.SQL.Text := 'INSERT INTO tabla (campo1, compo2, campo3) VALUES (?campo1, ?compo2, ?campo3)';

   {Abro el origen}
   TOrigen.ExecQuery;
   while not TOrigen.EOF do
   begin
      {Asigno parámetros}
      for i := 0 to TDestino.Params.Count-1 do
      begin
         {Asigno al paramemtro i el valor del campo con el nombre del parametro}
         TDestino.Params[i].Assign(TOrigen.FieldByName[TDestino.Params[i].Name]);
      end;
      
      TDestino.ExecQuery;
   end;

   {Luego hay que cerrar Querys, Transacciones y Base}
   with TOrigen do
   begin
      TOrigen.Close;
      Transaction.Commit;
      Database.Open;
   end;
   with TDestino do
   begin
      TDestino.Close;
      Transaction.Commit;
      Database.Open;
   end;
   
end;

Cecilio 18-09-2008 21:23:32

Muchas Gracias.

Mientras me escribias el ejemplo yo he escrito este procedimiento:

Código Delphi [-]
procedure Tform1.Env_Altas;
var dd,ds: TSqlQuery;
     s: String;
     x: Integer;
begin
ds:= TSqlQuery.Create(nil);
dd:= TsqlQuery.Create(nil);

ds.DataBase:=Con_o;
ds.Transaction:=Transac_O;
dd.DataBase:=Con_d;
dd.Transaction:=Transac_D;
// Artículos

  
 s:='Select Codigo,Almacen,Descripcion,existencias,pvp1 from articulo';
 s:=s+' where exp='+QuotedStr('NO');

 ds.SQL.Clear;
 ds.SQL.Text:=s;
 ds.Active:=true;

    dd.SQL.Clear;
    dd.SQL.Add('insert into articulo (codigo,almacen,descripcion,existencias,pvp1, exp) ');
    dd.SQL.Add('values (:codigo, :almacen, :descripcion, :existencias, :pvp1, :exp)');
    dd.ParseSQL:=true;
    
 while not ds.EOF do
 begin  
    dd.Params.ParamByName('codigo').Value:=ds.FieldByName('codigo').AsString;
    dd.Params.ParamByName('descripcion').Value:=ds.FieldByName('descripcion').AsString;
       dd.Params.ParamByName('existencias').Value:=ds.FieldByName('existencias').AsString;
    dd.Params.ParamByName('pvp1').Value:=ds.FieldByName('pvp1').AsFloat;
    dd.Params.ParamByName('exp').Value:='NO';
    dd.ExecSQL;

    ds.Next;
 end;

dd.SQL.Clear;
dd.sql.Add('commit');
dd.ExecSQL;
dd.Free;
ds.Free;
end;

Ni que decir tiene que su ejemplo es mucho mejor y voy a estudiarlo a fondo, porque hay muchas cosas en él que desconozco.

duilioisola 19-09-2008 08:02:51

Ante cualquier duda que tengas, será un placer ayudarte (el resto del foro y yo).

Saludos


La franja horaria es GMT +2. Ahora son las 10:11:33.

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