cad_sql0:="SELECT pp_actualiza_stock('"+xc_art+"','"+xc_alma+"',"+str(xtot_art)
USE [demo]
GO
/****** Object: StoredProcedure [dbo].[pp_actualiza_stock] Script Date: 03/11/2013 15:08:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[pp_actualiza_stock]
/******************************************************************************
* Stored Procedure : pp_actualiza_stock *
* Fecha Creación : 22/11/2001 *
* Parámetros : - @co_art char(30) código del articulo al cual se le mo- *
* difica el stock. *
* - @co_alma char(6) código del almacen donde se afectará *
* el stock. *
* - @total_art decimal(28,12) cantidad de artículos. *
* - @tipo_stock char(9) tipo de operación a ser realizada: *
* - stock_com --> comprometido, *
* - stock_act --> actual, *
* - stock_des --> por despachar, *
* - stock_lle --> por llegar. *
* - @costo_b decimal(28,12) costo en la moneda base. *
* - @fecha_mov smalldatetime fecha del movimiento. *
* - @stotal_art decimal(28,12) cantidad de artículos en la *
* unidad secundaria. *
* - @costo_om decimal(28,12) costa en otra moneda. *
* - @total_uni decimal(28,12) unidad de la venta. *
* - @co_us_in char(6) usuario que realiza la operación. *
* - @co_sucu char(6) sucursal del movimiento. *
* - @r_stock_neg tinyint indica cual será el comportamien- *
* to con respecto al stock negativo: *
* - 0 --> indica que no se puede facturar en negativo. *
* - 1 --> indica que se debe preguntar al usuario si de- *
* sea facturar con estoc en negativo. *
* - 2 --> indica que puede facturar con stock en negati- *
* vo o que la respuesta fue positiva. *
* - @accion char(1) indica cual es el tipo de operación a *
* realizar sobre el stock: *
* - S --> aumentar el stock. *
* - R --> disminuir el stock. *
* - @desde char(4) indica desde donde se llama a este *
* procedimiento. *
* Descripción : Este procedimiento se encarga modificar el stock de un *
* artículo y de manejar el esquema de los casos de negati- *
* vo de acuerdo a los parámetros que recibe. *
* Desarrollador : Noel Quiroz A. *
******************************************************************************/
@co_art char(30),@co_alma char(6),@total_art decimal(28,12),@tipo_stock char(9),
@costo_b decimal(28,12),@fecha_mov smalldatetime,@stotal_art decimal(28,12),
@nro_lote char(10),@fech_lote smalldatetime,@costo_om decimal(28,12),
@total_uni decimal(28,12),@co_us_in char(6),@co_sucu char(6),@r_stock_neg tinyint,
@p_lotefec_amb bit,@p_lotefec_res bit,@accion char(1),@desde char(4)
as
declare @cantidad_act decimal (28,12),@scantidad_act decimal (28,12),
@total_artc decimal(28,12) ,@status_sal int,@des_art varchar(120),
@ult_cos_un decimal(28,12) ,@cos_pro_un decimal(28,12),
@ult_cos_om decimal(28,12) ,@cos_pro_om decimal(28,12),
@fec_ult_co smalldatetime ,@fec_pro_un smalldatetime,
@fec_ult_om smalldatetime ,@fec_pro_om smalldatetime,
@relac_aut int ,@uni_relac decimal(28,12),
@p_lotenro bit ,@p_lotefec bit,
@lote bit
select @des_art = art_des ,@cantidad_act = stock_act,
@ult_cos_un = ult_cos_un,@cos_pro_un = cos_pro_un,
@ult_cos_om = ult_cos_om,@cos_pro_om = cos_pro_om,
@fec_ult_co = fec_ult_co,@fec_pro_un = fec_cos_pr,
@fec_ult_om = fec_ult_om,@fec_pro_om = fec_pro_om,
@relac_aut = relac_aut ,@uni_relac = uni_relac,
@lote = lote
from art where co_art = @co_Art
if @relac_aut in (2,3) and @uni_relac != 0
begin
set @stotal_art = 0
end
select @p_lotenro = p_lotenro, @p_lotefec = p_lotefec from par_emp
/******************************************************************************
* Proceso para el Stock comprometido. *
******************************************************************************/
if @tipo_stock = 'stock_com'
begin
if @accion = 'S'
begin
update art set stock_com = stock_com + (@total_art * @total_uni),
sstock_com = sstock_com + @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock comprometido ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_com = stock_com + (@total_art * @total_uni),
sstock_com = sstock_com + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
update st_almac set stock_com = stock_com - (@total_art * @total_uni),
sstock_com = sstock_com - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
update art set stock_com = stock_com - (@total_art * @total_uni),
sstock_com = sstock_com - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock comprometido en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
/******************************************************************************
* Proceso para el Stock actual. *
******************************************************************************/
if @tipo_stock = 'stock_act'
begin
if @accion = 'S'
begin
/*Actualizar los costos*/
if @fecha_mov >= @fec_ult_co
begin
set @fec_ult_co = @fecha_mov
set @ult_cos_un = @costo_b
set @cos_pro_un = ((@ult_cos_un * @cantidad_act) + (@total_art * @costo_b))
/ (@cantidad_act + @total_art)
end
update art set stock_act = stock_act + (@total_art * @total_uni),
sstock_act = sstock_act + @stotal_art,
ult_cos_un = @ult_cos_un,
cos_pro_un = @cos_pro_un,
fec_ult_co = @fec_ult_co
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock actual en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock actual ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_act = stock_act + (@total_art * @total_uni),
sstock_act = sstock_act + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock actual en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
/******************************************************************************
* Manejo de lotes, para este fin se utilizan 3 variables: *
* - p_lotenro --> esta indica si en parámetros de la empresa está activada la *
* marca de trabajar los lotes por número. *
* - p_lotefec --> esta indica si en parámetros de la empresa está activada la *
* marca de trabajar los lotes por fecha de vencimiento. *
* - lote --> esta indica si el artículo en curso maneja lotes. *
******************************************************************************/
if (@p_lotenro = 1 or @p_lotefec = 1) and @lote = 1
begin
if len(rtrim(@nro_lote)) = space(0)
begin
select 3 as Errores,'El número de lote para el artículo ' + rtrim(@co_art) +
' no fue especificado '
return 3
end
if @fecha_mov > @fech_lote and @p_lotefec_res = 0
begin
if @p_lotefec_amb = 1
begin
select 3 as Errores,'El número de lote ' + rtrim(@nro_lote) + ' se encuentra vencido ' +
convert(varchar,@fech_lote,103)
return 3
end
else
if @p_lotefec_amb = 0
begin
select 2 as Errores,'El número de lote ' + rtrim(@nro_lote) + ' se encuentra vencido ' +
convert(varchar,@fech_lote,103) + '.' + char(13) + 'Desea Continuar?' as Mensaje
return 2
end
end
update st_lote set stock_act = stock_act - (@total_art * @total_uni),
@cantidad_act = stock_act - (@total_art * @total_uni),
sstock_act = sstock_act - @stotal_art,
@scantidad_act = sstock_act - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
and nro_lote = @nro_lote
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo actualizar el stock actual para el lote ' +
@nro_lote as Mensaje
RETURN 1
end
if @cantidad_act < 0
begin
if @r_stock_neg = 0
begin
if @desde in ('FACT','COMP')
select 3 as Errores,'No hay suficiente stock para el artículo ' + rtrim(@co_art) + ' almacén ' +
rtrim(@co_alma) + ' Nro lote ' + rtrim(@nro_lote) + '.' + char(13) +
'Stock actual: ' + convert(varchar,(@cantidad_act + (@total_art * @total_uni)))
as Mensaje
return 3
end
else
if @r_stock_neg = 2
begin
select 2 as Errores,'No hay suficiente stock para el artículo ' + rtrim(@co_art) + ' almacén ' +
rtrim(@co_alma) + ' Nro lote ' + rtrim(@nro_lote) + '.' + char(13) +
'Stock actual: ' + convert(varchar,(@cantidad_act + (@total_art * @total_uni))) + char(13) +
'Desea Continuar?' as Mensaje
return 2
end
end
end
if exists (select * from art where co_art = @co_art
and compuesto = 1
and @desde in ('FACT','COMP')
and stock_act < @total_art)
begin
select @total_artc = (@total_art - stock_act) from art where co_art = @co_art
exec @status_sal = pp_genera_compuesto @co_art,@co_alma,@total_artc,
@tipo_stock,@costo_b,@fecha_mov,
@stotal_art,@costo_om,@total_uni,
@co_us_in,@co_sucu,@r_stock_neg,
@accion
if @status_sal != 0
begin
return 0
end
end
if not exists(select * from st_almac where co_art = @co_art and co_alma = @co_alma)
Insert into st_almac (co_art, co_alma) values (@co_art, @co_alma)
update st_almac set stock_act = stock_act - (@total_art * @total_uni),
@cantidad_act = stock_act - (@total_art * @total_uni),
sstock_act = sstock_act - @stotal_art,
@scantidad_act = sstock_act - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo actualizar el stock actual para el almacen ' +
@co_alma as Mensaje
RETURN 1
end
if @cantidad_act < 0
begin
if @r_stock_neg = 0
begin
if @desde in ('FACT','COMP')
select 3 as Errores,'No hay suficiente stock, en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + char(13)
+ 'Stock actual: ' + convert(varchar,(@cantidad_act + (@total_art * @total_uni)))
as Mensaje
return 3
end
else
if @r_stock_neg = 2
begin
select 2 as Errores,'No hay suficiente stock, en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + ' Stock actual: ' +
convert(varchar,(@cantidad_act + (@total_art * @total_uni))) + '.' + char(13) +
'Desea Continuar?' as Mensaje
return 2
end
end
if @scantidad_act < 0 and @stotal_art != 0
begin
if @r_stock_neg = 0
begin
if @desde in ('FACT','COMP')
select 3 as Errores,'No hay suficiente stock(Secun), en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + char(13)
+ 'Stock actual: ' + convert(varchar,(@scantidad_act + (@stotal_art * @total_uni)))
as Mensaje
return 3
end
else
if @r_stock_neg = 2
begin
select 2 as Errores,'No hay suficiente stock(Secun), en el almacén: ' + rtrim(@co_alma) +
' para el artículo: ' + rtrim(@co_art) + ' ' + rtrim(@des_art) + '.' + ' Stock actual: ' +
convert(varchar,(@scantidad_act + (@stotal_art * @total_uni))) + '.' + char(13) +
'Desea Continuar?' as Mensaje
return 2
end
end
update art set stock_act = stock_act - (@total_art * @total_uni),
sstock_act = sstock_act - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock actual en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
/******************************************************************************
* Proceso para el Stock por despachar. *
******************************************************************************/
if @tipo_stock = 'stock_des'
begin
if @accion = 'S'
begin
update art set stock_des = stock_des + (@total_art * @total_uni),
sstock_des = sstock_des + @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock por despachar ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_des = stock_des + (@total_art * @total_uni),
sstock_des = sstock_des + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
update st_almac set stock_des = stock_des - (@total_art * @total_uni),
sstock_des = sstock_des - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
update art set stock_des = stock_des - (@total_art * @total_uni),
sstock_des = sstock_des - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock por despachar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
/******************************************************************************
* Proceso para el Stock por entregar. *
******************************************************************************/
if @tipo_stock = 'stock_lle'
begin
if @accion = 'S'
begin
update art set stock_lle = stock_lle + (@total_art * @total_uni),
sstock_lle = sstock_lle + @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
if not exists (select * from st_almac where co_alma = @co_alma
and co_art = @co_art)
begin
insert into st_almac (co_alma,co_art)
values (@co_alma,@co_art)
if @@error != 0
begin
select 1 as Errores,'No se pudo insertar registro en la tabla de st_almac para el stock poe llegar ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
update st_almac set stock_lle = stock_lle + (@total_art * @total_uni),
sstock_lle = sstock_lle + @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
end
else
begin
update st_almac set stock_lle = stock_lle - (@total_art * @total_uni),
sstock_lle = sstock_lle - @stotal_art
where co_art = @co_art
and co_alma = @co_alma
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo aumentar el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art + ' en el almacén ' +
rtrim(@co_alma) as Mensaje
RETURN 1
end
update art set stock_lle = stock_lle - (@total_art * @total_uni),
sstock_lle = sstock_lle - @stotal_art
where co_art = @co_art
if @@error != 0 or @@rowcount = 0
begin
select 1 as Errores,'No se pudo disminuir el stock por llegar en la tabla de artículos ' +
'para el artículo ' + rtrim(@co_art) + ' ' + @des_art as Mensaje
RETURN 1
end
end
end
RETURN