From: | Roberto Andrade Fonseca <randrade(at)inteligentes(dot)com(dot)mx> |
---|---|
To: | Alvaro Herrera <alvherre(at)surnet(dot)cl> |
Subject: | Re: Secuencias (Consulta) II |
Date: | 2005-05-13 00:26:17 |
Message-ID: | 1115943977.4283f42971002@mail.nul-unu.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Quoting Alvaro Herrera <alvherre(at)surnet(dot)cl>:
> On Thu, May 12, 2005 at 03:06:14PM -0600, mmiranda(at)americatel(dot)com(dot)sv wrote:
>
> > Hola, nuevamente con lo las secuencias, leyendo aqui y alla he encontrado
> > que podria funcionar lo siguiente:
> >
> > crear una secuencia para id de cada pais:
> >
> > CREATE SEQUENCE id_pais1
> > CREATE SEQUENCE id_pais2
>
> Eso era lo que yo habia intentado sugerirte al principio.
>
> > Como las funciones que manipulan secuencias lo hacen de forma atomica,
> seria
> > a prueba de operaciones concurrentes,
> > Funciona no?
>
> Claro, en teoria :-)
>
Y en la práctica:
1. Cuando insertamos una sucursal (país en tu caso) generamos su secuencia, de
hecho varias: para facturas, notas de mostrador, devoluciones, y dos más.
CREATE FUNCTION genseqs() RETURNS TRIGGER AS '
DECLARE
sucursales RECORD;
resultado boolean;
BEGIN
EXECUTE ''CREATE SEQUENCE suc_'' || NEW.id_sucursal || ''fact_seq'';
EXECUTE ''CREATE SEQUENCE suc_'' || NEW.id_sucursal || ''nm_seq'';
EXECUTE ''CREATE SEQUENCE suc_'' || NEW.id_sucursal || ''dev_seq'';
EXECUTE ''CREATE SEQUENCE suc_'' || NEW.id_sucursal || ''cnmf_seq'';
EXECUTE ''CREATE SEQUENCE suc_'' || NEW.id_sucursal || ''nc_seq'';
return NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER genseqs AFTER INSERT ON
sucursales FOR EACH ROW EXECUTE PROCEDURE genseqs();
2. Creamos el folio para la factura. Tenemos una función para cada tipo de
documento, pero tal vez se pueda hacer una genérica.
CREATE OR REPLACE FUNCTION get_folio_fact(integer) returns VARCHAR AS '
DECLARE
my_id_sucursal ALIAS FOR $1;
mi_id_sucursal VARCHAR;
my_prefijo VARCHAR(2);
my_secuencia VARCHAR;
secuencia VARCHAR;
folio_factura VARCHAR;
BEGIN
SELECT INTO my_prefijo prefijo from sucursales where id_sucursal =
my_id_sucursal;
secuencia := ''suc_'' || my_id_sucursal || ''fact_seq'';
SELECT INTO my_secuencia nextval(secuencia);
my_secuencia := lpad(my_secuencia, 7, ''0'');
folio_factura := my_prefijo || ''F'' || my_secuencia;
return folio_factura;
END;
' LANGUAGE 'plpgsql';
----------
Espero que te sirva de guía.
Saludos,
--
Roberto Andrade Fonseca
Inteligentes.com, S.A. de C.V.
Tel. 5207-1672/73
From | Date | Subject | |
---|---|---|---|
Next Message | Jairo Martín Miguel | 2005-05-13 01:29:41 | acceso a postgres desde vb.net |
Previous Message | Roberto Cesar Najera | 2005-05-12 22:16:57 | EMS postgresql manager |