Ver Mensaje Individual
  #10  
Antiguo 02-12-2009
Avatar de Axel_Tech
Axel_Tech Axel_Tech is offline
Miembro
 
Registrado: nov 2008
Ubicación: lugar en que está ubicado algo.
Posts: 85
Reputación: 16
Axel_Tech Va por buen camino
Yo me encontré con un problema parecido, pero tenía 2 grandes diferencias con el tuyo:
1.- Sólo tenía que pasar una tabla (parte) de una base de datos Firebird a otra en vez de dos como es tu caso.
2.- Con lo de parte me refiero a que no tenía que pasar la tabla entera, seleccionaba los registros que me interasaban, ya fuera el criterio con un rango entre 2 fechas o por descripción. La selección mayor que tenía que "exportar" como mucho tendría unos 1500 registros, no 6000 como es tu caso. No se como te irá esta solución en cuanto a velocidad y/o rendimiento.
Aunque pensándolo bien después de leer esto:
Cita:
Refiriendome a una tabla sola, en delphi tengo dos edit, uno que es para poner el codigo inicial, y otro el final; con eso yo hago un select "desde" y "hasta" tal codigo para que lo muestre (seria select * from tabla1 where codigo >= edit1 and codigo <= edit2 (eso lo tengo funcionando)
creo que es algo parecido a lo que hago yo.
De todas formas te cuento:

Primero habría que hacer un select de la tabla de la base de datos Local1 (si es con el criterio "desde" y "hasta" mencionado antes mejor) con su IBQuery correspondiente (vamos a llamarle IBQuery1).
Después la recorremos, y hacemos un select de la tabla de Local2 (IBQuery2) utilizando como criterio por ejemplo el código del registro por el que vamos de IBQuery1.
Una vez echo esto montaríamos una cadena con el INSERT, que tendría como campos el Código, Nombre y Precio de IBQuery1 + el precio de IBQUERY2.
Ejecutaríamos el INSERT y ya tendríamos un registro en la nueva tabla (puedes usar un IBQuery3 o borrar el SQL de IBQuery2 e insertarlo desde ahí mismo). Mas o menos el código sería algo así:
Código Delphi [-]
IBQuery1.Active := False;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Text := 'SELECT CODIGO, NOMBRE, PRECIO FROM TABLA1 WHERE CODIGO >= EDIT1 AND CODIGO <= EDIT2'; 
IBQuery1.Active := True;        //select de la tabla Local1
IBQuery1.First;            //nos posicionamos en el primer registro

while not IBQuery1.Eof do    //la recorremos con un while
    begin
        IBQuery2.Active := False;
        IBQuery2.SQL.Clear;
        IBQuery2.SQL.Text := 'SELECT CODIGO, NOMBRE, PRECIO FROM TABLA2 ';
        IBQuery2.SQL.Add('WHERE CODIGO = ' + IBQuery1.FieldByName('CODIGO').AsString);
        IBQuery2.Active := True;    //select de la tabla Local2

        cadena := 'INSERT INTO TABLA3(CODIGO, NOMBRE, PRECIO_LOCAL1, PRECIO_LOCAL2) VALUES (';
        cadena := cadena + IBQuery1.FieldByName('CODIGO').AsString + ',';
        cadena := cadena + QuotedStr(IBQuery1.FieldByName('NOMBRE').AsString) + ',';
        cadena := cadena + IBQuery1.FieldByName('PRECIO').AsString + ',';   //precio1
        cadena := cadena + IBQuery2.FieldByName('PRECIO').AsString;   //precio2
        cadena := cadena + ')';    //cadena del insert montada
        
        IBQuery2.SQL.Clear;
        IBQuery2.SQL.Text := cadena;   
        IBQuery2.ExecSQL;    //metemos el nuevo registro
        IBQuery1.Next;    //pasamos al siguiente registro de la tabla de Local1
    end;

Obviamente cambiando los nombre de las tablas, campos, controles, etc. por los tuyos. Espero que te sirva
* Nota: cada IBQuery apunta a su IBDatabase correspondiente.
__________________
No hope, no dreams, no love, my only escape is Underground

Última edición por Axel_Tech fecha: 02-12-2009 a las 11:34:10.
Responder Con Cita