Foxtable(狐表)用户栏目专家坐堂 → 触发器中字段值的变化如何引用?


  共有3245人关注过本帖树形打印复制链接

主题:触发器中字段值的变化如何引用?

帅哥哟,离线,有人找我吗?
HappyFt
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1934 积分:17661 威望:0 精华:0 注册:2014/7/29 19:09:00
触发器中字段值的变化如何引用?  发帖心情 Post By: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;

 

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

谢谢!


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/17 10:31:00 [只看该作者]

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

 

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

 


 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1934 积分:17661 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1934 积分:17661 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/7/17 10:54:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/17 12:28:00 [只看该作者]

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

 

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

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
HappyFt
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1934 积分:17661 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2018/7/17 19:29:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/17 20:20:00 [只看该作者]

前台不是应该从表格里取值么,判断行的rowstate

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/18 10:11:00 [只看该作者]

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

 

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

 


 回到顶部