Re: Secuencias (Consulta) II

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

In response to

Browse pgsql-es-ayuda by date

  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