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

Ayuda con una función

Estas en el tema de Ayuda con una función en el foro de PostgreSQL en Foros del Web. Bueno nose como hacer esta función.. :( Lo que se requiere es que la función retorne fecha, el número de socio que ha pagado la ...
  #1 (permalink)  
Antiguo 11/12/2007, 22:41
 
Fecha de Ingreso: diciembre-2007
Ubicación: Coronel
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
Ayuda con una función

Bueno nose como hacer esta función.. :(

Lo que se requiere es que la función retorne fecha, el número de socio que ha pagado la multa y el monto, el monto acumulado hasta ese momento
y el número de multas pagadas acumuladas hasta ese momento.

Desde esta tabla debo sacar los datos.

CREATE TABLE multas (
num int PRIMARY KEY,
precio int,
pagado varchar (2) CHECK (pagado = 'Si' or pagado = 'No'),
fecha_pago DATE,
n_socio int
);

-- num : es el codigo que identifica las multas
-- precio: es el valor de la multa
-- pagado : si esta pagada o no la multa (Si o No)
--fecha_pago : cuando se pago la multa..
-- n_socio es el codigo que identifica a las personas de las multas.

Aquí unas inserciones..

INSERT INTO multas
VALUES (100,500,'Si','2007-12-01',111);

INSERT INTO multas
VALUES (200,500,'Si','2007-12-01',111);

INSERT INTO multas
VALUES (300,500,'No',Null,111);


Esto es lo que he realizado, pero no se que más hacer.. alguien me podría tender la mano. Quisas estoy mal, me podrían orientar

CREATE TYPE tmultas AS
(
fecha DATE,
n_socio INT,
precio INT,
monto_acum INT,
cant_acum INT
);



CREATE OR REPLACE FUNCTION f_multas ()
RETURNS SETOF tmultas
AS
$xD$
DECLARE
multass tmultas;
monto_acum INT;
cant_acum INT;
BEGIN
monto_acum := 0;
cant_acum := 0;

FOR r IN SELECT fecha_pago, n_socio, precio
FROM multas
WHERE pagado = 'Si' LOOP

multass.fecha := r.fecha_pago;
multass.n_socio := r.n_socio;
multass.precio := r.precio;
multass.monto_acum := multass.monto_acum + r.precio;
multass.cant_acum := multass.cant_acum;

RETURN NEXT multass;
END LOOP;
RETURN;
END;
$xD$
Language 'Plpgsql';


Algo asi deberia retornar la funcion.


fecha num_socio multa monto_acum cant_acum
01-11-07 125 1200 1200 1
02-11-07 128 1250 1250 1
02-11-07 125 900 2100 2
05-11-07 300 1500 1500 1
08-11-07 125 500 2600 3
12-11-07 128 1000 2250 2
  #2 (permalink)  
Antiguo 12/12/2007, 04:07
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: Ayuda con una función

Buenas,
una pregunta es una tarea de clases?

Cita:
pagado varchar (2) CHECK (pagado = 'Si' or pagado = 'No'),
Primero, por que no utilizas un boolean?????
algun not null también seria correcto!

Cita:
Lo que se requiere es que la función retorne fecha, el número de socio que ha pagado la multa y el monto, el monto acumulado hasta ese momento
y el número de multas pagadas acumuladas hasta ese momento.
Define bien que quieres sacar, la fecha de la ultima multa pagada y lo que lleva acumulado, hasta esa fecha o en total? (cuentan todas las multas o solo las pagadas), en fin, antes de ponerse a escribir codigo hay que pensar que quieres que haga.

No obstante, todo esto se puede hacer con una consulta no es necesario utilizar un PL.

Un saludo

Última edición por seyko; 12/12/2007 a las 04:15
  #3 (permalink)  
Antiguo 12/12/2007, 08:04
 
Fecha de Ingreso: diciembre-2007
Ubicación: Coronel
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Ayuda con una función

Hola gracias por interesarse en ayudar.

Cita:
Iniciado por seyko Ver Mensaje
Buenas,
una pregunta es una tarea de clases?

Si, es parte de uno de los cuantos ejercicios que me dieron hace 2 meses y este es el unico que no he sabido como hacerlo. Ahora esto no tengo que presentarlo solo lo trato de hacer para estudiar para mí examen.


Primero, por que no utilizas un boolean?????
algun not null también seria correcto!

La estructura de la base de datos tengo que respetarla, debo ajustarme a esta. Yo igual ocuparia un boolean :)..


Define bien que quieres sacar, la fecha de la ultima multa pagada y lo que lleva acumulado, hasta esa fecha o en total? (cuentan todas las multas o solo las pagadas), en fin, antes de ponerse a escribir codigo hay que pensar que quieres que haga.

Las fechas en que se pagaron, por eso en donde trate de hacer algo en la función que ves puse un SELECT fecha_pago, n_socio, precio FROM multas WHERE pagado = 'Si',...... lo que se va acumulando es la cantidad de dinero en multas que a pagado hasta ese entonces..

Mira esto.. aquí esta un poco más claro.

fecha, num_socio, multa, monto_acum, cant_acum
01-11-07, 125, 1200, 1200, 1
02-11-07, 128, 1250, 1250, 1
02-11-07, 125, 900, 2100, 2
05-11-07, 300, 1500, 1500, 1
08-11-07, 125, 500, 2600, 3
12-11-07, 128, 1000, 2250, 2

MIra él num_socio (125 )en la primera fila tiene una multa de 1200 y su monto_acum es de 1200 por que a esa fecha solo a pagado eso y su cantidad acumulada es 1 pues solo a pagado una vez, luego en la tercera fila vuelve a aparecer el num_socio(125) y ahora paga una multa de 900 por lo tanto su monto_acum es de 2100 y esto es por que en la primera fila su monto_acum era de 1200 luego en la tercera fila la multa fue de 900 y en esta misma tercera fila su monto_acum es de 1200+900= 2100 y la cant_acum es de 2 en la tercera fila ya que a pagado 2 veces hasta hay. Bueno si vez en la quinta fila vuelve a ocurrir lo mismo.

No obstante, todo esto se puede hacer con una consulta no es necesario utilizar un PL.

Bueno tengo que hacerlo en Plpgsql porque el ramo es de eso, ademas me tengo que ajustar a sacarlo con un bucle FOR..

Un saludo
Bueno muchas por el interes en ayudar
.. saludos
  #4 (permalink)  
Antiguo 12/12/2007, 10:24
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Busqueda Re: Ayuda con una función

ok, ahora lo he entendido.
Es simple,

FOR r IN SELECT fecha_pago, n_socio, precio
FROM multas
WHERE pagado = 'Si' LOOP

multass.fecha := r.fecha_pago;
multass.n_socio := r.n_socio;
multass.precio := r.precio;

select sum(precio), count(*) into multass.monto_acum, multass.cant_acum
from multas
where pagado = 'Si'
and n_socio = multass.r_socio
and fecha_pago <= multass.fecha;

RETURN NEXT multass;
END LOOP;

y ya esta, no lo he probado asi que probablemente tenga algun fallo.

Por cierto dale un tiron de orejas a tu profe, si empiezan desde el principio poniendo las cosas mal......

Ya me cuentas
  #5 (permalink)  
Antiguo 12/12/2007, 10:44
 
Fecha de Ingreso: diciembre-2007
Ubicación: Coronel
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Re: Ayuda con una función

Muuuchas gracias seyko me a funcionado realmente estoy muy agradecido por el tiempo brindado en ayudarme.

Ahora lo de mí profesor estaría muy a gusto en tirarle las orejas y unas cosas más cuando algo no me sale, pero creo que he aprendido mucho con las dificultades que nos pone.. En fin gran aporte por la resolución.

Estan muy buenos los demas temas igual me han prestado de ayuda en algunas otras grandes dudas :)....

