触发器

/*生产任务单入库数更新时更新所需工时*/
CREATE TRIGGER [ICMO_UPDATE_FAuxStockQty]		--自定义触发器的名称
			ON [dbo].[ICMO]		--此处为表名,触发器的表名,意为在哪个表创建触发
FOR UPDATE		--触发类型
AS 
BEGIN 
   if update(FAuxStockQty)		--如果入库数量更新更新所需工时
   update a 
     set a.FHeadSelfJ01108 = a.FHeadSelfJ01107 * (a.FAuxQty - a.FAuxStockQty)
     from ICMO a, inserted b 
     where a.FInterID = b.FInterID

END

CREATE TRIGGER [update_ICMO_gongshi]		--自定义触发器的名称 
			ON [dbo].[ICMO]		--生产任务单 此处为表名,触发器的表名,意为在哪个表创建触发
FOR INSERT,UPDATE		--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS   
    SET NOCOUNT ON  
DECLARE @FInterID   int;		--声明变量:FInterID 生产任务单内码
DECLARE @FRoutingID   int;		--声明变量:FRoutingID 工艺内码
select @FInterID = FInterID, @FRoutingID = FRoutingID from Inserted		--取当前插入或更新单据工艺内码赋值给@FRoutingID

BEGIN
    /*更新生产任务单工时*/
update ICMO			--更新生产任务单工时
set FHeadSelfJ01108 =  c.f1
from ICMO a		--生产任务单
join (select FInterID, sum(FPersonStdTimeRun) f1		--表头内码,汇总标准人工运行工时f1
from t_RoutingOper		--工艺路线表体
where FInterID = @FRoutingID	--声明变量:FRoutingID 工艺内码
group by FInterID		--表头内码
)c 
on a.FRoutingID = c.FInterID	--生产任务.工艺内码 = c.表头内码
and a.FInterID = @FInterID	--生产任务内码单内码
and FStatus in ('0', '5');	--单据状态为计划和确认;

END


select * 
from ICMO a		--生产任务单
--join t_RoutingOper b		--工艺路线表体
--on  a.FInterID = @FInterID
--and a.FRoutingID = b.FInterID	--生产任务单 = 工艺路线表体.表头内码
join (select FInterID, sum(FPersonStdTimeRun) f1		--表头内码,汇总标准人工运行工时f1
from t_RoutingOper		--工艺路线表体
group by FInterID		--表头内码
)c 
on c.FInterID = '48973'
and a.FInterID = c.FInterID	--工艺路线表体.表头内码 = c.表头内码
and FStatus in ('0', '5');	--单据状态为计划和确认



drop trigger [update_ICMO_gongshi]
/*
统计供应商个数

*/

create TRIGGER [dbo].t_supplyentry_luyu		--自定义触发器的名称
            ON [dbo].t_Supplyentry			--供应商供货明细表,触发器的表名,意为在哪个表创建触发
FOR update,DELETE			--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS  
    SET NOCOUNT ON  
     
DECLARE @NUMBER   int;		--声明变量:NUMBER
DECLARE @QTY   int;			--声明变量:QTY
      
select @NUMBER = FITEMID from deleted		--取当前删除或修改单据内码赋值给@NUMBER

/*统计供应商个数*/
select @QTY = COUNT(FItemID)	--@QTY = 物料内码个数
 from t_SupplyEntry			--供应商供货明细表
 where FUsed=1				--是否使用 = 1
 AND FItemID=@NUMBER		--物料内码
 
 /*供应商数量清零*/ 
UPDATE t_ICItem		--更新物料表
SET F_158 = 0		--供应商数量 = 0
WHERE FItemID=@NUMBER		--物料内码
 
 /*重新给供应商数量赋值*/ 
UPDATE t_ICItem		--更新物料表
SET F_158 = @QTY		--供应商数量 =  @QTY
WHERE FItemID=@NUMBER		--物料内码 
      
select * from sysobjects where xtype='TR'  --查询当前数据库中有多少触发器

/*我们如果需要关闭或者开启触发器的话,只需要运行:*/
disable trigger [触发器名] on database --禁用触发器
enable trigger [触发器名] on database --开启触发器
查看某一个触发器的内容,直接运行:exec sp_helptext [触发器名]
修改触发器:

--基本语句如下﹕
EXEC sp_helptext fu_icmo

exec sp_helptext ICHrpDestBills_Insert_POR

drop trigger fu_icmo
--删除触发器

