标签:tde 个数 mic object 等于 div begin string code
公司的组织机构图一般用树形展示,大括号内为部门代码,默认隐藏,显隐可以切换;
要实现拖动某个部门到另一部门下,自动产生新的部门代码,部门表结构如下:
CREATE TABLE [dbo].[DEPTCODE]( [DEPT_ID] [bigint] NOT NULL,--部门id [DEPT_CODE] [varchar](20) NULL,--部门代码 [PARENT] [varchar](20) NULL,--父级部门代码 [CONTENT] [varchar](128) NULL,--部门名称 [GRADE] [int] NULL,--部门级别 [CREATEDATE] [datetime] NULL,--创建日期 [DEPTOUT] [int] NULL--是否作废 --此处忽略与本文无关的字段, )
要想产生新的部门代码,需要获取对应部门级别由几位数字组成,系统由一个表保存,结构如下:
CREATE TABLE [dbo].[DEPTGRADE]( [GRADE] [varchar](30) NULL --各级部门使用几个数字保存,最多20级,每级一个数字,如33333333330000000000 )
后台使用存储过程实现拖拽部门,参数为拖动前后部门代码,其中调用函数获取目标部门子级部门的级别、总位数、当前级别位数,具体代码如下;
/****** Object: UserDefinedFunction [dbo].[FGetDeptInfo] Script Date: 08/12/2017 20:41:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[FGetDeptInfo] ( @Dept_code VARCHAR(200) , @rType VARCHAR(20) ) RETURNS INT AS BEGIN DECLARE @grade VARCHAR(20) DECLARE @p INT , @isum INT --设置部门级数信息 SELECT @grade = GRADE FROM deptGrade SET @p = 0 SET @isum = 0 WHILE @isum < LEN(@Dept_code) BEGIN SET @p = @p + 1 SELECT @isum = @isum + SUBSTRING(@grade, @p, 1) END RETURN CASE @rType WHEN ‘Grade‘ THEN @p WHEN ‘TotalLength‘ THEN @isum WHEN ‘SubLength‘ THEN SUBSTRING(@grade, @p, 1) END END /****** Object: StoredProcedure [dbo].[pDeptDrag] Script Date: 08/12/2017 15:54:14 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /*从源部门拖动到新部门,输入拖动前后部门代码*/ CREATE PROCEDURE [dbo].[pDeptDrag] @Source_Dept_code VARCHAR(200) , @New_Parent_code VARCHAR(200) AS BEGIN DECLARE @SDept_code VARCHAR(200) DECLARE @NDept_code VARCHAR(200) DECLARE @SubDeptsn INT DECLARE @SubDept_Code VARCHAR(200) DECLARE @MinSubDept_Code VARCHAR(200) DECLARE @SubLength INT DECLARE @i INT SET @SDept_code = @Source_Dept_code SET @NDept_code = @New_Parent_code --拖动到父级部门,等于没动 IF @NDept_code = ( SELECT PARENT FROM deptcode WHERE dept_code = @SDept_code ) RETURN --拖动到子级部门,不允许 IF EXISTS( SELECT 1 FROM deptcode WHERE dept_code = @NDept_code AND dept_code LIKE @SDept_code+ ‘%‘ ) RETURN --找出新父级部门下不存在的最小子部门 SET @SubLength = [dbo].[FGetDeptInfo](@NDept_code, ‘SubLength‘) SET @SubDeptsn = 1 SET @SubDept_Code = ‘‘ SET @i = 1 --子级部门代码长度 WHILE @i <= @SubLength BEGIN SET @SubDept_Code = @SubDept_Code + ‘0‘ SET @i = @i + 1 END WHILE EXISTS ( SELECT 1 FROM deptcode WHERE DEPT_CODE = @NDept_code + LEFT(@SubDept_Code, @SubLength - LEN(@SubDeptsn)) + CONVERT(VARCHAR(2), @SubDeptsn) ) BEGIN SET @SubDeptsn = @SubDeptsn + 1 END SET @MinSubDept_Code = @NDept_code + LEFT(@SubDept_Code, @SubLength - LEN(@SubDeptsn)) + CONVERT(VARCHAR(2), @SubDeptsn) --更新原部门下所有部门的部门代码、级数、父级部门,如有必要,请更新临时表 --本级部门 UPDATE dbo.DEPTCODE SET DEPT_CODE = @MinSubDept_Code , Grade = [dbo].[FGetDeptInfo](@MinSubDept_Code, ‘Grade‘) , parent = @NDept_code WHERE DEPT_CODE = @SDept_code --下属部门 UPDATE dbo.DEPTCODE SET DEPT_CODE = STUFF(DEPT_CODE, 1, LEN(Parent), @MinSubDept_Code) , Grade = [dbo].[FGetDeptInfo](STUFF(DEPT_CODE, 1, LEN(Parent), @MinSubDept_Code), ‘Grade‘) - 1 , parent = @MinSubDept_Code WHERE DEPT_CODE LIKE @SDept_code + ‘%‘ AND DEPT_CODE <> @SDept_code END
标签:tde 个数 mic object 等于 div begin string code
原文地址:https://www.cnblogs.com/yuqiaoQA/p/11839090.html