Author Topic: Problema con Trigger en PG  (Read 2728 times)

0 Members and 1 Guest are viewing this topic.

Offline Francisco™

  • The Communiter-
  • *
  • Posts: 1373
  • Bitch you make me hurl...
Problema con Trigger en PG
« on: November 16, 2010, 12:37:19 am »
Buenos Días Jovenes

Ya tengo un buen rato de estarme quebrando la cabeza y no logro solucionar el siguiente problema:


aca una captura de las tablas involucradas en el trigger:


lo que pretendo hacer es lo siguiente:
que cuando se inserte un nuevo plan a la tabla "planes", se ejecute el trigger y que me calcule las nuevas tarifas para que sean insertadas en la tabla "tarifa_planes"

este es el script que estoy ocupando para hacer las pruebas:
Code: [Select]
-- Function: movistar.trg_calcular_tarifas()
-- DROP FUNCTION movistar.trg_calcular_tarifas();
CREATE OR REPLACE FUNCTION movistar.trg_calcular_tarifas()
  RETURNS trigger AS
$BODY$
DECLARE
_script text;
BEGIN
IF(TG_OP = 'INSERT') THEN
_script:='INSERT INTO amadeus.tarifa_planes (cod_plan, "LCLM", "LCLFM", "LCLO", "LDNM", "LDNFM", "LDNO", "LDI", bolsa, es_prepago, fronterizo) VALUES ('''||new.cod_plan||''','''||new.LCLM+new.LCLM*0.16||''' ,''0'' ,''0'' ,''0'' ,''0'' ,''0'' ,''0'' ,''0'' , '||new.es_prepago||' ,false)';
EXECUTE _script;
RETURN NEW;
END IF;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION movistar.trg_calcular_tarifas() OWNER TO postgres;

yo hago esto en la tabla "planes": (lo que esta entre comilla doble son precios/tarifas sin IVA)
Code: [Select]
INSERT INTO movistar.planes(cod_plan, nombre_plan, "LCLM", "LCLFM", "LCLO", "LDNM", "LDNFM", "LDNO", "LDI", bolsa, es_prepago) VALUES ('PME-A','Pagamenos Extra A','3.39','3.39','3.5','3.39','3.39','3.5','3.39','0',true);

al momento de hacer la inserción quiero que el trigger me calcule el precio/tarifa con 2 tipo de IVA 11% y 16%, y que me las guarde en la tabla tarifa_planes es por eso que en el trigger pongo: new.LCLM+new.LCLM*0.16 para calcular la tarifa LCLM con el 16% de IVA

ya probe usando valores estaticos y funciona sin problemas, tambien probe hacer el calculo y almacenarlo en una variable pero me sale el mismo error de la imagen que puse arriba, ya busque en internet y no encontre nada acerca de ese error :sorry:

lo curioso del caso es que ese error me sale solo con los campos que son del tipo money, ya que con el campo cod_plan que es character varying y el campo es_prepago que es boolean, no me da ningun error

de antemano les agradesco su ayuda :drinks:

Offline tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Posts: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: Problema con Trigger en PG
« Reply #1 on: November 16, 2010, 08:49:11 am »
obviamente ya te diste cuenta que postgres respeta el "case sensitive" y trabajar con campos en mayúsculas es permitido, incluso, campos con nombres que tengan espacios, también podes hacerlo, lo único que es un alto costo el trabajar con ellos...


en el INSERT INTO, encerras los nombres de los campo entre comillas, lo cual es correcto, pero en el NEW; no lo haces, y ese es tu problema.


normaliza los nombres de los campos para que no te sigas quebrando la cabeza, y de paso, talvéz puedas cambiar esos nombres por otros más "entendibles" no caigas en errores de un dba común y corriente... si puedes meter mano en la db, haz la propuesta de verdaderos nombres de campo.


otro tip: no fusiles el porcentaje de IVA, imaginate una promoción cuya atracción sea "HOY NO COBRAREMOS IVA A NUESTROS PLANES DE VUELO" actualmente, a que te ves obligado para aplicar esa propaganda?¿

otro tip: el RETURN NEW sacalo del bloque IF THEN END IF, ponelo antes del END, obviamente no te da error porque la definición del trigger que llama esta función, de seguro lo tenes sólo en BEFORE INSERT, pero si este mismo trigger lo ocupas en BEFORE UPDATE, te dará otro error que te seguirá quebrando la cabeza  :D
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Offline Francisco™

  • The Communiter-
  • *
  • Posts: 1373
  • Bitch you make me hurl...
Re: Problema con Trigger en PG
« Reply #2 on: November 16, 2010, 11:38:29 am »
hey gracias juan. ya aplique los consejos que me diste:
- normalizar nombres, quien estuvo a cargo de crear las tablas no tomo eso en consideracion, y pues ya no se diga con los nombre
- no fusilar el iva, no habia pensado en lo planteas
- el return new sacarlo del if, no me habia fijado :phew:

al hacer lo anterior se solvento mi problema, que bien se siente al ver que funciona el trigger

dejo abierto el post ya que estoy seguro que voy a seguir molestando XD

Offline tekun

  • -^- Elite Silver -^-
  • The Communiter-
  • *
  • Posts: 3221
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: Problema con Trigger en PG
« Reply #3 on: November 17, 2010, 09:32:04 am »
jeee, cuando empezas a utilizar una db para aplicar las reglas del negocio, sentis una gran satisfacción  :D

un buen dba, es el que hace la vida de un programador sencilla..  :azn:

otro tip: en el insert into, veo que pasas valores en 0, si no ocupas esos valores en el trigger, te sugiero cambiar la definición de los campos en la tabla tarifa_planes, agregales un valor DEFAULT igual a 0 y obvialos del insert, para que el código sea aun más claro

quedaría algo así
_script:='INSERT INTO amadeus.tarifa_planes (cod_plan, "LCLM", es_prepago, fronterizo) VALUES ('''||new.cod_plan||''','''||new.LCLM+new.LCLM*0.16||''' ,'||new.es_prepago||' ,false)';
EXECUTE _script;


suponiendo como dije antes, que los campos "LCLFM""LCLO""LDNM""LDNFM""LDNO""LDI"bolsa en este caso asuman el valor de 0
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito