/*生产任务单入库数更新时更新所需工时*/
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 --并且 销售订单分录表.分录号 = 生产任务单.源单行号