Problema Trigger....Mi no entender...

09/03/2005 - 17:07 por K | Informe spam
Ante todo Salu2 y gracias por leer mi mensaje
Les comento mi problema

Tengo este trigger

CREATE TRIGGER [DisminuirStock] ON [dbo].[Movimientos]
FOR INSERT
AS
DECLARE @TipoM nvarchar(1)

SELECT Cantidad, CodigoArticulo
INTO #Agregados
FROM Inserted

Select @TipoM = Documento.TipoMovimiento
from Inserted INNER join Documento ON
Inserted.NumeroMovimiento = Documento.NumeroMovimiento

IF @TipoM='D' or @TipoM='I' or @TipoM='J'
BEGIN
update dbo.Articulo
set dbo.Articulo.Stock= dbo.Articulo.Stock + Agregados.cantidad
from #Agregados Agregados inner join dbo.Articulo on
Agregados.CodigoArticulo
Articulo.CodigoArticulo
END
ELSE IF @TipoM='S'
BEGIN
update dbo.Articulo
set dbo.Articulo.Stock= dbo.Articulo.Stock - Agregados.cantidad
from #Agregados Agregados inner join dbo.Articulo on
Agregados.CodigoArticulo
Articulo.CodigoArticulo
END

Tengo uno igual para DELETE con la diferencia que cambian los signo en las
operaciones
para cada una de las condiciones, bueno ahora vamos a trabajar con otro
almacen entonces
hice este cambio ...

CREATE TRIGGER [DisminuirStock] ON [dbo].[Movimientos]
FOR INSERT
AS
DECLARE @TipoM NVARCHAR(1), @Destino NVARCHAR(2)

SELECT Cantidad, CodigoArticulo
INTO #Agregados
FROM Inserted

SELECT @TipoM Documento.TipoMovimiento,@Destino=dbo.Documento.AlmacenDestino
FROM Inserted INNER join Documento ON
Inserted.NumeroMovimiento = Documento.NumeroMovimiento

IF @TipoM='D' or @TipoM='J'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.Stock = dbo.Articulo.Stock + Agregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo Articulo.CodigoArticulo
END

/*La salida produce disminucion en el stock de la tabla Articulos */
ELSE IF @TipoM='S'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.Stock = dbo.Articulo.Stock - Agregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo Articulo.CodigoArticulo
END

/*Este es para cuando se inserte un ingreso en el almacen principal*/
ELSE IF @TipoM=' I ' AND @Destino='TS'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.Stock = dbo.Articulo.Stock + Aqregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo Articulo.CodigoArticulo
END

/*Este es para cuando se inserte un ingreso para el otra almacen*/
ELSE IF @TipoM=' I ' AND @Destino='TC'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.StockInpersa = dbo.Articulo.StockInpersa +
Agregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo Articulo.CodigoArticulo
END

Cuando hago un Ingreso desde el programa no me da ningun mensaje
de error pero cuando busco en la tabla no esta el Movimiento que agrege, y
cuando hago
una Salida y agrego los Detalles me sale el mensaje de Restriccion de la
tabla que no pueden
existir movimientos repetidos... eso es lo que no entiendo mi trigger me
parece que no tiene
nada especial

Probe quitando los ultimos dos ELSE IF y no me da problema pero por eso sigo
sin enteder???

Y mi tabla de Documento tiene una relacion con la tabla Movimientos de uno a
muchos...

Si necesitan algun tipo mas de informacion no duden en pedirmelo

Muchas gracias.
 

Leer las respuestas

#1 Alejandro Mesa
09/03/2005 - 18:03 | Informe spam
Una cosa he notado y es que en el primer trigger usas:

IF @TipoM='D' or @TipoM='I' or @TipoM='J'



fijate en el insert (@TipoM='I'), mientras en el segundo usas:

ELSE IF @TipoM=' I ' AND @Destino='TS'



La cadena usada es diferente, tiene espacio al principio y al final
(@TipoM=' I ').

Otra cosa, tu trigger esta suponiendo que no habra mas de una fila para un
mismo articulo en la misma trasaccion. De no ser asi, en algun momento
fallara. Ve si esta version te es de alguna ayuda.

CREATE TRIGGER [DisminuirStock] ON [dbo].[Movimientos]
FOR INSERT
AS
DECLARE @TipoM NVARCHAR(1), @Destino NVARCHAR(2)

UPDATE
a
SET
a.Stock = a.Stock + isnull((select sum(i.Cantidad) from inserted as i INNER
join Documento ON i.NumeroMovimiento = Documento.NumeroMovimiento and
(Documento.TipoMovimiento in ('D', 'J') or (Documento.TipoMovimiento = ' I '
and Documento.AlmacenDestino = 'TS')) where i.CodigoArticulo =
a.CodigoArticulo), 0)
from
dbo.Articulo as a
where
exists (select * from inserted as i INNER join Documento ON
i.NumeroMovimiento = Documento.NumeroMovimiento and (Documento.TipoMovimiento
in ('D', 'J') or (Documento.TipoMovimiento = ' I ' and
Documento.AlmacenDestino = 'TS')) where i.CodigoArticulo = a.CodigoArticulo)

