PDA

Ver la Versión Completa : Error al emplearuna funcion


pame
30-07-2013, 23:50:54
Buenas tardes, tengo el siguiente problema, para el cual solicito su ayuda Gracias.. cuando empleo esta funcion en postgres CREATE OR REPLACE FUNCTION eoq(fi date, ff date)
RETURNS SETOF record AS
$BODY$
SELECT
DISTINCT a.cod_producto,
p.nombre,
SUM(a.cantidad) / ($2 - $1) AS demanda,
(2 * 75 * SUM(a.cantidad) / ($2 - $1)) /(p.precio_unid * 0.13) AS Q,
(SUM(a.cantidad) / ($2 - $1)) /
(2 * 75 * SUM(a.cantidad) / ($2 - $1)) /(p.precio_unid * 0.13) AS N,
(2 * 75 * SUM(a.cantidad) / ($2 - $1)) / (p.precio_unid * 0.13)/(SUM(a.cantidad) / ($2 - $1)) AS T,
Stddev(a.cantidad) * sqrt(4) AS Desv,
(Stddev(a.cantidad) * sqrt(4)) * 1.28 AS IS,
SUM(a.cantidad) / ($2 - $1) * 4 *((Stddev(a.cantidad) * sqrt(4)) * 1.28) AS R

FROM detalle_venta a, factura_vent fv, producto p

WHERE ((p.cod_producto = a.cod_producto) AND (a.cod_fact_vent = fv.cod_fact_vent) AND
(fv.fecha BETWEEN $2 AND $1))
GROUP BY a.cod_producto, p.nombre, p.precio_unid
$BODY$
LANGUAGE sql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION eoq(date, date) OWNER TO postgres;

y la ejecuto mediante un TADOStoreProc, con un DataSource y un TDBGrid en delphi me sale el siguiente error
error se requiere una lista de definición de columnas para funciones que retornan «record»

Por favor agradecere su ayuda
MUCHAS GRACIAS

movorack
31-07-2013, 00:34:11
Hola,

Cuando creas una función que retorne un SETOF RECORD solo le estás diciendo que va a regresar un conjunto de datos pero sin ninguna estructura y por eso aún llamándolo desde PgAdmin te generará ese error.

Para que no genere este error, deberás establecer la definición de los campos al llamar la función. Pero en este caso deberás usar un componente de consulta TAdoQuery en lugar de usar el componente de procedimiento almacenado.


select * from funcion(a, b) as (a int, b text, c numeric, ...)


Otra opción (que nunca he probado) es crear una vista con la estructura que piensas devolver y en RETURNS colocar la vista


CREATE OR REPLACE FUNCTION eoq(fi date, ff date)
RETURNS SETOF "public"."vistaEOQ" AS
$BODY$
..