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:20:15
Message-ID: 463F5FCF.8060605@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 insercion no se llevó a cabo con exito entonces
-- cancelamos la insercion 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
-- regsitrarán en la tabla hijo actualizamos el valor
-- del id del padre que recien 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 relacion 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 hubo exito cancelamos la actualizacion para el hijo
IF l_filas < 1
THEN RETURN NULL;
END IF;

-- retornamos el objeto new para que la actualizacion 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 cualñquiero otro dicumento que sea hijo de "ventas"

Asi cuando inserto en facturas o boletas , tambien se inserta en el
padre "ventas"
y en la tabla donde necesito la referencia a una factura o boleta, hago
mejor una refrencia a una venta

Bueno espero que me revisen este código y "le den con todo" es decir que
me hagan criticas de todo
ambito (incluso hata 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

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Esteban Osorio 2007-05-07 17:21:10 RE: Mejorar performance de un query.
Previous Message Miguel Bernilla Sánchez 2007-05-07 17:18:25 Re[2]: now(), localtime...