PDA

Ver la Versión Completa : copiar informacion entre dos tablas


payo7
17-10-2008, 02:12:35
Buenas, le estoy rebuscando y no encuentro la solucion. Tengo dos Tablas, TERMINALES y COLECTOR. En la Tabla COLECTOR, tengo el primary key en la columna CODIGO. La Tabla TERMINALES no tiene primary key. Importo la informacion en TERMINALES desde txt, lo cual me crea valores duplicados, que son necesarios. Tengo tambien un trigger con lo siguiente:
CREATE TRIGGER COLECTOR_CHANGE FOR TERMINALES
AFTER INSERT
AS
BEGIN
INSERT INTO COLECTOR
(CODIGO,CANTIDAD)
VALUES (
TERMINALES.CODIGO,TERMINALES.EXISTENCIAS);
END

El problema esta en que los valores duplicados no se me importan a la Tabla COLECTOR, por el primary key. Hay alguna manera de que cuando se repita el codigo en la Tabla TERMINALES, me lo sume en la columna CANTIDAD de la Tabla COLECTOR? Lo puedo incorporar en el trigger?

Uso Interbase 2007.

RolphyReyes
17-10-2008, 14:16:53
Saludos.

Prueba primero a realizar un Update y en caso de fallar haces el Insert.

Idea:

UPDATE COLECTOR
SET CANTIDAD = CANTIDAD + 1
WHERE CODIGO = TERMINALES.CODIGO;

IF ROW_COUNT = 0
INSERT INTO COLECTOR
(CODIGO,CANTIDAD)
VALUES (
TERMINALES.CODIGO,TERMINALES.EXISTENCIAS);

payo7
17-10-2008, 16:04:50
Muchas gracias Rolphy, el Update me funciono bien, pero solamente si hay valores en la Tabla de Colect, lo modifique de esta manera:
CREATE TRIGGER COLECTOR_CHANGE FOR TERMINALES
BEFORE INSERT
AS
BEGIN
UPDATE COLECTOR
SET CANTIDAD = CANTIDAD +TERMINALES.EXISTENCIAS
WHERE CODIGO = TERMINALES.CODIGO;
END

Habria alguna manera de modificar el Trigger para que primero me insertara los valores, y si se repite el codigo, hacer el update? Lo que sucede es que hago el emptytable en COLECTOR antes de Trigger para solamente tener la informacion inventariada. Otra vez, gracias.

hecospina
17-10-2008, 22:53:14
Hola
En la version 2.1 de firebird existe "insert or update", interbase 2007 no tendra algo parecido ? :confused:

payo7
18-10-2008, 02:44:21
Gracias por tu aporte Hescopina, trate esto:

BEGIN
insert into t1 (id, c1, c2) values (:id, :c1, :c2)
WHEN SQLCODE -803 DO
update t1 set c1 = :c1, c2 = :c2 WHERE id = :id;
END

pero se atora en WHEN, no lo acepta. Ya encontre la manera dandole varias vueltas, pero si funciona. Importe la columna codigo, en la columna de cantidad el null lo converti en 0, e hice el trigger con el update siguiente:

UPDATE COLECTOR
SET CANTIDAD = CANTIDAD +TERMINALES.EXISTENCIAS
WHERE CODIGO = TERMINALES.CODIGO;

Gracias hescopina y RolphyReyes.