??? 触发器攻关 ??? 大哥大姐,帮帮忙啊!
小弟只知道触发器是个好东西,但是从来没有自己写过,
早就听说CSDN里是高手云集,藏龙卧虎之地,故来请教!
问题如下:
A表: 字段如下
规格单号 小号 节目名称 订货数量 完成
HLOT-07-0001 1 征服1 1000 False
HLOT-07-0001 2 征服2 1000 False
B表: 字段如下
规格单号 小号 节目名称 订货数量 入库数量
HLOT-07-0001 1 征服1 1000 1000
HLOT-07-0001 2 征服2 1000 800
B表中的 "入库数量 "会不断改变,如果 "入库数量> =订货数量 "
就表明 A表中的相应 "节目 "的 "完成 "字段要赋值为 "True ".
实现要求:
(1)触发器只对 "入库数量 "的INSERT,UPDATE时起作用
(2)B表的 "入库数量> =订货数量 "时自动更改相应A表 "完成=True "
[解决办法]
我也在想,要怎么获取到 INSERT 或 UPDATE 受影响的行的值.那这个问题就好解决了
[解决办法]
create trigger ti_B表 on B表
for insert,update
as
if exists(select * from inserted i where isnull(i.入库数量,0)> =isnull(i.订货数量,0))
begin
update A表
set 完成= 'True '
from A表,inserted i
where A表.规格单号=i.规格单号
and A表.小号=i.小号
and A表.节目名称=i.节目名称
and isnull(i.入库数量,0)> =isnull(i.订货数量,0)
end
[解决办法]
你的意思是,你可以插入新的记录来修改征服1的数量,也可以直接在老的记录上增加?
[解决办法]
规格单号 小号 节目名称 订货数量 入库数量
HLOT-07-0001 1 征服1 1000 1000
HLOT-07-0001 2 征服2 1000 800
HLOT-07-0001 2 征服2 1000 200
表2会不会有这样的情况?
[解决办法]
检查inserted临时表中入库数量> =订货数量的
向表中insert时,新插入的数量保存在inserted表中
update表时,更新后的值保存在inserted表中
[解决办法]
easywind8088() ( ) 信誉:100 Blog 2007-03-14 17:45:40 得分: 0
不会,
HLOT-07-0001 2 征服2 1000 800
HLOT-07-0001 2 征服2 1000 200
全合并为一条记录,如下
HLOT-07-0001 2 征服2 1000 1000
---------------------
存在情的,不所有的西一起入的,肯定有今天入一部分,明天入一部分的情。
[解决办法]
楼主的表2中入库数量是一直加的?
不知道我这个对不对
if object_id( 'pubs..表A ') is not null
drop table pubs..表A
GO
CREATE TABLE 表A
(
规格nvarchar(50),
小号int,
订货数量int,
完成bit
)
INSERT INTO 表A SELECT 'HLOT-07-0001 ',1,1000,0
UNION ALL SELECT 'HLOT-07-0001 ',2,1000,0
if object_id( 'pubs..表B ') is not null
drop table pubs..表B
GO
CREATE TABLE 表B
(
规格nvarchar(50),
小号int,
订货数量int,
入库数量int
)
INSERT INTO 表B SELECT 'HLOT-07-0001 ',1,1000,900
UNION ALL SELECT 'HLOT-07-0001 ',2,1000,800
CREATE TRIGGER [Tri_temp] ON [dbo].[表B]
FOR INSERT, UPDATE
AS
DECLARE
@IINT
IF UPDATE(入库数量)
BEGIN
SELECT @I=C.入库数量-C.订货数量 FROM 表A,INSERTED C WHERE 表A.规格=C.规格 and 表A.小号=C.小号
IF @I> =0
UPDATE 表A SET 完成=1 WHERE 表A.规格=(SELECT 规格 FROM INSERTED) and 表A.小号=(SELECT 小号 FROM INSERTED)
ELSE
UPDATE 表A SET 完成=0 WHERE 表A.规格=(SELECT 规格 FROM INSERTED) and 表A.小号=(SELECT 小号 FROM INSERTED)
END
--------
我自己试了给小号等于3的新增也是对的,给小号1 和2 的修改,也可以,但是我觉得好像我写的很复杂。如果只是累加的不会减少的话,就不需要判断了
[解决办法]
你这里叫的是入库数量
如果是把单录错了,那么程序中处理的时候可能把这个数量减少的吧
[解决办法]
create table A表
(
规格单号 varchar(20),
小号 int,
节目名称 varchar(20),
订货数量 int,
完成 varchar(10)
)
go
create table B表
(
规格单号 varchar(20),
小号 int,
节目名称 varchar(20),
订货数量 int,
入库数量 int,
前存数量 int
)
go
insert into A表
select 'HLOT-07-0001 ',1, '征服1 ',1000, 'False ' union
select 'HLOT-07-0001 ',2, '征服2 ',1000, 'False '
insert into B表
select 'HLOT-07-0001 ',1, '征服1 ',1000,800,0 union
select 'HLOT-07-0001 ',2, '征服2 ',1000,600,200
go
create trigger tg_B
on B表
for insert,update
as
declare @a1 varchar(20),@a2 int,@a3 int,@a4 int
select @a1=节目名称,@a2=订货数量,@a3=入库数量,@a4=前存数量 from inserted
if @a2 <=@a3+@a4
update A表 set 完成= 'Ture ' where 节目名称=@a1
go
update B表 set 入库数量=入库数量+300 where 节目名称= '征服1 '
update B表 set 入库数量=入库数量+300 where 节目名称= '征服2 '
go