Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PostgreSQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=42)
-   -   Error al emplearuna funcion (https://www.clubdelphi.com/foros/showthread.php?t=83795)

pame 30-07-2013 23:50:54

Error al emplearuna funcion
 
Buenas tardes, tengo el siguiente problema, para el cual solicito su ayuda Gracias.. cuando empleo esta funcion en postgres
Código SQL [-]
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
Cita:

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.

Código SQL [-]
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

Código SQL [-]
CREATE OR REPLACE FUNCTION eoq(fi date, ff date)
  RETURNS SETOF "public"."vistaEOQ" AS
$BODY$
..


La franja horaria es GMT +2. Ahora son las 19:58:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi