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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
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 ?
__________________
Saludos Cordiales.
------------------


Última edición por Cecilio fecha: 18-09-2008 a las 13:20:13. Razón: concretar la pregunta
Responder Con Cita
  #2  
Antiguo 18-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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];

Última edición por duilioisola fecha: 18-09-2008 a las 13:32:17.
Responder Con Cita
  #3  
Antiguo 18-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 18-09-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
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.
__________________
Saludos Cordiales.
------------------


Última edición por Cecilio fecha: 18-09-2008 a las 16:40:27. Razón: explicación más detallada
Responder Con Cita
  #5  
Antiguo 18-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;

Última edición por duilioisola fecha: 18-09-2008 a las 17:32:13.
Responder Con Cita
  #6  
Antiguo 18-09-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
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, vp1, :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.
__________________
Saludos Cordiales.
------------------

Responder Con Cita
  #7  
Antiguo 19-09-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Ante cualquier duda que tengas, será un placer ayudarte (el resto del foro y yo).

Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Diferencias entre Firebird e Interbase David Firebird e Interbase 6 28-04-2007 16:14:47
Intercambio Electronico de Datos (EDI) cacuna Varios 0 08-03-2007 01:31:43
Diferencias entre Firebird e Interbase mieltxo Firebird e Interbase 2 11-02-2006 22:28:07
Como intercambio información entre formularios pyanqn Varios 8 03-11-2005 17:04:13
Compatibilidad entre Interbase y SQLab Ana Tudela Firebird e Interbase 0 09-05-2005 08:50:56


La franja horaria es GMT +2. Ahora son las 01:30:29.


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