395
צפיות
צפיות
22
תשובות
תשובות
שאלת מחשבה…
יש לי בסיס נתונים עם הפרטים הבאים:
שם, גיל ורמת קושי.
אני מעוניין לשלוף את המידע ל 3 טבלאות הממויינות לפי רמת הקושי (קל, מתקדם, קשה).
מה הדרך הטובה ביותר לעשות את זה מבחינת לחסוך בקוד?
אני יכול לבקש לשלוף את 3 פעמים ושכל פעם ה SQL יהיה שונה אבל אני חושב שאולי יש דרך קצרה ונכונה יותר. מעבר לזה, לא תמיד קיימות כל הקבוצות.
לפעמים קיימות רק 2 קבוצות, אז מה אז?
תודה לכם
22 תשובות
אל תפצל ל-3 טבלאות – תאחד לטבלה אחת
בלתי אפשרי, ללקוח יש דרישה מסויימת
שאני לא יכול לעקוף.
לקוח קובע את דרישות האפליקציה
לא את דרך היישום שלה. מה שנמצא מאחורי הממשק שאתה בונה לו – שקוף בשבילו.
לא עניינו אם יש טבלה אחת או 50 טבלאות, ולא עובדים בצורה לא נכונה בגלל התעקשות של מישהו שלא מבין. פשוט מסבירים לו למה זה לא נכון.
את צודקת אבל…
אני לא בטוח שאוריקס הבין למה התכוונתי.
אולי לך יש רעיון בשבילי?
יש לי רק טבלה אחת עם כל הנותנים:
ID, שם, גיל, אזור מגורים ורמת קושי. כל זה בטבלה אחת.
השאלה היא איך אני מציג דף אחד שיראה 3 טבלאות שונות (לפי רמות קושי)?
אני יכול לעשות את זה על ידי הכפלת הקוד 3 פעמים אבל אני חושב אולי יש דרך חכמה יותר. רעיונות אולי?
תודה
אממ…
אם הבנתי אותך נכון, אתה רוצה למיין את התוצאות של השליפה מה DB ל 3 טבלאות HTML שכל אחת מהן תהיה דרגת קושי אחרת, נכון?
אז תשלוף פשוט עם order by לפי העמודה של טבלת הקושי, תשתמש במשתנה שיחזיק את רמת הקושי של השורה האחרונה שהצגת מה recordset, ובכל ריצה של הלולאה על ה recordset תבדוק אם רמת הקושי נשארה זהה למשתנה שאתה שומר. אם כן, סגור את טבלת ה HTML ופתח חדשה (אל תשכח לעדכן את המשתנה), ואם לא, פשוט תמשיך כרגיל…
זהר, אם אפשר…
איזו דוגמא קטנה למה שאמרת?
או איך לגשת לזה בכלל?
ישבתי מול המחשב אבל באמת אין לי מושג איך להתחיל את זה…
דוגמית לבקשתך:
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
אני מקווה שעכשיו זה מספיק ברור.
מראה רק טבלה אחת
אני לא יודע אם זה נכון אבל
לא עדיף במקרה הזה לעבוד עם קבוצות (group by) ???
שוב, מראה רק טבלה אחת, הנה הקוד:
<%
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
%>
החדשות הטובות הן שהקוד שהקוד אכן שולף את כל דרגות הקושי כמו שרציתי.
העייה היא שזה לא מחלק את הקוד לטבלה אלא שולף הכל לטבלה אחת, למה?
אין לך פתיחה של הטבלה הראשונה,
וגם לא סגירה של האחרונה….
לא ציינתי את זה בדוגמא שלי כי חשבתי שזה ברור מאילו…
חוצמזה, מספר הערות:
– אין שום טעם להעביר את הערך שנמצא בתוך ה 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, כמו שאפשר לראות מהקוד הזה.
אבל לא עניתם על מה ששאלתי
בקשר ל-GROUP BY
סידרתי את הקוד לפי מה שאמרת אבל…
עדיין בעייתי. מה שקורה עכשיו זה שאני מקבל טבלה אחת לכל שורה של מידע ולא טבלה לכל רמת קושי.
הנה הקוד:
<%
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>"
מה פיספסתי? למה זה עדיין לא עובד?
פיספסת את העדכון של 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
עכשיו זה אמור לעבוד חלק.
זה עובד חלק עכשיו רק דבר אחד מטריד
הנה הקוד פה:
<%
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.
מה אני עושה בנידון?
אממ….

מתווספים שני תגי BR כי יש לך אותם שם ב Response.write…
מתוך הקוד שלך:
if department <> rs("department") Then
Response.write vbTab & "</table><br><br>"& vbCrLf & vbCrLf
פשוט תוציא אותם משם ואז הם לא יתווספו
🙂 אני יודע את זה…
השאלה היא איך מגברים על זה?
ה BR נחוץ לי אבל אני לא צריך אותו ממש בהתחלה אלא רק אחרי שטבלה הראשונה נוצרת. מה עושים? צריך להיות איזה פתרון לזה.
יש כאן עוד תנאי שצריך להוסיף…
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
עדיין לא עובד
2 דברים קורים:
1. זה פותח טבלה פעמיים בשורה הראשונה.
2. זה מראה את הטבלה הראשונה בסדר ואת השאר ללא טבלה. הוא לא פותח טבלה שוב.
מה פוספס פה?
תודה על העזרה –
פפר
מישהו?
אולי בכל זאת?
איך נראה הקוד שלך עכשיו?