Ver Mensaje Individual
  #12  
Antiguo 03-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
Con más de 2 bases de datos se complica la cosa. Yo creo que sí funcionaría, aunque veo un par de inconvenientes:
1.- Con tanto INSERT y UPDATE no se que rendimiento obtendrías. Sería cuestión de probarlo.
2.- Cuando llegas a este punto:
Cita:
(que si ya se habia insertado con el del query1 lo va a saltear, y sino lo va a agregar)
desconozco si se puede evitar que se muestre una excepción por violación de clave primaria cuando intentas insertar un producto que ya existe. Nunca se me ha dado el caso, quizás si se pueda pero ignoro cómo.

Tengo en mente otra solución: utilizando tablas temporales (una por cada tabla de cada base de datos) y un procedimiento almacenado con 2 cursores. Las tablas temporales las rellenarías tal y como hemos visto hasta ahora, recorriendo las IBQuery y utilizando el criterio "desde" y "hasta".
Una vez rellenas (para evitar errores te recomiendo que las tablas se llamen igual o parecido en la base de datos final, y los campos también) el SP sería algo tal que así:
Código SQL [-]
/*este primer cursor es para insertar directamente los que no existen en la tabla1, 
y nos quitamos ese problema de un plumazo. 
En este caso es con la tabla2, sería de la misma forma hasta tablaN:*/
FOR 
    SELECT A.CODIGO, A.NOMBRE, A.PRECIO FROM TABLA2 A 
    WHERE NOT EXISTS (SELECT B.CODIGO FROM TABLA1 WHERE B.CODIGO=A.CODIGO)
    INTO :COD, :NOM, :PREC2    /*variables que habrás tenido que declarar previamente*/
DO
    INSERT INTO TABLA_FINAL (CODIGO, NOMBRE, PRECIO2) VALUES (:COD, :NOM, :PREC2);

FOR  /*con la ayuda de este otro cursor para recorrerla, hacemos la consulta de la tabla1*/
     SELECT CODIGO, NOMBRE, PRECIO FROM TABLA1
     INTO :COD, :NOM, :PREC         /*:PREC es otra variable que tienes que declarar*/
DO
     BEGIN
        SELECT PRECIO FROM TABLA2 WHERE CODIGO=:COD
        INTO :PREC2    
        INSERT INTO TABLA_FINAL (CODIGO, NOMBRE, PRECIO1, PRECIO2) VALUES (:COD, :NOM, :PREC, :PREC2);

        SELECT PRECIO FROM TABLA3 WHERE CODIGO=:COD
        INTO :PREC2    
        INSERT INTO TABLA_FINAL (CODIGO, NOMBRE, PRECIO1, PRECIO2) VALUES (:COD, :NOM, :PREC, :PREC2);

        /*y así sucesivamente, hasta que llegues a tablaN*/
     END

Un SP es más potente y más rapido que tanto INSERT y UPDATE. Tendrías que depurarlo un poco y adaptarlo a tus necesidades. Como ya he dicho antes todo es cuestión de probarlo.
__________________
No hope, no dreams, no love, my only escape is Underground
Responder Con Cita