Problema con query y funcion

From: Roberto Rodríguez Pino <rodpin(at)gmail(dot)com>
To: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Problema con query y funcion
Date: 2008-09-16 05:22:05
Message-ID: 1221542525.3290.12.camel@pitufo
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos!
Tengo el siguiente problema con una funcion en plpgsql. La funcion tiene
una query la que por si sola da un resultado. El objetivo de la funcion
es tomar el resultado de dicha query y realizar una inserción en una
tabla. El problema es que la query tiene un resultado, y la funcion
entrega otro. He puedo unos "raise" para descartar problemas y no logro
encontrarlo.
La query en cuestion es:

SELECT articulo.idarticulo, articulo.descripcion, unidadmedida.sigla,
stockinicial.cantidad, costoultimo.costoultimo, entrada.entrada,
salida.salida as salida, notacredito.salida as notacredito
FROM articulo
LEFT OUTER JOIN costo USING (idarticulo)
LEFT OUTER JOIN unidadmedida USING (idunidad)
LEFT OUTER JOIN (select idarticulo,sum(cantidad) as entrada from
detalleentrada, voucherentrada where
voucherentrada.idvoucherentrada=detalleentrada.idvoucherentrada and
voucherentrada.fechaemision <= $1 group by detalleentrada.idarticulo) as
entrada USING (idarticulo)
LEFT OUTER JOIN (select idarticulo,sum(cantidad) as salida from
detallesalida, vouchersalida where
vouchersalida.idvouchersalida=detallesalida.idvouchersalida and
vouchersalida.fechaemision <= $1 group by detallesalida.idarticulo) as
salida USING (idarticulo)
LEFT OUTER JOIN (select idarticulo,sum(cantidad) as salida from
detallenotacredito, notacredito where
notacredito.idnotacredito=detallenotacredito.idnotacredito and
notacredito.fechaemision <= $1 group by detallenotacredito.idarticulo)
as notacredito USING (idarticulo)
LEFT OUTER JOIN (select idarticulo,cantidad from costo where
idproveedor is NULL and costo.fecha<=$1) as stockInicial USING
(idarticulo)
LEFT OUTER JOIN (select costo.idarticulo, costoultimo from
costo,(select max(idcosto) as idcosto,idarticulo,max (fecha) from costo
where fecha<=$1 group by idarticulo) as fechacosto where
fechacosto.idcosto = costo.idcosto) as costoultimo USING (idarticulo)
where
(costo.flag = false and costo.fecha<=$1 and costo.idproveedor is NULL)
or (costo.flag=true and costo.fecha<=$1)
group by articulo.idarticulo, articulo.descripcion,
unidadmedida.sigla,stockinicial.cantidad, entrada.entrada,
salida.salida, notacredito.salida, costoultimo.costoultimo
order by idarticulo

Y la funcion es:

CREATE OR REPLACE FUNCTION INVENTARIO_TOTAL(FECHA date)
RETURNS SETOF record AS
$BODY$
DECLARE
inv_temp inventariototal%ROWTYPE;
foo record;
articulo_ varchar;
descripcion_ varchar;
sigla_ varchar;
costounitario_ float8;
cantidad_ float8;
entrada_ float8;
salida_ float8;
notacredito_ float8;
BEGIN
DELETE FROM inventariototal;
FOR inv_temp IN
(SELECT articulo.idarticulo, articulo.descripcion, unidadmedida.sigla,
stockinicial.cantidad, costoultimo.costoultimo, entrada.entrada,
salida.salida as salida, notacredito.salida as notacredito
FROM articulo
LEFT OUTER JOIN costo USING (idarticulo)
LEFT OUTER JOIN unidadmedida USING (idunidad)
LEFT OUTER JOIN (select idarticulo,sum(cantidad) as entrada from
detalleentrada, voucherentrada where
voucherentrada.idvoucherentrada=detalleentrada.idvoucherentrada and
voucherentrada.fechaemision <= $1 group by detalleentrada.idarticulo) as
entrada USING (idarticulo)
LEFT OUTER JOIN (select idarticulo,sum(cantidad) as salida from
detallesalida, vouchersalida where
vouchersalida.idvouchersalida=detallesalida.idvouchersalida and
vouchersalida.fechaemision <= $1 group by detallesalida.idarticulo) as
salida USING (idarticulo)
LEFT OUTER JOIN (select idarticulo,sum(cantidad) as salida from
detallenotacredito, notacredito where
notacredito.idnotacredito=detallenotacredito.idnotacredito and
notacredito.fechaemision <= $1 group by detallenotacredito.idarticulo)
as notacredito USING (idarticulo)
LEFT OUTER JOIN (select idarticulo,cantidad from costo where
idproveedor is NULL and costo.fecha<=$1) as stockInicial USING
(idarticulo)
LEFT OUTER JOIN (select costo.idarticulo, costoultimo from
costo,(select max(idcosto) as idcosto,idarticulo,max (fecha) from costo
where fecha<=$1 group by idarticulo) as fechacosto where
fechacosto.idcosto = costo.idcosto and
fechacosto.idarticulo=costo.idarticulo) as costoultimo USING
(idarticulo)
where
(costo.flag = false and costo.fecha<=$1 and costo.idproveedor is NULL)
or (costo.flag=true and costo.fecha<=$1)
group by articulo.idarticulo, articulo.descripcion,
unidadmedida.sigla,stockinicial.cantidad, entrada.entrada,
salida.salida, notacredito.salida, costoultimo.costoultimo
order by idarticulo)
LOOP
articulo_ = inv_temp.codigo;
descripcion_ = inv_temp.descripcion;
sigla_ = inv_temp.sigla;
costounitario_ = inv_temp.costoultimo;
cantidad_ = inv_temp.cantidad;
raise notice 'Valor: %,%',articulo_,costounitario_;
IF inv_temp.entrada IS NULL THEN
entrada_=0;
ELSE
entrada_=inv_temp.entrada;
END IF;
IF inv_temp.salida IS NULL THEN
salida_=0;
ELSE
salida_ = inv_temp.salida;
END IF;
IF inv_temp.notacredito IS NULL THEN
notacredito_=0;
ELSE
notacredito_=inv_temp.notacredito;
END IF;
INSERT INTO inventariototal (codigo, descripcion, sigla, costoultimo,
cantidad, entrada, salida, notacredito)
VALUES(articulo_, descripcion_, sigla_, costounitario_, cantidad_,
entrada_, salida_, notacredito_);
END LOOP;
FOR foo IN (select codigo, descripcion, sigla, (entrada+cantidad) as
entrada, (salida+notacredito) as salida, (entrada
+cantidad-salida-notacredito) as total, costoultimo as costounitario,
((entrada+cantidad-salida-notacredito)*costoultimo) as costototal from
inventariototal)
LOOP
return next foo;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql';

¿Estoy haciendo algo mal? ¿que cosa? El raise esta puesto solo con fines
de "depuración".
Muchas gracias a quien me pegue una mano.

Saludos!
Roberto

--
visita mi weblog!
http://trasto.hopto.org/weblog
softwarelibre(at)diinf
http://softwarelibre.diinf.usach.cl

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2008-09-16 05:43:30 Re: Problema con query y funcion
Previous Message Marco Vinicio Jimenez Rojas 2008-09-16 04:49:39 Re: ayuda con jdbc