Respuesta: Problema con Store Procedure VB2010 express Este es el Store Procedure,,,, ahi por la tercera parte del codigo identifique donde es que da error, dice que se esta intenando ingresar un valor Nulo en "NUMERO_MOVIMIENTO" en la tabla "MOV_INVENTARIO_DET"
Create Proc inve_actualiza_compras4
@codigo_tipo_compra int = 0
, @codigo_compra int = 0
, @MOV_INVENTARIO_AUX int = null
As
/* ======================================= */
/* Actualizacion de compras de inventario */
/* ======================================= */
/* Creado por: CARLOS ECHEVERRIA */
/* Fecha: 18-Jan-1994 */
/* Modificado por: Julio López */
/* Fecha: 03-Sep-2012 */
/* Asunto: Actualización de tablas de */
/* historico de costos */
/* ======================================= */
Declare @MANEJO_COSTOS char(1)
, @TIPO_MOV_INVENTARIO int
, @NUMERO_MOV_INVENTARIO int
, @FEC_VENCIMIENTO_LOTE datetime
, @CANTIDAD_DISPONIBLE numeric(18,8)
, @CANTIDAD_A_INGRESAR numeric(18,8)
, @COSTO_TOTAL float
, @COSTO_UNITARIO_ANT float
, @COSTO_ALTERNO_ANT float
, @CODIGO_BODEGA char(2)
, @CODIGO_DE_UBICACION char(8)
, @CODIGO_DE_LOTE char(5)
, @COST_UNIT_COMPRAS float
, @TIPO_COSTO char(1)
, @DESCRIPCION_LOTE char(40)
, @FECHA_INGRESO_LOTE datetime
, @CANTIDAD_ORDENADO numeric(18,8)
, @CANTIDAD_RESERVADA numeric(18,8)
, @FECHA_COMPRA datetime
, @codigo_division char(10)
, @TIPO_COSTO_A_VALUAR char(1)
, @COSTO_ALTERNO float
, @CODIGO_DE_LOTE_MAX char(5)
, @CODIGO_UNIDAD_VENTA char(2)
, @CANTIDAD_UNIDAD_VTA numeric(18,8)
, @PESO_MOVIMIENTO numeric(18,8)
, @USUARIO_ACTUALIZA char(10)
, @FECHA_ACTUALIZACION datetime
Declare @timestamp timestamp
, @lBODEGA char(2)
, @PRODUCT0 char(25)
, @tocaestado char(1)
, @mes int
, @ano int
, @proveedor int
, @unidades numeric(18,8)
, @valor money
, @ok int
, @id varchar(50)
, @estado char(1)
, @USUARIO char(10)
, @FECHA_SIS datetime
, @errores int
, @rowcount int
Select @id = 'inve_actualiza_compras'
, @USUARIO = suser_name()
, @FECHA_SIS = getdate()
, @FECHA_COMPRA = FECHA_COMPRA
, @estado = ESTADO_COMPRA
, @codigo_division = CODIGO_DIVISION
, @USUARIO_ACTUALIZA = USUARIO_ACTUALIZA
, @FECHA_ACTUALIZACION = FECHA_ACTUALIZACION
, @mes = datepart(mm,FECHA_COMPRA)
, @ano = datepart(yy,FECHA_COMPRA)
, @proveedor = CODIGO_PROVEEDOR
From COMPRAS_ENC
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra
IF @USUARIO="FILEMON" OR @USUARIO="PEDROL" OR @USUARIO="MARLON" OR @USUARIO="ANGELINA" OR @USUARIO="GUSTAVO"
BEGIN
Exec SPCMSG 'R',@id,'USTED NO TIENE AUTORIZACION PARA GENERAR MOVIMIENTOS DE INVENTARIO'
Return 1
END
If @FECHA_COMPRA Is Null
Begin
Exec SPCMSG 'R',@id, 'No existe el ingreso con costo que desea actualizar'
Return 1
End
-- Manejo de costos
-- ----------------
Select @MANEJO_COSTOS = MANEJO_COSTOS
From COMPRAS_TIPO
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
-- Debe tener detalles
-- -------------------
If Exists( Select 1 From COMPRAS_DET
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra )
Select @id = @id
Else
Begin
Exec SPCMSG 'R',@id, 'El ingreso con costo no tiene detalles. IMPOSIBLE ACTUALIZARLO'
Return 1
End
-- Validamos que si el estado es E - Actualizadas existencias
-- y se desea actualizar la compra, que todos sus productos tengan costo
-- ---------------------------------------------------------------------
If @estado = 'E'
Begin
If Exists( Select 1 From COMPRAS_DET
Where COST_UNIT_COMPRAS <= 0
And CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra )
Begin
Exec SPCMSG 'R',@id, 'Para actualizar los costos en un ingreso con existencias actualizadas, TODOS los productos deben tener costo ( EL COSTO DEBE SER MAYOR A CERO )'
Return 1
End
End
-- Validamos tipo de mov de inventario para ingreso con costo
-- ----------------------------------------------------------
Select @TIPO_MOV_INVENTARIO = MOV_INVE_ING_COSTO
From PARAMETRO_GENERALES
Where COMPANIA = 'PA'
-- Si envian tipo de movimiento a generar NO se asigna el de parametros
-- --------------------------------------------------------------------
If @MOV_INVENTARIO_AUX Is Not Null
Select @TIPO_MOV_INVENTARIO = @MOV_INVENTARIO_AUX
If @TIPO_MOV_INVENTARIO Is Null
Begin
Exec SPCMSG 'R',@id, 'No se ha definido tipo de movimiento de inventario para actualizar ingresos con costo. DEFINALO EN ADMINISTRACION DE GENERALES PARA PODER ACTUALIZAR'
Return 1
End
If Exists( Select 1 From MOV_INVENTARIO_TIPO
Where CODIGO_MOV_INVEN = @TIPO_MOV_INVENTARIO
And INDICADOR_MOV_INVEN = 'S' )
Begin
Exec SPCMSG 'R',@id, 'Se detecto que el tipo de movimiento de inventario que se desea utilizar para registrar el ingreso con costo es salida, debe utilizar ENTRADA AL INVENTARIO.'
Return 1
End
-- T R A N S A C C I O N A L
-- - - - - - - - - - - - - -
Begin Transaction
If @MANEJO_COSTOS = 'S' -- Si el tipo de ingreso maneja costos, siempre se calcula
Or @estado = 'E' -- ó si no maneja costos y está actualizando por segunda vez ( costos )
Begin
Declare c_COMPRAS_DET1 cursor
For Select PRODUCT0
, Sum(CANTIDAD_A_INGRESAR)
, Sum(CANTIDAD_A_INGRESAR * COST_UNIT_COMPRAS )
From COMPRAS_DET
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra
Group By PRODUCT0
For Read Only
Open c_COMPRAS_DET1
Fetch c_COMPRAS_DET1 Into @PRODUCT0, @CANTIDAD_A_INGRESAR, @COSTO_TOTAL
While ( @@sqlstatus = 0 )
Begin
-- Datos del producto
-- ------------------
Select @COSTO_UNITARIO_ANT = IsNull(COSTO_UNITARIO, 0)
, @COSTO_ALTERNO_ANT = IsNull(COSTO_ALTERNO , 0)
, @COSTO_ALTERNO = IsNull(COSTO_ALTERNO , 0)
, @TIPO_COSTO_A_VALUAR = TIPO_COSTO_A_VALUAR
From MAESTRO_PRODUCTOS
Where PRODUCT0 = @PRODUCT0
-- Actualizamos los costos anteriores
-- ----------------------------------
Update COMPRAS_DET
Set COSTO_UNITARIO_ANT = @COSTO_UNITARIO_ANT
, COSTO_ALTERNO_ANT = @COSTO_ALTERNO_ANT
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra
And PRODUCT0 = @PRODUCT0
If @@error <> 0
Begin
Close c_COMPRAS_DET1
Deallocate cursor c_COMPRAS_DET1
Exec SPCMSG 'R',@id,'Al actualizar costos'
Exec SPCROLLBACKTRAN
Return 1
End
-- Disponibilidad en producto
-- --------------------------
Select @CANTIDAD_DISPONIBLE = Sum(CANTIDAD_DISPONIBLE)
From LOTES
Where PRODUCT0 = @PRODUCT0
-- Si el producto maneja costo alterno = ULTIMO COSTO, reemplazamos valor de costo alteno
-- --------------------------------------------------------------------------------------
If @TIPO_COSTO_A_VALUAR = 'U'
Begin
-- Buscamos ultimo lote
-- --------------------
Select @CODIGO_DE_LOTE_MAX = Max( CODIGO_DE_LOTE )
From COMPRAS_DET
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra
And PRODUCT0 = @PRODUCT0
-- Recuperamos costo
-- -----------------
Select @COSTO_ALTERNO = COST_UNIT_COMPRAS
From COMPRAS_DET
Where CODIGO_TIPO_COMPRA = @codigo_tipo_compra
And CODIGO_DE_COMPRA = @codigo_compra
And PRODUCT0 = @PRODUCT0
And CODIGO_DE_LOTE = @CODIGO_DE_LOTE_MAX
End
-- Cuando se calcula para un ingreso que SOLO actualiza los costos, se rebaja la disponibilidad
-- Por que en su actualizacion anterior ( parcial ) solo se incrementa la disponibilidad
-- --------------------------------------------------------------------------------------------
If @estado = 'E'
Select @CANTIDAD_DISPONIBLE = @CANTIDAD_DISPONIBLE - @CANTIDAD_A_INGRESAR
-- Calculamos el nuevo costo promedio y alterno ( ya analizado )
-- ----------------------------------
Update MAESTRO_PRODUCTOS
Set COSTO_UNITARIO = ( @COSTO_TOTAL + ( @CANTIDAD_DISPONIBLE * @COSTO_UNITARIO_ANT ) ) / ( @CANTIDAD_DISPONIBLE + @CANTIDAD_A_INGRESAR )
, COSTO_ALTERNO = @COSTO_ALTERNO
Where PRODUCT0 = @PRODUCT0 |