SQL Server - Problemas al insertar y actualizar una tabla con varios registros

   
Vista:

Problemas al insertar y actualizar una tabla con varios registros

Publicado por Ruben Sanchez (Venezuela) (4 intervenciones) el 26/03/2016 01:37:50
Hola a todos tengo un problema con una Trigguer.
Es lo siguiente tengo dos tablas una donde guardo el resumen y otra donde guardo el detalle de la compra y luego tengo una tercera tabla de movimiento de inventarios donde guardo todos los movimiento de entradas y salidas de inventario.
El problema esta en lo siguiente al insertar los renglones o el detalle de cada producto comprado en la tabla de detalle de compra yo inserto en la tabla de inventario un registro de movimiento de entrada, pero necesito actualizar la informacion de la tabla de producto, colocando en esta los valores acumulados que veran en el siguiente scripts.
Mi problema es que cuando inserto mas de un registro en la tabla de movimiento solo se actualiza la informacion del primer producto y los siguientes no los actualiza.
Esta es las instruciones de actualizacion que yo hago por cada registro que inserto.

// INICIO DEL SCRIPTS DE TRIGGUER EN LA TABLA DE MOVIMIENTO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [Inventario].[MovimientosInventarioInsertar]
ON [Inventario].[MovimientosInventario]
AFTER INSERT,UPDATE
AS
BEGIN
DECLARE @IdProducto INT
DECLARE @ExisteActual DECIMAL(20,5) = 0
DECLARE @CostoPromedio DECIMAL(20,5) = 0
DECLARE @UltimoCosto DECIMAL(20,5) = 0
DECLARE @AcumuladoEntrada DECIMAL(20,5) = 0
DECLARE @AcumuladoSalida DECIMAL(20,5) = 0
DECLARE @AcumuladoCostoEntrada DECIMAL(20,5) = 0
DECLARE @PedidosPendientes DECIMAL(20,5) = 0
DECLARE @AcumuladoCostoSalida DECIMAL(20,5) = 0
DECLARE @ExistenciaReal DECIMAL(20,5) = 0
DECLARE @Origen VARCHAR(3) = ''
DECLARE @FechaMovimiento DATETIME

SELECT @IdProducto = IdProducto,@Origen = Origen, @FechaMovimiento = FechaDocumento FROM INSERTED

IF @FechaMovimiento < GETDATE()
begin
EXECUTE Inventario.RecalculoCostoProducto @IdProducto, 0,@Origen

UPDATE Inventario.MovimientosInventario
SET CostoTotal = Inventario.CostoPromedio(IdProducto,FechaDocumento,0,0)*Cantidad
WHERE (TipoMovimiento = 'AS' OR TipoMovimiento = 'SA' OR TipoMovimiento = 'ST' OR TipoMovimiento = 'ET' ) AND FechaDocumento > = @FechaMovimiento
end

SELECT @CostoPromedio = isnull(Inventario.CostoPromedio(@IdProducto,getdate(),0,0),0)
SELECT @UltimoCosto = isnull(Inventario.UltimoCosto(@IdProducto,getdate(),0,0),0)
SELECT @ExisteActual = isnull(Inventario.Existencia(@IdProducto,getdate(),0),0)
SELECT @AcumuladoEntrada = isnull(Inventario.Entradas(@IdProducto,getdate(),0,0),0)
SELECT @AcumuladoCostoEntrada = isnull(Inventario.CostoEntradas(@IdProducto,getdate(),0,0),0)
SELECT @AcumuladoSalida = isnull(Inventario.Salidas(@IdProducto,getdate(),0,0),0)
SELECT @AcumuladoCostoSalida = isnull(Inventario.CostoSalidas(@IdProducto,getdate(),0,0),0)
SELECT @PedidosPendientes = isnull(Inventario.PedidosPendientesProducto(@IdProducto,getdate(),0),0)

UPDATE Inventario.Producto
SET Existencia_actual = @ExisteActual,
CostoPromedio = @CostoPromedio,
UltimoCosto = @UltimoCosto,
AcumuladoEntrada = @AcumuladoEntrada,
AcumuladoCostoEntrada = @AcumuladoCostoEntrada,
AcumuladoSalida = @AcumuladoSalida,
AcumuladoCostoSalida = @AcumuladoCostoSalida,
AcumuladoPedido = @PedidosPendientes,
ExistenciaReal = @ExisteActual
FROM Inventario.Producto
WHERE IdProducto = @IdProducto
END
// FIN DEL SCRIPTS

Gracias de antemano por la ayuda que me puedan ofrecer,

Yo pense en realizar un cursor y guairme por el id del documento que estoy haciendo en ese momento pero no entiendo la manera de realizar la insercion, si es por lotes o es uno a uno, yo la inserto en la tabla de compras con un insert into for iddocumento
no se si eso tiene que ver

saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

Problemas al insertar y actualizar una tabla con varios registros

Publicado por Isaias (3186 intervenciones) el 27/03/2016 21:22:01
Primero, los TRIGGERS no fueron para programar la logica de un proceso, fueron creados en un inicio para guardar la DRI (Referencia Integral de los datos).

Segundo, deberias saber que la tabla INSERTED, contiene TODOS LOS REGISTROS que se afectan en un INSERT y tu solamente tomas UN SOLO REGISTRO, ¿cuantos registros actualizara?, UNO (!!!!!, bingo).

1
SELECT @IdProducto = IdProducto,@Origen = Origen, @FechaMovimiento = FechaDocumento FROM INSERTED

Tu actualizacion que estas haciendo en el trigger, deberias hacerlo en el procedimiento que hace el insert.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar