台灣最大程式設計社群網站
線上人數
1555
 
會員總數:246494
討論主題:190002
歡迎您免費加入會員
討論區列表 >> MS SQL >> [SQL]上一筆與下一筆的連結如何跳過空值
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
[SQL]上一筆與下一筆的連結如何跳過空值
價值 : 0 QP  點閱數:4223 回應數:7
樓主


初學者
10 2
4 3
發送站內信

拜託幫一下,
我寫了一個表格顯示單筆資料,另設「上一筆」與「下一筆」的按鈕,用來讀取上下筆的資料,把SELECT到的主鍵+1或-1來當參數帶入連結
像這樣:
     if request("newsid")=empty then
   SQL = "Select * From news Order By newsdate DESC"
   else
   SQL = "Select * From news where newsid="&request("newsid")&""
   end if 
   rs.open SQL, Conn, 3, 3
...顯示區略...
上一筆:把NewsID-1
上一筆:把NewsID+1
個別的聯結就像是<A HREF="xxx.ASP?NewsID=「+1或+1之後的數字」>

但是問題在,若某一筆資料的ID是跟前後不連續的,就出現錯誤了,我該怎麼作,才能讓這個上一筆下一筆的工作跳過沒有資料的ID?

本篇文章發表於2002-08-28 16:43
1樓
作者回應


檢舉此回應
打錯,
個別的聯結就像是<A HREF="xxx.ASP?NewsID=「+1或+1之後的數字」>
應該是
個別的聯結就像是<A HREF="xxx.ASP?NewsID=「原本ID+1或-1之後的數字」>
本篇文章回覆於2002-08-28 17:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應


檢舉此回應
還有一個問題,當ID變成零或是超過最大的ID數字,也是一樣錯誤:
error '80020009' 
Exception occurred. 

我剛剛在到處看,發現有個網站的上下筆資料,是多帶一個參數:
顯示的那一筆原本是這樣:
http://XXX/forums/msg.asp?id=A02&msgid=99840&posit=3
上一筆就是:
http://XXX/forums/msg.asp?but1=Next&msgid=99840&n=1&posit=3&id=A02
下一筆就是:
http://XXX/forums/msg.asp?but1=Prev&msgid=99840&n=1&posit=3&id=A02
看的出他多帶一個but1,來找出另一筆資料,但是不知他怎寫的,各位可以幫忙想想嗎?
拜託拜託拜託
本篇文章回覆於2002-08-28 17:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應


檢舉此回應
我自己研究成功了,謝謝大家
果然是多帶一個參數
當錯誤時把ID再多+1或多-1,重導一次
本篇文章回覆於2002-08-28 18:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

redhair
檢舉此回應
但是如果有兩個ID中間差了幾千號,程式每次都加1來重導,要重導千次,server怎麼受得了?
而且也無法知道是還沒找到下一個ID還是已經超過最後一個ID了?
可以試試這樣做:
首先判斷but1是下一筆(Next)還是上一筆(Prev)
假如but1 = Next
SQL = "Select Top 1 * From news Where newsid > '" & id &"' Order By newsid"
如果rs.eof =true,表示已超過最後一筆了

假如but1 = Prev
SQL = "Select Top 1 * From news Where newsid < '" & id &"' Order By newsid Desc"
如果rs.eof =true,表示已超過第一筆了

這樣做的話,只要向db query一次,不用一直重新導向進行新的query



本篇文章回覆於2002-08-29 06:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應


檢舉此回應
感謝感謝!果然,比我ㄉ方法有效率很多,我改寫成這樣:
if request("newsid")=empty then
   SQL = "Select * From news Order By newsdate DESC"
   elseif dir="next" then
   SQL = "Select Top 1 * From news Where newsid > "&request("newsid")&" Order By newsid"
   elseif dir="pre" then
   SQL = "Select Top 1 * From news Where newsid < "&request("newsid")&" Order By newsid Desc"
   else
   SQL = "Select * From news where newsid="&request("newsid")&""
   end if
若EOF為真,則重導一次,不帶任何參數

正在測試中,不知還有沒有效率不彰或是BUG,若看出問題請幫忙說一下囉
本篇文章回覆於2002-08-30 03:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應


檢舉此回應
嗯,這樣有問題,遇到中斷ID的跳不過去!
本篇文章回覆於2002-08-30 04:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應


檢舉此回應
是我的錯,可以了,SORRY
本篇文章回覆於2002-08-30 04:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.