--把销售订单客户和备注带到生产任务单上
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
IF EXISTS (select * from sysobjects where name='ICHrpDestBills_Insert_SynFields' and type='TR')
Drop TRIGGER ICHrpDestBills_Insert_SynFields
GO
alter TRIGGER [ICHrpDestBills_Insert_SynFields] ON [dbo].[ICMrpDestBills]
FOR INSERT
AS
update v1
set v1.FHeadSelfJ01102 = u2.FCustID	--FHeadSelfJ01102 购货单位(客户)自定义字段
   ,v1.FHeadSelfJ01103 = u3.FNote	--FHeadSelfJ01103 生产任务单表体备注自定义字段 备注
   ,v1.FHeadSelfJ01104 = u3.FEntrySelfS0167	--FHeadSelfJ01104 生产任务单表体备注自定义字段 出货日期
   ,v1.FHeadSelfJ01106 = u3.FAdviceConsignDate --FHeadSelfJ01106 生产任务单表体备注自定义字段 投产日期
from ICMO v1
left join inserted ul on v1.FInterID = ul.FDestBillInterID
left outer join SEOrder u2 on v1.FOrderInterID = u2.FInterID	--诮售订单表头信息
left outer join SEOrderEntry u3 on u2.FInterID = u3.FInterID	--销害订单表体信息
where ul.FTranType in (54,85) and u3.FEntryID = v1.FSourceEntryID


把销售订单备注带到采购申请上
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
IF EXISTS (select * from sysobjects where name='ICHrpDestBills_Insert_POR' and type='TR')
Drop TRIGGER ICHrpDestBills_Insert_SynFields
GO
CREATE TRIGGER [ICHrpDestBills_Insert_POR] ON [dbo].[ICMrpDestBills]
FOR INSERT
AS
update v1
set v1.FEntrySelfP0134 = u3.FNote	--FHeadSelfJ01103 采购申请单表体备注自定义字段 备注
from PORequestEntry v1
left join inserted ul on v1.FInterID = ul.FDestBillInterID
left outer join SEOrder u2 on v1.FSourceEntryID = u2.FInterID	--诮售订单表头信息
left outer join SEOrderEntry u3 on u2.FInterID = u3.FInterID	--销害订单表体信息
where ul.FTranType in (54,85) and u3.FEntryID = v1.FSourceEntryID
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
/*
插入生产投料单时继承生产任务单编号
将BOM描述带到生产任务单上
*/

alter TRIGGER [dbo].[PPBom_luyu]		--自定义出发器的名称
			ON [dbo].[PPBOMEntry]		--生产投料单分录 此处为表名,触发器的表名,意为在哪个表创建触发
FOR INSERT			--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS   

DECLARE @NUMBER int;		--声明变量:NUMBER
select @NUMBER = FICMOInterID from inserted		--取当前插入记录的物料内码赋值给@NUMBER

update PPBOM			--更新生产投料单
set FBillNo = a.FBillNo	--编号 = 生产任务单.编号
from ICMO a, PPBOM b  
-- 生产任务单 a,生产投料单 b
where a.FInterID=b.FICMOInterID  --生产任务单内码 = 生产投料单.生产/委外订单号
and a.FBillNo<>b.FBillNo   --生产任务单.编号 <> 生产投料单.编号
  

/*更新生产任务单工时和BOM描述*/
update ICMO			--更新生产任务单工时
set FHeadSelfJ01108 =  b.f1,
FHeadSelfJ0197 = c.FNote	--BOM描述 = BOM表.备注
from ICMO a
JOIN (select h.FInterID, FBomInterID,  SUM(FPersonStdTimeRun)f1
from ICMO h		--生产任务单
join t_Routing i		--工艺路线表
on h.FInterID = @NUMBER		--生产任务单.物料内码 = 当前插入的物料内码
and h.FRoutingID = i.FInterID		--生产任务单.工艺路线 = 工艺路线表体.表头内码
join t_RoutingOper j		--工艺路线表体
on i.FInterID = j.FInterID		--工艺路线表.内码 = 工艺路线表体.表头内码
group by h.FInterID, FBomInterID
)b
on a.FInterID = b.FInterID
join ICBOM c		--BOM表 
on c.FInterID = b.FBomInterID
--生产任务单.BOM编号 = BOM表.BOM内码
and isnull(a.FHeadSelfJ0197, 'a') <> c.FNote
--判断生产任务单.BOM描述是否为NULL,为NULL返回‘a’ <> BOM表.备注
and isnull(a.FHeadSelfJ0197, '') = ''
--判断生产任务单.BOM描述是否为NULL,为NULL返回‘ ’ = ''

