当前位置: 代码迷 >> Sql Server >> 急数据库数据修改有关问题
  详细解决方案

急数据库数据修改有关问题

热度:37   发布时间:2016-04-24 09:13:00.0
急急急急急急急急急急急急急急急急!!!!!数据库数据修改问题
我现在有一张成本子表,主表是周报表,子表主要存储本周的成本以及累计的成本,现在需要修改某一周的成本值然后更新所有子表的累计值,请教高手有没有触发器或者存储过程能搞定
主表
编号  项目名称   日期     累计工时   总成本
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
  相关解决方案