Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Triggers - operacion sobre varias filas

Estas en el tema de Triggers - operacion sobre varias filas en el foro de SQL Server en Foros del Web. Hola a todos, es mi primer post en este foro, soy programador y estoy teniendo unas dificultades con triggers en SQL server. Los triggers ya ...
  #1 (permalink)  
Antiguo 03/03/2010, 10:27
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
Triggers - operacion sobre varias filas

Hola a todos, es mi primer post en este foro, soy programador y estoy teniendo unas dificultades con triggers en SQL server.
Los triggers ya estan instalados y corriendo, hay : OnDelete, OnInsert, OnUpdate y cumplen su funcion, el problema se presenta cuando debe actualizar mas de un registro, pues en este caso solo acciona sobre el primer registro.
Leyendo un poco verifique que deberia modificar el codigo para que actualice registros por lote, y me gustaria no utilizar cursores, alguien tiene alguna experiencia en este tema..

ESPECIFICO LAS TABLAS Y CODIGO:

tabla ARTICULOS: (PK : codigodearticulo)

codigodearticulo descripcion stock (suma de entradas y salidas de Movstock)
8722500026435 100 White 6.000



tabla MOVSTOCK (PK: idtransac, suc, linea)

idtransac sucursal linea codigodearticulo tipoMovimiento codigodeposito cantidad
1116 1 1 8722500026435 E 2 4.000
138 1 1 8722500026435 E 1 5.000
248 1 2 8722500026435 E 1 2.000
258 1 1 8722500026435 E 1 3.000
296 1 1 8722500026435 E 1 4.000
389 1 1 8722500026435 I 1 24.000

-----------------------------------------------------------------------------------------------


AHORA TENIENDO LAS TABLAS Y EL TRIGGER:

SI SE ME OCURRE HACER UNA MODIFICACION COMO:

UPDATE MOVSTOCK SET CANTIDAD = 2
WHERE CODIGODEARTICULO= '8722500026435' AND CODIGODEPOSITO = 1

Como resultado se modifican correctamente los 5 regitros en movstock con la cantidad=2,
pero en la tabla ARTICULOS campo STOCK, ME QUEDA 9 EN LUGAR DE -10 !!!


investigando llegue a realizar este trigger que supuestamente se ejecuta cuando la ejecucuion involucra a mas de una fila(@@rowcount), y trabaja con la tabla inserted.
pero me actualiza el campo stock en 0(cero), es lo mejor que tengo hasta ahora.

ALTER TRIGGER [Movstock_ONUPDATExLOTE] ON [dbo].[Movstock]
AFTER UPDATE
AS
SET NOCOUNT ON

IF @@ROWCOUNT > 1
BEGIN
DECLARE @CANTIDAD DECIMAL(11,3)

BEGIN


UPDATE A
SET A.STOCK = A.STOCK
+ (SELECT sum(CASE WHEN I.tipodemovimiento ='I' THEN I.Cantidad ELSE -I.Cantidad END)
FROM INSERTED I
WHERE I.CODIGODEARTICULO = A.CODIGODEARTICULO )
FROM ARTICULOS A
JOIN INSERTED I
ON A.CODIGODEARTICULO = I.CODIGODEARTICULO

END
--

END


gracias
  #2 (permalink)  
Antiguo 03/03/2010, 10:57
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Triggers - operacion sobre varias filas

Con el permiso, pero los triggers no fueron creados para lo que desea hacer, ¿porque no lo haces directamente en el procedimiento que hace dicha actualizacion?, tendrias un mejor control
  #3 (permalink)  
Antiguo 03/03/2010, 13:54
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Triggers - operacion sobre varias filas

Gracias iislas por tu comentario, aunque es recomendable lo que decis, lamentablamante tengo que hacerlo con triggers.

El error se encontraba en el set nocount , pues al setear esta propiedad en ON , SQL no retorna la cantidad de filas afectadas, entonces nunca pasaba el IF @@ROWCOUNT > 1 .

Con esto ya funcionaba, pero solo para los registros afectados, dando comoresultado un stock que no era el requerido.

Tambien hay que replicar el proceso pero primero con la tabla Deleted , y luego con la Iserted.
De esta forma se obtiene el stock actualizado en base a la tabla movimientos de stock.

paso a detallar como seria el codigo:

ALTER TRIGGER [Movstock_ONUPDATExLOTE] ON [dbo].[Movstock]
AFTER UPDATE
AS
IF @@ROWCOUNT > 1
BEGIN

UPDATE A
SET STOCK = STOCK
+ (SELECT sum(CASE WHEN D.tipodemovimiento ='I' THEN -D.Cantidad ELSE D.Cantidad END)
FROM DELETED D
WHERE D.CODIGODEARTICULO = A.CODIGODEARTICULO )
FROM ARTICULOS A
JOIN DELETED D
ON A.CODIGODEARTICULO = D.CODIGODEARTICULO


UPDATE A
SET STOCK = STOCK
+ (SELECT sum(CASE WHEN I.tipodemovimiento ='I' THEN I.Cantidad ELSE -I.Cantidad END)
FROM INSERTED I
WHERE I.CODIGODEARTICULO = A.CODIGODEARTICULO )
FROM ARTICULOS A
JOIN INSERTED I
ON A.CODIGODEARTICULO = I.CODIGODEARTICULO

END

**Aclaro que este trigger solo funciona para operaciones sobre mas de una fila!!

Etiquetas: filas, operacion, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:32.