FAQ
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



Saludos

_________________
José de Paz
Escuintla, Guatemala
Tel. (502)-56041676

http://desarrolloescuintla.wordpress.com

Search Discussions

  • Fernando Hevia at May 4, 2010 at 3:30 pm

    -----Mensaje original-----
    De: [email protected]
    En nombre de
    Desarrollo Escuintla
    Enviado el: Martes, 04 de Mayo de 2010 11:54
    Para: [email protected]
    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.
  • Desarrollo Escuintla at May 4, 2010 at 3:30 pm
    Ya resolvi el problema,
    era cuestión de tipo de argumento.

    la función sp_traesaldo(integer),
    debería recibir como paramentro un valor numeric:

    sp_traesaldo(numeric)


    saludos




    2010/5/4 Desarrollo Escuintla <[email protected]>
    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



    Saludos

    _________________
    José de Paz
    Escuintla, Guatemala
    Tel. (502)-56041676

    http://desarrolloescuintla.wordpress.com

    --
    Saludos

    _________________
    José de Paz
    Escuintla, Guatemala
    Tel. (502)-56041676

    http://desarrolloescuintla.wordpress.com

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppgsql-es-ayuda @
categoriespostgresql
postedMay 4, '10 at 3:07p
activeMay 4, '10 at 3:30p
posts3
users2
websitepostgresql.org.es
irc#postgresql

People

Translate

site design / logo © 2023 Grokbase