触发器的问题。

vileboy 2003-11-26 10:03:09
我做了个基于insert的触发器在采购收货单的明细表中,当在采购收货单的明细表中插入记录,那么就要在相关的采购订单的明细表的收货数量=收货数量+采购收货单的明细数量。可是每次插入多条记录时,加到采购订单的收货数量是采购收货数量从总和。本来影响的记录数是1,可是这里返回的@@rowcount确等于插入记录的总数。下面是我的代码,大家帮忙分析下:

/*
***************************************************************
采购收货单明细表(oc_stockitm) 2003-11-25
****************************************************************
*/--drop procedure pd_main
create trigger ta_i_stock_itm on oc_stockitm
for insert
as
set nocount on
declare @order_id varchar(50) --订单号
declare @mate_id varchar(50) --货品编号
declare @stock_id varchar(50) --收货单号
declare @amount numeric(20,3) --收货数量

select @mate_id=mateid_vch ,@stock_id=stocid_vch,@amount=amount_num from inserted --取得货品编号
print @amount
select @order_id=ordeid_vch from oc_stock where stocid_vch=@stock_id
update oc_orderitm set getAmnt_num=getAmnt_num+@amount where ordeid_vch=@order_id --更新订单明细表
if not exists(select * from oc_orderitm where getAmnt_num<>amount_num and ordeid_vch=@order_id) --更新订单状态
update oc_order set ordestat_vch='结清' where ordeid_vch=@order_id
set nocount off
go
...全文
42 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vileboy 2003-11-26
  • 打赏
  • 举报
回复
不只更新一条,会更新订单单中的所有记录(货品编号和订单号相同),但是数量字段更新为
订单明细收货数量=原订单明细收货数量+收货单明细数量
vileboy 2003-11-26
  • 打赏
  • 举报
回复
结构:
订单明细:
订单号 货品编号 数量 收货数量 金额 备注
ordeID_vch mateID_vch amount_num getAmnt_num sumItm_num Remark_vch

收货单明细:
收货单号 货品编号 数量 金额 备注
stocID_vch mateID_vch amount_num sumItm_num remark_vch
数据:
收货单明细:
ST200311250001 001 10.000 100.000 0
ST200311250001 003 10.000 200.000 0
ST200311250002 002 10.000 2000.000 0
ST200311250002 004 10.000 11000.000 0
ST200311250003 003 5.000 100.000
ST200311250003 004 5.000 5500.000
ST200311250003 005 5.000 2500.000
ST200311260001 003 100.000 2000.000
ST200311260001 005 100.000 50000.000
ST200311260002 003 5.000 100.000
ST200311260002 004 6.000 6600.000
ST200311260003 003 10.000 200.000
ST200311260003 004 15.000 16500.000
ST200311260003 005 20.000 10000.000
ST200311260004 002 2.000 400.000
ST200311260004 004 6.000 6600.000
ST200311260005 002 2.000 400.000
ST200311260005 003 5.000 100.000
ST200311260006 003 1.000 20.000
订单明细:
SO200311220002 001 10.000 5.000 100.000
SO200311220002 003 10.000 5.000 200.000
SO200311220003 003 20.000 .000 400.000
SO200311220003 004 1.000 .000 1100.000
SO200311220003 005 10.000 .000 5000.000
SO200311220004 002 10.000 7.000 2000.000
SO200311220004 003 10.000 7.000 200.000
SO200311220005 002 10.000 8.000 2000.000
SO200311220005 004 10.000 8.000 11000.000
SO200311220006 003 10.000 15.000 200.000
SO200311220006 004 10.000 15.000 11000.000
SO200311220006 005 10.000 15.000 5000.000
SO200311220007 003 153.000 200.000 3060.000
SO200311220007 005 156.000 200.000 78000.000
SO200311220008 003 10.000 11.000 200.000
SO200311220008 004 10.000 11.000 11000.000
SO200311220009 003 15.000 45.000 300.000
SO200311220009 004 456.000 45.000 501600.000
SO200311220009 005 48.000 45.000 24000.000
SO200311220010 003 10.000 .000 200.000
SO200311220010 004 10.000 .000 11000.000
SO200311220011 003 10.000 .000 200.000
SO200311220011 005 4.000 .000 2000.000
SO200311220012 003 2.000 .000 40.000
SO200311220012 004 23.000 .000 25300.000
SO200311220013 004 342.000 .000 376200.000
SO200311220013 005 324.000 .000 162000.000
SO200311220014 003 1.000 .000 20.000
SO200311220014 004 2.000 .000 2200.000
SO200311240002 003 10.000 .000 200.000
SO200311240002 004 10.000 .000 11000.000
SO200311240003 003 10.000 .000 200.000
SO200311240003 005 10.000 .000 5000.000
SO200311240004 002 10.000 .000 2000.000
SO200311240004 004 10.000 .000 11000.000
SO200311250001 001 10.000 .000 100.000
SO200311250001 002 10.000 .000 2000.000
SO200311250002 003 10.000 .000 200.000

(所影响的行数为 38 行)


zjcxc 2003-11-26
  • 打赏
  • 举报
回复
上面只是处理例子,楼主最好贴出表结构及部分数据.

因为照你的更新方法,插入多条记录时,只能处理一条.
zjcxc 2003-11-26
  • 打赏
  • 举报
回复
***************************************************************
采购收货单明细表(oc_stockitm) 2003-11-25
****************************************************************
*/--drop procedure pd_main
create trigger ta_i_stock_itm on oc_stockitm
for insert
as

update oc_orderitm set getAmnt_num=a.getAmnt_num+b.amount_num
from oc_orderitm a join (
select a.mateid_vch,a.stocid_vch,a.amount_num,b.ordeid_vch
from inserted a join oc_stock on a.stocid_vch=b.stocid_vch
) b on a.ordeid_vch=b.ordeid_vch

if not exists(select 1 from oc_orderitm a join(
from oc_orderitm a join (
select a.mateid_vch,a.stocid_vch,a.amount_num,b.ordeid_vch
from inserted a join oc_stock on a.stocid_vch=b.stocid_vch
) b on a.ordeid_vch=b.ordeid_vch)
update oc_order set ordestat_vch='结清'
from oc_orderitm a join (
select a.mateid_vch,a.stocid_vch,a.amount_num,b.ordeid_vch
from inserted a join oc_stock on a.stocid_vch=b.stocid_vch
) b on a.ordeid_vch=b.ordeid_vch
go

vileboy 2003-11-26
  • 打赏
  • 举报
回复
那为什么执行一个insert语句,会把其他记录的数据加起来插入到采购订单中呢??我怀疑主要是这句有问题:
select @mate_id=mateid_vch ,@stock_id=stocid_vch,@amount=amount_num from inserted
这个inserted是不是有问题??
pengdali 2003-11-26
  • 打赏
  • 举报
回复
@@ROWCOUNT

返回受上一语句影响的行数

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