TRIGGERS: lo prometido es ....

From: Mario Cassanelli <mcassan(at)speedy(dot)com(dot)ar>
To: lista de ayuda de postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: TRIGGERS: lo prometido es ....
Date: 2005-05-20 15:31:05
Message-ID: 428E02B9.30608@speedy.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Este mensaje es un poco largo pero prometi que cuando lo hubiese
resuelto lo mandaba a la lista. Creo que puede ser un aporte.

Esto lo uso en un sistema que desarrolle para la venta de productos por
el modelo
de multinivel. La idea no es mia esta en la siguiente direccion:
http://www.windowsitpro.com/Articles/Index.cfm?ArticleID=8826&DisplayTab=Article
el titulo del art es "Triggers and T-SQL to create a functional and
self-maintaining solution for managing hierarchical data" y el autor es
Itzik Ben-gan - Julio del 2000.-
Yo lo implemente en SQLServer con algunas pequeñas modificaciones y
ahora lo estoy implementando para PostGresql.

Bueno, muchas gracias a los que colaboraron, mas abajo esta lo que arme
para postgres.
Saludos
Mario Cassanelli
PD: todo esta siendo desarrollado en Linux Mandrake 10.1, postgresql 7.4
y usando pgAdminIII.

TABLA SOBRE LA CUAL ACTUA EL TRIGGERS PARA EL ARMADO DE JERARQUIAS
CREATE TABLE empleados
(
empid int4 NOT NULL,
mgrid int4,
empname varchar(25) NOT NULL,
salario money NOT NULL,
lvl int4,
jerarquia varchar(900),
CONSTRAINT pk_empleados_empid PRIMARY KEY (empid),
CONSTRAINT pk_empleados_mgrid_empid FOREIGN KEY (mgrid) REFERENCES
empleados (empid) ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH OIDS;
ALTER TABLE empleados OWNER TO postgres;

Para crear la tabla no tuve mas que copiar lo que estaba en el ejemplo
es puro SQL, no tuve ningun problema para lo demas tuve que estudiar y
leer bastante, lo cual es casi nada de todo lo que me falta por aprender.

-----------------------------------
-- Function: trg_emp_ins() para el
-- armado de las jerarquias a medida que se
-- realizan altas de empleados
-----------------------------------
CREATE OR REPLACE FUNCTION trg_emp_ins()
RETURNS "trigger" AS
'
DECLARE
EMP_REC RECORD;
BEGIN
SELECT INTO EMP_REC *
FROM EMPLEADOS
WHERE EMPID = NEW.MGRID;

IF NEW.MGRID IS NULL THEN
NEW.lvl=0;
NEW.jerarquia=''.''||CAST(NEW.EMPID AS VARCHAR(10))||''.'';
ELSE
NEW.lvl=EMP_REC.lvl+1;
NEW.JERARQUIA=EMP_REC.jerarquia||CAST(NEW.EMPID AS
VARCHAR(10))||''.'';
END IF;
RETURN NEW;
END;'
LANGUAGE 'plpgsql' VOLATILE;

--DROP FUNCTION trg_emp_ins() CASCADE;
/*
CREATE TRIGGER TRG_EMP_INS BEFORE INSERT ON EMPLEADOS
FOR EACH ROW EXECUTE PROCEDURE TRG_EMP_INS();
*/

------------------------------------------------------
RESULTADO DEL INSERT INTO EMPLEADOS
CAMPOS -> EMPID, MGRID, EMPNAME,NIVEL,SALARIO,JERARQUIA
-------------------------------------------------------
1; NULL ;"NANCY" ;$12.000,00 ;0 ;".1."
2; 1 ;"ANDREW" ;$2.000,00 ;1 ;".1.2."
3; 1 ;"JANET" ;$204.000,00 ;1 ;".1.3."
4; 1 ;"CARLOS" ;$100.000,00 ;1 ;".1.4."
5; 2 ;"JORGE" ;$500,00 ;2 ;".1.2.5."
6; 1 ;"MARISA" ;$20.000,00 ;1 ;".1.6."
7; 3 ;"NOEMI" ;$2.000.000,00;2 ;".1.3.7."
8; 3 ;"ANDREA" ;$200.000,00 ;2 ;".1.3.8."
9; 3 ;"JAVITO" ;$200.000,00 ;2 ;".1.3.9."
10; 4 ;"GISELA" ;$2.000,00 ;2 ;".1.4.10."
11; 7 ;"LORENA" ;$5.000,00 ;3 ;".1.3.7.11."
12; 7 ;"MARCELO ;$4.600,00 ;3 ;".1.3.7.12."
13; 7 ;"EZEQUIEL";$21.000,00 ;3 ;".1.3.7.13."
14; 11 ;"SANTIAGO";$2.000,00 ;4 ;".1.3.7.11.14."
------------------------------------------------------------

La idea es que al solicitar datos en el arbol de jerarquias del empleado
o distribuidor
por ejemplo Nro 7, yo puedo saber inmediatamente quien es su jefe/padre
o patrocinador
y quienes son sus subordinados/hijos o sus patrocinados, como tambien su
nivel de
profundidad en el arbol. Esto hoy esta funcionando con una cantidad de
registros no muy
grande pero si considerable unos 50000 registros, en otra empresa esta
funcionando con
muy poco unos 2000 registros, todo en SQLSERVER, es muy interesante como
pude optimizar el codigo para la visualizacion y calculos de los mapas
de distribuidores.

Gracias a todos
Saludos
Mario Cassanelli
ARG/Mar del Plata

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Emilio Capolupo 2005-05-20 15:31:23 Herencia y Triggers
Previous Message Mauricio Zea (Gmail) 2005-05-20 15:23:39 Re: saludos