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.»

Preguntas similare

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.»


Respuesta Responder a este mensaje
#2 ROLANDOCC
26/08/2005 - 21:00 | Informe spam
Wow!

funciona, muchísimas gracias.



Saludos desde Costa Rica! : )

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




"Alejandro Mesa" escribió:

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.»
>
>
Respuesta Responder a este mensaje
#3 Alejandro Mesa
26/08/2005 - 21:17 | Informe spam
Trata asi para que no tengas el problema de multi filas y ademas uses una
sola instrucion.

CREATE TRIGGER [Trg_BitacoraCosto] ON dbo.Articulo_x_Bodega
FOR UPDATE
AS
begin

set nocount on

if update(Mon_Costo_Actual) or update(Mon_Costo_Ultima_Compra)

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)
select
i.Emp_Id,
i.Suc_Id,
i.Bod_Id,
i.Art_Id,
getdate(),
isnull(i.Mon_Costo_Actual,0),
isnull(i.Mon_Costo_Ultima_Compra,0),
isnull(d.Mon_Costo_Actual,0),
isnull(d.Mon_Costo_Ultima_Compra,0),
HOST_NAME(),
APP_NAME(),
SUSER_SNAME(),
SUSER_SNAME()
from
inserted as i
inner join
deleted as d
on i.Emp_Id = d.i.Emp_Id
and i.Suc_Id = d.Suc_Id
and i.Bod_Id = d.Bod_Id
and i.Art_Id = d.Bod_Id
go


AMB

"ROLANDOCC" wrote:

Wow!

funciona, muchísimas gracias.



Saludos desde Costa Rica! : )

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




"Alejandro Mesa" escribió:

> 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.»
> >
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida