Re: NO SOLUCIONO EL PROBLEMA DEL TRIGGER Y TENGO UN JEFE QUE ??????

From: "Siciliano, Pablo E(dot)" <psiciliano(at)puentenet(dot)com>
To: "P(at)blo Villad(at)" <andresv50(at)hotmail(dot)com>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: NO SOLUCIONO EL PROBLEMA DEL TRIGGER Y TENGO UN JEFE QUE ??????
Date: 2005-08-19 15:19:26
Message-ID: 001d01c5a4d1$63473ba0$2300a8c0@PuenteHnos.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ok, vamos por partes.

Primero voy a ver si entendí lo que tenés que hacer.

Vos tenés dos tablas (No estas dando las claves). Asumo que las claves son
cedula y cedula contrato respectivamente. Querés que cuando alguien haga un
insert en una tabla (ascenso), se borre el registro anterior de la misma con
la misma clave, se modifique un campo de todos los registros de la segunda
(estado en ascenso_categoria), y se agregue un nuevo registro en la segunda
con estado = 't'. Voy a suponer que si el contrato es nuevo, no grabas un
ascenso.

Si estoy en lo correcto, sigamos.

Tenés que crear una nueva función que haga todo eso, sabiendo que el
registro que vas a insertar se llama NEW, y que vos solo la vas a asociar al
insert, no se va a ejecutar cuando se haga nada mas en la tabla. Te va a
quedar algo mas o menos así:

CREATE OR REPLACE FUNCTION ascenso_contrato_categoria() RETURNS TRIGGER AS
$act_con_ascenso_categoria$
DECLARE
anterior RECORD;
BEGIN
-- Me elijo el anterior contrato, para grabar el contrato categoria
SELECT INTO anterior FROM ascenso WHERE contrato=NEW.contrato;
-- Si es el primer contrato, dejo el insert y no hago nada mas.
IF NOT FOUND THEN
return NEW;
END IF
-- Siguiendo con los pasos que puse antes, borro el viejo contrato
DELETE FROM ascenso WHERE contrato=NEW.contrato;
-- Cambio los anteriores ascensos
UPDATE ascenso_categoria SET estado='t' WHERE
cedula_contrato=NEW.contrato
-- Agrego el nuevo ascenso
INSERT INTO ascenso_categoria
(cedula_contrato,nombre,dedicacion,categoria,estado)values(NEW.contrato,NEW.nombre,NEW.dedicacion,NEW.estado);
-- Me voy, con lo que se inserta el registro.
return NEW;

$act_con_ascenso_categoria$ LANGUAGE plpgsql;

Ahora, lo que te queda hacer es relacionar la función que acabás de crear,
con el insert de un registro en la tabla ascenso.

CREATE TRIGGER contrato_categoria
AFTER INSERT ON ascenso FOR EACH ROW EXECUTE PROCEDURE
ascenso_contrato_categoria();

Lo hice directamente en el mail, por lo que debe estar plagado de errores,
pero creo que te va a servir para entender un poco mejor el tema funciones y
triggers. De todos modos, no estaría de mas que leas de vuelta un par de
veces el capítulo del manual que lo explica. ¡Lo explica perfecto!.

Para la proxima NO GRITES :);)

Saludos!
Pablo E. Siciliano.

----- Original Message -----
From: "P(at)blo Villad@" <andresv50(at)hotmail(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Friday, August 19, 2005 11:02 AM
Subject: [pgsql-es-ayuda] NO SOLUCIONO EL PROBLEMA DEL TRIGGER Y TENGO UN
JEFE QUE ??????

HOLA A TODOS.....
AUN NO SOLUCIONO EL PROBLEMA DEL TRIGGER... CREO NO ME HE HECHO
ENTENDER....
O NO HE PODIDO COMPRENDER BIEN EL FUNCIONAMIENTO DE UN TRIGGER....

Tengo dos tablas una contrato y otra ascenso_categoria

Tengo un Contrato Datos

cedula Nombre Dedicacion Categoria estado
Contrato
10 | Andres | Dedicacion 1 | Categoria 1 | t

ahora inserto un ascenso por categoria a este empleado

cedula nombre Categoria Actual Categoria Pasa
10 | Andres | Categoria 1 | Categoria 2

ahora necesito que la tabla contrato se refleje de esta manera

cedula Nombre Dedicacion Categoria estado
Contrato
10 | Andres | Dedicacion 1 | Categoria 1 | f
10 | Andres | Dedicacion 1 | Categoria 2 | t

por ahora lo hago trato de hacerlo con un trigger de esta manera...

CREATE OR REPLACE FUNCTION ascenso_contrato_categoria() RETURNS TRIGGER AS
$act_con_ascenso_categoria$
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO contrato SELECT OLD.con_emp_nidntfccion,
OLD.con_tcon_cdigo, OLD.con_nmero, OLD.con_dd_cdigo, OLD.con_car_cdigo,
OLD.con_pro_cdigo, OLD.con_fincio, OLD.con_fvncmnto, OLD.con_frtiro,
OLD.con_ded_cdigo, NEW.con_cat_cdigo, OLD.con_sbsico, OLD.con_fpago,
OLD.con_ppago, OLD.con_ppreba, OLD.con_mtivo, OLD.con_estado;
RETURN NEW;
END IF;
RETURN NULL;
END;

$act_con_ascenso_categoria$ LANGUAGE plpgsql;
CREATE TRIGGER contrato_categoria
AFTER INSERT ON ascenso_categoria
FOR EACH ROW EXECUTE PROCEDURE ascenso_contrato_categoria();

USTEDES ME INDICAN Q LO REALICE CON NEW... PERO AHORA VIENE MI PREGUNTA..
COMO HACE EL TRIGGER PARA SABER CUAL ES EL DATO NUEVO EN CONTRATO
SI LA INSERCION SE ESTA REALIZANDO SOBRE LA TABLA ascenso_categoria.

¿¿¿¿¿¿ COMO PUEDO HACER PARA QUE UN TRIGGER DISPARE A OTRO TRIGGER
?????????

ME URGE DAR SOLUCION A ESTE PROBLEMA, TENGO UN JEFE QUE ACOSA MAS Q .....
AYUDA

---------------------------(fin del mensaje)---------------------------
TIP 1: para suscribirte y desuscribirte, visita
http://archives.postgresql.org/pgsql-es-ayuda

--
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.338 / Virus Database: 267.10.12/77 - Release Date: 2005/08/18

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ulises Poirier 2005-08-19 15:44:31 No puedo bajar la version binary para Win32
Previous Message Pascual De Ruvo 2005-08-19 15:19:11 Re: NO SOLUCIONO EL PROBLEMA DEL TRIGGER Y TENGO UN JEFE QUE ??????