asp中的排序改变向上移动和向下移动的问题。也算是一种算法吧。这里我就拿access举例了。
这个是正常的数据库结构
id | title | px |
1 | 第一项目 | 0 |
2 | 第二项目 | 0 |
3 | 第三项目 | 0 |
4 | 第四项目 | 0 |
id 是 自动的,title 是文本,px 是整数型,展示的时候是通过px 来展示的 order by px desc 倒叙
也就是说 px 越大 越靠前。越小越靠后。那么上面这个 基础的数据库是排序不了的。因为都是0 所以排序不了
那么正常排序的结构是这样的。
id | title | px |
1 | 第一项目 | 100 |
2 | 第二项目 | 50 |
3 | 第三项目 | 20 |
4 | 第四项目 | 10 |
举例:如果这里我们要移动排序 id=2的向上移动的话。那么就首先要获得他的上一条的排序也就是上面所看到的id=1的排序
那么这里我定义下 id=1的px 是 UpPx 那么 id=2向上移动的算法就是
id2的px
px=px+(UpPx-px)+1
这样就向上移动了最终得出的数据就是
id | title | px |
1 | 第一项目 | 100 |
2 | 第二项目 | 101 |
3 | 第三项目 | 20 |
4 | 第四项目 | 10 |
如果展示的话就是
id | title | px |
2 | 第二项目 | 101 |
1 | 第一项目 | 100 |
3 | 第三项目 | 20 |
4 | 第四项目 | 10 |
向下移动是这样的。
算法跟上移差不多。不过是减法
px=(px-(DonPx-px))-1
id | title | px |
1 | 第一项目 | 100 |
2 | 第二项目 | 99 |
3 | 第三项目 | 20 |
4 | 第四项目 | 10 |
算法基本知道。核心的。那么有个重点不得不说下。这里很容易产生混乱
就是你需要获取当前id 的排序 然后在通过排序去看你上一条,和下一条的 排序
shang=当前id的px sql="select px From "&tab&" where Id="&id&""
上一条
sql="select px From "&tab&" where px>"&shang&" order by px asc"
下一条
sql="select px From "&tab&" where px<"&shang&" order by px desc"
根据上述是一种方法 下面是另外一个叫做替换移动法
就是获取当前id的 上下篇的id和排序。
获取上级px 和id
向上移动的话,替换当前id的px 为上级px
然后更新上级px 为当前id的px
下移也同样具体代码可以参考如下。不多说:
<% act=request("act") id=request("Check")'选择的id if act<>"" then tab="ExperimentApplyTable"'数据库的表 '=============链接数据库 set conn=server.CreateObject("adodb.connection") conn.provider="microsoft.jet.oledb.4.0" conn.open server.MapPath("/data.mdb") '=========判断传递过来的id不能为空获取上下排序 if id <>"" then' set rs = Server.CreateObject("adodb.recordset") sql="select AT_id From "&tab&" where Id="&id&"" rs.open sql,conn,1,1 if rs.recordcount>0 then shang=rs("AT_id") end if rs.close set rs = nothing set rs = Server.CreateObject("adodb.recordset") sql="select AT_id,id From "&tab&" where AT_id<"&shang&" order by AT_id desc" rs.open sql,conn,1,1 if rs.recordcount>0 then upid=rs("id") up=rs("AT_id") end if rs.close set rs = nothing set rs = Server.CreateObject("adodb.recordset") sql="select AT_id,id From "&tab&" where AT_id>"&shang&" order by AT_id asc" rs.open sql,conn,1,1 if rs.recordcount>0 then donid=rs("id") don=rs("AT_id") end if rs.close set rs = nothing else '报错!!!!!!!! call ok("传输的id有问题",Request.ServerVariables("HTTP_REFERER")) end if '=========判断传递过来的按钮value if act="up" then'上移 if up<>"" then set rs = Server.CreateObject("adodb.recordset") sql="select AT_id from "&tab&" where Id="&id&" order by AT_id desc" rs.open sql,conn,1,3 if rs.recordcount>0 then ispx=rs("AT_id") rs("AT_id")=up rs.update end if rs.close set rs = nothing set rs = Server.CreateObject("adodb.recordset") sql="select AT_id from "&tab&" where Id="&upid&" order by AT_id desc" rs.open sql,conn,1,3 if rs.recordcount>0 then rs("AT_id")=ispx rs.update end if rs.close set rs = nothing end if call ok("上移成功",Request.ServerVariables("HTTP_REFERER")) elseif act="down" then if don<>"" then set rs = Server.CreateObject("adodb.recordset") sql="select AT_id from "&tab&" where Id="&id&" order by AT_id desc" rs.open sql,conn,1,3 if rs.recordcount>0 then dipx=rs("AT_id") rs("AT_id")=don rs.update end if rs.close set rs = nothing set rs = Server.CreateObject("adodb.recordset") sql="select AT_id from "&tab&" where Id="&donid&" order by AT_id desc" rs.open sql,conn,1,3 if rs.recordcount>0 then rs("AT_id")=dipx rs.update end if rs.close set rs = nothing end if call ok("下移成功",Request.ServerVariables("HTTP_REFERER")) end if '关闭数据 conn.close set conn=nothing end if '===================== '对话框 'ok(url,str) '===================== sub ok(str,url) html="<script type='text/javascript'>window.document.location.href='"&url&"';" html=html&"alert('"&str&"');" html=html&"</script>" response.Write(html) response.End() end sub %>
吉公网安备 22020202000301号