UPDATE
a
SET
a.Stock = a.Stock - isnull((select sum(i.Cantidad) from inserted as i INNER
join Documento ON i.NumeroMovimiento = Documento.NumeroMovimiento and
Documento.TipoMovimiento = 'S' where i.CodigoArticulo = a.CodigoArticulo), 0)
from
dbo.Articulo as a
where
exists (select * from inserted as i INNER join Documento ON
i.NumeroMovimiento = Documento.NumeroMovimiento and Documento.TipoMovimiento
= 'S' where i.CodigoArticulo = a.CodigoArticulo)

UPDATE
a
SET
a.StockInpersa = a.StockInpersa + isnull((select sum(i.Cantidad) from
inserted as i INNER join Documento ON i.NumeroMovimiento =
Documento.NumeroMovimiento and Documento.TipoMovimiento = ' I ' and
Documento.AlmacenDestino = 'TC' where i.CodigoArticulo = a.CodigoArticulo), 0)
from
dbo.Articulo as a
where
exists (select sum(i.Cantidad) from inserted as i INNER join Documento ON
i.NumeroMovimiento = Documento.NumeroMovimiento and Documento.TipoMovimiento
= ' I ' and Documento.AlmacenDestino = 'TC' where i.CodigoArticulo =
a.CodigoArticulo)
go


AMB



"" wrote:

Ante todo Salu2 y gracias por leer mi mensaje
Les comento mi problema

Tengo este trigger

CREATE TRIGGER [DisminuirStock] ON [dbo].[Movimientos]
FOR INSERT
AS
DECLARE @TipoM nvarchar(1)

SELECT Cantidad, CodigoArticulo
INTO #Agregados
FROM Inserted

Select @TipoM = Documento.TipoMovimiento
from Inserted INNER join Documento ON
Inserted.NumeroMovimiento = Documento.NumeroMovimiento

IF @TipoM='D' or @TipoM='I' or @TipoM='J'
BEGIN
update dbo.Articulo
set dbo.Articulo.Stock= dbo.Articulo.Stock + Agregados.cantidad
from #Agregados Agregados inner join dbo.Articulo on
Agregados.CodigoArticulo >
Articulo.CodigoArticulo
END
ELSE IF @TipoM='S'
BEGIN
update dbo.Articulo
set dbo.Articulo.Stock= dbo.Articulo.Stock - Agregados.cantidad
from #Agregados Agregados inner join dbo.Articulo on
Agregados.CodigoArticulo >
Articulo.CodigoArticulo
END

Tengo uno igual para DELETE con la diferencia que cambian los signo en las
operaciones
para cada una de las condiciones, bueno ahora vamos a trabajar con otro
almacen entonces
hice este cambio ...

CREATE TRIGGER [DisminuirStock] ON [dbo].[Movimientos]
FOR INSERT
AS
DECLARE @TipoM NVARCHAR(1), @Destino NVARCHAR(2)

SELECT Cantidad, CodigoArticulo
INTO #Agregados
FROM Inserted

SELECT @TipoM > Documento.TipoMovimiento,@Destino=dbo.Documento.AlmacenDestino
FROM Inserted INNER join Documento ON
Inserted.NumeroMovimiento = Documento.NumeroMovimiento

IF @TipoM='D' or @TipoM='J'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.Stock = dbo.Articulo.Stock + Agregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo > Articulo.CodigoArticulo
END

/*La salida produce disminucion en el stock de la tabla Articulos */
ELSE IF @TipoM='S'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.Stock = dbo.Articulo.Stock - Agregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo > Articulo.CodigoArticulo
END

/*Este es para cuando se inserte un ingreso en el almacen principal*/
ELSE IF @TipoM=' I ' AND @Destino='TS'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.Stock = dbo.Articulo.Stock + Aqregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo > Articulo.CodigoArticulo
END

/*Este es para cuando se inserte un ingreso para el otra almacen*/
ELSE IF @TipoM=' I ' AND @Destino='TC'
BEGIN
UPDATE dbo.Articulo
SET dbo.Articulo.StockInpersa = dbo.Articulo.StockInpersa +
Agregados.Cantidad
FROM #Agregados Agregados INNER JOIN dbo.Articulo ON
Agregados.CodigoArticulo > Articulo.CodigoArticulo
END

Cuando hago un Ingreso desde el programa no me da ningun mensaje
de error pero cuando busco en la tabla no esta el Movimiento que agrege, y
cuando hago
una Salida y agrego los Detalles me sale el mensaje de Restriccion de la
tabla que no pueden
existir movimientos repetidos... eso es lo que no entiendo mi trigger me
parece que no tiene
nada especial

Probe quitando los ultimos dos ELSE IF y no me da problema pero por eso sigo
sin enteder???

Y mi tabla de Documento tiene una relacion con la tabla Movimientos de uno a
muchos...

Si necesitan algun tipo mas de informacion no duden en pedirmelo

Muchas gracias.



Preguntas similares