找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 4129|回复: 11

sql及用友实施高手帮忙看看自己在U872里添加的触发器有问题吗?

[复制链接]
发表于 2009-11-18 11:51:23 | 显示全部楼层 |阅读模式
悬赏30金币已解决
本帖最后由 lbyeye 于 2009-11-18 13:46 编辑

U872的人力资源中,已将人事附加信息中的教育经历(表:hr_hi_edu)设置为多当前记录表,增加“maxs”(布尔型字段)作为是否最高学历判断,现在还想达到新增记录maxs如为1(是最高学历),自动将同一人的其他行maxs更新为0(不是最高学历),我自己写了个触发器:


ALTER     TRIGGER [dbo].[udt_tbu]
ON [dbo].[hr_hi_edu]
FOR insert,update AS  --插入和修改触发器
declare @cPsn_Num nvarchar --人员编码
declare @maxs bit   --是否最高学历
declare @iRecordID int  --同一人的教育经历id
select @cPsn_Num=cPsn_Num ,@maxs=maxs,@iRecordID=iRecordID from inserted
if @maxs=1 and exists(select 1 from hr_hi_edu where cPsn_Num=@cPsn_Num and maxs=1 group by iRecordID having(count(maxs)>1)) --判断新增记录是否为最高学历,以及同一人的最高学历记录是否在一条以上
begin
     update [dbo].[hr_hi_edu] set maxs=0 where cPsn_Num=@cPsn_Num and iRecordID<>@iRecordID --将除新增记录外的最高学历更新为否,不能将新插入或更新的值也修改掉
end


但实际使用还是没有实现要求,原有记录为最高学历的还是没变,是触发器那里有问题?
数据库为sql2005
实际操作中已跟踪到确实对表hr_hi_edu的insert

最佳答案

查看完整内容

。。。。 begin update x set maxs=0 from hr_hi_edu x inner join inserted b on x.cPsn_Num=b.cPsn_Num and x.iRecordID=b.iRecordID end 。。。。
发表于 2009-11-18 11:51:24 | 显示全部楼层
本帖最后由 naojin 于 2009-11-18 12:44 编辑

。。。。

begin
     update x set maxs=0  from hr_hi_edu  x inner join  inserted b on  x.cPsn_Num=b.cPsn_Num and x.iRecordID=b.iRecordID
end
。。。。
回复

使用道具 举报

发表于 2009-11-18 12:44:51 | 显示全部楼层
declare @cPsn_Num nvarchar --人员编码
declare @maxs bit   --是否最高学历
declare @iRecordID int  --同一人的教育经历ID
select @cPsn_Num=cPsn_Num ,@maxs=maxs,@iRecordID=iRecordID from inserted
if @maxs=1 and exists(select 1 from hr_hi_edu where [email=cPsn_Num=@cPsn_Num]cPsn_Num=@cPsn_Num[/email] and maxs=1 group by iRecordID having(count(maxs)>1)) --判断新增记录是否为最高学历,以及同一人的最高学历记录是否在一条以上


这些都可以不申明
回复

使用道具 举报

发表于 2009-11-18 12:46:14 | 显示全部楼层
本帖最后由 naojin 于 2009-11-18 12:49 编辑

也可以看看我的帖子

https://www.oyonyou.com/thread-56018-1-1.html

https://www.oyonyou.com/viewthread.php?tid=69670&highlight=
回复

使用道具 举报

 楼主| 发表于 2009-11-18 13:40:45 | 显示全部楼层
本帖最后由 lbyeye 于 2009-11-19 08:48 编辑

需要修改:
begin
     update x set maxs=0  from hr_hi_edu  x inner join  inserted b on  x.cPsn_Num=b.cPsn_Num and x.iRecordID<>b.iRecordID
end
不胜感谢,以前只知道inner join和select一起使用,现在才知道update和delete居然也支持inner join的方式

还想知道
1、我自己写的那个怎么就不行呢
2、还有其他更容易理解的方式实现吗
3、另外b是插入的行吧,怎么不需要声明x和b呢?

虽然2楼的语句可以用,一个我没看懂,再有我还是想知道我自己写的那里有问题,毕竟只知道答案但不清楚细节
回复

使用道具 举报

发表于 2009-11-19 12:32:33 | 显示全部楼层
总的来说是你的语句的关联条件不正确。
2、估计我的代码是最精简的了。
3、x是hr_hi_edu 表的别名,b 是inserted表的别名。
SqlServer中Deleted =旧的一条记录,Inserted=新的一条记录。一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后往hr_hi_edu 里写入新纪录。
回复

使用道具 举报

发表于 2009-11-19 12:34:51 | 显示全部楼层
楼主还需要多学习sqlserver的语法
回复

使用道具 举报

 楼主| 发表于 2009-11-21 13:26:57 | 显示全部楼层
本帖最后由 lbyeye 于 2009-11-21 18:15 编辑

那如果修改为:
update hr_hi_edu   set maxs=0  from hr_hi_edu   inner join  inserted  on  hr_hi_edu  .cPsn_Num=inserted.cPsn_Num and hr_hi_edu.iRecordID<>inserted.iRecordID

是否可以?至少这样我能理解了,但有一个问题,如果插入的记录maxs就为0,那不就把原来为1的也更新为0了,是否可以加上:

declare @maxs bit
select @maxs=maxs from inserted
if @maxs=1
begin
     update hr_hi_edu   set maxs=0  from hr_hi_edu   inner join  inserted  on  hr_hi_edu  .cPsn_Num=inserted.cPsn_Num and hr_hi_edu.iRecordID<>inserted.iRecordID
end
回复

使用道具 举报

 楼主| 发表于 2009-11-21 18:19:13 | 显示全部楼层
经测试按照我修改的可以实现了,如果插入的记录maxs就为0,不会把原来为1的也更新为0了,最终的执行脚本为:

create trigger rdu
ON [dbo].[hr_hi_edu]
FOR insert,update AS
declare @maxs bit
select @maxs=maxs from inserted
if @maxs=1
begin
     update hr_hi_edu   set maxs=0  from hr_hi_edu   inner join  inserted  on  hr_hi_edu  .cPsn_Num=inserted.cPsn_Num and hr_hi_edu.iRecordID<>inserted.iRecordID
end

学习到不少,很有满足感
回复

使用道具 举报

发表于 2009-11-23 12:41:51 | 显示全部楼层
create trigger rdu ON [dbo].[hr_hi_edu]
FOR insert,update AS

update hr_hi_edu   set maxs=0  from hr_hi_edu   inner join  inserted  on  hr_hi_edu  .cPsn_Num=inserted.cPsn_Num and hr_hi_edu.iRecordID<>inserted.iRecordID and inserted.maxs=1

只需这一句
回复

使用道具 举报

发表于 2011-3-22 16:28:23 | 显示全部楼层
新手学习
回复

使用道具 举报

发表于 2011-10-31 14:43:23 | 显示全部楼层
有点高深的哦。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-12-23 03:30 , Processed in 0.105583 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表