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@postgresql.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