触发器修改事件的问题。

purple_snow 2013-05-20 03:11:08
仓库盘点时如有损坏产品,出库业务里要同时增加一条报损出库信息;
如果有多出的产品,入库业务里要同时增加一条报溢入库信息;
需要用触发器来实现,如果损益数量大于0,就往入库业务中插入一条信息,如果损益数量小于0,就往出库业务中插入一条信息,
现在的问题是,多出的产品可以插入到入库业务中;但是报损的产品插入错误了,出库业务中不但插入了报损的数据,把其他损益数量为0的数据也插进去了;不知道哪位高手可以帮忙解决.错误触发器如下:
--盘点触发器
CREATE trigger ti_stock_盘点D on dbo.stock_盘点D for update as
begin
declare @单号 varchar(50)
declare @材料编号 varchar(50)
declare @材料名称 varchar(200)
declare @数量 decimal(18,2)
declare @规格 varchar(50)
declare @型号 varchar(50)
declare @单位 varchar(50)
declare @批次 varchar(50)
declare @采购价 decimal(18,2)
declare @销售价 decimal(18,2)

declare @日期 datetime
declare @分公司 varchar(50)
declare @仓库 varchar(50)
declare @经办人 varchar(50)
declare @经办部门 varchar(50)
declare @备注 varchar(500)


--新增仓库明细
declare num_cursor cursor for
Select 单号,材料编号,材料名称,损益数量,规格,型号,单位,批次 from stock_盘点D
open num_cursor
fetch num_cursor
into @单号,@材料编号,@材料名称,@数量,@规格,@型号,@单位,@批次

While @@Fetch_status=0
begin

--盘点明细
--select @单号=单号,@材料编号=材料编号,@材料名称=材料名称,@数量=损益数量,@规格=规格,@型号=型号,@单位=单位,@批次=批次 from stock_盘点D

--盘点主表
Select @日期=日期,@分公司=分公司,@仓库=仓库,@经办人=经办人,@经办部门=经办部门,@备注=备注 from stock_盘点H where 单号=@单号

--新增仓库主表
if @数量 < 0
begin
select * from stock_出入库H where 单号='CK_'+@单号
if @@RowCount <1
insert into stock_出入库H(单号,日期,分公司,方向,类型,仓库,经办人,经办部门,备注)values('CK_'+@单号,@日期,@分公司,'出库','103',@仓库,@经办人,@经办部门,@备注)
else
update stock_出入库H set 日期=@日期,分公司=@分公司,仓库=@仓库,经办人=@经办人,经办部门=@经办部门,备注=@备注 where 单号='CK_'+@单号

end
if @数量 > 0
begin
select * from stock_出入库H where 单号='RK_'+@单号
if @@RowCount <1
insert into stock_出入库H(单号,日期,分公司,方向,类型,仓库,经办人,经办部门,备注)values('RK_'+@单号,@日期,@分公司,'入库','103',@仓库,@经办人,@经办部门,@备注)
else
update stock_出入库H set 日期=@日期,分公司=@分公司,仓库=@仓库,经办人=@经办人,经办部门=@经办部门,备注=@备注 where 单号='RK_'+@单号

end


Select @采购价=采购价,@销售价=客户价 from stock_材料 where 材料编号=@材料编号

if @数量 < 0
begin
select * from stock_出入库D where 单号='CK_'+@单号 and 材料编号=@材料编号
if @@RowCount <1
insert into stock_出入库D(单号,材料编号,材料名称,出库数量,规格,型号,单位,采购价,销售价,批次)values('CK_'+@单号,@材料编号,@材料名称,@数量*(-1),@规格,@型号,@单位,@采购价,@销售价,@批次)
-- else
-- update stock_出入库D set 出库数量=@数量*(-1),规格=@规格,型号=@型号,单位=@单位,批次=@批次 where 单号='CK_'+@单号 and 材料编号=@材料编号

end
if @数量 > 0
begin
select * from stock_出入库D where 单号='RK_'+@单号 and 材料编号=@材料编号
if @@RowCount <1
insert into stock_出入库D(单号,材料编号,材料名称,入库数量,规格,型号,单位,采购价,销售价,批次)values('RK_'+@单号,@材料编号,@材料名称,@数量,@规格,@型号,@单位,@采购价,@销售价,@批次)
-- else
-- update stock_出入库D set 入库数量=@数量,规格=@规格,型号=@型号,单位=@单位,批次=@批次 where 单号='RK_'+@单号 and 材料编号=@材料编号

end

Fetch num_cursor
Into @单号,@材料编号,@材料名称,@数量,@规格,@型号,@单位,@批次

end

Close num_cursor
Deallocate num_cursor

end
...全文
123 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
purple_snow 2013-05-23
  • 打赏
  • 举报
回复
引用 3 楼 babyqian84 的回复:
不知道你这个是什么数据库,我只了解ORACLE,我觉得问题应该是逻辑上的,你可以把更新错误的数据单独拉出来,TRIGGER里面一点一点跟踪,看问题出在哪。 另外,个人觉得:1)@数量要给个初始值,变量都应该初始化比较好;2)trigger是建在“stock_盘点D”这张表上的UPDATE,那么你在trigger里面使用这张表里的数据是怎么判断使用的是UPDATE前的数据还是update后的数据?oracle里面是用new., old. 来判断新旧数据的。
谢谢指点! 你提醒我了一下,我发现我取当前数据的时候取错了 Select 单号,材料编号,材料名称,损益数量,规格,型号,单位,批次 from stock_盘点D 不应该从整个表里取,应该是只取刚刚修改过的数据 Select 单号,材料编号,材料名称,损益数量,规格,型号,单位,批次 from insered
wojiaochenglong 2013-05-21
  • 打赏
  • 举报
回复
sqlserver的过程,没有好的注释看着确实晕. 你的这种需求建议用存储过程吧,而且为了保证数据一致性还要用事务来做,sqlserver的事务必须用显式的 方式:begin transaction
andy_linky 2013-05-21
  • 打赏
  • 举报
回复
看了有点晕。为表示支持, 填写一下回复内容。
babyqian84 2013-05-21
  • 打赏
  • 举报
回复
不知道你这个是什么数据库,我只了解ORACLE,我觉得问题应该是逻辑上的,你可以把更新错误的数据单独拉出来,TRIGGER里面一点一点跟踪,看问题出在哪。 另外,个人觉得:1)@数量要给个初始值,变量都应该初始化比较好;2)trigger是建在“stock_盘点D”这张表上的UPDATE,那么你在trigger里面使用这张表里的数据是怎么判断使用的是UPDATE前的数据还是update后的数据?oracle里面是用new., old. 来判断新旧数据的。
purple_snow 2013-05-20
  • 打赏
  • 举报
回复
怎么仓库类的问题都没人管呢???

7,388

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 数据仓库
社区管理员
  • 数据仓库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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