From: | "Fernando Hevia" <fhevia(at)ip-tel(dot)com(dot)ar> |
---|---|
To: | "'Desarrollo Escuintla'" <desarrollo(dot)escuintla(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Funcion Trigger |
Date: | 2010-05-04 15:17:16 |
Message-ID: | 96133192F88B4DAF8B34A3D4F8172E3D@iptel.com.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
> -----Mensaje original-----
> De: pgsql-es-ayuda-owner(at)postgresql(dot)org
> [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de
> Desarrollo Escuintla
> Enviado el: Martes, 04 de Mayo de 2010 11:54
> Para: pgsql-es-ayuda(at)postgresql(dot)org
> Asunto: [pgsql-es-ayuda] Funcion Trigger
>
> Hola buen día,
>
> tengo el siguiente trigger:
>
>
>
> CREATE TRIGGER tri_actualizar_asig
> AFTER INSERT
> ON tbl_08
> FOR EACH ROW
> EXECUTE PROCEDURE tri_actualiza_asignacion();
>
> y aqui el procedimiento:
>
> CREATE OR REPLACE FUNCTION tri_actualiza_asignacion()
> RETURNS trigger AS
> $BODY$
> DECLARE resto numeric;
> BEGIN
> resto=sp_traesaldo(NEW.tbl_07_asignacion);
> //aqui me salta el error
> IF (resto=0) THEN
> UPDATE tbl_07 SET tbl_07_estado='PAGADO' WHERE
> tbl_07_asignacion=NEW.tbl_07_asignacion;
> END IF;
> RETURN NEW;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE
> COST 100;
>
>
>
> dentro del cual llamo a la siguiente funcion "sp_traesaldo(integer)":
> (que me devuelve el saldo restante entre el precio de venta y
> los abonos realizados y que recibe como parametro el número
> de asignacion de la venta)
>
> CREATE OR REPLACE FUNCTION sp_traesaldo(integer)
> RETURNS numeric AS
> $BODY$
> SELECT
> (tbl_03.tbl_03_pventa - SUM(tbl_10.tbl_10_cant)) AS resto
> FROM tbl_10 LEFT JOIN tbl_08 ON
> tbl_10.tbl_08_no=tbl_08.tbl_08_no LEFT JOIN tbl_07 ON
> tbl_07.tbl_07_asignacion=tbl_08.tbl_07_asignacion
> LEFT JOIN tbl_03 ON
> tbl_07.tbl_03_placa=tbl_03.tbl_03_placa
> LEFT JOIN tbl_01 ON
> tbl_07.tbl_01_codigo=tbl_01.tbl_01_codigo
> WHERE tbl_10.tbl_08_no
> IN (SELECT tbl_08.tbl_08_no FROM tbl_08 WHERE
> tbl_08.tbl_07_asignacion=$1)
> GROUP BY tbl_03.tbl_03_pventa,tbl_07.tbl_07_asignacion,
> tbl_07.tbl_07_fecha,tbl_01.tbl_01_codigo;
> $BODY$
> LANGUAGE 'sql' VOLATILE
> COST 100;
> --
>
>
> pero al insertar un registro en la tabla "tbl_08" donde se
> debe activar el trigger despues de la inserción, me resulta
> el siguiente error:
>
>
> ERROR: no existe la función sp_traesaldo(numeric) LINE 1:
> SELECT sp_traesaldo( $1 )
> ^
> HINT: Ninguna función coincide en el nombre y tipos de
> argumentos. Puede desear agregar conversión explícita de tipos.
> QUERY: SELECT sp_traesaldo( $1 )
> CONTEXT: PL/pgSQL function "tri_actualiza_asignacion" line 3
> at asignación
>
Definiste a sp_traesaldo(integer) pero la estás invocando como
sp_traesaldo(numeric).
Son funciones diferentes y Postgres no forzará un cast implícito.
Te recomiendo definir la función correctamente de acuerdo al tipo de dato
que recibirá.
En caso que este efectivamente sea integer pero circunstancialmente resulta
que el parámetro está almacenado en un numeric (NEW.tbl_07_asignacion)
puedes forzar el cast explícitamente:
resto=sp_traesaldo((NEW.tbl_07_asignacion)::integer);
Funcionará, pero desnuda una inconsistencia que te conviene corregir lo
antes posible.
Saludos,
Fernando.
From | Date | Subject | |
---|---|---|---|
Next Message | Jaime Casanova | 2010-05-04 20:29:14 | Re: Problema con ODBC |
Previous Message | Desarrollo Escuintla | 2010-05-04 15:16:56 | Re: Funcion Trigger |