רקורסיה

mishaL

New member
רקורסיה

אני משתמש בפונקציה הבאה:
function tree(id) Set rs2 = ObjConn.Execute ("SELECT * FROM mesgs where tid="&id&"") do while not rs2.eof %> <%= rs2("subject")%> <% response.Write "<br>" rs2.movenext loop End function​
ובrs הראשון אני שולף את האב אבל מה שקורה זה שהוא מוציא לי רק את הבנים של האב ניסיתי לעשות ככה:
function tree(id) Set rs2 = ObjConn.Execute ("SELECT * FROM mesgs where tid="&id&"") do while not rs2.eof %> <%= rs2("subject")%> <% response.Write "<br>" do while not rs2.eof tree rs2("id") rs2.movenext loop rs2.movenext loop End function​
או שאני לא בכיוון בכלל ויש דרך יותר טובה? תודה
 

mishaL

New member
קפץ

השירשור של הבוקר לוקח חצי מהדף לא רואים כלום
 
לא כל כך הבנתי מה אתה...

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

rmarko

New member
יש ברקורסיה הזאת שתי בעיות

הראשונה: אתה יוצר אובייקט רקורדסט. בריצה הראשונה של הפונקציה, אתה שולף מידע לתוך הרקורדסט הזה, ונכנס לרקורסיה. בריצה השניה, אתה שולף מידע שוב לתוך הרקורדסט - אבל הפעם אין הודעת בן, אז אתה יוצא מהרקורסיה. בוא נגיד שיש עוד בן להודעת האב (האב = הריצה הראשונה) - ..איך אתה מצפה לגלות שקיים עוד בן? לאחר שאתה יוצא מהסיבוב השני, ברקורדסט שלך עדיין יש את הרשומות מהריצה השניה - ואתה נמצא ב- eof. כדי לחזור להכין שהיית לפני שנכנסת לרקורסיה, תצטרך לשלוף שוב פעם את המידע של הודעת האב. הבעיה השניה היא מאד ברורה, אם כן: אם יש לך 3 הודעות בפורום (אב ושני בנים) אתה צריך להיות במגע עם אובייקט החיבור שלך חמש פעמים: פעם ראשונה לאב, פעם שניה לבן הראשון, פעם שלישית לאב שוב, פעם רביעית לבן השני, פעם חמישית לאב שוב. מה אם יש לך 30 הודעות בפורום? מתכון לקטסטורפה. מרון כתב רק אתמול או שלשום הודעה על חוסר היעיליות בפורום רקורסיבי, אבל אם אתה נעול על בחירה זו - כדאי לך לשלוף את כל טבלת ההודעות שלך לתוך רקורדסט (אתה יכול לשער כמה זה יהיה קשה לשרת אם הפורום שלך יגיע לאלף הודעות, לא לציין עשר אלף), לנתק את הרקורדסט מאובייקט החיבור ולסגור את החיבור - ולעבור ברקורסיה בעזרת המאפיינים filter ו- sort של אובייקט הרקורדסט על כל ההודעות. זה עדיין יהיה איטי ומסובך - ואולי אפילו יפיל לך את השרת פה ושם - אבל זה עדיף על שליחת משפטי sql הלוך חזור לדיבי שלך.
 

mishmesh

New member
זה מה שאני ניסיתי לעשות, פחות או

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

orimagic

New member
זה מוסבר שם, אני לא

עובד עם הרקורדסט אלא עם מערך של getRows. אתה מוציא את כל הרקורדסט לשם, ורק אח"כ מסדר אותו.
 

mishmesh

New member
אוי ואבוי!

יקח לי שנים לעשות את זה!
בכל מקרה!
 
למעלה