VBScript 製作換頁數功能


Tek 發表



在沒有提供換頁能力的程式語言環境下,也是能照要做出換頁數的效果!

VBScript 製作換頁數功能

文章編寫: Tek (tek1e@netscape.net)
程式語言: VBscript (Visual Basic Script)
編寫日期: 5/9/2003



在許多網站上,大部份讀取資料庫網頁程式都有換頁數的能力• 例如ASP,做一個有換頁能力的網頁是再也簡單不過的事了! 但是,您曾是否想過如果程式本身沒有換頁的能力,那要怎麼做出換頁的功能呢? 這種情況也許用ASP讀資料庫的編寫者不會遇到,但是如果在VBScript上呢? 假設您寫了一個可以讀取資料庫的VBS,要如何照樣順利建立一個換頁功能呢? 也許您會說,VBScript因為功能被限制,我用其他的就可以了,所以這篇就甭看了• 如果您是ASP.Net愛好者,那麼當你在使用datalist control時,您會發現這種說法是錯.誤.的• 因為ASP.Net的Datalist control雖然有建立自己的template功能,卻沒有換頁的function• 而唯一的解決辦法,就是完全瞭解程式是怎麼自己做到分頁的能力的! 當您瞭解後,換頁就再也不是程式語言功能的專利了!

其實要做換頁功能的範圍很廣,基本上只要是與總資料數量控制的程式都可以用到換頁• 例如讀取一個文字檔並基於文字顯示的數量來做索引分頁、陣列顯示數量、寫IIS Log viewer等等... 而最常見的,則為從資料庫的資料索引換頁•


在您要開始學習這篇文章時,如果您擁有以下條件,那麼在學習上會比較輕鬆:


1. 瞭解程式變數/常數意義,及完整使用方法,例:

a. 變數在子程式外的影響

2. 對VBScript大部份函式、功能等有基本的瞭解,例如:

a. mod 運算子
b. for...next 陳述式
c. Array 函數
d. cookie 使用
e. 對表單的控制
f. sub, function 程序的使用
g. if...then...else 陳述式
h. 更多...

3. 瞭解數學加減乘除,這樣子才可以瞭解:

a. 程式是如何算出總頁數的
b. 程式是如何控制每一頁所顯示的資料數量
c. 控制頁數
d. 更多...


如果您越接近以上的條件,那麼相對的您學習以下的教學將會越容易• 但是Tek 還是會盡量以最簡單的方式帶過說明! 如果是重要的,那我將會盡量以最簡單的方式讓您瞭解• 如果您有VBS的函式或類似的問題,那麼您可到msdn.microsoft.com來下載VBS 或 WSH的Html help 檔案來直接查詢功能的使用•


【一切的開始】解剖換頁功能


要準備建立一個換頁功能,首先您必須先收集一些將會是您在網頁上控制換頁的關鍵資料• 包括有『總資料數量』、『每頁的資料數量』『目前的頁數』『餘數』『總頁數』• 其實這些並還沒真的講到到程式編寫上,只是普通的數學,所以先別嚇到了... 我現在就一一講解要如何求出這些資料,及為什麼需要他們•

-總資料數量:
如果要從資料庫抓出總資料數量並不難,以ASP而言,有recordcount method來抓• 但在最後的範本,我用陣列當做資料庫使用• 所以要算出陣列的總資料,您可以用ubound() 來抓上限• 但注意陣列是第0比也會跟著算進去的,所以要顯示資料的話,可以在後面放個+1即可! (第0比不代表沒資料,而是陣列)
這非常重要,因為總頁數、餘數等都要靠它來算出其答案•

-每頁的資料數量:
這其實不是算出來,而是設計者自定的• 這代表每一頁所將會顯示的資料的數量• 靠每頁的資料數量,您才可以算出總頁數、餘數、算索引(每頁應該所顯示的數量)、上下頁控制等•

-目前的頁數:
基本上這算是使用者自己更動的部份• 預設從1開始算• 靠它,您可以算出索引、頁數控制等•

-餘數:
餘數 = 將兩個數值相除,然後傳回其餘數。 您必須將總資料數量除每頁所要顯示的資料數量(浮點數會捨入為整數),並得到餘數• 在這邊,餘數是程式控制準確頁數的關鍵•

假設,我有一個總資料為122,每一頁的顯示數量為10的話,那麼:
餘數:2
122 / 10 = 12 ,因為有餘數,所以總頁數再+1 = 13

再這邊,我寫一個小程式讓大家來自己算看看:

