Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   PostgreSQL (http://www.forosdelweb.com/f99/)
-   -   función+disparador que calcule un porcentaje a partir de dos campos (http://www.forosdelweb.com/f99/funcion-disparador-que-calcule-porcentaje-partir-dos-campos-463879/)

cacr 09/02/2007 21:17

función+disparador que calcule un porcentaje a partir de dos campos
 
Saludos

Estoy buscando de aprender a usar funciones y disparadores, con lo cual me inicio con una cosa sencilla...

Una tabla con un campo de total de habitantes, y otro con total de habitantes con celulares, deseo saber a qué porcentaje equivale... he probado con:

[SQL]CREATE FUNCTION cporc() RETURNS "trigger"

AS '

DECLARE

resultado boolean;

BEGIN

EXECUTE (vs_aseo/v_ocup) *100;

return NEW;

END;

'

LANGUAGE plpgsql;

CREATE TRIGGER dporc AFTER
INSERT ON cobertura
FOR EACH ROW EXECUTE PROCEDURE cporc();
[/SQL]

pero, obviamente, no está bien...

Cualquier orientación, será siempre bien recibida... gracias de una

cacr 11/02/2007 14:12

Re: función+disparador que calcule un porcentaje a partir de dos campos
 
Vale... más datos, más pruebas:

plpgsql está para la BD que estoy usando!

La tabla tiene:
poblacion -> integer
celulares -> integer
porcentaje -> float

La función y el disparador, que se crean sin ningún problema:

Código:

CREATE OR REPLACE FUNCTION fporcentaje()
RETURNS trigger AS '
        SELECT (($2 * 100) / $1)
' LANGUAGE plpgsql;

CREATE TRIGGER calporc
  AFTER INSERT OR UPDATE ON poblacion
  FOR EACH ROW EXECUTE
  PROCEDURE fporcentaje('total','celulares');

Ejecuto un insert:

insert into poblacion (total, celulares) values (100,60)

y el Error:

Código:

Error de SQL:

ERROR:  syntax error en o cerca de "SELECT"
CONTEXT:  compile of PL/pgSQL function "fporcentaje" near line 1

En la declaración:
insert into poblacion (total, celulares) values (100,60)

El asunto, es que no sé por donde voy... cualquier orientación, será siempre bien recibida...

cacr 11/02/2007 17:45

Re: función+disparador que calcule un porcentaje a partir de dos campos
 
Asumiendo la responsabilidad, sigo colocando mis comentarios...

Guiandome de algunos apuntes, como este:
http://es.tldp.org/Postgresql-es/web...mer/x1503.html

he probado algunas cosas... a la tabla he agregado un campo fecha, y la función y el disparador han quedado así:

Código:

CREATE OR REPLACE FUNCTION fporcentaje() RETURNS "trigger"
 AS '
DECLARE
        porcentaje double precision;       
BEGIN
        porcentaje := NEW.total;
        NEW.porcentaje := porcentaje;
        NEW.registro := ''now()'';
        RETURN NEW;
END
'
LANGUAGE plpgsql;

CREATE TRIGGER calporc
  AFTER INSERT OR UPDATE ON poblacion
  FOR EACH ROW
  EXECUTE PROCEDURE fporcentaje();

caso 1:
sí quito de la función la línea: NEW.registro := ''now'';, al insertar un registro nuevo:

insert into poblacion (total, celulares) values (100,23)

sólo inserta los datos explícitos, más no hace nada sobre el campo porcentaje de la tabla, que es el que se define en la función.

caso 2:
dejando la línea, arroja el siguiente erro:

Error de SQL:

ERROR: syntax error en o cerca de "now" at character 11
CONTEXT: PL/pgSQL function "fporcentaje" line 6 at assignment

En la declaración:
insert into poblacion (total, celulares) values (100,23)

donde la línea 6, obviamente, hace referencia a la línea en cuestión.

Ciertamente, en el ejemplo, aparece now sin los parentesis, y el llamado a la función, se hace con los parentesis... vale decir, que he probado ambas, y arroja mismo error....

Sospecho, pero no sé cómo probarlo, que o el disparador no le está llegando a la función, o en la función no está devolviendo el valor asignado... demás está decir, que el campo donde debería guardarse el valor calculado en la función queda como NULL

cacr 11/02/2007 20:48

Re: función+disparador que calcule un porcentaje a partir de dos campos
 
Bueno, para finalizar, el asunto quedó resuelto, de la siguiente manera:

Código:

-- FUNCION PARA CALCULAR UN PORCENTAJE        (REGLA DE TRES)
 
-- funcion y disparador
-- para calcular el porcentaje que corresponde a un total de poblacion
CREATE OR REPLACE FUNCTION fporcentaje() RETURNS trigger
 AS '
        DECLARE
            porc double precision;
        BEGIN
            NEW.porcentaje := ((NEW.celulares*100)/NEW.total);
            return NEW;
        END;
'
LANGUAGE plpgsql;

CREATE TRIGGER calporc
  AFTER INSERT OR UPDATE ON poblacion
  FOR EACH ROW EXECUTE
  PROCEDURE fporcentaje('total','celulares');



La zona horaria es GMT -6. Ahora son las 19:59.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.