Re: Duda en necesidad de bloquear tablas

From: "Marcos Saldivar" <baron(dot)rojo(dot)cuerdas(dot)de(dot)acero(at)gmail(dot)com>
To: "Arturo Munive [pgsql-es-ayuda]" <arturomunive(at)gmail(dot)com>
Cc: Postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda en necesidad de bloquear tablas
Date: 2008-06-21 01:36:23
Message-ID: 1c4d91ab0806201836l4e2a290bg62217b0189d8389f@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 20 de junio de 2008 20:57, Arturo Munive [pgsql-es-ayuda]
<arturomunive(at)gmail(dot)com> escribió:
> Hola a todos:
> tengo una duda en cuanto a como armar una función ( ya sea del lado del
> cliente o un proc almacenado)
>
> El asunto es el que sigue:
> tengo 2 tablas una llamada compras y otra llamada pagos:
> aca versiones simplificadas de las mismas
>
> CREATE TABLE "test"."compras" (
> "id" SERIAL,
> "valor" INTEGER,
> "pagada" BOOLEAN DEFAULT false NOT NULL,
> CONSTRAINT "c_pkey" PRIMARY KEY("id")
> );
>
> CREATE TABLE "test"."pagos" (
> "id" SERIAL,
> "id_compra" INTEGER,
> "valor" INTEGER,
> CONSTRAINT "p_pkey" PRIMARY KEY("id")
> );
>
> los pagos pueden ser parciales para cada compra , es decir una compra puede
> ser cancelada(pagada) por uno o mas pagos
> el procedimiento lógico para efectuar un pago es el siguiente:
>
> 1. verifico que la compra no esta pagada.
> 2. calculo cuanto suman los pagos anteriores que se le hicieron a la compra
> 3. verifico que el valor del nuevo pago mas los pagos anteriores no superan
> al monto de la compra.
> 4. inserto el pago en su tabla
> 5. si la suma de los pagos es igual a el valor la compra, actualizo la
> compra estableciendo el campo pagada = TRUE.
[...]

Bajo mi perspectiva, el motor de base datos se preocupa de esto, de
hecho creo que para esto son.

Si tienes un compra que puede ser pagado en varias cuotas, yo
simplemente insertaría valores en la tabla pagos hasta que la suma de
estos sean igual o mayor al valor total de la compra. Tienes que
considerar que muy pocas personas van a pagar mas de lo que le
cobran(ademas que si siempre consulta por el total de pagos, no
deberías nunca pagar de mas) y en el caso de simplemente antes de
hacer la inserción de un nuevo pago, consultas la suma de pagos y la
compara con el total de la compra.

Yo implementaría algo como:

CREATE TABLE compras(
id SERIAL primary key,
valor INTEGER not null
);

insert into compras(valor) values(15990);

CREATE TABLE pagos(
id SERIAL primary key,
id_compra INTEGER references compras(id) on delete cascade not null,
valor INTEGER not null
);

select c.id, c.valor, sum(p.valor) from compras c, pagos p where c.id
= p.id_compra and c.id = 1 group by 1, 2

insert into pagos(id_compra, valor) values(1, 5000);

select c.id, c.valor, c.valor - sum(p.valor) as faltan from compras c,
pagos p where c.id = p.id_compra and c.id = 1 group by 1, 2;

si esto no es una solucion valida no te entendia :-) espero que esto te ayude

saludos

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2008-06-21 03:19:14 Re: Duda en necesidad de bloquear tablas
Previous Message Edwin Quijada 2008-06-21 01:22:01 RE: Manejo de textos grandes