入库明细表guid 入库单号 材料编号 材料名称 数量
1 d1 cx001 cxoo1name 3
2 d1 cx002 cx002name 2
3 d1 cx003 cx003name 5库存表guid 库房 材料编号 数量
1 KF1 cx001 10 ---原来有7个,入库更新:7+3
2 KF1 cx002 2 ---原来没有, 入库插入记录
3 KF2 cx003 12 ---原来有7个,入库更新:7+5
1 d1 cx001 cxoo1name 3
2 d1 cx002 cx002name 2
3 d1 cx003 cx003name 5库存表guid 库房 材料编号 数量
1 KF1 cx001 10 ---原来有7个,入库更新:7+3
2 KF1 cx002 2 ---原来没有, 入库插入记录
3 KF2 cx003 12 ---原来有7个,入库更新:7+5
-- Author: T.O.P
-- Create date: 2009/11/26
-- Version: SQL SERVER 2005
-- =============================================
declare @TB1 table([guid] int,[入库单号] varchar(2),[材料编号] varchar(5),[材料名称] varchar(9),[数量] int)
insert @TB1
select 1,'d1','cx001','cxoo1name',3 union all
select 2,'d1','cx002','cx002name',2 union all
select 3,'d1','cx003','cx003name',5declare @TB2 table([guid] int,[库房] varchar(3),[材料编号] varchar(5),[数量] int)
insert @TB2
select 1,'KF1','cx001',7 union all
select 2,'KF1','cx002',0 union all
select 3,'KF2','cx003',7update b
set b.[数量] = b.[数量]+a.[数量]
FROM @TB1 A INNER JOIN @TB2 B ON A.GUID = B.GUID
AND A.[材料编号] = B.[材料编号]SELECT * FROM @TB2
--测试结果:
/*
guid 库房 材料编号 数量
----------- ---- ----- -----------
1 KF1 cx001 10
2 KF1 cx002 2
3 KF2 cx003 12(3 row(s) affected)*/
还有,库存表里没有数量为0的记录
写触发器 有可能能用到这个
update b
set b.[数量] = b.[数量]+a.[数量]
FROM TB1 A INNER JOIN TB2 B ON A.[材料编号] = B.[材料编号]
if object_id('入库明细表') is not null drop table 入库明细表
go
create table 入库明细表 (guid int,入库单号 varchar(3),材料编号 varchar(5),材料名称 varchar(20),数量 int )
--> 测试数据: 库存表
if object_id('库存表') is not null drop table 库存表
go
create table 库存表 (guid int,库房 varchar(3),材料编号 varchar(5),数量 int )
insert into 库存表
select 1,'KF1','cx001',7 union all
select 3,'KF2','cx003',7
/*
guid 入库单号 材料编号 材料名称 数量
1 d1 cx001 cxoo1name 3
2 d1 cx002 cx002name 2
3 d1 cx003 cx003name 5
*/
if object_id('trig') is not null drop trigger trig
go
create trigger trig on 入库明细表
for insert
as
if exists(select 1 from 库存表 k,inserted i where i.材料编号=k.材料编号)
update 库存表
set 数量=a.数量+i.数量
from 库存表 a,inserted i
where i.材料编号=a.材料编号 else
insert 库存表 select i.guid,'KF1',i.材料编号,i.数量 from inserted igo
insert 入库明细表 select 1,'d1','cx001','cxoo1name',3
select * from 库存表
insert 入库明细表 select 2,'d1','cx002','cxoo2name',2
select * from 库存表
insert 入库明细表 select 3,'d1','cx003','cxoo3name',5
select * from 库存表
guid 库房 材料编号 数量
----------- ---- ----- -----------
1 KF1 cx001 10
3 KF2 cx003 12
2 KF1 cx002 2(3 行受影响)
自己参考参考
from 库存表 inner join 入库明细表
on 库存表.材料编号=入库明细表.材料编号
没有0的那一条, 那就只好先更新, 然后将没有的插进去了!--=============================================
-- Author: T.O.P
-- Create date: 2009/11/26
-- Version: SQL SERVER 2005
-- =============================================
declare @TB1 table([guid] int,[入库单号] varchar(2),[材料编号] varchar(5),[材料名称] varchar(9),[数量] int)
insert @TB1
select 1,'d1','cx001','cxoo1name',3 union all
select 2,'d1','cx002','cx002name',2 union all
select 3,'d1','cx003','cx003name',5declare @TB2 table([guid] int,[库房] varchar(3),[材料编号] varchar(5),[数量] int)
insert @TB2
select 1,'KF1','cx001',7 union all
select 3,'KF2','cx003',7update b
set b.[数量] = b.[数量]+a.[数量]
FROM @TB1 A INNER JOIN @TB2 B ON A.[材料编号] = B.[材料编号]insert into @tb2
select 2,'KF1',A.[材料编号], A.[数量]
FROM @TB1 A LEFT JOIN @TB2 B ON A.[材料编号] = B.[材料编号]
WHERE B.[材料编号] IS NULLSELECT * FROM @TB2 ORDER BY GUID
--测试结果:
/*
guid 库房 材料编号 数量
----------- ---- ----- -----------
1 KF1 cx001 10
2 KF1 cx002 2
3 KF2 cx003 12(3 row(s) affected)*/
--写一个触发器
if object_id('入库明细表') is not null
drop table 入库明细表
go
create table 入库明细表(guid int ,入库单号 varchar(10),材料编号 varchar(10),材料名称 varchar(10),数量 int)
go
if object_id('库存表') is not null
drop table 库存表
go
create table 库存表(guid int,库房 varchar(10),材料编号 varchar(10),数量 int)
go
insert into 库存表
select 1,'KF1','cx001',7 union all
select 3,'KF2','cx003',7
go
if object_id('tr_updatesl') is not null
drop trigger tr_updatesl
go
create trigger tr_updatesl on 入库明细表
for insert
as
select a.* from 库存表 a inner join inserted b on a.guid=b.guid
if @@rowcount>0
update 库存表 set 数量=a.数量+b.数量 from 库存表 a,inserted b where a.guid=b.guid
else
insert into 库存表 select guid,'KF1',材料编号,数量 from inserted
goinsert into 入库明细表 select 1,'d1','cx001','cxoo1name',3
insert into 入库明细表 select 2,'d1','cx002','cxoo2name',2
insert into 入库明细表 select 3,'d1','cx003','cxoo3name',5select * from 库存表 order by guid
--假设guid为自增列,如不是,插入前必需先查询最大guid
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --将事务隔离级别设为最高
begin tran
update a
set 数量=a.数量+b.数量
from 库存表 a,入库明细表 b
where a.材料编号=b.材料编号 and a.库房='kF1'insert into 库存表 (库房,材料编号,数量)
select 'KF1',材料编号,数量
from 入库明细表 a where not exists(select * from 库存表 where 库房='KF1' and 材料编号=a.材料编号)
commit tran