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 [EMAIL PROTECTED] http://softwarelibre.diinf.usach.cl
signature.asc
Description: Esta parte del mensaje está firmada digitalmente