RE: Funcion Trigger

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.

In response to

Browse pgsql-es-ayuda by date

  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