/*
插入生产投料单时继承生产任务单编号
将BOM描述带到生产任务单上
*/

alter TRIGGER [dbo].[PPBom_luyu] --自定义出发器的名称
ON [dbo].[PPBOMEntry] --生产投料单分录 此处为表名,触发器的表名,意为在哪个表创建触发
FOR INSERT --触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS

update PPBOM --更新生产投料单
set FBillNo = a.FBillNo --编号 = 生产任务单.编号
from ICMO a, PPBOM b
– 生产任务单 a,生产投料单 b
where a.FInterID=b.FICMOInterID --生产任务单内码 = 生产投料单.生产/委外订单号
and a.FBillNo<>b.FBillNo --生产任务单.编号 <> 生产投料单.编号

update ICMO --更新生产任务单
set FHeadSelfJ0197=b.fnote --BOM描述 = BOM表.备注
from ICMO a,ICBOM b
–生产任务单 a,BOM表 b
where a.FBomInterID = b.FInterID
–生产任务单.BOM编号 = BOM表.BOM内码
and isnull(a.FHeadSelfJ0197,‘a’)<>b.fnote
–判断生产任务单.BOM描述是否为NULL,为NULL返回‘a’ <> BOM表.备注
and isnull(a.FHeadSelfJ0197,’’)=’’
–判断生产任务单.BOM描述是否为NULL,为NULL返回‘ ’ = ‘’


/*
将销售订单号代入采购订单
*/
CREATE TRIGGER [dbo].[PORequest_luyu] --自定义触发器的名称
ON [dbo].[PORequest] --采购申请表 此处为表名,触发器的表名,意为在哪个表创建触发
FOR insert,update --触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS
SET NOCOUNT ON

update PORequestentry --采购申请单分录表
set FEntrySelfP0132=b.forderbillno --客户订单 = 销售订单分录表.客户订单号
from PORequestentry a,SEOrderEntry b
– 采购申请分录表 a,销售订单分录表 b
where a.FSourceInterId=b.FInterID
–采购申请分录表.原单内码 = 销售订单分录表.订单内码
and isnull(a.FEntrySelfP0132,0)<>isnull(b.forderbillno,0)
–采购申请分录表.客户订单 <> 销售订单分录表.客户订单号
and a.FSourceEntryID=b.fentryid
–采购申请分录表.原单分录号 = 销售订单分录表.分录号


/*
POOrder_PriceCheck 检查采购订单是否有零单价
*/

CREATE trigger POOrder_PriceCheck	--自定义触发器的名称	
			on poorder				--采购订单表 此处为表名,触发器的表名,意为在哪个表创建触发
for insert		--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
as 
declare @FInterID int		--声明变量@finterid
select @FInterID = FInterID from inserted
--取当前插入单据的单据内码
if exists (			--检查子查询是否有为 0 的单价
select * from poorder a, poorderentry b		--采购订单表 a, 采购订单分录表 b
where a.FInterID = b.FInterID		--采购订单表.单据内码 = 采购订单分录表.单据内码
and a.FInterID = @FInterID			--采购订单表.单据内码 = 当前插入单据的单据内码
and b.FPrice = 0)			--采购订单分录表.单价 = 0
begin   --判断是否成立
raiserror('单价为0,不允许保存',18,18)		--弹出提示信息
rollback tran		--撤销已插入的部分记录
end
/*
收料通知单
*/

CREATE TRIGGER [dbo].[POInStock_luyu]		--自定义触发器的名称
            ON [dbo].[POInStock]			--此处为表名,触发器的表名,意为在哪个表创建触发
FOR insert,update,DELETE		--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS  
    SET NOCOUNT ON  
  
update POInStockEntry		--更新收料通知单分录
set FEntrySelfP0378=a.FBillNo+'-'+CONVERT(VARCHAR,b.FEntryID)
--收料通知单分录单据行号 = 收料通知单.通知单号 + '-' +	收料通知单分录.分录号
from POInStock a,POInStockEntry b  
--收料通知单 a,收料通知单分录b
where a.FInterID=b.FInterID 
--物料内码 = 物料内码
and ISNULL(FEntrySelfP0378,'a')<>(a.FBillNo+'-'+CONVERT(VARCHAR,b.FEntryID))  
/*
计划订单投放成生产任务单时修改生产任务单编号
生产任务单编号 = 销售订单编号 + '-' + 生产任务单原单行号 + '(' + 物料代码 + ')'
*/
CREATE TRIGGER [dbo].LUYU		--自定义触发器的名称
 ON [dbo].[ICMrpResult]			--计划订单,触发器的表名,意为在哪个表创建触发
