problema con trigger

26/08/2005 - 20:00 por ROLANDOCC | Informe spam
saludos, tengo el siguiente trigger: en sql 2000


CREATE TRIGGER [Trg_BitacoraCosto] ON dbo.Articulo_x_Bodega
FOR UPDATE
AS
begin
declare @Empresa smallint,
@Sucursal smallint,
@Bodega smallint,
@Articulo varchar(13),
@CostoPAc money,
@CostoCAc money,
@CostoPAn money,
@CostoCAn money,
@Maquina varchar(50),
@Aplicacion varchar(50),
@UsuarioNET varchar(30),
@UsuarioSQL varchar(30)

if update(Mon_Costo_Actual) or update(Mon_Costo_Ultima_Compra)
begin
select @Empresa=Emp_Id,
@Sucursal=Suc_Id,
@Bodega=Bod_Id,
@Articulo=Art_Id,
@CostoPAc=isnull(Mon_Costo_Actual,0),
@CostoCAc=isnull(Mon_Costo_Ultima_Compra,0)
from Inserted

select @CostoPAn=isnull(Mon_Costo_actual,0),
@CostoCAn=isnull(Mon_Costo_Ultima_Compra,0)
from Articulo_X_Bodega
where Emp_Id=@Empresa
and Suc_Id=@Sucursal
and Bod_Id=@Bodega
and Art_Id=@Articulo

select @Maquina=hostname,
@Aplicacion=program_name,
@UsuarioNET=nt_username,
@UsuarioSQL=Loginame
from master.dbo.sysprocesses
where spid=@@SPID

insert into Inv_Bitacora_Costos
(Emp_Id,Suc_Id,Bod_Id,Art_Id,Fecha,
Costo_PromedioAc,Costo_CompraAc,
Costo_PromedioAn,Costo_CompraAn,
Maquina,Aplicacion,UsuarioNET,UsuarioSQL)
values
(@Empresa,@Sucursal,@Bodega,@Articulo,getdate(),
@CostoPAc,@CostoCAc,
@CostoPAn,@CostoCAn,
@Maquina,@Aplicacion,@UsuarioNet,@UsuarioSQL)


end

end



-

como verán el trigger se dispara y realiza su accion unicamente con los
campos mon_costo_actual , y mon_costo_ultima_compra,
si por ejemplo yo tengo un mon_costo_actualP00
y ejecuto esto:

update articulo_x_bodega set mon_costo_Actual00 where art_id='8614105'

este select:
select @CostoPAn=isnull(Mon_Costo_actual)
@CostoCAn=isnull(Mon_Costo_Ultima_Compra,0)
from Articulo_X_Bodega
where Emp_Id=@Empresa
and Suc_Id=@Sucursal
and Bod_Id=@Bodega
and Art_Id=@Articulo

me retorna en la variable @CostoPAn los 9000 que yo
estoy poniendo con el update y no los 5000 que tiene el campo en
ese momento, osea, se ejecuta el update, y luego el trigger de manera
que cuando el select va a traer los datos que supuestamente son los
de antes del update mas bien me trae los datos que yo estoy poniendo
porque ya se ejecutó el update.

Gracias por la ayuda que me puedan brindar.




Saludos desde Costa Rica! : )

DISCLAIMER: «Este mensaje se proporciona "como está" sin garantías de
ninguna indole, y no otorga ningún derecho.»
 

Leer las respuestas

#1 Alejandro Mesa
26/08/2005 - 20:44 | Informe spam
Si quieres traer el valor que tenia antes, entonces lo debes buscar en la
tabla virtual [deleted].

select
@CostoPAn=isnull(Mon_Costo_actual)
@CostoCAn=isnull(Mon_Costo_Ultima_Compra,0)
from
deleted
where
Emp_Id=@Empresa
and Suc_Id=@Sucursal
and Bod_Id=@Bodega
and Art_Id=@Articulo

esa es la forma en la que trabajan los "after" triggers, porque son
disparados despues de que se ejecuta la accion. Si quieres tomar los valores
antes de que la accion sea ejecutada, debes usar un "instead of" trigger. Ve
los libros en linea para mas info.

Ahora unos comentarios:

- si en algun momento ejecutas un update en masa, el trigger no hara lo que
esperamos, puesto que al ejecutar la sentencia:

