Re: Herencia?

From: Arturo Munive <arturomunive(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: Jaime Casanova <systemguards(at)gmail(dot)com>, Postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Herencia?
Date: 2007-05-07 17:23:11
Message-ID: 463F607F.8060901@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

yo lo trate así

CREATE TABLE "facturas" (
"id" SERIAL,
"fecha" DATE NOT NULL,
"serie" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"id_cliente" INTEGER DEFAULT 0 NOT NULL,
"id_tipo_documento" INTEGER
"id_venta" INTEGER,
"dato_fac1",
"dato_fac2",
"dato_fac3"
}

CREATE TABLE "boletas" (
"id" SERIAL,
"fecha" DATE NOT NULL,
"serie" INTEGER NOT NULL,
"numero" INTEGER NOT NULL,
"id_cliente" INTEGER DEFAULT 0 NOT NULL,
"id_tipo_documento" INTEGER
"id_venta" INTEGER,
"dato_bol1",
"dato_bol2",
"dato_bol3"
}

CREATE TABLE "ventas" (
"id" SERIAL,
"fecha" DATE,
"serie" INTEGER,
"numero" INTEGER,
"id_cliente" INTEGER,
"id_tipo_documento" INTEGER
)

Obviamente omito los campos irrelevantes
luego tengo 3 triggers

-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
antes de cada insert
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
DECLARE
l_id integer; -- id del nuevo registro en la tabla padre
l_filas integer; -- filas afectadas luego de la insercion

BEGIN

-- guardamos el id del padre que insertaremos,
-- para relacionarla luego con el hijo
l_id = nextval('ventas_id_seq');

-- insertamos el padre
INSERT
INTO
ventas(
id,
serie,
numero,
fecha,
id_tipo_documento,
id_cliente)
VALUES (
l_id,
NEW.serie,
NEW.numero,
NEW.fecha,
NEW.id_tipo_documento,
NEW.id_cliente);

-- Si la inserción no se llevó a cabo con éxito entonces
-- cancelamos la inserción para el hijo
GET DIAGNOSTICS l_filas := ROW_COUNT;
IF l_filas < 1
THEN RETURN NULL;
END IF;

-- en el objeto NEW que contiene los datos que se
-- registrarán en la tabla hijo actualizamos el valor
-- del id del padre que recién insertado
NEW.id_venta = l_id;

-- retornamos el objeto new para que la inserción
-- siga de manera normal
RETURN NEW;

END;

-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
antes de cada update
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
DECLARE
l_filas integer; -- filas actualizadas
BEGIN

-- No permitimos que el hijo cambie su relación con su padre
NEW.id_venta = OLD.id_venta;

l_filas := 0;

-- actualizamos el padre
UPDATE ventas
SET
serie = NEW.serie,
numero = NEW.numero,
fecha = NEW.fecha,
total = NEW.total,
id_cliente = NEW.id_cliente,
id_tipo_documento =NEW.id_tipo_documento
WHERE
id = NEW.id_venta;

-- verificamos que la actualización sea exitosa
GET DIAGNOSTICS l_filas := ROW_COUNT;

-- si no hubo éxito cancelamos la actualización para el hijo
IF l_filas < 1
THEN RETURN NULL;
END IF;

-- retornamos el objeto new para que la actualización siga
--de manera normal
RETURN NEW;

END;

-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
Después de cada Delete
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------

BEGIN
-- eliminamos el padre
DELETE FROM ventas
WHERE OLD.id_venta = id;

RETURN OLD;

END;

----------------------------------------------------------------------------------

con estas funciones creo triggers para cada tabla "hijo" es decir
para facturas boletas o cualquier otro documento que sea hijo de "ventas"

Así cuando inserto en facturas o boletas , también se inserta en el
padre "ventas"
y en la tabla donde necesito la referencia a una factura o boleta, hago
mejor una referencia a una venta

Bueno espero que me revisen este código y "le den con todo" es decir que
me hagan criticas de todo
ámbito (incluso hasta el estilo de código jaja) lo que puede pasar no
puede pasar,
que si algo esta mal que se puede de mejorar etc.

gracias

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Esteban Osorio 2007-05-07 17:23:44 RE: Mejorar performance de un query.
Previous Message Esteban Osorio 2007-05-07 17:21:10 RE: Mejorar performance de un query.