还是触发器的问题,上一篇贴子地址:http://topic.csdn.net/u/20090323/17/cbc2dd3e-f08d-4c9b-9e78-0cb83b9ba7d8.html
关于通过触发器修改出货累计数及金额累计数,可能我没有说清楚,是应该按出货单号为外键来累计,我修改后的代码如下:
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
Update 出货单主档
set
总数量=(select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号),
总金额=(select sum(金额) from 出货单明细 where 出货单明细.单号=出货单主档.单号)
END问题1:目的已经达到,但我这样写合理吗?与你的写法是一样吗?
SET
总数量=b.数量,
总金额=b.金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
WHERE
问题2:采用这样的触发器后,是否我每插入或修改删除一笔纪录,触发器会对里面的每一条纪录都进行写重新累计?这是样否造成效率低下?问题3:如果是对每一条纪录都重新累计,是否可以有选择性的累计某一出货单号的数据?问题4:是否可以利用触发器来做仓库库存运算?这样做跟在VB里面采用SQL语句来更新库存谁更高效?问题5: 比如我利用触发器按产品来累计生产数,如果我修改了某条纪录的产品号,对触发器来说,是否先删除原来的产品再新增一个新的产品?
谢谢!!非常谢谢!!!
关于通过触发器修改出货累计数及金额累计数,可能我没有说清楚,是应该按出货单号为外键来累计,我修改后的代码如下:
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
Update 出货单主档
set
总数量=(select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号),
总金额=(select sum(金额) from 出货单明细 where 出货单明细.单号=出货单主档.单号)
END问题1:目的已经达到,但我这样写合理吗?与你的写法是一样吗?
SET
总数量=b.数量,
总金额=b.金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
WHERE
问题2:采用这样的触发器后,是否我每插入或修改删除一笔纪录,触发器会对里面的每一条纪录都进行写重新累计?这是样否造成效率低下?问题3:如果是对每一条纪录都重新累计,是否可以有选择性的累计某一出货单号的数据?问题4:是否可以利用触发器来做仓库库存运算?这样做跟在VB里面采用SQL语句来更新库存谁更高效?问题5: 比如我利用触发器按产品来累计生产数,如果我修改了某条纪录的产品号,对触发器来说,是否先删除原来的产品再新增一个新的产品?
谢谢!!非常谢谢!!!
SQL版块热心人真多
问题2、是这样的。不过要让两个表进行同步更新的话,还是这样比较好
问题3、select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号
这个不是已经选择了吗?
问题4、还是使用触发器比较好,这样的话省了在vb中麻烦
问题5、对于修改update而言,是分为两步走的,先删除原来的数据,再插入新的数据。在这个过程当中使用了两个临时表deleted,inserted
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
Update 出货单主档
set
总数量=(select sum(数量) from 出货单明细 where 出货单明细.单号=出货单主档.单号),
总金额=(select sum(金额) from 出货单明细 where 出货单明细.单号=出货单主档.单号)
END这个是老大写的
SET
总数量=b.数量,
总金额=b.金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
WHERE1.老大写的 " from inserted",inserted是什么意思呢?我觉得应该是我写的那个会慢些,因为我查询了两次,但老大写的那个我看不懂。
我刚刚又依样写了一个,但检查语法的时候一直接示",附近语法错误",请大家帮我看一下:
CREATE TRIGGER [TRG_MPSDayReport] ON [dbo].[MPSDayReport]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UpDate MPSDayReport
Set SinQTY=b.TotInQTY,
SOutQTY=b.TotOutQTY,
SBLQTY=b.TotBLQTY,
SPSQTY=b.TotPSQTY,
StoreQTY=B.TotInQTY-b.TotOutQTY-b.TotBlQTY-b.TotPSQTY
FROM
MPSDayReport,(Select sum(INQTY) as TOTInQTY,,sum(OutQTY) as TotOutQTY,,sum(BLQTY) as TOtBLQTY, sum(PsQTY) as TotPSQTY From MPSDayReport c
where c.Date_1<=MPSDayReport.Date_1 and c.ProcessID=MPSDayReport.ProcessID and c.MPSID=MPSDayReport.MPSID and c.Prdid=MPSDayReport.Prdid
and c.YSID=MPSDayReport.YSID and c.PackListID=MPSDayReport.PackListID) b
END
2.比如说,我现在修改的是出货单号为001的明细数据,那么触发器是只去重新算001的累计数呢还是所有的出货单都在重算?3.同上,我的意思是希望只去重新累计我编辑的出货单号为001的数量和金额4.如2,如果是触发器只要检测有修改,即把所有数据都重算一遍的话,是否采用它来做库存计算会很慢?
1、你的和李老大的还是稍有差别的,老大的是计算你修改记录的金额和数量。至于用老大的还是你的视乎要看你具体的需求
2、inserted表和deleted表是在进行数据update的时候要用到的两张临时表。update相当于删除原来的数据,插入新的数据。这样需要用临时表来存储原来的数据(使用deleted),插入新的数据(inserted)另等李老大
SET
总数量=b.数量,
总金额=b.金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
WHERE
DATEDIFF(DD,GETDATE(),a.出货日期)=0
现在主要是我不知道判定条件写在哪儿,我只想修改当前出货单号,where条件怎么写呢,或者请看我的另外一篇贴子:http://topic.csdn.net/u/20090323/22/20a4f289-4388-4984-a2ef-f83a5c4ff403.html?seed=1149905067
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE a
SET
总数量=b.数量,
总金额=b.金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 数量,SUM(金额) AS 金额 FROM INSERTED) b
WHERE
a.单号=出货单明细.单号
END这样写?
注意,不能用日期来作外键,只能用单号
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE a
SET
总数量=b.总数量,
总金额=b.总金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 总数量,SUM(金额) AS 总金额,单号 FROM 出货单明细 Group by 单号) b
WHERE
a.单号 =b.单号END这样写目的也达到了
但还是在修改全部单号,没有修改当前的单号
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE a
SET
总数量=b.总数量,
总金额=b.总金额
FROM
出货单主档 a,(SELECT SUM(数量) AS 总数量,SUM(金额) AS 总金额,单号 FROM 出货单明细 where 单号 in (select 单号 from inserted) Group by 单号) b
WHERE
a.单号 =b.单号END哈哈,这样写目的达到了,也只修改当前单号的累计,但合理不呢。。
又修改了一下:
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE a
SET
总数量=b.总数量,
总金额=b.总金额
FROM
出货单主档 a,(SELECT SUM(出货单明细.数量) AS 总数量,SUM(出货单明细.金额) AS 总金额,出货单明细.单号 FROM 出货单明细 inner join inserted on 出货单明细.单号=inserted.单号 Group by 出货单明细.单号) b
WHERE
a.单号 =b.单号END
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
Update a
set
总数量=isnull((select sum(数量) from 出货单明细 where 出货单明细.单号=a.单号),0),
总金额=isnull((select sum(金额) from 出货单明细 where 出货单明细.单号=a.单号),0)
from
出货单主档 a
where
exists(select 1 from inserted where 单号=a.单号)
or
exists(select 1 from deleted where 单号=a.单号)
END问题2:采用这样的触发器后,是否我每插入或修改删除一笔纪录,触发器会对里面的每一条纪录都进行写重新累计?这是样否造成效率低下? 楼主的会,我在上面给出的那个不会。
问题3:如果是对每一条纪录都重新累计,是否可以有选择性的累计某一出货单号的数据? 可以。
问题4:是否可以利用触发器来做仓库库存运算?这样做跟在VB里面采用SQL语句来更新库存谁更高效? 建议不要用触发器,复杂的业务逻辑不妨封装在存储过程中;显然在数据库中处理快。问题5: 比如我利用触发器按产品来累计生产数,如果我修改了某条纪录的产品号,对触发器来说,是否先删除原来的产品再新增一个新的产品? 业务逻辑需要在触发器中定义,触发器只会忠实的执行你所定义的SQL。
即时通讯工具目前只能用内网的Communicator,Sorry.
CREATE TRIGGER [TRG_出货单] ON [dbo].[出货单明细]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE a
SET
总数量=ISNULL(b.数量,0),
总金额=ISNULL(b.金额,0)
FROM
出货单主档 a
LEFT JOIN
(SELECT
c.单号,
SUM(c.数量) AS 数量,
SUM(c.金额) AS 金额
FROM
出货单明细 c
WHERE
EXISTS(SELECT 1 FROM inserted WHERE 单号=c.单号)
or
EXISTS(SELECT 1 FROM deleted WHERE 单号=c.单号)
GROUP BY
c.单号) b
ON
a.单号=b.单号
END
GO
能帮我再看一下另外一个贴子吗?地址:http://topic.csdn.net/u/20090323/22/20a4f289-4388-4984-a2ef-f83a5c4ff403.html?seed=1149905067如果你晚上也上QQ,能加我吗?我不会在你不方便的时候烦你的啦!
update a
set
生产累计=b.进货累计,
不良累计=b.不良累计
from
生产日报 a,
(select
n.产品,
n.工序,
n.日期,
sum(m.生产数) as 进货累计,
sum(m.不良数) as 不良累计,
...
from
生产日报 m,生产日报 n
where
m.日期<=n.日期 and m.工序=n.工序 and m.产品=n.产品
and
(exists(select 1 from inserted where 工序=n.工序 and 产品=n.产品)
or
exists(select 1 from deleted where 工序=n.工序 and 产品=n.产品))
group by
n.产品,n.工序,n.日期) b
where
a.产品=b.产品 and a.工序=b.工序 and a.日期=b.日期