Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

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

Estas en el tema de función+disparador que calcule un porcentaje a partir de dos campos en el foro de PostgreSQL en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/02/2007, 21:17
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
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
__________________
Gracias de todas todas
-----
Linux!
  #2 (permalink)  
Antiguo 11/02/2007, 14:12
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
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...
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 11/02/2007, 17:45
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
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
__________________
Gracias de todas todas
-----
Linux!
  #4 (permalink)  
Antiguo 11/02/2007, 20:48
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
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');
__________________
Gracias de todas todas
-----
Linux!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:57.