Re: Función recursiva

From: Julio Cesar Diaz Vera <jcdiaz(at)uci(dot)cu>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Función recursiva
Date: 2012-03-05 23:15:20
Message-ID: 4F554908.9000602@uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Will: si usas postgres 9 la forma más sencilla de resolver el problema
de la recursividad es con with recursive (revisa la documentación). Para
tu caso podrías probar algo como esto
*with recursive compuesta as ((select * from mercancia where
barcode_madre =1414000)
union all
(select mercancia.* from mercancia, compuesta where
mercancia.barcode_madre = compuesta.barcode_comp_der)
)
select barcode_comp_der, sum(compuesta.cant_mud) as cantidad from
compuesta where tipo_comp_der = 1 group by barcode_comp_der

*Esto devuelve el código de barras y la cantidad de cada uno de los
productos básicos que componen a 1414000 como 'mercadería compuesta'. La
función para encontrar cuantos productos de este tipo tienes en el
almacén se podría parecer a esto, aunque debes pulir algunos detalles
para poder usarla.

*create type pro_cant as (barcode bigint, disponible double precision)

CREATE OR REPLACE FUNCTION obtener_stock_desde_barcode ( IN
codigo_barras bigint)
RETURNS double precision AS $$

declare
var pro_cant ;
temporal double precision;
disponible double precision:=100000000000;
BEGIN
for var in
(with recursive compuesta as ((select * from mercancia where
barcode_madre =$1)
union all
(select mercancia.* from mercancia, compuesta where
mercancia.barcode_madre = compuesta.barcode_comp_der)
)
select barcode_comp_der, sum(compuesta.cant_mud) as cantidad from
compuesta where tipo_comp_der = 1 group by barcode_comp_der)
loop
select into temporal stock/var.disponible FROM producto WHERE
barcode= var.barcode;
if temporal < disponible then
disponible = temporal;
end if;
end loop;

RETURN disponible; -- Retorna el valor de "disponible"
END; $$ language plpgsql;*

Saludos
Julio

El 3/5/2012 10:59 AM, will escribió:
> Hola a todos,
>
> Resulta que estoy integrando en un POS (bajo la GPL) una funcionalidad
> para vender mercaderías compuestas,
> entendiendo por 'mercadería compuesta' a un producto integrado por
> otros 2 o más productos,
> tal como las ofertas, de modo que al vender esta mercadería puedo
> rebajar el stock de sus componentes.
> Cuando se crea la mercadería compuesta también se define la cantidad
> de unidades de cada
> componente que participa de ella.
>
> Ej: Oferta A = 2xMantquillas + 1xPan
>
> Hasta ahí todo bien.
> El problema radica cuando asocio una mercadería compuesta a otra, el
> sistema debería
> ser capaz de recorrer todo sus componentes y sub-componentes para
> obtener el stock
> 'posible' del compuesto. Para ello he creado una función recursiva,
> sin embargo no da el resultado esperado.
>
> Adjunto el link de la tabla de asociación:
> http://pastebin.com/rqip8ddd
>
> nota: tipo 4 = compuesta,
> tipo 1 = corriente,
>
> cant_mud = las unidades de la mercadería que participa del
> compuesto.
>
> Esta tabla también la utilizo para asociar materias primas a
> mercaderías derivadas de ellas
> pero los eximo de esta explicación.
>
> Adjunto el link de la función:
> http://pastebin.com/h0V1fsvy
>
> La función retorna el stock que corresponde cuando se consulta por una
> mercadería
> corriente (una normal), y cuando se consulta por una mercadería
> compuesta integrada
> por mercaderías corrientes.
> Pero cuando consulto por una mercadería compuesta, donde uno de sus
> componentes
> es otro compuesto (incluso si este compuesto solo tiene mercaderías
> corrientes) me retorna 0.
>
> En este ejemplo específico si llamo a la función se esta forma:
>
> select * from obtener_stock_desde_barcode(1313000)
> resulta 10 (esta bien)
>
> pero si hago:
> select * from obtener_stock_desde_barcode(1414000)
> retorna 0, se supone que dentro de sí esta función se llama a sí misma
> de esta forma:
> select * from obtener_stock_desde_barcode(1313000) y da como resultado 0,
> cuando debería retornar 10.
>
> Ese es el problema, si ejecuto select * from
> obtener_stock_desde_barcode(1313000)
> me da el resultado esperado, pero no así cuando se ejecuta esa misma
> sentencia
> dentro de sí misma. )=
>
> Estaré omitiendo algo?
> Está bien realizarlo de esta forma o existe algún proceso especial
> para trabajar con recursividad
> en postgresql?
>
> De antemano muchísimas gracias! =)
>
> ----
> P.D:
> Leí de antemando sobre esta funcionalidad
> http://wiki.postgresql.org/wiki/CTEReadme
> pero por lo visto no es aplicable a mi situación, puesto que no solo
> debo consultar los datos
> sino también calcular el stock por cada componente y subcomponente.
> (y además porque un compuesto puede tener otro compuesto)
>
>
>
>
>
>
>
>
>
>
> -
> Enviado a la lista de correo pgsql-es-ayuda
> (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
>
> Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE
> SE ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU!
> http://www.antiterroristas.cu
> http://justiciaparaloscinco.wordpress.com

Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU!
http://www.antiterroristas.cu
http://justiciaparaloscinco.wordpress.com

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Edwin Quijada 2012-03-06 02:59:35 RE: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] [pgsql-es-ayuda] sobre imágenes
Previous Message Alejandro Carrillo 2012-03-05 19:43:50 Borrado logico