Hola. Tu problema no es tanto con las variables NEW y OLD, sino en la lógica 
que estás usando en tu función para responder a los diferentes eventos. Cuando 
alguien ejecuta un UPDATE en compras, no deberías introducir un nuevo registro 
en movimientos, sino actualizarlo. NEW y OLD sólo están inicializados a la vez 
cuando se trata de un UPDATE, pues te ayuda a conocer el estado actual y futuro 
del registro. En tu caso, deberías usar NEW para aplicar los cambios a la tabla 
movimientos, la cual me pregunto si es una copia de la primera y por qué razón 
lo sería.

Gracias por la respuesta, bueno si movimientos(tabla que recibe el trigger) es 
una copia de compras, movimientos me sirve para el kardex ya que mi tabla 
compras y ventas (con estructuras similares) llenan a movimientos por medio del 
trigger.

Entonces quedaria algo asi...?

BEGIN
  IF (TG_OP = 'INSERT') THEN
 INSERT INTO movimiento (cod_movimiento, fec_movimiento, cod_transaccion, 
cod_documento, nro_documento, cod_entidad, cod_moneda, tipo_cambio, 
flag_anulado, fec_update)
    VALUES(NEW.cod_compra, NEW.fec_compra, '01', NEW.cod_documento, 
NEW.nro_documento, NEW.cod_proveedor, NEW.cod_moneda, NEW.tipo_cambio, 
NEW.flag_anulado, NEW.fec_update);
  END IF;
 
  IF (TG_OP = UPDATE) THEN

UPDATE movimiento 
   SET cod_movimiento= NEW.cod_compra, fec_movimiento = NEW.fec_compra, 
cod_transaccion = '01', cod_documento = NEW.cod_documento, nro_documento = 
NEW.nro_documento, cod_entidad = NEW.cod_proveedor, cod_moneda = 
NEW.cod_moneda, tipo_cambio = NEW.tipo_cambio, flag_anulado = NEW.flag_anulado, 
fec_update = NEW.fec_update

  END IF;
 
RETURN NEW;

Gracias...


      

Responder a