שלח תשובה

זירת השאלות

283
צפיות
22
תשובות

שאלת מחשבה…

,‏ 5 בפברואר, 2004

יש לי בסיס נתונים עם הפרטים הבאים:
שם, גיל ורמת קושי.

אני מעוניין לשלוף את המידע ל 3 טבלאות הממויינות לפי רמת הקושי (קל, מתקדם, קשה).

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

תודה לכם

תגיות:

22 תשובות

  1. אוריקס הגיב:

    אל תפצל ל-3 טבלאות – תאחד לטבלה אחת

  2. mynameispepper הגיב:

    בלתי אפשרי, ללקוח יש דרישה מסויימת
    שאני לא יכול לעקוף.

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

  4. mynameispepper הגיב:

    את צודקת אבל…
    אני לא בטוח שאוריקס הבין למה התכוונתי.
    אולי לך יש רעיון בשבילי?

    יש לי רק טבלה אחת עם כל הנותנים:
    ID, שם, גיל, אזור מגורים ורמת קושי. כל זה בטבלה אחת.

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

    תודה

  5. זהר פלד הגיב:

    אממ…
    אם הבנתי אותך נכון, אתה רוצה למיין את התוצאות של השליפה מה DB ל 3 טבלאות HTML שכל אחת מהן תהיה דרגת קושי אחרת, נכון?

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

  6. mynameispepper הגיב:

    זהר, אם אפשר…
    איזו דוגמא קטנה למה שאמרת?
    או איך לגשת לזה בכלל?

    ישבתי מול המחשב אבל באמת אין לי מושג איך להתחיל את זה…

  7. זהר פלד הגיב:

    דוגמית לבקשתך:

    difficultyLevel = ""
    sqlStr = "SELECT strDifficultyLevel, intAge, strName FROM tblTableName ORDER BY strDifficultyLevel"
    ‘ note that the ORDER BY section – it’s a must.
    rs.open sqlStr, connectionString
     if NOT rs.eof then
      do until rs.eof
    ‘ check if the difficulty level is the same as the last record displayed
       if difficultyLevel = rs("strDifficultyLevel") THEN
       Response.write "<tr><td>" & rs…. & "</td></tr>"
       ELSE
       Response.write "</table>"& vbCrLf &"<table>"
       Response.write "<tr><td>" & rs…. & "</td></tr>"
       END IN
    ‘ "remember" the last difficulty level displayed    difficultyLevel = rs("strDifficultyLevel")
       rs.moveNext
      loop
     end if

    אני מקווה שעכשיו זה מספיק ברור.

  8. ניר טייב הגיב:

    אני לא יודע אם זה נכון אבל
    לא עדיף במקרה הזה לעבוד עם קבוצות (group by) ???

  9. mynameispepper הגיב:

    שוב, מראה רק טבלה אחת, הנה הקוד:

    <%
    start_date = request.querystring("date")
    level = ""

    Set rs = Server.CreateObject("ADODB.RecordSet")
    SQL = "Select first_name,last_name,level FROM lama Where start_date=’" & start_date & "’" & "ORDER BY level"

    rs.Open SQL,DSN,3,1
    if NOT rs.eof then
    do until rs.eof
    if level = rs("level") Then
    first_name = rs("first_name")
    last_name = rs("last_name")

    Response.Write "<tr>"
    Response.Write "<td>" & first_name & " " & last_name & "</td>"
    Response.Write"</tr>"
    Else
    first_name = rs("first_name")
    last_name = rs("last_name")

    Response.write "</table>"& vbCrLf &"<table border=1 cellpadding=2 cellspacing=0 width=620>"
    Response.Write "<tr>"
    Response.Write "<td>" & first_name & " " & last_name & "</td>"
    Response.Write"</tr>"
    End If
    rs.moveNext
    loop
    end if
    rs.Close
    Set rs = Nothing
    %>

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

  10. זהר פלד הגיב:

    אין לך פתיחה של הטבלה הראשונה,
    וגם לא סגירה של האחרונה….

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

    קוד משופר:

    <%
    start_date = request.querystring("date")
    level = ""
    Response.write "<table border=1 cellpadding=2 cellspacing=0 width=620>"

    SQL = "Select first_name,last_name,level FROM lama Where start_date=’" & start_date & "’" & "ORDER BY level"
    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.Open SQL,DSN,3,1
    if NOT rs.eof then
    do until rs.eof
    if level <> rs("level") Then
    Response.write "</table>"& vbCrLf &"<table border=1 cellpadding=2 cellspacing=0 width=620>"
    END IF
    Response.Write "<tr>"
    Response.Write "<td>" & rs("first_name") & " " & rs("last_name") Response.Write"</tr>"
    rs.moveNext
    loop
    end if
    rs.Close
    Set rs = Nothing
    Response.write "</table>"

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

  11. ניר טייב הגיב:

    אבל לא עניתם על מה ששאלתי
    בקשר ל-GROUP BY

  12. mynameispepper הגיב:

    סידרתי את הקוד לפי מה שאמרת אבל…
    עדיין בעייתי. מה שקורה עכשיו זה שאני מקבל טבלה אחת לכל שורה של מידע ולא טבלה לכל רמת קושי.

    הנה הקוד:

    <%
    start_date = request.querystring("date")
    department = ""

    Response.write "<table border=1 cellpadding=2 cellspacing=0 width=620>"

    Set rs = Server.CreateObject("ADODB.RecordSet")
    SQL = "Select first_name,last_name,department FROM tstTBL Where start_date=’" & start_date & "’" & "ORDER BY department"

    rs.Open SQL,DSN,3,1
    if NOT rs.eof then
    do until rs.eof
    if department <> rs("department") Then
    Response.write "</table>"& vbCrLf &"<table border=1 cellpadding=2 cellspacing=0 width=620>"
    End If
    Response.Write "<tr>"
    Response.Write "<td>" & rs("first_name") & " " & rs("last_name") & "</td>"
    Response.Write"</tr>"
    rs.moveNext
    loop
    end if
    Response.Write"</table>"

    מה פיספסתי? למה זה עדיין לא עובד?

  13. זהר פלד הגיב:

    פיספסת את העדכון של department…
    בתוך התנאי הזה אתה צריך גם לעדכן את department :


    if department <> rs("department") Then
    Response.write "</table>"& vbCrLf &"<table border=1 cellpadding=2 cellspacing=0 width=620>"
    department = rs("department")
    End If

    עכשיו זה אמור לעבוד חלק.

  14. mynameispepper הגיב:

    זה עובד חלק עכשיו רק דבר אחד מטריד
    הנה הקוד פה:


    <%
    start_date = request.querystring("date")
    department = ""

    Response.write "<table border=1 cellpadding=2 cellspacing=0 width=660>"

    Set rs = Server.CreateObject("ADODB.RecordSet")
    SQL = "Select first_name,last_name,department FROM tstTBL Where start_date=’" & start_date & "’" & "ORDER BY department"

    rs.Open SQL,DSN,3,1
    if NOT rs.eof then
    do until rs.eof
    if department <> rs("department") Then
    Response.write vbTab & "</table><br><br>"& vbCrLf & vbCrLf

    Response.write vbTab & "<table border=1 cellpadding=2 cellspacing=0 width=660>" & vbCrLf
    Response.write vbTab & "<tr>" & vbCrLf
    Response.write vbTab & "<th width=170>Full Name</th>" & vbCrLf
    Response.write vbTab & "<th width=120>Department</th>" & vbCrLf
    Response.write vbTab & "</tr>" & vbCrLf

    department = rs("department")
    End If
    Response.Write vbTab & "<tr>" & vbCrLf
    Response.Write vbTab & "<td>" & rs("first_name") & " " & rs("last_name") & "</td>" & vbCrLf
    Response.Write vbTab & "<td>" & rs("department") & "</td>" & vbCrLf
    Response.Write vbTab & "</tr>" & vbCrLf
    rs.moveNext
    loop
    end if
    Response.Write vbTab & "</table><br><br>" & vbCrLf & vbCrLf

    rs.Close
    Set rs = Nothing
    %>

    הבעייה היא שבתחילת הקוד יש פתיחת טבלה שנסגרת עם התנאי הראשון של
    ה IF. מה שקורה זה שנפתחת טבלה ונסגרת ואז מתווספים 2 BR.
    מה אני עושה בנידון?

  15. זהר פלד הגיב:

    אממ….
    מתווספים שני תגי BR כי יש לך אותם שם ב Response.write…
    מתוך הקוד שלך:

    if department <> rs("department") Then
    Response.write vbTab & "</table><br><br>"& vbCrLf & vbCrLf

    פשוט תוציא אותם משם ואז הם לא יתווספו

  16. mynameispepper הגיב:

    🙂 אני יודע את זה…
    השאלה היא איך מגברים על זה?
    ה BR נחוץ לי אבל אני לא צריך אותו ממש בהתחלה אלא רק אחרי שטבלה הראשונה נוצרת. מה עושים? צריך להיות איזה פתרון לזה.

  17. זהר פלד הגיב:

    יש כאן עוד תנאי שצריך להוסיף…

    if department <> rs("department") Then
     if department<>"" then
      Response.write vbTab & "</table><br><br>"& vbCrLf & vbCrLf
     else
      Response.write vbTab & "<table border=1 cellpadding=2 cellspacing=0 width=660>" & vbCrLf
     end if

  18. mynameispepper הגיב:

    עדיין לא עובד
    2 דברים קורים:

    1. זה פותח טבלה פעמיים בשורה הראשונה.
    2. זה מראה את הטבלה הראשונה בסדר ואת השאר ללא טבלה. הוא לא פותח טבלה שוב.

    מה פוספס פה?

    תודה על העזרה –
    פפר

שלח תשובה

חדש! אחסון אתרים של וובמאסטר

שירות אחסון אתרים
המקצועי של וובמאסטר!

מומחים באירוח אתרי
WordPress, Joomla, Drupal

  • שרתי לינוקס עם CloudLinux, LiteSpeed
  • 1GB דיסק SSD, 10GB תעבורה חודשית
  • ממשק ניהול cPanel, תעודת SSL חינם

עכשיו במחיר היכרות:
רק 420 ש"ח לשנה!