导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

当日志记录表发生新增、删除、修改时,触发相应仓库表发生相应的数量变化

ingernew 2003-12-16 06:01:54
我有一仓库进出日志记录表,当日志记录表发生新增、删除、修改时,触发相应仓库表发生相应的数量变化。
日志记录表中又有一个bit字段来区别是入还是出,请问这样的触发器怎样写!
日志记录表的字段为:
产品编号、仓库、入出(bit)、数量

仓库表为:
产品编号、仓库、数量

谢谢大家!!
...全文
28 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
--解决上面的问题.出仓不够

--创设入出为0时代表入,为1时代表出
create trigger t_process on 日志记录表
for insert,update,delete
as
--判断是否有足够的库存
if exists(select 1 from 仓库表 a join(
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from inserted group by 产品编号,仓库
) b on a.产品编号=b.产品编号 and a.仓库=b.仓库
where isnull(a.数量,0)+isnull(b.数量,0)<0)
begin
raiserror('库存不足,操作无法进行',1,16)
rollback tran
end
else
begin
--更新仓库表中已经有产品的数量
update 仓库表 set 数量=isnull(a.数量,0)+isnull(b.数量,0)
from 仓库表 a join(
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from inserted group by 产品编号,仓库
) b on a.产品编号=b.产品编号 and a.仓库=b.仓库

--插入仓库表中不存在的产品数量
insert into 仓库表(产品编号,仓库,数量)
select a.* from (
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from inserted group by 产品编号,仓库
) a left join 仓库表 b on a.产品编号=b.产品编号 and a.仓库=b.仓库
where b.产品编号 is null and b.仓库 is null
end

--减少删除的产品数量
update 仓库表 set 数量=isnull(a.数量,0)-isnull(b.数量,0)
from 仓库表 a join(
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from deleted group by 产品编号,仓库
) b on a.产品编号=b.产品编号 and a.仓库=b.仓库
go
回复
ingernew 2003-12-16
对了,如果出库时仓库数量不够(会产生负数),如何返回错误终止操作
回复

--创设入出为0时代表入,为1时代表出
create trigger t_process on 日志记录表
for insert,update,delete
as
--更新仓库表中已经有产品的数量
update 仓库表 set 数量=isnull(a.数量,0)+isnull(b.数量,0)
from 仓库表 a join(
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from inserted group by 产品编号,仓库
) b on a.产品编号=b.产品编号 and a.仓库=b.仓库

--插入仓库表中不存在的产品数量
insert into 仓库表(产品编号,仓库,数量)
select a.* from (
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from inserted group by 产品编号,仓库
) a left join 仓库表 b on a.产品编号=b.产品编号 and a.仓库=b.仓库
where b.产品编号 is null and b.仓库 is null

--减少删除的产品数量
update 仓库表 set 数量=isnull(a.数量,0)-isnull(b.数量,0)
from 仓库表 a join(
select 产品编号,仓库,数量=sum(case 入出 when 0 then 数量 else -数量 end)
from deleted group by 产品编号,仓库
) b on a.产品编号=b.产品编号 and a.仓库=b.仓库
go
回复
ingernew 2003-12-16
我写了一个,不是最好:
CREATE TRIGGER UP_IN_DE_storelog ON [dbo].[StoreLog]
FOR INSERT, UPDATE, DELETE

AS
@IN_OUT bit
if (Select 入出 form 日志记录表)='1'--当为入库时
--如果是修改和删除,则deleted表中有数据
UPDATE 仓库表 SET 数量=a.数量+b.数量 FROM 仓库表 a,deleted b
--WHERE a.仓库=b.仓库 AND a.产品编号=b.产品编号

--如果是新增和修改,则inserted表中有数据
UPDATE 仓库表 SET 数量=a.数量-b.数量 FROM 仓库表 a,inserted b
WHERE a.仓库=b.仓库 AND a.产品编号=b.产品编号
else --当为出库时
UPDATE 仓库表 SET 数量=a.数量-b.数量 FROM 仓库表 a,deleted b
--WHERE a.仓库=b.仓库 AND a.产品编号=b.产品编号

--如果是新增和修改,则inserted表中有数据
UPDATE 仓库表 SET 数量=a.数量+b.数量 FROM 仓库表 a,inserted b
WHERE a.仓库=b.仓库 AND a.产品编号=b.产品编号
回复
txlicenhe 2003-12-16
最好自己写。
回复
1ssp 2003-12-16
create trigger tr1 on lt
for insert ,delete,update

as
if
update kc set sl=sl+(case (select rc from inserted) when 0 then (0- (select sl from inserted)) else (select sl from inserted) end) where cpbh in (select cpbh from inserted)

update kc set sl=sl-(case (select rc from deleted) when 0 then (0- (select sl from deleted)) else (select sl from deleted) end) where cpbh in (select cpbh from deleted)
回复
1ssp 2003-12-16

create trigger tr1 on lt
for insert ,delete

as
if
update kc set sl=sl+(case (select rc from inserted) when 0 then (0- (select sl from inserted)) else (select sl from inserted) end) where cpbh in (select cpbh from inserted)
update kc set sl=sl
测试如下:
go
insert into kc select '001','1',100
insert into lt select '001','1',0,10
select * from kc
我给你编写一个,自己在完善吧!
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告