שלח תשובה

זירת השאלות

455
צפיות
6
תשובות

מחפש פיתרון יציאתי ויעיל

,‏ 28 ביולי, 2006

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

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

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

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

לצערי התגלו המון טעויות שהתחלתי לבדוק את הפלט, והשיטה שהצעתי ירדה לטמיון.

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

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

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

שוב פעם תודה לכל מי שעוזר.

תגיות:

6 תשובות

  1. gilad123 הגיב:

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

    האם המחזור תלוי בשבוע בו התקיים המשחק מאז תחילת הליגה? אם כן יכול להיות שחישוב מספר השבועות (אם אין בעיות של חגים וכד') יעזור

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

  2. shlomolol הגיב:

    בדוק את זה
    כמובן זהו פסודו קוד, שלא הורץ ולא נופה משגיאות.
    תעדכן אם זה עזר [עבדתי על זה 15 דקות תמימות!]

    set rs = con.open "select * from futbolHistori order by id"
    do while not rs.eof
        set rs2 = con.open "select * from futbolHistori where "
        "    sizn=" & rs("sizn")      //עונה
          " and liga=" & rs("liga") & "      //ליגה
        "  and Groump_id=" & rs("Groump_id") & "    //קבוצה
            "order by datePlay"      //תאריך משחק

            roundNum=1
            do while not rs2.eof or rs("id") <> rs2("id")
                
                roundNum = roundNum + 1    
                
                rs.movenext
            loop

        rs2.close()        

        con.open "update futbolHistori set round=" & roundNum        
        rs.movenext
    loop

  3. shlomolol הגיב:

    תיקון קטן
    כמובן

    set rs = con.open "select * from futbolHistori order by id"
    do while not rs.eof
        set rs2 = con.open "select * from futbolHistori where "
        "    sizn=" & rs("sizn")
          " and liga=" & rs("liga") & "
        "  and Groump_id=" & rs("Groump_id") & "
            "order by datePlay"

            roundNum=1
            do while not rs2.eof or rs("id") <> rs2("id")
                
                roundNum = roundNum + 1    
                
                rs.movenext
            loop

        rs2.close()        

        con.open "update futbolHistori set round=" & roundNum & " where id=" & rs("id")        
        rs.movenext
    loop

  4. Shuki142 הגיב:

    לא ממש עובד
    זה מזין לי בכל המשחקים את הערך33 שזה בעצם המחזור האחרון של הליגה שבדקתי, במקרה הזה זה היה הליגה הישראלית שיש שם 33 מחזורים.

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


    rs("id") <> rs2("id")

    מה התכוונת ?


    rs.movenext

    גם טעות זה צריך להיות של rs2.
    בקיצור הקוד לא עובד.

    אשמח לקבל עוד עזרה.
    ותודה לך על העזרה.

  5. shlomolol הגיב:

    אוקיי , אז ככה
    הקוד לא אמור לרוץ. זהו "פסודו קוד". הוא נועד לתת לך כיוונים ורעיונות ולא לעבור קומפילציה או לעבוד פיקס.

    set rs = con.open "select * from futbolHistori order by id"
    do while not rs.eof
        set rs2 = con.open "select * from futbolHistori where "
        "    sizn=" & rs("sizn")      //עונה
          " and liga=" & rs("liga") & "   //ליגה
        "  and Groump_id=" & rs("Groump_id") & "   //מס' קבוצה
            "order by datePlay"     //תאריך

            roundNum=1
            do while not rs2.eof and rs("id") <> rs2("id")     //מונה את מס' המחזור
                
                roundNum = roundNum + 1    
                
                rs2.movenext
            loop

        rs2.close()        

        con.open "update futbolHistori set round=" & roundNum & " where id=" & rs("id")        
        rs.movenext
    loop
    rs.close()  

    [הבנתי גם באופן שונה מקודם את המושג "מחזור". ]
    בהצלחה

  6. Shuki142 הגיב:

    מה זה ?
    למה אתה מתכוון שאתה רושם את זה


    do while not rs2.eof and rs("id") <> rs2("id")

    מה אתה מכוון שאתה רושם את הדבר הזה ?


    rs("id") <> rs2("id")    

    מקודם זה לא עבד אז הורדתי את הדבר הזה.
    תסביר לי מה ניסית לעשות שאני אבין.

שלח תשובה