批号分摊(预调拨可用于门店铺货)sql存储过程
2015-02-10 17:22
288 查看
USE [jxgx]
GO
/****** Object: StoredProcedure [dbo].[batch_ft] Script Date: 02/10/2015 17:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[batch_ft]
@outwhid char(11)
,@inwhid char(11)
,@whorgid char(11)
as
declare @errcode integer
select @errcode = 7000
declare @return integer
set @return=0
--启动事务处理
declare @tran_point int
set @tran_point = @@trancount
if @tran_point = 0
begin tran tran_batch_ft
else
save tran tran_batch_ft
if exists (select * from sysobjects where id = object_id(N'[dbo].[#anglect]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table #anglect
if exists (select * from sysobjects where id = object_id(N'[dbo].[#mdbalance]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table #mdbalance
if exists (select * from sysobjects where id = object_id(N'[dbo].[#zbbalance]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table #zbbalance
create table #anglect(
[inLocatId] [char](11) NULL,
[outLocatId] [char](11) NULL,
[GoodsId] [char](11) NULL,
[OwnerId] [char](11) NULL,
[AngleId] [char](11) NULL,
[EntId] [char](11) NULL,
[Num] [decimal](14, 2) NULL,
[MovePrice] [decimal](14, 6) NULL
)
--查询销售日均情况--入库
select (sum(b.BaseNum) - (SUM(w.PlaceNum)-SUM(isnull(x.placeNum,0)))) as basenum,
b.WHId,b.LocatId,b.OwnerId,b.GoodsId into #mdbalance
from saleOutMt a
join SaleOutDt b on a.BillNo = b.BillNo and a.EntId = b.EntId
join ANGLEBALANCE w on b.AngleId= w.AngleId and b.GoodsId = w.GoodsId
and b.EntId = w.EntId and b.OwnerId = w.OwnerId and b.LocatId = w.LocatId
left join (select
sum(basenum) as placeNum,a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId
from GOODSOCCU a
group by a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId) x on b.GoodsId = x.GoodsId
and b.OwnerId = x.OwnerId and b.LocatId = x.LocatId and b.EntId = x.EntId
and b.GoodsId = x.GoodsId and b.WHId = x.WHId
where a.ruleid = '4szcn61oa8b0tz79'
--日期设置 前3天销量
--and a.Dates between CONVERT(varchar(100) ,DATEADD(DD,-4,getdate()),23) and CONVERT(varchar(100) ,DATEADD(DD,-1,getdate()),23)
--日期设置 昨天销量
and a.Dates = CONVERT(varchar(100) ,DATEADD(DD,-1,getdate()),23)
and b.WHId = @inwhid
group by b.WHId,b.LocatId,b.OwnerId,b.GoodsId
having (sum(b.BaseNum) - (SUM(w.PlaceNum)-SUM(isnull(x.placeNum,0)))) > 0
declare @basenum int
declare @GoodsId char(11)
declare @locatid char(11)
declare @ownerid char(11)
declare pcurr cursor for select basenum,goodsid,locatid,ownerid from #mdbalance
open pcurr
fetch next from pcurr into @basenum,@GoodsId,@locatid,@ownerid
while (@@fetch_status = 0)
begin
declare @indexNum int
set @indexNum = @basenum
--查询整件的库存--出库
select a.GoodsId,a.EntId,a.LocatId,a.AngleId,a.OwnerId,d.ValDate
,SUM(a.PlaceNum) - SUM(isnull(x.basenum,0)) as placeNum
into #zbbalance
from ANGLEBALANCE a
join STOREROOM b on a.LocatId = b.LocatId
join STOREHOUSE c on b.WHId = c.WHId
join BATCHCODE d on a.GoodsId = d.GoodsId and a.AngleId = d.AngleId
left join (select
sum(basenum) as basenum,a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId
from GOODSOCCU a
group by a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId) x on a.GoodsId = x.GoodsId
and a.OwnerId = x.OwnerId and a.LocatId = x.LocatId and a.EntId = x.EntId
and a.GoodsId = x.GoodsId and c.WHId = x.WHId
where c.WHId = @outwhid
and a.GoodsId = @GoodsId
and a.OwnerId = @ownerid
group by a.GoodsId,a.EntId,a.LocatId,a.AngleId,a.OwnerId,d.ValDate
having SUM(a.PlaceNum) - SUM(isnull(x.basenum,0)) > 0
order by d.ValDate
----批量分摊批号处理
while @indexNum > 0
begin
---不存在时跳出循环
if not exists (select top 1 placenum from #zbbalance where placenum > 0)
begin
set @indexNum = 0;
break;
end
--满足最大批号要求,进行下一步处理
if @indexNum > (select top 1 PlaceNum from #zbbalance)
begin
--插入暂存表中
insert into #anglect(inLocatId,outLocatId,goodsid,ownerid,angleid,num,EntId)
select @locatid,locatid,goodsid,ownerid,angleid,PlaceNum,EntId
from #zbbalance
where AngleId = (select top 1 AngleId PlaceNum from #zbbalance)
and GoodsId = (select top 1 GoodsId from #zbbalance)
and LocatId = (select top 1 LocatId PlaceNum from #zbbalance)
and OwnerId = (select top 1 OwnerId PlaceNum from #zbbalance)
---减掉已经处理过的数量
set @indexNum = @indexNum - (select top 1 PlaceNum from #zbbalance);
--删除处理过的总部库存记录
delete from #zbbalance where AngleId = (select top 1 AngleId PlaceNum from #zbbalance)
and GoodsId = (select top 1 GoodsId from #zbbalance)
and LocatId = (select top 1 LocatId PlaceNum from #zbbalance)
and OwnerId = (select top 1 OwnerId PlaceNum from #zbbalance)
if @@error <> 0 or @@rowcount = 0
begin
set @return=11
goto err_lab
end
end
--总部库存完全满足时
if @indexNum <= (select top 1 PlaceNum from #zbbalance)
--插入暂存表中
begin
insert into #anglect(inLocatId,outLocatId,goodsid,ownerid,angleid,num,EntId)
select @locatid,locatid,goodsid,ownerid,angleid,@indexNum,EntId
from #zbbalance
where AngleId = (select top 1 AngleId PlaceNum from #zbbalance)
and GoodsId = (select top 1 GoodsId from #zbbalance)
and LocatId = (select top 1 LocatId PlaceNum from #zbbalance)
and OwnerId = (select top 1 OwnerId PlaceNum from #zbbalance)
--全部满足后跳出循环
set @indexNum = 0;
break;
if @@error <> 0 or @@rowcount = 0
begin
set @return=12
goto err_lab
end
end
end
if @indexNum < = 0
begin
drop table #zbbalance
end
fetch next from pcurr into @basenum,@GoodsId,@locatid,@ownerid
end
close pcurr
deallocate pcurr
<
c891
br />
---铺货检索
select distinct
b.LocatCode as outlocatcode,b.LocatName as outlocatname,b.LocatId as OutLocatId
,j.LocatCode as inlocatcode,j.LocatName as inlocatname,j.LocatId as inLocatId
,d.BatchCode,d.ProduceDate,d.ValDate,d.AngleId
,d.gebjj as Cost,d.gebjj as movePrice,d.gebjj as basePrice
,a.Num,a.Num as baseNum,a.Num as jynum
,a.Num * d.gebjj as Amount,a.Num * d.gebjj as costAmt
,g.RetailP,a.Num * g.RetailP as RetailAmt
,h.PackId,h.unit,h.Meas
,f.GoodsCode,f.GoodsName,f.GoodsSpec,f.Manufacturer,f.Place
,g.ApprovalNo,g.ManagePack,g.Formula,g.GCategory
,@inwhid as inwhid,@outwhid as outwhid,@whorgid as whorgid
,o.ORGID as ownerid,o.ORGNAME as ownername,g.zlnum,ISNULL(x1.innum,0) as innum,ISNULL(x2.outnum,0) as outnum
,a.*
from #anglect a
join STOREROOM b on a.outLocatId = b.LocatId and a.EntId = b.EntId
join STOREROOM j on a.inLocatId = j.LocatId and a.EntId = j.EntId
join BATCHCODE d on a.AngleId = d.AngleId
and a.GoodsId = d.GoodsId and a.EntId = d.EntId
join GOODSDOC f on a.GoodsId = f.GoodsId and a.EntId = f.EntId
join GOODSATTR g on f.GoodsId = g.GoodsId and f.EntId = g.EntId
left join PGPRICE h on a.GoodsId = h.GoodsId and a.EntId = h.EntId
and h.IsBase = 'Y'
join ORGDOC o on a.OwnerId = o.ORGID and a.EntId = o.ENTID
left join (select a.goodsid,d.batchcode,sum(a.placenum) as innum from AngleBalance a
join STOREROOM b on a.LocatId=b.LocatId
join STOREHOUSE c on b.WHId=c.WHId
left join BATCHCODE d on a.angleid=d.angleid
where c.WHId=@inwhid
group by a.goodsid,d.batchcode
) x1 on x1.GoodsId=d.GoodsId and x1.batchcode =d.batchcode
left join (select a.goodsid,d.batchcode,sum(a.placenum) as outnum from AngleBalance a
join STOREROOM b on a.LocatId=b.LocatId
join STOREHOUSE c on b.WHId=c.WHId
left join BATCHCODE d on a.angleid=d.angleid
where c.WHId=@outwhid
group by a.goodsid,d.batchcode
) x2 on x2.GoodsId=d.GoodsId and x2.batchcode =d.batchcode
order by f.GoodsCode
ok_lab:
--删除临时表
drop table #mdbalance
drop table #anglect
--结束事务处理
commit_lab:
if @tran_point = 0
commit tran tran_batch_ft
goto return_lab
err_lab:
if @return < 10000
set @return = cast(cast(@errcode as varchar(6)) +
right(cast(10000 + @return as varchar(5)),4) as int)
rollback tran tran_batch_ft
return_lab:
return @return
GO
/****** Object: StoredProcedure [dbo].[batch_ft] Script Date: 02/10/2015 17:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[batch_ft]
@outwhid char(11)
,@inwhid char(11)
,@whorgid char(11)
as
declare @errcode integer
select @errcode = 7000
declare @return integer
set @return=0
--启动事务处理
declare @tran_point int
set @tran_point = @@trancount
if @tran_point = 0
begin tran tran_batch_ft
else
save tran tran_batch_ft
if exists (select * from sysobjects where id = object_id(N'[dbo].[#anglect]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table #anglect
if exists (select * from sysobjects where id = object_id(N'[dbo].[#mdbalance]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table #mdbalance
if exists (select * from sysobjects where id = object_id(N'[dbo].[#zbbalance]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table #zbbalance
create table #anglect(
[inLocatId] [char](11) NULL,
[outLocatId] [char](11) NULL,
[GoodsId] [char](11) NULL,
[OwnerId] [char](11) NULL,
[AngleId] [char](11) NULL,
[EntId] [char](11) NULL,
[Num] [decimal](14, 2) NULL,
[MovePrice] [decimal](14, 6) NULL
)
--查询销售日均情况--入库
select (sum(b.BaseNum) - (SUM(w.PlaceNum)-SUM(isnull(x.placeNum,0)))) as basenum,
b.WHId,b.LocatId,b.OwnerId,b.GoodsId into #mdbalance
from saleOutMt a
join SaleOutDt b on a.BillNo = b.BillNo and a.EntId = b.EntId
join ANGLEBALANCE w on b.AngleId= w.AngleId and b.GoodsId = w.GoodsId
and b.EntId = w.EntId and b.OwnerId = w.OwnerId and b.LocatId = w.LocatId
left join (select
sum(basenum) as placeNum,a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId
from GOODSOCCU a
group by a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId) x on b.GoodsId = x.GoodsId
and b.OwnerId = x.OwnerId and b.LocatId = x.LocatId and b.EntId = x.EntId
and b.GoodsId = x.GoodsId and b.WHId = x.WHId
where a.ruleid = '4szcn61oa8b0tz79'
--日期设置 前3天销量
--and a.Dates between CONVERT(varchar(100) ,DATEADD(DD,-4,getdate()),23) and CONVERT(varchar(100) ,DATEADD(DD,-1,getdate()),23)
--日期设置 昨天销量
and a.Dates = CONVERT(varchar(100) ,DATEADD(DD,-1,getdate()),23)
and b.WHId = @inwhid
group by b.WHId,b.LocatId,b.OwnerId,b.GoodsId
having (sum(b.BaseNum) - (SUM(w.PlaceNum)-SUM(isnull(x.placeNum,0)))) > 0
declare @basenum int
declare @GoodsId char(11)
declare @locatid char(11)
declare @ownerid char(11)
declare pcurr cursor for select basenum,goodsid,locatid,ownerid from #mdbalance
open pcurr
fetch next from pcurr into @basenum,@GoodsId,@locatid,@ownerid
while (@@fetch_status = 0)
begin
declare @indexNum int
set @indexNum = @basenum
--查询整件的库存--出库
select a.GoodsId,a.EntId,a.LocatId,a.AngleId,a.OwnerId,d.ValDate
,SUM(a.PlaceNum) - SUM(isnull(x.basenum,0)) as placeNum
into #zbbalance
from ANGLEBALANCE a
join STOREROOM b on a.LocatId = b.LocatId
join STOREHOUSE c on b.WHId = c.WHId
join BATCHCODE d on a.GoodsId = d.GoodsId and a.AngleId = d.AngleId
left join (select
sum(basenum) as basenum,a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId
from GOODSOCCU a
group by a.AngleId,a.OwnerId,a.LocatId,a.EntId,a.WHId,a.GoodsId) x on a.GoodsId = x.GoodsId
and a.OwnerId = x.OwnerId and a.LocatId = x.LocatId and a.EntId = x.EntId
and a.GoodsId = x.GoodsId and c.WHId = x.WHId
where c.WHId = @outwhid
and a.GoodsId = @GoodsId
and a.OwnerId = @ownerid
group by a.GoodsId,a.EntId,a.LocatId,a.AngleId,a.OwnerId,d.ValDate
having SUM(a.PlaceNum) - SUM(isnull(x.basenum,0)) > 0
order by d.ValDate
----批量分摊批号处理
while @indexNum > 0
begin
---不存在时跳出循环
if not exists (select top 1 placenum from #zbbalance where placenum > 0)
begin
set @indexNum = 0;
break;
end
--满足最大批号要求,进行下一步处理
if @indexNum > (select top 1 PlaceNum from #zbbalance)
begin
--插入暂存表中
insert into #anglect(inLocatId,outLocatId,goodsid,ownerid,angleid,num,EntId)
select @locatid,locatid,goodsid,ownerid,angleid,PlaceNum,EntId
from #zbbalance
where AngleId = (select top 1 AngleId PlaceNum from #zbbalance)
and GoodsId = (select top 1 GoodsId from #zbbalance)
and LocatId = (select top 1 LocatId PlaceNum from #zbbalance)
and OwnerId = (select top 1 OwnerId PlaceNum from #zbbalance)
---减掉已经处理过的数量
set @indexNum = @indexNum - (select top 1 PlaceNum from #zbbalance);
--删除处理过的总部库存记录
delete from #zbbalance where AngleId = (select top 1 AngleId PlaceNum from #zbbalance)
and GoodsId = (select top 1 GoodsId from #zbbalance)
and LocatId = (select top 1 LocatId PlaceNum from #zbbalance)
and OwnerId = (select top 1 OwnerId PlaceNum from #zbbalance)
if @@error <> 0 or @@rowcount = 0
begin
set @return=11
goto err_lab
end
end
--总部库存完全满足时
if @indexNum <= (select top 1 PlaceNum from #zbbalance)
--插入暂存表中
begin
insert into #anglect(inLocatId,outLocatId,goodsid,ownerid,angleid,num,EntId)
select @locatid,locatid,goodsid,ownerid,angleid,@indexNum,EntId
from #zbbalance
where AngleId = (select top 1 AngleId PlaceNum from #zbbalance)
and GoodsId = (select top 1 GoodsId from #zbbalance)
and LocatId = (select top 1 LocatId PlaceNum from #zbbalance)
and OwnerId = (select top 1 OwnerId PlaceNum from #zbbalance)
--全部满足后跳出循环
set @indexNum = 0;
break;
if @@error <> 0 or @@rowcount = 0
begin
set @return=12
goto err_lab
end
end
end
if @indexNum < = 0
begin
drop table #zbbalance
end
fetch next from pcurr into @basenum,@GoodsId,@locatid,@ownerid
end
close pcurr
deallocate pcurr
<
c891
br />
---铺货检索
select distinct
b.LocatCode as outlocatcode,b.LocatName as outlocatname,b.LocatId as OutLocatId
,j.LocatCode as inlocatcode,j.LocatName as inlocatname,j.LocatId as inLocatId
,d.BatchCode,d.ProduceDate,d.ValDate,d.AngleId
,d.gebjj as Cost,d.gebjj as movePrice,d.gebjj as basePrice
,a.Num,a.Num as baseNum,a.Num as jynum
,a.Num * d.gebjj as Amount,a.Num * d.gebjj as costAmt
,g.RetailP,a.Num * g.RetailP as RetailAmt
,h.PackId,h.unit,h.Meas
,f.GoodsCode,f.GoodsName,f.GoodsSpec,f.Manufacturer,f.Place
,g.ApprovalNo,g.ManagePack,g.Formula,g.GCategory
,@inwhid as inwhid,@outwhid as outwhid,@whorgid as whorgid
,o.ORGID as ownerid,o.ORGNAME as ownername,g.zlnum,ISNULL(x1.innum,0) as innum,ISNULL(x2.outnum,0) as outnum
,a.*
from #anglect a
join STOREROOM b on a.outLocatId = b.LocatId and a.EntId = b.EntId
join STOREROOM j on a.inLocatId = j.LocatId and a.EntId = j.EntId
join BATCHCODE d on a.AngleId = d.AngleId
and a.GoodsId = d.GoodsId and a.EntId = d.EntId
join GOODSDOC f on a.GoodsId = f.GoodsId and a.EntId = f.EntId
join GOODSATTR g on f.GoodsId = g.GoodsId and f.EntId = g.EntId
left join PGPRICE h on a.GoodsId = h.GoodsId and a.EntId = h.EntId
and h.IsBase = 'Y'
join ORGDOC o on a.OwnerId = o.ORGID and a.EntId = o.ENTID
left join (select a.goodsid,d.batchcode,sum(a.placenum) as innum from AngleBalance a
join STOREROOM b on a.LocatId=b.LocatId
join STOREHOUSE c on b.WHId=c.WHId
left join BATCHCODE d on a.angleid=d.angleid
where c.WHId=@inwhid
group by a.goodsid,d.batchcode
) x1 on x1.GoodsId=d.GoodsId and x1.batchcode =d.batchcode
left join (select a.goodsid,d.batchcode,sum(a.placenum) as outnum from AngleBalance a
join STOREROOM b on a.LocatId=b.LocatId
join STOREHOUSE c on b.WHId=c.WHId
left join BATCHCODE d on a.angleid=d.angleid
where c.WHId=@outwhid
group by a.goodsid,d.batchcode
) x2 on x2.GoodsId=d.GoodsId and x2.batchcode =d.batchcode
order by f.GoodsCode
ok_lab:
--删除临时表
drop table #mdbalance
drop table #anglect
--结束事务处理
commit_lab:
if @tran_point = 0
commit tran tran_batch_ft
goto return_lab
err_lab:
if @return < 10000
set @return = cast(cast(@errcode as varchar(6)) +
right(cast(10000 + @return as varchar(5)),4) as int)
rollback tran tran_batch_ft
return_lab:
return @return
相关文章推荐
- 一个用于返回所有存储过程及其参数的T-SQL
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
- 分页存储过程(只用于SQL2005)
- 用于执行(计算) "字符串表达式" 的 T-SQL 存储过程
- SQL日期格式化函数(类似格式函数)一般用于存储过程中
- sql中一个分解字符串的实用函数(也可用于存储过程中的 in 查询)
- 存储过程 VS 嵌入代码的sql语句
- SQL过程自动C#封装,支持从表到基本存储过程生成,
- PL/SQL块或者存储过程中不能执行DDL,可以使用动态SQL
- 一个简单的sql存储过程
- [SQL]对于分页存储过程,李洪根说...(收藏)
- SQL Server加过密的存储过程可以被解密?
- 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程
- 自动产生存储过程的sql 脚本
- 在SQL*PLUS下建立、运行存储过程
- 利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。
- 将 SQL Server 存储过程用于数据访问
- 存储过程备份SQL日志
- T-SQL 存储过程创建 PDF 格式文件(报表)
- 自动产生存储过程的sql 脚本