触发器修改事件的问题。
仓库盘点时如有损坏产品,出库业务里要同时增加一条报损出库信息;
如果有多出的产品,入库业务里要同时增加一条报溢入库信息;
需要用触发器来实现,如果损益数量大于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
库 盘点 产品
[解决办法]
不知道你这个是什么数据库,我只了解ORACLE,我觉得问题应该是逻辑上的,你可以把更新错误的数据单独拉出来,TRIGGER里面一点一点跟踪,看问题出在哪。
另外,个人觉得:1)@数量要给个初始值,变量都应该初始化比较好;2)trigger是建在“stock_盘点D”这张表上的UPDATE,那么你在trigger里面使用这张表里的数据是怎么判断使用的是UPDATE前的数据还是update后的数据?oracle里面是用new., old. 来判断新旧数据的。