如何取得当前记录的前三条后三条

almims 2006-09-28 10:12:35
我想实现一个功能。
要获取当前记录的前三条和后三条记录。
如果前面不足三条,则后面补足(例如:当前记录的前面只有二条记录,则在当前记录后面取四条;若后面只有两条记录,则前面取四条。)

就是说要获取当前记录的前后记录总共六条。

我想了一下一共有以下几总取值的情况:

前大于3条 (当前记录) 后大于3条 =则取前3条,后3条

前小于3条 (当前记录) 后小于3条 =前后全取出

前大于3条 (当前记录) 后小于3条 =前面多取几条以补足后面少的几条

前小于3条 (当前记录) 后大于3条 =后面多取几条以补足前面少的几条
...全文
494 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjincheng88 2006-09-29
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4935/4935858.xml?temp=.9749872
almims 2006-09-28
  • 打赏
  • 举报
回复
终于实现了。。。。


Dim SightRs,PrevNum,NextNum,SightNum,SightArray(6)
SightNum = 0
Set SightRs = Conn.ExeCute("Select Count(S_ID) From [Sight_Info] Where C_ID=" & C_ID & " And S_ID<" & S_ID)
If Not SightRs.Eof Then
PrevNum = SightRs(0)
Else
PrevNum = 0
End If
SightRs.Close
Set SightRs = Nothing

Set SightRs = Conn.ExeCute("Select Count(S_ID) From [Sight_Info] Where C_ID=" & C_ID & " And S_ID>" & S_ID)
If Not SightRs.Eof Then
NextNum = SightRs(0)
Else
NextNum = 0
End If
SightRs.Close
Set SightRs = Nothing

If PrevNum<3 And NextNum>3 Then
SightNum = 0
Set SightRs = Conn.ExeCute("Select Top " & PrevNum & " S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID<" & S_ID & " Order By S_ID Desc")
Do Until SightRs.Eof
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
SightRs.MoveNext
Loop
SightRs.Close
Set SightRs = Nothing

Set SightRs = Conn.ExeCute("Select Top " & 6 - PrevNum & " S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID>" & S_ID)
Do Until SightRs.Eof
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
SightRs.MoveNext
Loop
SightRs.Close
Set SightRs = Nothing
ElseIf PrevNum>3 And NextNum<3 Then
SightNum = 0
Set SightRs = Conn.ExeCute("Select Top " & NextNum & " S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID>" & S_ID)
Do Until SightRs.Eof
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
SightRs.MoveNext
Loop
SightRs.Close
Set SightRs = Nothing

Set SightRs = Conn.ExeCute("Select Top " & 6 - NextNum & " S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID<" & S_ID & " Order By S_ID Desc")
Do Until SightRs.Eof
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
SightRs.MoveNext
Loop
SightRs.Close
Set SightRs = Nothing
Else
SightNum = 0
Set SightRs = Conn.ExeCute("Select Top 3 S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID<" & S_ID & " Order By S_ID Desc")
Do Until SightRs.Eof
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
SightRs.MoveNext
Loop
SightRs.Close
Set SightRs = Nothing

Set SightRs = Conn.ExeCute("Select Top 3 S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID>" & S_ID)
Do Until SightRs.Eof
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
SightRs.MoveNext
Loop
SightRs.Close
Set SightRs = Nothing
End If
almims 2006-09-28
  • 打赏
  • 举报
回复
SightRs.MovePrevious

SightRs.NextPrevious
mkqiang 2006-09-28
  • 打赏
  • 举报
回复
是不是某一条记录的前后字段啊?
mkqiang 2006-09-28
  • 打赏
  • 举报
回复
不清楚楼上所说的为何物!
sotwind 2006-09-28
  • 打赏
  • 举报
回复
实在搞不明白你的数据库记录集怎么会有前后之分啊

太神奇了
sotwind 2006-09-28
  • 打赏
  • 举报
回复
有点莫名其妙噢
almims 2006-09-28
  • 打赏
  • 举报
回复
ID:1 2 (4) 5 6 7 8 9 10

这样就要取出 1 2 5 6 7 8

ID:(4)5 6 7 8 9 10

这样就要取出 5 6 7 8 9 10
almims 2006-09-28
  • 打赏
  • 举报
回复
如果是:
ID:1 2 (4)5 6 7 8 9 10

ID:(4)5 6 7 8 9 10
sotwind 2006-09-28
  • 打赏
  • 举报
回复
if <=6 条
取全部

if >6条
则前三后三

就两种嘛
almims 2006-09-28
  • 打赏
  • 举报
回复
ID:1 2 3 4 5 6 7

ID=4的前三条,后三条(前三条:1 2 3 后三条:5 6 7)

当然记录集不可能是刚好有前三条,后三条,情况很多,所以考虑的情况也很多。
sotwind 2006-09-28
  • 打赏
  • 举报
回复
if rs.recordcount>=3 then

