当前位置: 代码迷 >> Sql Server >> 写1算法思路
  详细解决方案

写1算法思路

热度:47   发布时间:2016-04-24 18:21:17.0
写一算法思路
如果3月1号入库4000件,然后3月15号出库2000件。
只要库存>0,我可以随意改日期 。即3月1号可改为1号到15号中任意一个日期 。
但改为16号报错。

例:3月1号改为3月14号 4000-2000 >0 OK 可以更改
       3月1号改为3月15号 4000-2000>0  OK 可以更改
       3月1号改为3月16号 时,15号没法出库报错。
这个怎么写SQL。

------解决方案--------------------

-- 建测试表
create table ly(nid int identity(1,1),ndate varchar(15),ntype varchar(10),nqty int)

-- 建触发器
create trigger tr_ly on ly
for update
as
begin
 if update(ndate)
 begin
  select row_number() over(order by cast(ndate as datetime)) 'rn',ntype,nqty
   into #t
   from ly

  if exists(
   select 1 from #t t
   where (select sum(case u.ntype 
                     when '入' then u.nqty 
                     when '出' then -1*u.nqty 
                     else 0 end) 'inv' 
          from #t u
          where u.rn<=t.rn)<0
     )
  begin
   print '库存<0,不能调整.'
   rollback tran
  end
 end
end


-- 测试1
truncate table ly

insert into ly(ndate,ntype,nqty)
 select '2014-03-01','入',4000 union all
 select '2014-03-15','出',2000


-- 3月1号改为3月14号 4000-2000 >0 OK 可以更改
update ly set ndate='2014-03-14' where nid=1

select * from ly
/*
nid         ndate           ntype      nqty
----------- --------------- ---------- -----------
1           2014-03-14      入          4000
2           2014-03-15      出          2000

(2 row(s) affected)
*/


-- 3月1号改为3月15号 4000-2000>0  OK 可以更改
update ly set ndate='2014-03-15' where nid=1

select * from ly
/*
nid         ndate           ntype      nqty
----------- --------------- ---------- -----------
1           2014-03-15      入          4000
2           2014-03-15      出          2000

(2 row(s) affected)
*/


-- 3月1号改为3月16号 时,15号没法出库报错
update ly set ndate='2014-03-16' where nid=1
/*
(2 row(s) affected)
库存<0,不能调整.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/

select * from ly
/*
nid         ndate           ntype      nqty
----------- --------------- ---------- -----------
1           2014-03-15      入          4000
2           2014-03-15      出          2000

(2 row(s) affected)
*/


-- 测试2
truncate table ly

insert into ly(ndate,ntype,nqty)
 select '2014-03-01','入',4000 union all
 select '2014-03-15','出',2000 union all
 select '2014-03-16','入',1000 union all
 select '2014-03-17','出',3000 


-- 若把1号入的4000调到15号后都报错。
update ly set ndate='2014-03-16' where nid=1
/*
(4 row(s) affected)
库存<0,不能调整.
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
*/

select * from ly
/*
nid         ndate           ntype      nqty
  相关解决方案