מה זה?
פונקציה המקבלת שאילתת SQL ועוד משתנים, ויודעת להציג את התוצאה בצורת גרף טקסטואלי.
הסבר
הפונקציה פועלת בצורה יחסית פשוטה אך מתוחכמת. היא יודעת לעבור על כל הרשומות ב-RecordSet, לכתוב את הערך בשדה הראשון (rs(0)) ואז, בעזרת לולאת FOR מ-1 ועד הערך שבשדה השני (rs(1)) ולכתוב תו אותו ניתן לבחור.
התוצאה שנקבל היא בעצם גרף טקסטואלי פשוט!
יש לשים לב שהפוקנציה קוראת לשדות במספרים ולא בשמות שלהם כדי שלא ישנה השם של השדות בעת הקריאה לפונקציה. היא יודעת שבשדה הראשון אמור להיות ערך שיכתב ובשדה השני ערך מספרי המייצג את ערך העמודה לאותו ערך שבשדה הראשון.
מן הסתם, בדרך כלל נשלח לפונקציה משפטי SQL אשר משתמשים בפונקציות COUNT ו-SUM אשר יודעות לספור או לסכום ערכים מול עמודות מסויימות, למשל: מספר כניסות לאתר לפי תאריכים, מספר לחיצות לפי מאמרים, סכום רכישות לפי חודשים וכו...
רצוי גם לתחום את גבול התוצאות בעזרת TOP כדי שהתוצאה לא תהיה סתם ארוכה.
בתחילת הפונקציה יש בדיקה האם קיימים כבר אובייקטים המשמשים לקישור למסד הנתונים בשמות cn ו-rs.
אם הפונקציה מוצאת שאובייקט כבר קיים, היא משתמשת בו, אם לא, היא יוצרת אותו, משתמשת בו ומעלימה אותו בסוף הקריאה לפונקציה.
לכן רצוי שבדפים בהם יש קריאה לפונקציה, שתשתמשו באובייקט Connection בשם cn ואובייקט RecordSet בשם rs על מנת להגיע לביצועים אופטימלים של הפונקציה.
הפונקציה בנויה בצורתה הבסיסית ויש הרבה מקום לשיפורים. אני אמנה פה מספר שיפורים כהצעות:
- שימוש בקובץ תמונה במקום בתו כדי לקבל גרף לא טקסטואלי - יפה יותר מבחינה ויזואלית
- הכנסת התוצאות לטבלה וכך לאפשר יצירת גרך אנכי או אופקי, לפי בקשת המשתמש.
שימושים
הצגת תוצאות סקרים, מילות חיפוש נפוצות, מונה כניסות, לחיצות, הרשמות ובעצם כמעט כל טבלה שתהיה לנו במסד הנתונים.
הפונקציה גם שימושית מאוד למערכות ניהול (admin) בהן בדרך כלל רוצה בעל האתר לראות את נתוני האתר באופן ויזואלי.
קוד הפונקציה
Sub drawTextGraph(sign,color,size,chars,SQL)
Dim removeRS,max
removeRS = False
if isObject(rs) and isObject(cn) Then 'rs+cn
rs.Open SQL,cn,3,1
Else if isObject(rs) Then 'NO cn
rs.Open SQL,DSN,3,1
Else 'NO rs, cn-?
Set rs = Server.CreateObject("ADODB.RecordSet")
removeRS = True
if isObject(cn) Then
rs.Open SQL,cn,3,1
Else
rs.Open SQL,DSN,3,1
End if
End if
End if
While NOT rs.EOF
if rs(1) > max Then max = rs(1)
rs.MoveNext
Wend
rs.MoveFirst
While NOT rs.EOF
Response.Write rs(0) & " - "
For i = 1 to Cint((Cint(rs(1))/max)*chars)
Response.Write sign
Next
Response.Write " (" & rs(1) & ")"
Response.Write " "
rs.MoveNext
Wend
if removeRS = True Then
rs.Close
Set rs = Nothing
End if
End sub
דוגמא לקריאה לפונקציה
SQL = "SELECT TOP 10 the_date, COUNT(0) "
SQL = SQL & "FROM USERS "
SQL = SQL & "GROUP BY the_date "
SQL = SQL & "ORDER BY the_date DESC "
drawTextGraph "/","orange","1",150,SQL
התוצאה
17/01/2002 - ///////////////// (18)
16/01/2002 - ///////////////////////////////////////////////////////////////////////////////////////////////////////////// (113)
15/01/2002 - ////////////////////////////////////////////////////////////////////////////////////////(91)
14/01/2002 - //////////////////////////////////////////////////////////////////////////////////////////// (96)
13/01/2002 - ///////////////////////////////////////////////////////////////////////////////////////////////////////// (109)
12/01/2002 - ///////////////////////////////////////////////////////////////////////////////////////////////// (101)
11/01/2002 - //////////////////////////////////////////////////////////////////////////////////////// (92)
10/01/2002 - ////////////////////////////////////////////////////////////////////////////////// (85)
09/01/2002 - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// (156)
08/01/2002 - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////(138)
|