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

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月之后月份月结数据删除已完成!
******************************/

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

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

  1. 简简单单 My SQL 学习笔记(2)——分组和简单数据的查询

    初始数据 创建表(要记得先选择好我们的数据库 use+数据库名) create table student( studentno int(4) primary key not null auto_in ...

  2. 初学redux笔记,及一个最简单的redux实例

    categories: 笔记 tags: react redux 前端框架 把初学redux的一些笔记写了下来 分享一个入学redux很合适的demo, 用redux实现计数器 这是从阮一峰老师git ...

  3. 使用oracle 的 PL/Sql 定时执行一个存储过程

    /* 使用oracle 的 PL/Sql 定时执行一个存储过程 测试目的:在表 tab 中间隔一分钟插入一条数据 实现方案: 1.通过 oracle 中 dbms_job 完成存储过程的定时调用 2. ...

  4. sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...

    准备工作: 我需要一张User表,这张表有几个字段,还有一个自增长的数字id,表结构如下: 这是一张比现实应用中简单的多的用户表,UserID是自增长字段. 开始执行一个最简单的INSERT: INS ...

  5. [PL/SQL] 请教大家一个问题,存储过程中需要几个commit?

    查看: 10357|回复: 17 收藏    [PL/SQL] 请教大家一个问题,存储过程中需要几个commit? [复制链接]     yi888long 注册会员 精华贴数 0 专家积分 1 技术 ...

  6. sql存储过程几个简单例子

    导读:sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解. 例1: cr ...

  7. TensorFlow笔记(3)——利用TensorFlow和MNIST数据集训练一个最简单的手写数字识别模型...

    前言 当我们开始学习编程的时候,第一件事往往是学习打印"Hello World".就好比编程入门有Hello World,机器学习入门有MNIST. MNIST是一个入门级的计算机 ...

  8. linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader

    直接看代码,即使已经理解了代码,但是还是会有种没有学到手的感觉.真正的掌握来自实践,来自己动手做出来."简单AB任务切换程序"系列文章的目的是,在bochs下,实践出简单AB两个任 ...

  9. SQL学习笔记_Aliyun4

    SQL学习笔记_Aliyun4 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql ...

最新文章

  1. java接口如何定义常量 c_java接口定义常量研究
  2. css伪类元素及选择器
  3. Divan and Kostomuksha (easy version) dp,gcd(2100)
  4. 趣学python3(23)-队列
  5. 【机器学习】Facets:评估机器学习数据集质量利器 (来自Google、可交互、可可视化)...
  6. react中key的正确使用方式
  7. php原生读取excel文件夹,原生php实现excel文件读写的方法分析php技巧
  8. 中小微企业税务数据的指标分析
  9. c语言50个小程序,C语言50小程序.doc
  10. 斯坦福大学深度学习公开课cs231n学习笔记(7)神经网络防止数据过拟合:损失函数和正则化
  11. Keil5下载及安装
  12. 值得学习17个C/C++ 超经典开源项目,面试加分
  13. 计算机主机hs编码,电脑设备的进出口品名
  14. 第39级台阶 蓝桥杯递归 java
  15. 【数据攻略】字节面试真题(含答案)+100道面试题库
  16. (翻译)完型填空(Fill in the Blanks)
  17. 恭喜清华姚班校友马腾宇等18名华人科学家获得2021年斯隆奖学金!
  18. 解决PIP下载安装速度慢
  19. 跳楼梯--递归--动态规划--过渡
  20. hsqldb mysql 语法_[spring batch]建表语句(hsqldb改mysql)

热门文章

  1. 如何评价CVPR 2022的best paper?
  2. 大学生日记 我走出了农村 却永远走不进城市
  3. 2018-2019-2 20175227张雪莹 《Java程序设计》 实验一 Java开发环境的熟悉
  4. pdf口令安全性破解
  5. java continu语句
  6. android电视 优酷视频,将优酷视频投屏到智能电视上,竟然还有这种操作
  7. 阿里女合伙人身价达40亿,曾经月薪500小小前台,如何成功逆袭?
  8. 如何对台式计算机 笔记本进行日常维护,笔记本电脑日常怎么保养?这些方法别错过了...
  9. C# Matrix类
  10. 2021年G3锅炉水处理考试内容及G3锅炉水处理试题及解析