FOR insert,update,delete		--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
As  
   
 
UPDATE ICMO			--生产任务单
SET FBILLNO = B.FBILLNO + '-' + CONVERT (VARCHAR,FSourceEntryID,2) + '(' + C.FNumber + ')'  
/*生产任务单编号 = 销售订单编号 + '-' + 生产任务单原单行号 + '(' + 物料代码 + ')'*/
FROM 
ICMO A,		--生产任务单
SEOrder B,		--销售订单表
t_ICItem C		--物料表
WHERE A.FOrderInterID = B.FInterID		--生产任务单.销售订单号 = 销售订单表.订单内码
AND A.FItemID = C.FITEMID		--生产任务单.物料代码 = 物料表.物料代码
AND A.FBILLNO <> B.FBILLNO+'-'+CONVERT(VARCHAR,FSourceEntryID,2)+'('+C.FNumber+')'  
/*生产任务单.编号 <> 销售订单编号 + '-' + 生产任务单原单行号 + '(' + 物料代码 + ')'*/
   
/*
ICStockBill_luyu将销售订单号 + 行号 带到销售出库单上
*/ 
create TRIGGER [dbo].[ICStockBill_luyu]		--自定义触发器的名称  
            ON [dbo].[ICStockBill]		--出入库数据表 此处为表名,触发器的表名,意为在哪个表创建触发
FOR insert		--触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可 
AS  
  
update ICStockBillEntry			--出入库单据分录表
set FEntrySelfB0187=FOrderBillNo+'-'+CONVERT(VARCHAR,FOrderEntryID,2) 
--销售订单行号 = 订单单号 + '-' + 订单分录
from ICStockBill a,ICStockBillEntry b  
-- 出入库单据表 a,出入库单据分录表 b
where b.FOrderEntryID<>0		--出入库单据分录表.订单分录 不等于 0
and a.FTranType = 21			--出入库单据表.单据类型 = 21
and a.FInterID=b.FInterID		--出入库单据表.单据内码 = 出入库单据分录表.单据内码
and isnull(FEntrySelfB0187,'a')<>FOrderBillNo+'-'+CONVERT(VARCHAR,FOrderEntryID,2)
--判断销售订单行号是否为NULL为空返回a <> 订单单号 + '-' + 订单分录
  
  

/*
CHrpDestBills_Insert_SynFields 把销售订单客户和备注带到生产任务单上
*/

CREATE TRIGGER [ICHrpDestBills_Insert_SynFields] --自定义触发器的名称
ON [dbo].[ICMrpDestBills] --计划运算目标单据表 此处为表名,触发器的表名,意为在哪个表创建触发
FOR INSERT --触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS
update v1 --更新生产任务单
set v1.FHeadSelfJ01102 = u2.FCustID --FHeadSelfJ01102 购货单位(客户)自定义字段
,v1.FHeadSelfJ01103 = u3.FNote --FHeadSelfJ01103 生产任务单表体备注自定义字段 备注
,v1.FHeadSelfJ01104 = u3.FEntrySelfS0167 --FHeadSelfJ01104 生产任务单表体备注自定义字段 出货日期
,v1.FHeadSelfJ01106 = u3.FAdviceConsignDate
from ICMO v1 --生产任务单
left join inserted ul --当前插入的记录
on v1.FInterID = ul.FDestBillInterID --生产任务单内码 = 计划运算目标单据表.目标单据内码
left outer join SEOrder u2 --销售订单表
on v1.FOrderInterID = u2.FInterID --生产任务单.销售订单号 = 销售订单表.订单内码
left outer join SEOrderEntry u3 --销售订单分录表
on u2.FInterID = u3.FInterID --销害订单表.订单内码 = 销售订单分录表.订单内码
where ul.FTranType in (54,85) --如果 计划运算目标单据表.目标单据事务类型 包含 (54,85)
and u3.FEntryID = v1.FSourceEntryID --并且 销售订单分录表.分录号 = 生产任务单.源单行号




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值