您的位置:首页 > 其它

根据AD中传回的上级manager信息更新系统需要的上级

2016-03-26 20:18 1266 查看
已知:

1、AD中同步的上级字段字符串为

CN=张三,OU=业务发展,OU=find908,OU=Account,DC=fd,DC=com


2、人力资源表中上级managerid 为int型,存储的是人力资源id

3、人力资源表中所有上级managerstr为 str型,存储的是所有上级的id,以”,”号分割

4、人力资源表中有预留的文本字段 textfield1~textfield5

解决问题思路:

1、 将AD中的上级字段字符串同步到textfield4中

2、在人力资源表中的textfield4上写触发程序,当发生insert或者update时做相应的处理

3、对 上级字段字符串做处理,只获取 上级的姓名 如 “张三”

4、写2个函数分别去获取 上级字符串中的 姓名对应的 id 和 manager

step1:

对 上级字段字符串做处理,只获取 上级的姓名 如 “张三”,用sqlserver自带函数即可

Substring(textfield4,4,(Patindex('%,%',textfield4)-4))


step2:写2个函数分别去获取 上级字符串中的 姓名对应的 id 和 manager

GO

/****** Object:  UserDefinedFunction [dbo].[getManagerStr]    Script Date: 03/26/2016 11:27:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
/*DROP FUNCTION [dbo].[getManagerStr];*/

GO
CREATE function [dbo].[getManagerId](@ad_manager_str varchar(500))
RETURNS INT
AS
BEGIN  Return (select ID  from HrmResource
where lastname=Substring(@ad_manager_str,4,(Patindex('%,%',@ad_manager_str)-4)) )
END;
GO

GO
CREATE function [dbo].[getManagerStr](@ad_manager_str varchar(500))
RETURNS VARCHAR(100)
AS
BEGIN  Return (select managerstr  from HrmResource
where lastname=Substring(@ad_manager_str,4,(Patindex('%,%',@ad_manager_str)-4)) )
END;
GO


step3:在人力资源表中的textfield4上写触发程序,当发生insert或者update时做相应的处理

需要注意的是

A 按照下面的处理逻辑,人员上级树中的顶点即CEO节点如果维护了上级是他自己,就不要写在触发更新范围里

B 同步时,最好对同步的人员数据 按照人员级别 从上往下顺序同步,若没有做顺序处理,第一次同步则需要多同步1-2次,依据层级而定若是最底层的树到根节点只有2个距离,共同步3次即可保证所有manager,managerstr字符串的正确性

GO

/****** Object:  Trigger [dbo].[hrmresource_getmanagerId_Str]    Script Date: 03/26/2016 20:07:18 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE trigger [dbo].[hrmresource_getmanagerId_Str] ON [dbo].[HrmResource]
FOR INSERT,UPDATE
AS
DECLARE @manager_str varchar(4000)
DECLARE @managerid int
DECLARE @id_1 int
begin if (update(textfield4))
begin SELECT @managerid = dbo.getManagerId(textfield4),@manager_str=dbo.getManagerStr(textfield4),@id_1=id FROM  inserted
update HrmResource set managerid= @managerid,managerstr=','+Convert(varchar(100),@managerid)+@manager_str where id = @id_1 and lastname not in
(select c.lastname from HrmRoles a
left join HrmRoleMembers b on a.id=b.roleid
left join HrmResource c on c.id=b.resourceid
where a.rolesmark='CEO')
end
end

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: