1 IF EXISTS (select name from sysobjects where name='tr_XX') 2 DROP TRIGGER tr_XX 3 GO 4 CREATE TRIGGER tr_XX 5 ON dbo.ICStockBillEntry 6 FOR DELETE 7 as 8 BEGIN 9 DECLARE @FInterID AS INT, 10 @FTranType AS INT, 11 @FBillNo AS NVARCHAR(50), 12 @FEntryID AS INT 13 14 declare @table0 table 15 (FInterID INT, 16 FEntryID INT) 17 18 insert into @table0 19 (FInterID,FEntryID) 20 SELECT FInterID,FEntryID FROM DELETED 21 22 WHILE EXISTS(SELECT 1 FROM @table0) 23 BEGIN 24 SET ROWCOUNT 1 25 SELECT @FInterID=FInterID,@FEntryID=FEntryID FROM DELETED 26 IF @FInterID > 0 27 BEGIN 28 SELECT @FTranType=FTranType,@FBillNo=FBillNo FROM dbo.ICStockBill WHERE FInterID=@FInterID 29 IF @FTranType > 0 30 IF @FTranType=1 OR @FTranType=2 OR @FTranType=5 OR @FTranType=10 OR @FTranType=21 OR @FTranType=24 OR @FTranType=28 OR @FTranType=29 OR @FTranType=41 31 -- 业务逻辑处理 32 END 33 END 34 DELETE FROM @table0 WHERE FInterID=@FInterID AND FEntryID=@FEntryID 35 SET ROWCOUNT 0 36 END 37 END 38 GO
该触发器 主要是想 针对K3供应链出入库老单删除单据或单据中一行或多行物料 时 触发追加的业务逻辑处理 。 经过测试 发现该触发器 在sql server 查询分析器上执行删除事务该触发器的业务逻辑可以执行,但是在K3客户端进行单据删除操作,触发器的业务逻辑没有被执行。后跟踪K3删除单据sql脚本,发现K3单据删除有两种情况:
1、整张单据删除:K3是先执行“delete from ICStockBill where FInterID=XXXX”,接着执行“delete from ICStockBillEntry whereFInterID=XXXX”;
2、单据删除部分,由于K3是操作是进去K3选中一行 点击菜单栏删除按钮进行删除 然后保存.sql执行顺序是:"DELETE ICStockBill WHERE FInterID=xxxx ----> INSERT INTO StockBillEntry ........ ----> INSERT INTO ICStockBill...... ----->UPDATE ICStockBill .......".
由跟踪出来的信息可知K3单据删除都是先删除 单据头表:ICStockBill ,由于该触发器是单据体表(ICStockBillEntry)的触发器,并且在该触发器中 需要查询单据头表的单据类型(FTranType)等信息 作为下步判断逻辑处理等,但是在此处 单据头该单据信息已被删除,查出来为空。进而不能下步的处理,所以该触发器处理失效. 由于对K3单据删除时 K3是怎么处理 不清楚,上面分析都是本人自己跟踪测试 个人分析出来的。所以在K3中如果需要需要处理这样的业务逻辑,该怎么处理?
PS:在此处记录下来,以后如果有很好的解决办法再来解答...