Última edición por yermatron; 12/12/2007 a las 13:16
  #6 (permalink)  
Antiguo 12/12/2007, 15:44
 
Fecha de Ingreso: diciembre-2007
Ubicación: Coronel
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Ayuda con una función

Muuuchas gracias seyko me a funcionado realmente estoy muy agradecido por el tiempo brindado en ayudarme.

Ahora lo de mí profesor estaría muy a gusto en tirarle las orejas y unas cosas más cuando algo no me sale, pero creo que he aprendido mucho con las dificultades que nos pone.. En fin gran aporte por la resolución.

Estan muy buenos los demas temas igual me han prestado de ayuda en algunas otras grandes dudas :)....

Cita:
Iniciado por yermatron Ver Mensaje
CREATE TYPE ty_multas AS
(
fecha DATE,
n_socio INT,
multa INT,
monto_acum INT,
cant_acum INT
);

create or replace function f_multassocios()
returns setof ty_multas
as
$xD$
declare
num_multa int;
type_multero ty_multas;

begin
for num_multa in select num from multas where pagado ='Si' loop
select fecha_pago into type_multero.fecha
from multas
where num = num_multa;

select n_socio into type_multero.n_socio
from multas
where num = num_multa;

select precio into type_multero.multa
from multas
where num = num_multa;

select sum(precio) into type_multero.monto_acum
from multas
where n_socio = type_multero.n_socio
and fecha_pago <= type_multero.fecha;

select count(*) into type_multero.cant_acum
from multas
where n_socio = type_multero.n_socio
and fecha_pago <= type_multero.fecha;

return next type_multero;
end loop;
RETURN;

END;
$xD$
Language 'Plpgsql';
La he hecho toda denuevo :)
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 16:03.