SQL存储过程【笔记】一个较简单的库存月结

关于库存月结的一个存储过程:

 

1、测试版本)

select @@version

/*********************************
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) 
	Oct 14 2005 00:33:37 
	Copyright (c) 1988-2005 Microsoft Corporation
	Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
*********************************/


2、相关表)

SM_Company   --公司信息表
BS_Product   --产品信息表
IM_Stock   --库存表
IM_In    --入库主表
IM_Out    --出库主表
StockStorage  --月结主表
StockStorageDetail --月结明细表 

3、存储过程脚本)

--库存月结存储过程
/**
Q1:该公司未曾做月结,与出入库最早日期比较,提醒需要从某一月份开始做月结;
Q2:本次月结之前某几个月份未曾做月结,提醒要做完整月结;
Q3:正确月结的计算。
**/

alter procedure LS_Get_IMStockMonth
@companyid int,				--月结公司id
@date datetime,				--月结月份
@staffid int,				--月结人id
@warehouseid int,			--月结仓库id
@createtime datetime,		--月结创建日期
@remark text,				--月结备注
@flag int,					--操作:0 月结,1 删除
@storid int,				--月结主表id
@text varchar(1000) output	--月结提示
as
begin
set transaction isolation level read uncommitted
set nocount on
begin transaction
declare @mindatein datetime
declare @mindateout datetime
declare @monthdate datetime
declare @storageId int
declare @err int
declare @month int
declare @maxdate datetime

select @mindatein = min(a.createtime)
from IM_In a join IM_Warehouse b on a.warehouseid = b.id
where b.companyid = @companyid and b.id = @warehouseid
select @mindateout = min(a.createtime)
from IM_Out a join IM_Warehouse b on a.warehouseid = b.id
where b.companyid = @companyid and b.id = @warehouseid
--得到发生库存变化的初始时间
select @monthdate = (case when @mindatein<@mindateout then @mindatein else @mindateout end)

--判断是否删除月结数据
if @flag=1
goto nextdelete
else
begin
select @maxdate = max(paperDate) from StockStorage where companyid=@companyid and warehouseid=@warehouseid
if exists (select 1 from StockStorage 
		where companyid=@companyid and warehouseid=@warehouseid 
			and convert(varchar(6),paperDate,112)=convert(varchar(6),@date,112))
begin
set @text = '1,公司'+replace(convert(varchar(7),@date,120),'-','年')+'月月结数据已新增!'
commit tran
return
end
--判断月结月份前是否存在断月份月结的情况
/*找出从有出入库其实日期到做本次月结日期的所有月份*/
select @maxdate = isnull(@maxdate,@monthdate)
select @month = datediff(mm,@maxdate,@date)
--判断在这些月份中是否存在断月份月结的情况
if @month < 0 or @month > 1
begin
set @text = '1,公司'+replace(convert(varchar(7),@date,120),'-','年')+'月之前未做月结数据或需从'
					+replace(convert(varchar(7),@monthdate,120),'-','年')+'月做月结!'
commit tran
return
end
else
goto nextinsert	--跳转至月结主表及明细表插入节点
end

nextinsert:
--插入月结主表对应数据
insert into StockStorage
select @companyid,@date,@staffid,@warehouseid,@createtime,@remark
--获取插入到月结主表最新的主键id
select @storageId = scope_identity()

/*计算库存月结数据逻辑SQL语句,可以利用临时表或with cte的用法,下文以cte为主。*/

--向月结子表插入数据
insert into StockStorageDetail
select @storageId,productid,quantity
from cte
if(@@error<>0) goto Failure
commit transaction
set @text = '0,公司'+replace(convert(varchar(7),@date,120),'-','年')+'月月结数据插入已完成!'
return

nextdelete:
select @companyid = companyid from StockStorage where id = @storid
select @warehouseid = warehouseid from StockStorage where id = @storid
select @date = paperDate from StockStorage where id = @storid
--删除子表数据,删除对应月份及之后做的所有月结数据
delete b
from StockStorage a join StockStorageDetail b on a.id = b.storageId
where a.companyid = @companyid and a.warehouseid = @warehouseid
		and convert(varchar(6),a.paperDate,112) >= convert(varchar(6),@date,112)
select @err = abs(@@error)
--删除主表数据,删除对应月份及之后做的所有月结数据
delete from StockStorage
where companyid = @companyid and warehouseid = @warehouseid
		and convert(varchar(6),paperDate,112) >= convert(varchar(6),@date,112)
select @err = @err + abs(@@error)
if(@err<>0) goto Failure
commit transaction
set @text = '0,公司'+replace(convert(varchar(7),@date,120),'-','年')+'月之后月份月结数据删除已完成!'
return

Failure:
rollback transaction
set @text = '1,公司'+replace(convert(varchar(7),@date,120),'-','年')+'月月结数据出现异常!'
commit tran
return

set nocount off

end
go


4、测试)

--做任意月份月结,提示月结初始月份
declare @str varchar(1000)
exec LS_Get_IMStockMonth 15,'2011-11-30',238,47,'2012-02-20',null,0,null,@str output
select @str

/*****************************
1,公司2011年11月之前未做月结数据或需从2011年08月做月结!
******************************/

--做2011年10月份月结数据
declare @str varchar(1000)
exec LS_Get_IMStockMonth 15,'2011-10-30',238,47,'2012-02-20',null,0,null,@str output
select @str

/*****************************
1,公司2011年10月之前未做月结数据或需从2011年08月做月结!
******************************/

--做2011年08月份月结数据
declare @str varchar(1000)
exec LS_Get_IMStockMonth 15,'2011-08-30',238,47,'2012-02-20',null,0,null,@str output
select @str

/*****************************
0,公司2011年08月月结数据插入已完成!
******************************/

--做2011年10月份月结数据
declare @str varchar(1000)
exec LS_Get_IMStockMonth 15,'2011-10-30',238,47,'2012-02-20',null,0,null,@str output
select @str

/*****************************
1,公司2011年10月之前未做月结数据或需从2011年08月做月结!
******************************/

--做2011年09月份月结数据
declare @str varchar(1000)
exec LS_Get_IMStockMonth 15,'2011-09-30',238,47,'2012-02-20',null,0,null,@str output
select @str

/*****************************
0,公司2011年09月月结数据插入已完成!
******************************/

--删除2011年08月份月结数据,会删除之后所有月份月结
select * from StockStorage where companyid = 15
/*****************************
id          companyId   paperDate               
----------- ----------- ----------------------- 
24          15          2011-08-30 00:00:00.000 
25          15          2011-09-30 00:00:00.000 

(2 行受影响)
*****************************/
declare @str varchar(1000)
exec LS_Get_IMStockMonth 15,'2011-08-30',238,47,'2012-02-20',null,1,24,@str output
select @str

/*****************************
0,公司2011年08月之后月份月结数据删除已完成!
******************************/


表结构就不用贴了,看下表名就知道里面有什么了,在这里做个标记,以防后续改进之用!

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值