金蝶K3--产品入库--更新销售订单/预测单编号

本文详细解析了一个SQL触发器的实现,该触发器在产品入库单更新时,通过复杂的查询逻辑来同步更新库存明细中的相关订单信息。涉及的技术包括T-SQL、游标、条件判断及多表联接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

create trigger icstockbill_cust
	on icstockbill
for update
if exists(select 1 from inserted)
begin
	declare @ftrantype int
	select @ftrantype=ftrantype from inserted
	if @ftrantype=2		--产品入库单
	begin
		declare @fworkinterid int,@forderbillno varchar(9),@forderentryid int,@finterid int,@fentryid int
		declare my_select cursor for select c.finterid,b.finterid,b.fentryid from inserted a inner join icstockbillentry b on a.finterid=b.finterid left outer join icmo c on b.ficmointerid=c.finterid
		open my_select
		fetch next from my_select into @fworkinterid,@finterid,@fentryid
		while @@fetch_status=0
		begin
			if exists(select 1 from icmo where finterid=@fworkinterid and forderinterid>0)
			begin	--销售订单生成
				select @forderbillno=d.fbillno,@forderentryid=c.fentryid from icmo a left outer join icmrpresult b on a.forderinterid=b.forgsaleinterid left outer join seorderentry c on b.forgsaleinterid=c.finterid and b.forgentyrid=c.fentryid left outer join seorder d on c.finterid=d.finterid
			end
			if exists(select 1 from icmo where finterid=@fworkinterid and fpporderinterid>0)
			begin	--产品预测生成
				select @forderbillno=d.fbillno,@forderentryid=c.fentryid from icmo a left outer join icmrpresult b on a.fpporderinterid=b.forgppointerid left outer join pporderentry c on b.forgppointerid=c.finterid and b.forgentyrid=c.fentryid left outer join pporder d on c.finterid=d.finterid
			end
			--if not isnull(@forderbillno,'noresult')='noresult' begin select '订单编号是:' + @forderbillno + '----订单行号:' + cast(@forderentryid as varchar) end
			if not isnull(@forderbillno,'noresult')='noresult' begin update icstockbillentry set fentryselfa0238=@forderbillno,fentryselfa0239=@forderentryid where finterid=@finterid and fentryid=@fentryid end
			fetch next from my_select into @fworkinterid
		end
		close my_select
		deallocate my_select
	end
end

 

转载于:https://my.oschina.net/ansenchina/blog/3021893

CREATE trigger icstockbill_check --实现对物料据管控 on Icstockbill for insert as Declare @Ftrantype int --据类别定义/生产领料24/调拔41/销售出库21 Select @Ftrantype=Ftrantype from inserted --控制领料的领料日期不能小于生产任务的计划开工日期 倒扣物料只能车间仓库发料 if (@Ftrantype=24) begin declare @icmo varchar(20) declare @message varchar(200) declare @message0 varchar(200) declare @message00 varchar(200) declare @message000 varchar(200) declare @finterid240 int set @message=&#39;错误!领料日期不能小于生产任务计划开工日期,请与生管人员联系!错误号:&#39; set @message0=&#39;生产领料发料仓库不正确,倒扣物料不能从 原料仓/半成品仓/成品仓 发料&#39; set @message00=&#39;已完工生产任务不能跨月领料.请检查领料日期!&#39; set @message000=&#39;生产领料必需关联源生产任务号,请重新录入据!&#39; if exists ( select t1.fbillno from inserted as t1 inner join icstockbillentry as t2 on t2.finterid=t1.finterid where t2.ficmointerid=0 ) begin RAISERROR(@message000,18,18) ROLLBACK end if exists( select t3.fbillno from inserted as t1 inner join icstockbillentry as t2 on t2.finterid=t1.finterid inner join icmo as t3 on t3.finterid=t2.fsourceinterid where t2.fsourceinterid>0 and t1.fdate0 and t1.fdateCast(year(max(t4.fdate)) as int(10))*100+Cast(month(max(t4.fdate)) as int(5)) ) begin RAISERROR(@message00,18,18) ROLLBACK end --更新领料上的销售订单号 select @finterid240=finterid from inserted update t2 set t2.fentryselfb0445=t4.fbillno from icstockbill as t1 inner join icstockbillentry as t2 on t1.ftrantype=24 and t1.finterid=t2.finterid inner join icmo as t3 on t3.finterid=t2.ficmointerid left join seorder as t4 on t4.finterid=t3.forderinterid where isnull(t4.fbillno,&#39;no&#39;)&#39;no&#39; and t2.finterid=@finterid240 return end --控制委外加工生产任务领料日期不对小于计划开工日期 if (@Ftrantype=28) begin declare @icmo3 varchar(20) declare @message3 varchar(200) set @message3=&#39;错误!委外加工发出日期不能小于对应委外加工生产任务计划开工日期,请与采购人员联系变更!错误号:&#39; if exists( select t3.fbillno from inserted as t1 inner join icstockbillentry as t2 on t2.finterid=t1.finterid inner join icmo as t3 on t3.finterid=t2.fsourceinterid where t2.fsourceinterid>0 and t1.fdate0 and t1.fdate0 and t1.fdate0 and t1.fdate<t3.FPlanCommitDate set @message4=@message4+@icmo4 RAISERROR(@message4,18,18) ROLLBACK end ; --更新产品入库单上的销售订单号 select @finterid20=finterid from inserted update t2 set t2.fentryselfa0236=t4.fbillno from icstockbill as t1 inner join icstockbillentry as t2 on t1.ftrantype=2 and t1.finterid=t2.finterid inner join icmo as t3 on t3.finterid=t2.ficmointerid left join seorder as t4 on t4.finterid=t3.forderinterid where isnull(t4.fbillno,&#39;no&#39;)&#39;no&#39; and t2.finterid=@finterid20 return end ---更新委外加工入销售订单号 if (@Ftrantype=5) begin update t2 set t2.fentryselfa0548=t4.fbillno from inserted as t1 inner join icstockbillentry as t2 on t2.finterid=t1.finterid inner join icmo as t3 on t3.finterid=t2.fsourceinterid inner join seorder as t4 on t4.finterid=t3.forderinterid return end ---控制出全部出货的销售订单所对应的采购订单不能退料(红字外购入库单) /*if (@Ftrantype=1) begin declare @message500 varchar(200) set @message500=&#39;已全部出货的销售订单所对应的采购订单不能退料!请检查您所退料的采购订单号码是否正确!&#39; if exists (select t1.fbillno from inserted as t1 inner join icstockbillentry as t2 on t2.finterid=t1.finterid inner join seorder as t3 on t3.fbillno=t2.fentryselfa0152 where t2.fqty<0 and t3.fclosed=1 ) begin RAISERROR(@message500,18,18) ROLLBACK end return end */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值