Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una tabla

From: Ricardo Fuentes Pereira <rfuentesp(at)gmail(dot)com>
To: Jaime Casanova <systemguards(at)gmail(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una tabla
Date: 2005-05-18 17:08:53
Message-ID: 428B76A5.5010403@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola, y gracias por responder

>Tienes varias fallas en esa funcion por ejemplo tienes un loop que no
>hace nada mas que obtener un (y solo un) valor del select.
>
>
>
Claro, era lo que me temía...

>Y creo que en general la logica es incorrecta, prueba mas bien con
>algo como esto:
>
>CREATE OR REPLACE FUNCTION select() RETURNS tabla2 AS '
> SELECT * FROM tabla2 WHERE rut IN (SELECT param FROM tabla1);'
>LANGUAGE 'sql' VOLATILE;
>
>
Ok. Eso me funcionó a la perfección. Pero tengo otro problema.
Sucede que tengo que recorrer otras tablas también dentro de la misma
consulta
Esta es para saber el de un solo registro por rut, ya mas completa

SELECT * FROM (

SELECT
*,

( fact_compra.sum_valor_fc + fact_gasto.sum_valor_fg +
nd_ext.sum_valor_nd - nc_ext.sum_valor_nc ) AS sum_valor

FROM sx_prov prov,
-- fact_compra
(
SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS sum_valor_fc
FROM sx_doc
WHERE fecha_doc >= ?
AND fecha_doc <= ?
AND cod_t_doc = ?
AND nulo = ?
AND rut = ?
) AS fact_compra,
-- fact_gasto
(
SELECT COALESCE(SUM(total), 0) AS sum_valor_fg
FROM sx_fact_gasto
WHERE fecha >= ?
AND fecha <= ?
AND nulo = ?
AND rut = ?
) AS fact_gasto,
-- nd_ext
(
SELECT COALESCE(SUM(total), 0) AS sum_valor_nd
FROM sx_nd_ext
WHERE fecha >= ?
AND fecha <= ?
AND rut = ?
) AS nd_ext,
-- nc_ext
(
SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS sum_valor_nc
FROM sx_nc_ext
WHERE fecha >= ?
AND fecha <= ?
AND rut = ?
) AS nc_ext --

WHERE prov.rut = ?

-- joins


GROUP BY

-- sx_prov
prov.rut, prov.cod_t_prov, prov.cod_t_pers, prov.des_prov,
prov.nom_vendor,

fact_compra.sum_valor_fc, fact_gasto.sum_valor_fg,
nd_ext.sum_valor_nd, nc_ext.sum_valor_nc
) AS tabla
ORDER BY sum_valor DESC

Como verás, deseo obtener a cuánto han ascendido las compras de la
empresa para un proveedor especificado entre fechas. Para ello tengo que
entrar a diferentes tablas donde están los distintos documentos
asociados: factura de compra, factura de gasto, notas de credito, notas
de debito.

Para un solo proveedor funciona, pero cuando la trate de hacer para que
me devolviese una lista de todos con sus 'sum_valor', me entregaba
informacion erronea de 'sum_valor' sumando varias veces, o sumando otros
valores (lo hice hace tiempo, asi que no recuerdo bien los detalles,
pero de que no salian los datos bien, no salian :'( ).
Entonces hice lo que comente en el 1er mail (Obtener todos los rut de la
tabla de proveedores y despues uno por uno calcular su 'sum_valor')
Ahora hay dos posibles soluciones, a mi modo de ver:
Hacer eso de obtener todos los rut de la tabla de proveedores y
despues calcular uno por uno su 'sum_valor' pero ahora solo desde un
procedimiento almacenado; o,
Mejorar el procedimiento almacenado anterior de manera que si
funcione entregando los datos de los proveedores y su correspondiente
'sum_valor'

>>PD1: Estoy "obligado" a devolver un refcursor debido a que trabajo con
>>Java y según la especificación tengo que trabajar con ese tipo de dato
>>para obtener los registros/filas.
>>
>>
>>
>No estas obligado, la funcion que te di la ejecutas como cualquier select
>select * from select(); y eso lo puedes ejecutar desde Java. O tienes
>algun tipo de problema al respecto?
>
>
>
Frente a este último punto trabajo con CallableStatement, y según leí en
la documentación, deben usarse refcursor
http://www.postgresql.org/docs/7.4/static/jdbc-callproc.html#AEN24395

Si alguien ha trabajado de manera distinta con Java, que comente su
solución.

Salu2.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ricardo Fuentes Pereira 2005-05-18 17:16:16 Re: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una tabla
Previous Message Jaime Casanova 2005-05-18 16:42:43 Re: Recorrer una consulta según un dato de una tabla