Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   copiar informacion entre dos tablas (https://www.clubdelphi.com/foros/showthread.php?t=60885)

payo7 17-10-2008 02:12:35

copiar informacion entre dos tablas
 
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:
Código SQL [-]
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.


La franja horaria es GMT +2. Ahora son las 11:27:26.

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