我现在有一张成本子表,主表是周报表,子表主要存储本周的成本以及累计的成本,现在需要修改某一周的成本值然后更新所有子表的累计值,请教高手有没有触发器或者存储过程能搞定
主表
编号 项目名称 日期 累计工时 总成本
1 a 2015-1-1 10 260
2 a 2015-1-8 20 580
子表
编号 主表编号 工序 本周工时 成本 累计工时
1 1 a1 5 130 5
2 1 a2 5 130 5
3 2 a1 5 130 10
4 2 a2 5 130 10
------解决思路----------------------
create table m(
编号 int ,项目名称 varchar(10) ,日期 varchar(10) ,累计工时 int ,总成本 int
)
insert into m values(1,'a','2015-1-1',10,260),(2,'a','2015-1-8',20,580)
go
create table s(
编号 int , 主表编号 int,工序 varchar(10), 本周工时 int,成本 int,累计工时 int
)
insert into s values
(1,1,'a1',5,130,5),(2,1,'a2',5,130,5),(3,2,'a1',5,130,10),(4,2,'a2',5,130,10)
go
create trigger m_up
on m after update
as
begin
update s
set 本周工时 = i.累计工时/(select COUNT(*) from s where 主表编号=i.编号),
累计工时 = i.累计工时
from s , inserted i
where s.主表编号 = i.编号
end
go
select * from s
go
update m set 累计工时 = 50 where 编号 = 1
update m set 累计工时 = 60 where 编号 = 2
go
select * from s
go
drop table m,s
go
(2 行受影响)
(4 行受影响)
编号 主表编号 工序 本周工时 成本 累计工时
----------- ----------- ---------- ----------- ----------- -----------
1 1 a1 5 130 5
2 1 a2 5 130 5
3 2 a1 5 130 10
4 2 a2 5 130 10
(4 行受影响)
(2 行受影响)
(1 行受影响)
(2 行受影响)
(1 行受影响)
编号 主表编号 工序 本周工时 成本 累计工时
----------- ----------- ---------- ----------- ----------- -----------
1 1 a1 25 130 50
2 1 a2 25 130 50
3 2 a1 30 130 60
4 2 a2 30 130 60
(4 行受影响)
------解决思路----------------------
用触发器会有循环触发的问题,不如用存储过程
CREATE PROCEDURE p_adjust(
@mid int, -- 主表编号
@workflow varchar(20), -- 工序
@adjust_cost int, -- 成本调整(正数为加、负数为减、零不变)
@adjust_time int -- 工时调整(正数为加、负数为减、零不变)
)
AS
BEGIN
DECLARE @project varchar(20)
DECLARE @date datetime
SELECT @project = 项目名称,
@date = 日期
FROM 主表
WHERE 编号=mid
UPDATE 子表
SET 本周工时 = 本周工时 + @adjust_time,
累计工时 = 累计工时 + @adjust_time,
成本 = 成本 + @adjust_cost
WHERE 主表编号 = @mid
AND 工序 = @workflow
UPDATE 子表
SET 子表.累计工时 = 子表.累计工时 + @adjust_time
FROM 子表, 主表
WHERE 子表.主表编号 = 主表.编号
AND 主表.项目名称 = @project
AND 主表.日期 > @date
AND 子表.工序 = @workflow
UPDATE 主表
SET 累计工时 = 累计工时 + @adjust_time,
总成本 = 总成本 + @adjust_cost
FROM 主表
WHERE 主表.项目名称 = @project
AND 主表.日期 >= @date
END
GO
-- 比如#5的调整
EXEC p_adjust 1,'a1',0,-1