Re: ayuda con trigger

From: Jenaro Centeno Gómez <jcenteno(at)aldia(dot)com(dot)mx>
To: Virginia <mavir78(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: ayuda con trigger
Date: 2009-06-22 09:49:25
Message-ID: 4A3F53A5.30700@aldia.com.mx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Virginia escribió:
> Buenas tardes, estoy tratando de implementar un trigger en mi base de
> datos de tal manera que cuando inserte un nuevo registro en mi tabla
> de "acumulados" se borre el registro cuya fecha sea superior al último
> año, es algo así como las consultas via internet de los bancos, que
> solo muestra las transacciones de los últimos 12 meses.
> Por ejemplo si estoy insertando el acumulado del mes de junio 2009, se
> debe borrar el registro correspondiente al junio 2008 y solo mostrar
> los acumulados de los últimos 12 meses...
>
> El trigger es el siguiente:
>
> -- Function: autoservicios.historico_sobres()
>
> -- DROP FUNCTION autoservicios.historico_sobres();
>
> CREATE OR REPLACE FUNCTION autoservicios.historico_sobres()
> RETURNS trigger AS
> $BODY$
> DECLARE
> anio integer;
> mes integer;
> codigo integer;
> fecha varchar(10);
> fecha_nueva varchar(10);
> BEGIN
> IF TG_OP = 'INSERT' THEN
> SELECT dat_fecha INTO fecha FROM autoservicios.toi019_acumulado WHERE
> nu_co_empleado = NEW.nu_co_empleado;
> anio = substring(fecha,0,4);
> anio = anio + 1;
> mes = substring(fecha,5,2);
> IF (mes > 1) THEN
> mes = mes - 1;
> ELSE
> mes = 12;
> END IF;
> fecha_nueva = anio || '-' || mes || '- 01';
> SELECT co_acumulado INTO codigo FROM autoservicios.toi019_acumulado
> WHERE nu_co_empleado = NEW.nu_co_empleado AND dat_fecha < fecha_nueva;
> DELETE FROM autoservicios.tr001_acumulado_concepto WHERE
> nu_co_acumulado = codigo;
> DELETE FROM autoservicios.toi019_acumulado WHERE co_acumulado = codigo;
> END IF;
> RETURN NEW;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE
> COST 100;
> ALTER FUNCTION autoservicios.historico_sobres() OWNER TO postgres;
>
> ¿qué estoy haciendo mal? ¿cómo pruebo esta funcion para detectar el
> error?
>
> Muchas gracias...
>
> <http://www.lawebdelprogramador.com/news/imprimir.php?n1=537000>
>
>
>
> --
> -----------------------------------------------------------
> ------------------------ Virginia ------------------------
> -----------------------------------------------------------
Yo veo varias cosas:
1. Estas trabajando con fechas pero en modo texto?????????
2. Tu función puede fallar de fea manera si la configuración de la fecha
no es DD-MM-AAAA
3. Si vas a dejar solamente los últimos 12 meses pero el usuario inserta
una fecha varios años adelante del último registro que tengas, ¿ que va
a pasar?
4. Y no esta indentada lo que hace dificil el interpretarla :D

Algunas sugerencias:

1. Tus campos de fecha deberían ser tipo Date cuando menos.
2. Utiliza datepart(), revisa la documentación de Posgresql, mira:
http://www.postgresql.org/docs/8.4/static/functions-datetime.html
3. Inserta una validación contra la fecha actual en el servidor para ver
que fecha esta tratando de insertar el usuario de manera que tu función
no falle si la fecha está en el futuro. Me refiero a fallar en el hecho
de que si por ejemplo estas en 2009 y tu usuario introduce 2019, adios
todos los meses no?
4. Indenta tus funciones :D. Como decía un compañero: "Ayúdanos a
ayudarte" :D.

Saludos a todos.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Terry Yapt 2009-06-22 10:10:52 Re: Sobre los TableSpaces
Previous Message Jenaro Centeno Gómez 2009-06-22 09:34:45 Re: [pgsql-es-ayuda] Duda con modelado de Datos + Crear Función