הדוגמא המובאת כאן היא התשובה לשאלה הנשאלת כל פעם מחדש, איך מחלקים את כל הרשימה הארוכה הזאת לדפים? (דוגמא זו זהה לחלוטין לדוגמא של חלוקה לדפים, רק שבדוגמא זו השתמשנו בשיטת GetRows אשר מייעלת את המהירות שבה מוצגים הנתונים מתוך מסד הנתונים.) אז הנה התשובה!
איך עושים את זה?
הנה הקוד מקור:
<%@ LANGUAGE="VBSCRIPT" %>
<%
set rs = Server.CreateObject("ADODB.RecordSet")
SQL = "select * from PHONE_BOOK" אם היינו עושים חיפוש המשפט היה שונה
PAGE = Request.QueryString("page")
if PAGE = "" Then PAGE = 1 לבדוק שבאמת נשלח מספר הדף הנוכחי
NumOfRecInPage = Request.QueryString("numofrec")
if NumOfRecInPage = "" Then NumOfRecInPage = 5 לבדוק שבאמת נשלח מספר הרשומות בדף
rs.CacheSize = rs.PageSize
rs.PageSize = NumOfRecInPage
rs.Open SQL,Samples_DSN,3,1
NumOfRec = rs.RecordCount
if Cint(NumofRecInPage) > Cint(NumOfRec) Then NumOfRecInPage = NumOfRec לא לאפשר חריגה
NumOfPages = rs.PageCount
CurrentPage = PAGE
rs.AbsolutePage = CurrentPage
RSa = rs.GetRows()
rs.Close
Set rs = Nothing
Response.Write "
"
Response.Write "
" & NumOfRec & ": סה"כ רשומות
"
Response.Write "
" & NumOfPages & ": מספר הדפים
"
Response.Write "
" & CurrentPage & ": דף נוכחי
"
Response.Write "
" & NumOfRecInPage & ": מספר רשומות בדף
"
Response.Write "
"
Response.Write "
"
Response.Write "
"
Leng = Ubound(RSa,2)
For i = 0 to NumOfRecInPage-1 לעבור על הסט רשומות כמספר הרשומות שבדף אחד
Response.Write "
"
Response.Write "
" & rsa(3,I) & ""
Response.Write "
" & rsa(2,I) & ""
Response.Write "
"
if i = Leng Then i = NumOfRecInPage-1 לוודא שאין חריגה מהמערך
Next
Response.Write "
"
Response.Write "
"
Pages = ""
For i = 1 to NumOfPages קישורים לשינוי הדף הנוכחי
Pages = Pages & " [" & i & "] "
Next
Response.Write "
" & Pages & ": דף נוכחי
"
RecNum = ""
For i = 1 to 10 קישורים לשינוי מספר הרשומות בדף
RecNum = RecNum & " [" & i & "] "
Next
Response.Write "
" & RecNum & ": מספר רשומות בדף
"
%>
הסברים כלליים
rs.RecordCount - מחזיר את סה"כ מספר הרשומות rs.PageSize - מחזיר או קובע את מספר הרשומות בכל דף ודף rs.CacheSize - קובע את מספר הרשומות שהאובייקט מקציב להן זיכרון Cache rs.PageCount - מחזיר את מספר הדפים. זאת הוא מחשב ע"י חלוקה של סה"כ מספר הרשומות חלקי מספר הרשומות בכל דף rs.AbsolutePage - מחזיר או קובע את הדף הנוכחי
התגובות שלכם
01.21/12/2004Moty_pמה ההבדל בין זה לבין החלוקה לדפים השני?
תשובת המערכת: הדוגמא הזאת משלבת את החלוקה לדפים (מאמר חלוקה לדפים) עם הפקודה GetRows אשר אינה קשורה לחלוקה לדפים אבל שילוב שלה ביחד עם החלוקה מקצר את תהליך טעינת הדף...
02.22/12/2004חגי .ב.מה בקשר לחלוקת תוצאות חיפוש - מהמסד נתונים... יש לי קצת בעיה עם זה... כיוון שאני משתמש בטופס POST לדף אשר מציג את הנתונים מהטופס... במעבר לעמוד הבא, זה מציג לי את הכל.. ולא את התוצאות חיפוש... מה עושים?!
תשובת המערכת: כשאתה רוצה לעבור לדף אחר, אתה צריך להעביר גם את כל הנתונים שנשלחו אל אותו דף אתה יכול לעשות זאת ע"י לולאה שעוברת על כל הנתונים שנשלחו ולהעביר אותם הלאה, משהו בסגנון:
Links = "" For each item in Request.Form Links = Links & "&" & item & "=" & Request(item) Next
ואז לשרשר את זה במעבר לעמודים האחרים, כמו למשל:
RecNum = RecNum & " [<A Href=?page=1&numofrec=" & i & ">" & i & Links & "</A>] "
בהצלחה!
03.24/12/2004חגי .ב.האם זה משנה במידה וזה לא נעשה במערכת Getrows לפי המאמר המוזכר כאן, אלא לפי המאמר השני של חלוקת עמודים?!
תשובת המערכת: יש הבדל מבחינת מהירות ההרצה, עבודה עם GetRows אמורה לקצר את זמן הריצה של הקוד...
04.28/12/2004Moty_pלפי דעתי הדוגמת הקוד של החלוקה לדפים השניה (בלי השיטה של "GetRows") יותר טובה משום שאולי ה-GetRows מקצר את תהליך זמן הקוד אבל בקודם יש אפשרות של דף הבאה ודף קודם ואין את זה או שזה לא עובד אם ה-GetRows
האם אפשר לעשות שיהיה את האפשרות של "דף הבאה ודף קודם" אם השיטה והדוגמת קוד של GetRows?
05.12/01/2005 snpproלפעמים צריך לשקול שימוש ב GetString אבל זה כבר שיטת עבודה שונה
06.17/01/2005 יניבמה קורה עם אין רשומות ??? כלומר הטבלה ריקה מרשומות ? המצב הזה לא מכוסה !!
07.26/04/2005 yaronואיך נקרא ל-Rsa(i) כאשר משתמשים ב-JOIN ?
לא ניסתי את העניין אבל אני אנסה..
08.29/06/2005 שיהדוגמא לא עובדת כאשר משתמשים בבסיס נתונים של mysql
09.19/11/2005 k4school2 הערות/הארות לקוראים שעדיין לא קיבלו תגובה:
יניב ניתן לכסות את המצב בקלות ע"י הוספת בדיקה "if rs.eof then" מייד אחרי שפותחים את הרשומות ולפני כל הפעולות על הרשומות המאמר טוב וברור שלא ניתן לכסות כל מצב
שי אכן נכון אבל במסד mysql יש שיטה מובנית הרבה יותר קלה והיא שימוש ב limit
הערה: ישנם שיטות יעילות יותר מהשיטה המוסברת כאן וזו רק שיטה אחת (טובה לנתונים מסויימים) מכמה שיטות.
למשל שיטה נוספת יעילה בדרך כלל הרבה יותר במסדי mssql היא שימוש ב"SET ROWCOUNT"
כמו כן זכרו ששימוש ב הבדלי המהירות (מדוד במסד נתונים ספציפי שלי) הן כ 4 שניות לעומת 0.05 שניות.
לצערי אני לא מכיר מדריך טוב לשימוש בשיטה אבל דוגמאות יש באתר msdn של מייקרוסופט דוגמאות והשוואת מהירות של כמה שיטות נפותות ניתן לראות בקישור הבא http://www.codeproject.com/aspnet/PagingLarge.asp
הערה: גם המהירות ב mysql היא באותם סדרי גודל של שימוש ב RowCount והסיבות לכך נובעות ככל הנראה מכך שבשיטות האחרות המסד מבצע בדיקות על הנתונים כגון חלוקת מספר הנתונים במספר הנתונים שרוצים להציג בעוד בשיטות האחרות שהזכרתי יש פנייה ישירה לנתונים שרוצים