<Script Language="VBS">
total_record = 122
rec_per_pg = 10
if rec_per_pg >= total_record then
rec_per_pg = total_record
end if
modresult = total_record mod rec_per_pg
total_over_recpg = cint(total_record/rec_per_pg)
pgcount = 0
with document
.write "總資料數量: " & total_record & "<BR>"
.write "每頁的資料數量: " & rec_per_pg & "<BR>"
.write "餘數:" & modresult & "<BR>"
.write total_record & " / " & rec_per_pg & " = " & total_over_recpg & "<BR>"
if not modresult = 0 then
.write "總頁數: " & total_over_recpg + 1
else
.write "總頁數: " & total_over_recpg
end if
end with

</script>


【VBS換頁的數學小技巧】換頁可能會用到的數學公式


求餘數 = 總資料數量 Mod 每一頁所要顯示的資料數量
算總頁數 = 總資料數量 / 每一頁所要顯示的資料數量(算整數但不四捨五入,如果有餘數則再加一)
算開始索引 = (目前的頁數 x 每一頁所要顯示的資料數量) - 每一頁所要顯示的資料數量
算結束索引 = (目前的頁數 x 每一頁所要顯示的資料數量) - 1


【換頁功能成功的關鍵】瞭解索引控制


為什麼我一直提到索引? 其實說換頁只是個幌子... 說換頁,事實上你只是在控制索引數量而已• 也就是說,你的目地只是要讓程式能自己判斷在第幾頁顯示第幾筆到第幾筆的資料,而並非真的程式會"換頁"• 要做索引,您必須要以兩部份分開來想• 一為開始,二為結束索引• 要算出這兩個,您必須將目前的頁數乘上每一頁顯示的數量! 如果說是要算開始的索引,則將剛得到的值減掉每一頁顯示的數量• 如果說是結束的索引,則減一•

接著,拿著這兩個值放入迴圈中(for...next)就可以控制索引• 注意在迴圈裡,您必須要在開始處理要顯示的資料前判斷索引是否有超過資料數量範圍,如果超過則用Exit method離開迴圈即可• 為什麼要這樣? 因為當您遇到這種情況時,通常都會代表餘數不等於零• 也就是說,最後一頁不跟其他頁一樣有同樣的結束索引•


【VBS有效的保持變數資料】使用Cookie


因為"目前的頁數"資料是您唯一讓使用者操控的,所以每次都必須更新此變數! 如果只是用Dim 陳述式來儲存變數的話,那麼瀏覽器在重新整理或離開去讀其他網頁時,目前停留的頁數就會消失• 挺囉嗦的,如果說有十幾頁的話不都要每一次回來都選的要死? 唯一解決的辦法,就是用Cookie來暫時保存資料• 以下為Cookie的使用辦法:

<Script Language="VBS">
Document.Cookie = "VBScript eats cookies"
Document.Write(document.cookie)

</Script>

注意有一些網頁空間會在瀏覽者登入時就會自動製造Cookie, 有時可能會影響對Cookie的控制!


【實際範例】VBScript 有換頁功能的程式碼


<Html>
<Head>

<meta http-equiv="Content-Type" content="text/html; charset=big5">
<Script Language="VBS">
'Coded By Tek (tek1e@netscape.net)
'Website: http://tek-c.sytes.net/
'Purpose: This programs shows how to use paging
' function in VBScript environment.
Option Explicit

'Given information
Dim data_loop

'My database
Dim data_value(29) '30, including index zero
data_value(0) = "Superman can't fly 'cuz he's fat!"
data_value(1) = "Batman is getting older, so there's ""Batman beyond"""
data_value(2) = "Tek is the webmaster of http://tek-c.sytes.net"
data_value(3) = "Microsfot's boss, Bill, can purchase Tek."
data_value(4) = "The term "".Net"" is really confusing for some people."
data_value(5) = "Java? Java Script? JScript? Huhh?"
data_value(6) = "Westwood is a public high school in Austin, Texas."
data_value(7) = "B.B.Gun could kill a person, believe it or not!"
data_value(8) = "Chewing gum was actually invented before...?"
data_value(9) = "How did Adolf Hitler die? Well, he shot himself."
data_value(10) = "America has never said they want to take over anybody!"
data_value(11) = "Sars brings the world chaos!"
data_value(12) = "Some people say sars is a man-made virus from China?!"
data_value(13) = "Geometry is actually harder than algebra, believe that."
data_value(14) = "Netscape is going down."
data_value(15) = "The first atomic bomb was dropped in Hiroshima, Japan."
data_value(16) = "The second atomic bomb was ""Fat man"""
data_value(17) = "If you don't watch 2 Fast 2 Furious, you're missing out!"
data_value(18) = "The matrix has you..."
data_value(19) = "Would you like to have a freedom of expression?"
data_value(20) = "How many black projects does your country have, huh?"
data_value(21) = "Hello, world!"
data_value(22) = "NASSA & the US military have invented a lotta new tech!"
data_value(23) = "Pepsi is one of my favorite drinks!"
data_value(24) = "Coding is fun, you can create your own stuff!"
data_value(25) = "I'm not a computer geek, awright?"
data_value(26) = "What's drama? It's what makes life colorful :-)"
data_value(27) = "Do you, uhhhh, yahoo?"
data_value(28) = "Bump, bump, bump? No, man, it's Dumb, dumb, dumb!!"
data_value(29) = "One day there was a ghost, he farted, and he died..."
'End database

