手动排序(置顶 置末 上移 下移)

主要提示:给需要排序的记录增加一个字段N_Order(N_Order值可以设置成该记录ID自增值),用于记录的排序序号。主要通过存储过程实现,但是我这里给出的算法不是最好的,比如置顶操作,可以把要置顶的记录的N_Order设置成最小的N_Order-1,其他记录的N_Order值就都不要变了。

/*
  @Table:kanfang360.FloorModel
  @Func:  手动设置楼号顺序N_Order
  @Author:  Linc
  @Time:  2008.5.23
  @PS:    N_Order值越小越排前
*/
CREATE         proc kf.setFloorModelOrd
@N_Order varchar(20),--排序号
@mode    varchar(20),
@id varchar(20),
@s_out varchar(20) output

AS
declare
@T_N_Order int,
@tempOrder int,
@tempID int,
@preN_Order int,--上一记录的N_Order
@nextN_Order int,
@T_ID int

set @T_N_Order=cast(@N_Order as int)
set @T_ID=cast(@id as int)

begin

	if(@mode='top')--置顶
	 begin
	   --获取最小N_Order值
	   select @tempOrder=MIN(N_Order) from kanfang360.FloorModel
	   --获取最小N_Order值 记录的ID
	   select @tempID=[ID] from kanfang360.FloorModel where N_Order=@tempOrder
	   --将原最小N_Order值 记录的N_Order+1
           update kanfang360.FloorModel set N_Order=@tempOrder+1 where [ID]=@tempID
           --将要置顶的记录的N_Order值设置成最小N_Order值   
	   update kanfang360.FloorModel set N_Order=@tempOrder where N_Order=@T_N_Order
	   --除置顶和原最顶记录外,其他记录的N_Order值+1
	   update kanfang360.FloorModel set N_Order=N_Order+1 Where N_Order<>@tempOrder AND [ID]<>@tempID

	  set @s_out='置顶成功'
	 end--end top

	if(@mode='bottom')--置末
	 begin
	   --获取最大N_Order值
	   select @tempOrder=MAX(N_Order) from kanfang360.FloorModel
	   --获取最大N_Order值 记录的ID
	   select @tempID=[ID] from kanfang360.FloorModel where N_Order=@tempOrder
	   --将原最大N_Order值 记录的N_Order-1
           update kanfang360.FloorModel set N_Order=@tempOrder-1 where [ID]=@tempID
           --将要置末的记录的N_Order值设置成最大N_Order值   
	   update kanfang360.FloorModel set N_Order=@tempOrder where N_Order=@T_N_Order
	   --除置末和原最末记录外,其他记录的N_Order值-1
	   update kanfang360.FloorModel set N_Order=N_Order-1 Where N_Order<>@tempOrder AND [ID]<>@tempID	     	  
	  
	   set @s_out=' 置末成功'
	 end--end bottom

	if(@mode='up')--上移
	 begin
	  --如果是最顶记录就自动退出
	   --获取最小N_Order值
	   select @tempOrder=MIN(N_Order) from kanfang360.FloorModel  
	   if(@tempOrder=@T_N_Order)
	   begin
	     set @s_out='记录已到顶!'
	     return
	   end
	   --获取上一条记录N_Order
	   select Top 1  @preN_Order=N_Order from kanfang360.FloorModel where N_Order<@N_Order order by N_Order desc
	   --获取上一条 记录的ID
	   select @tempID=[ID] from kanfang360.FloorModel where N_Order=@preN_Order   
	   --将上移记录的N_Order设置成上一条记录的N_Order
	   update kanfang360.FloorModel set N_Order=@preN_Order where N_Order=@T_N_Order
	   --将上一条记录的N_Order设置成要上移记录的N_Order   
	   update kanfang360.FloorModel set N_Order=@N_Order where [ID]=@tempID
	  set @s_out=' 上移成功'
	 end--end up

	if(@mode='down')--下移
	 begin
	  --如果是最末记录就自动退出
	   select @tempOrder=MAX(N_Order) from kanfang360.FloorModel  
	   if(@tempOrder=@T_N_Order)
	   begin
	     set @s_out='记录已到底!'
	     return
	   end
	   --获取下一条记录N_Order
	   select Top 1  @nextN_Order=N_Order from kanfang360.FloorModel where N_Order>@N_Order order by N_Order
	   --获取下一条 记录的ID
	   select @tempID=[ID] from kanfang360.FloorModel where N_Order=@nextN_Order   
	   --将下移记录的N_Order设置成下一条记录的N_Order
	   update kanfang360.FloorModel set N_Order=@nextN_Order where N_Order=@T_N_Order
	   --将下一条记录的N_Order设置成要下移记录的N_Order   
	   update kanfang360.FloorModel set N_Order=@N_Order where [ID]=@tempID	  
	   set @s_out='下移成功'
	 end--end down
/*
  @T_N_Order      要插入到此排序号前  4
  @tempID         要插入到此排序号的ID 737
  
  @T_ID           要操作的记录 的ID  731
  @tempOrder      要操作记录的N_Order  1
*/
--exec kf.setFloorModelOrd '3','insert','736',''
	if(@mode='insert')--插入
	 begin
	 select @T_N_Order=N_Order from kanfang360.FloorModel where Floor_Code=@T_N_Order
	  --获取要操作记录的N_Order
  	  select @tempOrder=N_Order from kanfang360.FloorModel where [ID]=@T_ID
	  --获取插入到此排序号的ID
	  select @tempID=[ID] from kanfang360.FloorModel where N_Order=@T_N_Order
	 
        /*
	   插入必须分两种情况,一种是A插入B之前,A的N_Ooder >B的N_Ooder ;还有一种是A@T_N_Order)
 	  begin
	   --获取上一条记录N_Order
	   select Top 1  @preN_Order=N_Order from kanfang360.FloorModel where N_Order<@tempOrder order by N_Order desc
	    if(@preN_Order=@T_N_Order)--如果上一条记录就是要插入到此排序号之前,则退出
  	      begin
		set @s_out='无需插入1';
		return
	      end
	    --执行插入操作
	    
           update  kanfang360.FloorModel set N_Order=@T_N_Order where [ID]=@T_ID
	   update  kanfang360.FloorModel set N_Order=N_Order+1  where (N_Order>=@T_N_Order)AND(N_Order<@tempOrder)AND([ID]<>@T_ID)
	    set @s_out='操作成功1';
          end
--select Top 1  N_Order from kanfang360.FloorModel where N_Order>1 order by N_Order
	 else if(@tempOrder<@T_N_Order)
	  begin
	    --获取要操作记录的下一条记录的N_Order
	    select Top 1  @nextN_Order=N_Order from kanfang360.FloorModel where N_Order>@tempOrder order by N_Order
	    if(@nextN_Order=@T_N_Order)--如果下一条记录就是要插入到此排序号之前,则退出
  	      begin
		set @s_out='无需插入2';
		return
	      end
	    --执行插入操作 
	    update  kanfang360.FloorModel set N_Order=@T_N_Order-1 where [ID]=@T_ID
	    update  kanfang360.FloorModel set N_Order=N_Order-1  where (N_Order>=@tempOrder)AND(N_Order<@T_N_Order)AND([ID]<>@T_ID)
	    set @s_out='操作成功2';
	  end

	 else
	  begin
	    set @s_out='无需插入3';
	    return
	  end
	 end
end

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值