select @Empresa=Emp_Id,
@Sucursal=Suc_Id,
@Bodega=Bod_Id,
@Articulo=Art_Id,
@CostoPAc=isnull(Mon_Costo_Actual,0),
@CostoCAc=isnull(Mon_Costo_Ultima_Compra,0)
from Inserted

las variables tomaran el valor de una sola fila, que no sabemos cual es,
debido a que en la tabla "inserted" habra mas de una fila. Los triggers se
disparan por operacion y no por cada fila afectada por la operacion.

- Te recomiendo no usar la tabla sysprocesses para seleccionar esa info. La
misma info la puedes obtener usando:

@Maquina=hostname -- HOST_NAME()
@Aplicacion=program_name -- APP_NAME()
@UsuarioNET=nt_username -- SUSER_SNAME()
@UsuarioSQL=Loginame -- SUSER_SNAME()

asi te ahorraras el tener que cambiar el codigo entre versiones de sql server.


AMB

"ROLANDOCC" wrote:

saludos, tengo el siguiente trigger: en sql 2000


CREATE TRIGGER [Trg_BitacoraCosto] ON dbo.Articulo_x_Bodega
FOR UPDATE
AS
begin
declare @Empresa smallint,
@Sucursal smallint,
@Bodega smallint,
@Articulo varchar(13),
@CostoPAc money,
@CostoCAc money,
@CostoPAn money,
@CostoCAn money,
@Maquina varchar(50),
@Aplicacion varchar(50),
@UsuarioNET varchar(30),
@UsuarioSQL varchar(30)

if update(Mon_Costo_Actual) or update(Mon_Costo_Ultima_Compra)
begin
select @Empresa=Emp_Id,
@Sucursal=Suc_Id,
@Bodega=Bod_Id,
@Articulo=Art_Id,
@CostoPAc=isnull(Mon_Costo_Actual,0),
@CostoCAc=isnull(Mon_Costo_Ultima_Compra,0)
from Inserted

select @CostoPAn=isnull(Mon_Costo_actual,0),
@CostoCAn=isnull(Mon_Costo_Ultima_Compra,0)
from Articulo_X_Bodega
where Emp_Id=@Empresa
and Suc_Id=@Sucursal
and Bod_Id=@Bodega
and Art_Id=@Articulo

select @Maquina=hostname,
@Aplicacion=program_name,
@UsuarioNET=nt_username,
@UsuarioSQL=Loginame
from master.dbo.sysprocesses
where spid=@@SPID

insert into Inv_Bitacora_Costos
(Emp_Id,Suc_Id,Bod_Id,Art_Id,Fecha,
Costo_PromedioAc,Costo_CompraAc,
Costo_PromedioAn,Costo_CompraAn,
Maquina,Aplicacion,UsuarioNET,UsuarioSQL)
values
(@Empresa,@Sucursal,@Bodega,@Articulo,getdate(),
@CostoPAc,@CostoCAc,
@CostoPAn,@CostoCAn,
@Maquina,@Aplicacion,@UsuarioNet,@UsuarioSQL)


end

end



-

como verán el trigger se dispara y realiza su accion unicamente con los
campos mon_costo_actual , y mon_costo_ultima_compra,
si por ejemplo yo tengo un mon_costo_actualP00
y ejecuto esto:

update articulo_x_bodega set mon_costo_Actual00 where art_id='8614105'

este select:
select @CostoPAn=isnull(Mon_Costo_actual)
@CostoCAn=isnull(Mon_Costo_Ultima_Compra,0)
from Articulo_X_Bodega
where Emp_Id=@Empresa
and Suc_Id=@Sucursal
and Bod_Id=@Bodega
and Art_Id=@Articulo

me retorna en la variable @CostoPAn los 9000 que yo
estoy poniendo con el update y no los 5000 que tiene el campo en
ese momento, osea, se ejecuta el update, y luego el trigger de manera
que cuando el select va a traer los datos que supuestamente son los
de antes del update mas bien me trae los datos que yo estoy poniendo
porque ya se ejecutó el update.

Gracias por la ayuda que me puedan brindar.




Saludos desde Costa Rica! : )

DISCLAIMER: «Este mensaje se proporciona "como está" sin garantías de
ninguna indole, y no otorga ningún derecho.»


Preguntas similares