'All the key variables you need for paging in VBS
Dim modresult, total_over_data_per_pg
Dim current_page, record_amount, page_amount
Dim start_index, end_index
Dim cookievalue
Const data_per_pg = 11

Sub Window_Onload()
'Begins to initialize each variable
cookievalue = document.cookie
record_amount = UBound(data_value) + 1
total_over_data_per_pg = Int(record_amount/data_per_pg)
modresult = record_amount Mod data_per_pg
If modresult = 0 Then
page_amount = total_over_data_per_pg
Else
page_amount = total_over_data_per_pg+1
End If
If cookievalue = "" Then
current_page = 1
Document.Cookie = current_page
Else
current_page = cookievalue
If not isnumeric(current_page) then
alert("Cookie 值裡有不正確的資料,頁數將自動跳回第一頁!")
current_page = 1
end if
End If
Call main()
End Sub 'Window_Onload

Sub main()
'Interface control
Dim myinfo
Dim i, listhtml, listoption
total_data_display.InnerText = record_amount
current_page_display.InnerText = current_page
page_amount_display.InnerText = page_amount
if page_amount > 1 then
listhtml = "&nbsp;&nbsp;<select name=""pagelist"" onchange=""page_control()"">"
listoption = "<option>選擇頁數</option>"
for i = 1 to page_amount
listoption = listoption & "<option value='"& i &"'>第"& i &"頁</option>"
next
listhtml = listhtml & listoption & "</select>"
pagelistcomponent.innerhtml = listhtml
end if
For data_loop = index_process("start") to index_process("end") Step 1
if data_loop > ubound(data_value) then
exit for
end if
myinfo = "<font color='red'>資料第" & data_loop+1 & "</font> = " & data_value(data_loop) & "<BR>" & myinfo
Next
datalist.InnerHtml = myinfo
End Sub 'main()

Sub page_control()
if not isempty(pagelist.value) then
document.cookie = pagelist.value
Call Window_Onload()
end if
End Sub

Function index_process( indexmode )
Dim default_value : default_value = Int(current_page*data_per_pg)
If indexmode = "start" then
start_index = default_value - data_per_pg
index_process = start_index
elseif indexmode = "end" then
end_index = default_value - 1
index_process = end_index
end if
End Function 'index_process()


</Script>
<Style Type="text/css">
Body, Table, Tr, Td
{font-size:14px;Color:White}
Td.pageinfo
{font-size:11px;Color:#808080}
Td.pagecontent
{font-size:14px;Color:black}
Td.mycomment
{font-size:11px;Color:#00CCFF}
A:link
{color:black; text-decoration:none}
A:Hover
{color:blue; text-decoration:none}
A:Visited
{color:black; text-decoration:none}
</Style>
</Head>
<Body>


<Table Border="0" cellspacing="1" cellpadding="0" width="400" bgcolor="#0066CC" height="77">
<Tr>
<Td Width="100%" Valign="middle" height="23">
<Font Class="program_title">VBScript 頁數處理 By Tek</font>
</Td>
</Tr>
<Tr>

<Td Width="100%" Valign="middle" bgcolor="#F6F6F6" Class="pageinfo" height="17">
資料數量:<span id="total_data_display"></span> | 頁數:<span id="current_page_display"></span>/<span id="page_amount_display"></span><span id="pagelistcomponent"></span></Td>
</Tr>
<Tr>
<Td
Width="100%" Valign="Top" Bgcolor="White" Class="pagecontent" height="22">
<Span id="datalist"></Span>
</Td>
</Tr>
<Tr>

<Td width="100%" valign="top" Class="mycomment" height="11">
</td>
</Table>


</Body>
</Html>

最後更新日期: 5/10/2003 5:55:03 AM