以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  触发器中字段值的变化如何引用?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=121992)

--  作者:HappyFt
--  发布时间:2018/7/17 9:17:00
--  触发器中字段值的变化如何引用?

想根据盘点表中的主管字段第一次赋值时生成盘点调整表,如下SQL语句

ALTER TRIGGER [dbo].[trup_pdb]
ON [dbo].[盘点表]
AFTER UPDATE
AS
BEGIN
    --生成盘点调整表
    IF UPDATE(主管)
    BEGIN
        DECLARE @New NVARCHAR(8);
        DECLARE @Old NVARCHAR(8);
        DECLARE @YM NVARCHAR(8);
        DECLARE @ck NVARCHAR(16);
        DECLARE @cg NVARCHAR(8);
        DECLARE @datepd DATETIME;
        DECLARE @bh NVARCHAR(16);

        SELECT @New = a.主管,
            @Old = b.主管,
            @YM = a.年月,
            @ck = a.仓库,
            @cg = a.仓管,
            @bh = a.盘点编号,
            @datepd = a.盘点日期
        FROM inserted a
            INNER JOIN Deleted b
                ON a._Identify = b._Identify;
        IF @New IS NOT NULL AND @Old IS NULL  --如果主管字段第一次赋值
        BEGIN

 

        ...生成盘点调整表的语句


        END;
    END;
END;

 

但上面红色的条件没起作用,因为下面生成表的语句没有执行,应该怎么写才可以?

谢谢!


--  作者:有点甜
--  发布时间:2018/7/17 10:31:00
--  

更新的动作你可以分2步理解,先delete,再insert
所以,前的值在 deleted里
后的值在 inserted里

 

查表即可,如 https://www.cnblogs.com/naniannayue/archive/2011/04/22/2024830.html

 


--  作者:有点甜
--  发布时间:2018/7/17 10:41:00
--  

你执行的sql语句应该没问题的,你输出各个值看一下。再有就是,你update了多少行数据?

 

        SELECT @New = a.主管,
            @Old = b.主管,
            @YM = a.年月,
            @ck = a.仓库,
            @cg = a.仓管,
            @bh = a.盘点编号,
            @datepd = a.盘点日期
        FROM inserted a
            INNER JOIN Deleted b
                ON a._Identify = b._Identify;


--  作者:HappyFt
--  发布时间:2018/7/17 10:48:00
--  
但这样同时查询出来也应该可以啊,与2楼好像没有本质的区别,只是将两个条件写在一起表示一定是第一次主管有值时
      SELECT @New = a.主管,
            @Old = b.主管,
            @YM = a.年月,
            @ck = a.仓库,
            @cg = a.仓管,
            @bh = a.盘点编号,
            @datepd = a.盘点日期
        FROM inserted a
            INNER JOIN Deleted b
                ON a._Identify = b._Identify;
        IF @New IS NOT NULL AND @Old IS NULL  --如果主管字段第一次赋值

--  作者:HappyFt
--  发布时间:2018/7/17 10:54:00
--  
不确定,因为填写时操作者可能同时操作几张表填写主管的名字再保存(是通过sql语句用事务一次性同时保存的)
即使select时只取到最后一个表的值也应该至少生成一张新的盘点整表才是,但是一个都没有?
触发器中的值要如何返回到前台来,比如想看一下@New,与@Old两个的值?
谢谢!

--  作者:有点甜
--  发布时间:2018/7/17 12:28:00
--  

1、输入你获取到的变量的值;

 

2、多行数据只触发一次触发器的;

 

3、你应该循环各行数据分别判断的。


--  作者:HappyFt
--  发布时间:2018/7/17 19:29:00
--  
其他都没问题,我是问select @New  = ....
得到@New的值后,在触发器中要如何写才能将这个值反馈到前台来,在前台界面上只是改变主管的值保存后触发器就运行了,比如前台想用msgbox()来显示这个改变的值分怎么样才做的到?

--  作者:有点蓝
--  发布时间:2018/7/17 20:20:00
--  
前台不是应该从表格里取值么,判断行的rowstate
--  作者:有点甜
--  发布时间:2018/7/18 10:11:00
--  

数据库和前台是无法交流的。

 

你可以在beforesavedatarow事件检测旧值新值 http://www.foxtable.com/webhelp/scr/2369.htm