插入序号及更新、删除调整序号,保证数值是连续的 实现原理
insert(查询当前主题下的最大值,如果没有就直接添加,如果有,
就比较,如果当前大,直接插入(保证是连续的);如果当前小,就重新进行排序 大于等于的 进行加一 ,为当前腾一个位置
注释:如果:当前条件下的表中有数据 进入 逻辑A,
否则 : 设置当前domain的序号为1 ,插入数据(当前domain中的序号不一定是1)
逻辑A:
1: 获取当前条件下表中的最大的序号 赋给: @ROLRATE
2: 如果: 表中的最大序号 小于 当前domain中的序号,直接插入到最后一行使序号为 @ROLRATE+1
否则: 使表中所有大于等于 当前domain中的序号的记录的序号加 1 ,再插入当前domain.
if (select count(SBJCOD) from XXX where SBJCOD=#sbjcod:char# ) >= 1
begin
declare @ROLRATE int
set @ROLRATE =( select max(ROLRATE) from XXX where SBJCOD=#sbjcod:char# )
if @ROLRATE <![CDATA[ < ]]>#rolrate:int#
begin
insert into XXX (SBJCOD, ROLCOD, ROLNAM ,ROLRATE, ORGLVL,ISRPTGRP) values (#sbjcod:char#, #rolcod:int#, #rolnam:varchar#,@ROLRATE+1,#orglvl:char#,#isrptgrp:char#)
end
else
begin
update XXX set ROLRATE=ROLRATE+1 where SBJCOD=#sbjcod:char# and ROLRATE >= #rolrate:int#
insert into XXX (SBJCOD, ROLCOD, ROLNAM ,ROLRATE, ORGLVL,ISRPTGRP) values (#sbjcod:char#, #rolcod:int#, #rolnam:varchar#, #rolrate:int#,#orglvl:char#,#isrptgrp:char#)
end
end
else
begin
insert into XXX (SBJCOD, ROLCOD, ROLNAM ,ROLRATE, ORGLVL,ISRPTGRP) values (#sbjcod:char#, #rolcod:int#, #rolnam:varchar#, 1,#orglvl:char#,#isrptgrp:char#)
end
update
查询当前主题下的最大值
调整,如果从小调整大了。在此区间的进行-1操作
如果调整小了,在此区间的进行+1操作。
sql注释
1:获取当前条件下表中的最大的序号 赋给: @ROLRATE
2:如果:变更后的domain的序号(A) 大于变更前的序号(B),使表中所有小于等于A 且 小于B的记录的序号减1
如果:变更后的domain的序号 小于变更前的序号,使表中所有大于等于A 且 小于B的记录的序号加1
如果:变更后的domain的序号 等于变更前的序号,不进行操作。
3:再使@ROLRATE 与 A 进行比较
如果 变更后的序号 大于 当前条件下最大序号,设置当前domain序号为@ROLRATE
否则 直接插入。
declare @ROLRATE int
set @ROLRATE =( select max(ROLRATE) from XXX where SBJCOD=#sbjcod:char# )
if #rolrate:int# > #tmprolrate:int#
begin
update XXX set ROLRATE=ROLRATE-1 where SBJCOD=#sbjcod:char# and <![CDATA[ ROLRATE <= #rolrate:int# and ROLRATE > #tmprolrate:int# ]]>
end
if #rolrate:int# <![CDATA[ < ]]> #tmprolrate:int#
begin
update XXX set ROLRATE=ROLRATE+1 where SBJCOD=#sbjcod:char# and <![CDATA[ ROLRATE >= #rolrate:int# and ROLRATE < #tmprolrate:int# ]]>
end
//调整过后,再处理当前值和 最大值的关系(保证最大值是连续的**********)
if @ROLRATE <![CDATA[ < ]]>#rolrate:int#
begin
update XXX set SBJCOD=#sbjcod:char# , ROLCOD=#rolcod:int# , ROLNAM=#rolnam:varchar# , ROLRATE=@ROLRATE ,ORGLVL=#orglvl:char#,ISRPTGRP=#isrptgrp:char# where SBJCOD=#sbjcod:char# and ROLCOD=#rolcod:int#
end
else
begin
update XXX set SBJCOD=#sbjcod:char# , ROLCOD=#rolcod:int# , ROLNAM=#rolnam:varchar# , ROLRATE=#rolrate:int# ,ORGLVL=#orglvl:char#,ISRPTGRP=#isrptgrp:char# where SBJCOD=#sbjcod:char# and ROLCOD=#rolcod:int#
end
删除操作
sql 注释
1: 删除当前domain ,
2: 更新表中序号大于当前domain序号的记录(CTSQN-1)
delete from XXX where SBJCOD=#sbjcod:char# and ANLCOD=#anlcod:varchar# and COLCOD=#colcod:varchar# and CFGBSL=#cfgbsl:char#
update XXX set CTSQN=CTSQN-1 where SBJCOD=#sbjcod:char# and ANLCOD=#anlcod:varchar# and CFGBSL=#cfgbsl:char# and CTSQN > #ctsqn:int#
备注:
1:设置方式
DECLARE @dim_val_cnt INT
SELECT @dim_val_cnt = COUNT(1) from XX
2:比较
IF (@dim_val_cnt = 0)
begin
end
else if ()
else if ()
else