Ver Mensaje Individual
  #2  
Antiguo 09-06-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Reputación: 28
jachguate Va por buen camino
Se me ocurren dos posibles soluciones:

si tu estructura lo permite:

Recordá que el segundo parámetro de la función gen_id es el avance del generador, así podrías hacer:

Código SQL [-]
insert into empresa(gen_id(gen_empresas, 1), 'FULANITO SA', ...);
insert into factura(gen_id(gen_facturas, 1), gen_id(gen_empresas, 0), 'A1'...);
insert into detalle_factura(gen_id(gen_detfacturas, 1), gen_id(gen_factura, 0), 123);
insert into detalle_factura(
...
insert into factura(gen_id(gen_facturas, 1), gen_id(gen_empresas, 0), 'A2'...);
insert into detalle_factura(gen_id(gen_detfacturas, 1), gen_id(gen_factura, 0), 123);
...
insert into empresa(gen_id(gen_empresas, 1), 'FULANITO 2', ...);
insert into factura(gen_id(gen_facturas, 1), gen_id(gen_empresas, 0), 'A1'...);
..

El problema es que con una estructura medianamente compleja, esto ya no es posible.

Para estos otros casos, se me ocurre otra solución:

primero, crear una tabla de equivalencia entre ID's, algo como:

Código SQL [-]
create table idequiv (
  id integer not null primary key, 
  tabla_origen varchar(20), 
  id_origen integer, 
  id_destino integer
);

create generator gen_idequiv;
create index idequiv_idorigen on idequiv(tabla_origen, id_origen);

Esta tabla servirá para "recordar" el id en la base de datos de origen, así que el script de traslado podría lucir como:

Código SQL [-]
--primero salvamos, el ID del registro que estamos procesando, en este caso la empresa 1, y generamos el nuevo.  
insert into idequiv(gen_id(gen_idequiv, 1), 'EMPRESA', 1, gen_id(gen_empresas, 1));
-- ahora usamos ese valor dondequiera que requiramos el id de la empresa valiendonos del id en la base de origen
insert into empresa((select id_destino from idequiv where tabla_origen = 'EMPRESA' and id_origen = 1), 'FULANITO SA', ...);
insert into idequiv(gen_id(gen_idequiv, 1), 'EMPRESA', 2, gen_id(gen_empresas, 1));
insert into empresa((select id_destino from idequiv where tabla_origen = 'EMPRESA' and id_origen = 2), 'FULANITO 2', ...);

insert into idequiv(gen_id(gen_idequiv, 1), 'FACTURA', 1, gen_id(gen_facturas, 1));

insert into factura((select id_destino from idequiv where tabla_origen = 'FACTURA' and id_origen = 1), (select id_destino from idequiv where tabla_origen = 'EMPRESA' and id_origen = 1), 'A1'...);
insert into detalle_factura(gen_id(gen_detfacturas, 1), (select id_destino from idequiv where tabla_origen = 'FACTURA' and id_origen = 1), 0), 123);
insert into detalle_factura(

En la aplicación que genera el script, sería sencillo añadir funciones que dada una tabla y un id del registro, generen la sentencia de inserción y el subquery a utilizar. El modelo se simplificaría si se usara un único generador para todas las tablas.

Si es una base de datos que aún no está en producción, hay otras formas de enfrentar este problema.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita