חלוקה לעמודים - המשך

  • פותח הנושא zprun
  • פורסם בתאריך

zprun

New member
חלוקה לעמודים - המשך

טוב, ההודעה הקודמת כבר לא קופצת אז אני אמשיך פה. אני משער שלא ענו לי בהודעה הקודמת כי לא נתתי מספיק פרטים.. אז ככה: בניתי פורום מאוד פשוט בעזרת השיטה getRows, והצגת ההודעות והקינון שלהם נעשים בעזרת רקורסיה. שאלתי שאלה איך אפשר לעשות חלוקה לעמודים ב getRows וענו לי שאפשר פשוט רגיל - ב ADO. אז ניסיתי להוסיף את החלוקה בעצמי - אבל זה עשה בעיות משום מה.. הקוד הרלוונתי:
Dim Conn, MainRs, MainSQL, fid, arr fid = Request.Querystring("forumID") If isEmpty(fid) or isNumeric(fid) = False Then fid = 0 Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("DBpath.mdb") Set MainRs = Server.CreateObject("ADODB.RecordSet") MainSQL = "SELECT * FROM Messages WHERE ForumID=" & fid & " ORDER BY mTime DESC" MainRs.Open MainSQL, Conn, 3, 1 Const MessagesNum = 10 Dim Page, PagesCount Page = Request.Querystring("Page") If isEmpty(Page) or isNumeric(Page) = False Then Page = 1 MainRs.PageSize = MessagesNum MainRs.CacheSize = MessagesNum If Not MainRs.EOF Then PagesCount = MainRs.PageCount MainRs.AbsolutePage = Page arr = MainRs.getRows End If MainRs.Close Set MainRs = Nothing Conn.Close Set Conn = Nothing If isArray(arr) Then Const iID = 0 Const iForumID = 1 Const iSubject = 2 Const iAuthor = 3 Const iBody = 4 Const iTime = 5 Const iParentID = 6 Const iRootID = 7 Function ShowMessages(index,level) Dim s, i %> <!-- ****** The HTML code that prints the message. ****** --> <% i = UBound(arr,2) Do While i>=0 If arr(iParentID,i) = arr(iID,index) Then Call ShowMessages(i,level + 1) End If i = i - 1 Loop End Function Dim i, j, Count Count = 0 j = 0 i = 0 Do While Not i = UBound(arr,2) AND Not j = MessagesNum If arr(iParentID,i) = 0 Then Call ShowMessages(i,0) Response.Write "<br>" j = j + 1 End If i = i + 1 Loop End If​
אני יודע שהקוד אולי קצת ארוך ומתיש, אבל בבקשה - תנסו למצוא את הבעיה, אני ממש תקוע על העניין הזה כבר כמה ימים.. תודה רבה מראש.
 

zprun

New member
הקפצה + עוד שאלה

טוב אז ככה, חשבתי לעצמי - איך אני יעשה הכי יעיל את העניין של מחיקת הודעות? כלומר מתי שמוחקים הודעה, שיימחקו גם כל התגובות והתתי תגובות שלה. ועלה לי רעיון מעולה: למה שלא להוסיף עמודה ב DB שתקרא RootStr או משהו כזה והיא תכיל בתוכה את כל מספרי הID של ההודעות שהיו מעליה מופרדים בפסיקים, כלומר נגיד המקרה הוא כזה:
ID|ParentID 1 |0 2 |1 3 |2 4 |3​
אז השדה RootStr של הודעה 4 יהיה 1,2,3 (כי הייתה הודעה 1 שלה היה בן 2 ולו היה 3 וההודעה הנכחית(4) היא הבת שלו) עכשיו ב SQL שמוחק אני אבחר את כל ההודעות שהID שאמור להמחק מופיע ב RootStr שלהן.. יש דרך יעילה יותר לעשות את זה? מה מקובל בד"כ? נ.ב. השאלה הקודמת עדיין לא נפתרה לי.. בתודה, zprun
 

zprun

New member
אווף מישהו - בבקשה

או שלא יודעים את התשובה (מה שלא נראה לי כ"כ סביר), או שפשוט לא הסברתי את עצמי מספיק טוב (ואז תגידו ואני אסביר), או שאולי זה ארוך ולאנשים אין כח.. בבקשה אנשים - אני יודע שזה לפעמים מעצבן - אבל אני ממש נואש בעניין הזה :-\ לפחות תגיבו - משהו..
 
לשמור ID מופרד בפסיקים זה לא רצוי

מה גם שזה ידרוש ממך עוד כמה פעולות בזמן הוספת הודעה. הוספת הודעה נעשית כל הזמן, בעוד שמחיקת הודעה נעשית רק מדי פעם. לכן הדרך הנכונה היא למחוק את ההודעות בצורה רקורסבית. לגבי השאלה הראשונה: א. לא הסברת מה הבעיה ב. תראה לנו רק קוד רלוונטי.
 

zprun

New member
תודה ../images/Emo6.gif

תודה רבה לך על תשובתך
בקשר להודעה הראשונה, העניין הוא שבפורום ההודעות מוצגות בעזרת getRows והחלוקה לעמודים מתבצעת בעזרת Ado. משום מה, החלוקה לעמודים בילגנה לי הכל
בהתחלה זה נראה כאילו זה עובד, אני מכניס לדוגמה 15 שרשורים חדשים (שעדיין אין להם "בנים") בעוד שמספר הודעות בעמוד הוא 10. לכאורה זה פועל רגיל - מראה לי 10 בעמוד הראשון ו 5 בעמוד השני. אבל אז, כנגד כל תגובה ("בן") שאני מוסיף, מתווספת אחת ההודעות מעמוד הראשון לעמוד השני - כלומר נוצרת כפילות בין העמודים.. אין לי מושג מה גורם לתופעה המאוד-מוזרה הזאת. קוד (שאני לפחות חושב שהוא) רלוונטי: החלוקה לעמודים - אחרי פתיחת הרקורדסט
rs.PageSize = MessagesNum rs.CacheSize = MessagesNum If Not rs.EOF Then PagesCount = rs.PageCount rs.AbsolutePage = Page arr = rs.getRows End If​
הלולאה שקוראת אח"כ לרקורסיה בשביל כל הודעת שורש:
Dim i, j j = 0 i = 0 Do While Not i = UBound(arr,2) AND Not j = MessagesNum If arr(iParentID,i) = 0 Then Call ShowMessages(i,0) Response.Write "<br>" j = j + 1 End If i = i + 1 Loop End If​
הערות: MessagesNum מכיל את המספר 10 - שהוא המספר של הודעות שאני רוצה בכל עמוד. זה - arr(iParentID,i) אומר לגשת למערך לשדה ParentID (הקבוע iParentID מכיל את האינדקס שלו במערך) עם האינדקס i. אודה לכל כיוון לפתרון, zprun
 
למעלה