我觉得这句应该改成 rs.recordcount>=6 才有点意思
almims 2006-09-28
  • 打赏
  • 举报
回复
Dim SightRs,SightNum,SightArray(6)
SightNum = 0
Set SightRs = Server.CreateObject("Adodb.Recordset")
Sql = "Select S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID=" & S_ID
SightRs.Open Sql,Conn,1,1
Do Until (SightRs.Bof Or SightNum>=3)
SightRs.MovePrevious
If Not SightRs.Bof Then
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
Response.Write("<script>alert('1||S_ID="& SightRs("S_ID") &"')</script>")
End If
Loop
SightRs.Close

Sql = "Select S_ID,S_Name,S_Pic,S_Intro From [Sight_Info] Where C_ID=" & C_ID & " And S_ID=" & S_ID
SightRs.Open Sql,Conn,1,1
Do Until (SightRs.Eof Or SightNum>=6)
SightRs.MoveNext
If Not SightRs.Eof Then
SightArray(SightNum) = SightRs("S_ID") & "$$" & SightRs("S_Name") & "$$" & SightRs("S_Pic") & "$$" & SightRs("S_Intro")
SightNum = SightNum + 1
Response.Write("<script>alert('2||S_ID="& SightRs("S_ID") &"')</script>")
End If
Loop
SightRs.Close
sotwind 2006-09-28
  • 打赏
  • 举报
回复
for i=0 to 2
取一条
rs.movenext
if rs.eof then exit for
next
if rs.recordcount>=3 then
rs.move rs.recordcount-3
for i=0 to 2

rs.movenext
next
end if

未测试 只是想法

xxuu503 2006-09-28
  • 打赏
  • 举报
回复
MoveFirst、MoveLast、MoveNext、MovePrevious 方法 (RDS)
在显示的记录集中移动到第一个、最后一个、下一个或前一个记录。

语法

DataControl.Recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

参数

DataControl 对象变量,代表 RDS.DataControl 对象。

说明

可以使用 RDS.DataControl 对象的 Move 方法在 Web 页的数据绑定控件的数据记录中定位。例如,假设通过绑定到 RDS.DataControl 对象来显示网格中的记录集。然后可以加入“第一个”、“最后一个”、“下一个”或“上一个”按钮,以便用户可以单击这些按钮移动到记录集的第一个、最后一个、下一个和上一个记录。对于“第一个”、“最后一个”、“下一个”和“上一个”按钮,可分别通过调用 onClick 过程中 RDS.DataControl 对象的 MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法来实现。地址簿范例将说明其具体方法。

sotwind 2006-09-28
  • 打赏
  • 举报
回复
什么叫前面不足后面有?

当前记录集是不? 怎么分前后?
如果前面没了 后面还有吗?
almims 2006-09-28
  • 打赏
  • 举报
回复
就是表中指定一条记录,要获取的是该条记录的前面三条和后面三条记录。

前后都没记录了,那就不取,即:无数据。

若是前有三条就取出,后有三条取出。

反正就是取出当前记录的前后记录总数为6条

达不到6条,或一条也没有,也没关系。
huo789 2006-09-28
  • 打赏
  • 举报
回复
不明白”当前记录“是什么意思?
如果是数据库表中记录,前面不足三条的话,还谈什么后面4条?
kubbye 2006-09-28
  • 打赏
  • 举报
回复
用游标,要能滚动的,往前移动游标,同时判断是否到了非数据区,然后再往后移动:
rs.mark(); //标记当前
int i=0;
int j=0;
for(i=0;rs.foward();i++)
{
if(i=2)
{
break;
}
}
rs.reset(); //将游标设置到设置标记的地方
for(j=0;rs.next();j++)
{
if(j=2)
{
break;
}
}
if(i=2) //前面>=3条记录
{
if(j=2) //后面>=3条记录
{
rs.reset();
rs.forward();
用游标,要能滚动的,往前移动游标,同时判断是否到了非数据区,然后再往后移动:
rs.mark(); //标记当前
int i=0;
int j=0;
for(i=0;rs.foward();i++)
{
if(i=2)
{
break;
}
}
rs.reset(); //将游标设置到设置标记的地方
for(j=0;rs.next();j++)
{
if(j=2)
{
break;
}
}
if(i=2) //前面>=3条记录
{
if(j=2) //后面>=3条记录
{
rs.reset();
rs.forward();
rs.forward();
rs.forward();
//开始取需要的
}
if(j!=2)
{
for(int k=1;k<4+(2-j);k++)
{
rs.forward();
}
//开始取需要的
}
}
}
}
if(i!=2) //前面不足3条
{
rs.first();
for(int k=0;k<7 ,rs.next();k++)
{
//开始取需要的
}
}
almims 2006-09-28
  • 打赏
  • 举报
回复
不好表达啊。。

我想这代码还有待于优化,或许可以简化简化,感觉有些饶远路。。。
加载更多回复(1)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