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


0