โปรแกรมรายงานผลการเรียน เบื้องต้น
เว็บเพจสำรอง (Backup Webpages) : http://www.thaiall.com/asp/sgrd01.htm | http://www.thaiabc.com/asp/sgrd01.htm
ปรับปรุง : 2549-02-06 (แก้ไข grade.mdb)
[ โปรแกรมรายงานผลการเรียน เบื้องต้น ]
บทเรียนทั้งหมดนี้ ได้ทำเป็น กรณีศึกษาไว้ที่ http://www.thaiall.com/asp/sgrade.htm เพื่อให้เรียกใช้ได้ง่าย
ส่วนนี้ผมทำเป็น ทั้งบทเรียน ให้ท่านนำไปเขียนใช้เอง และส่วนที่ ให้บริการครู อาจารย์ ประกาศผลการเรียน ในวิชาของตน
หรือจะเรียกบริการประกาศผลการเรียน ด้วยบริการ redirection ที่ http://go.to/grade ก็จะจำได้ง่ายกว่า
    สารบัญ
  1. ข้อควรทราบ
  2. อ่านข้อมูลมาแสดงอย่างง่าย
  3. แสดงผลจากรหัสการสอน ซึ่งรับค่าได้ทั้งผ่าน form และ url
  4. เพิ่มวิชา คะแนน และเกรด (ส่วนนี้ใช้การส่งค่า 2 ช่วงคือ sgrdadd.asp และ sgrdaddx.asp)
  5. แสดงผลสรุปว่ามี รหัสการสอนอะไรบ้าง และจำนวน ซึ่งใช้วิธีการอ่านแฟ้ม query จาก group by ตาราง 2 ตาราง
  6. ลบข้อมูลโดยใช้รหัสการสอน และรหัสผ่าน โดยลบจากตาราง teacher และ grade ด้วย click เดียว
  7. แบบฝึกหัด
ข้อควรทราบ
  1. ที่เขียนบทเรียนนี้ได้ เพราะได้รับคำแนะนำ วิธีการติดต่อกับ mdb ใน websamba.com จาก webmaster ของ http://aspbuilder.webhostme.com (expired) ผมพยายามอยู่นาน แต่ก็หาวิธีติดต่อกับ mdb ไม่ได้ ด้วยเหตุที่ไม่ทราบว่าจะติดต่ออย่างไร พอ mail ไปถาม webmaster ของ websamba เขาก็ตอบกลับมาด้วยดี แต่ผมมาพลาดตรงแฟ้ม mdb เพราะ ไปสั่ง compact ก่อนส่งเข้าไปใน websamba จึงขอเตือนไว้เลยครับว่า ถ้าเกิด error ที่บอกว่า แฟ้มเสียหาย มีโอกาสเป็นไปได้สูงมากที่ท่านสั่ง compact database ก่อน upload และ ที่เป็นเช่นนี้ ก็คาดว่า เป็นเพราะ access97 ที่ใช้เป็น version ภาษาไทย และ ODBC ของ websamba อาจไม่ได้รองรับตัวนี้ก็ได้ ... สรุปว่าตอนนี้ผมติดต่อ mdb ที่ websamba.com ได้แล้ว เพราะได้ guide จาก aspbuilder นั่นเอง ที่ทำให้ผมกลับไปพบความผิดพลาดในเรื่องของการ compact database ก่อน upload
  2. บทเรียนนี้ ผมเน้นการอ่านข้อมูลมาแสดง การเพิ่มข้อมูล การลบข้อมูล และการใช้ Query ที่สร้างไว้ใน mdb โดยอาศัยกรณีศึกษา เรื่องการรายงานผลการเรียน เป็นหัวหอกในการทำ case นี้
  3. ผมไม่ได้ทำบทเรียนนี้ให้ใช้งานได้โดยสมบูรณ์ เพราะได้เปิดโอกาสให้ผู้ศึกษาสามารถ download ข้อมูลทั้งหมดไป ศึกษาได้ ดังนั้นอาจมีผู้ศึกษาบางคนใช้โปรแกรมพิเศษ แอบดูรหัสผ่าน ใน field password ผมจึงทำ case การรายงานผลนี้ไม่ให้ทำการปรับปรุงส่วนของ score ได้ และถ้าได้ก็จะกำหนดเป็นกรณีไปให้ชัดเจน แต่จะไม่ขอกล่าวในบทนี้ เพราะเรียนไปแล้วว่า บทนี้เป็นบทเรียนเริ่มต้น
  4. แฟ้มข้อมูลที่ใช้ในบทนี้คือ grade.mdb ซึ่งท่านสามารถ [ download แฟ้ม grade.mdb ] ไปศึกษาประกอบ source โปรแกรมที่แสดงไว้ในบทเรียนนี้ได้ หรือถ้าท่านไม่แน่ใจว่า mdb ที่ท่านสร้างขึ้นใช้ได้ หรือไม่ ก็ลอง download ไปทดสอบดูก็ได้ครับ ผมก็เคยใช้ mdb ที่ download มา จึงรู้ว่า access97 ในเครื่องผมมีปัญหา หรืออะไรทำนองนั้น
  5. แฟ้ม grade.mdb ประกอบด้วย 3 object สำหรับบทเรียนนี้คือ table ชื่อ teacher, table ชื่อ grade และ query ชื่อ cntstd สำหรับ query นี้เกิดจากการเชื่อมตาราง teacher และ grade ในลักษณะ group by แยก ตามรหัสการสอน และใช้คำสั่ง count เพื่อนับว่าแต่ละรหัสการสอน มีจำนวนนักเรียนกี่คน เมื่อท่าน download แฟ้มไปแล้วเห็น field อื่น นั่นคือ field ที่เตรียมไว้สำหรับพัฒนาระบบให้สมบูรณ์ ในภายหลัง
    table ชื่อ teacher
    ทำหน้าที่เก็บข้อมูลการสอน
    tid : รหัสการสอน เป็น autonumber จะเพิ่มอัตโนมัติเมื่อเพิ่มระเบียน
    school : ชื่อสถาบัน หรือชื่อโรงเรียน
    tyear : ปีการศึกษา
    tsem : ภาคการศึกษา
    subj : ชื่อ หรือรหัสวิชา
    tname : ชื่ออาจารย์ผู้สอน
    typeshow : ประเภทของการแสดงผลเกรด
    passwd : รหัสผ่าน ซึ่งจะใช้คู่กันกับ tid และมีรูปแบบที่ซ่อนไว้
    table ชื่อ grade
    ทำหน้าที่เก็บข้อมูลเกรดนักเรียน
    tid : รหัสการสอน ที่ต้องตรงกันกับ tid ในตาราง teacher
    sid : รหัสนักเรียน นักศึกษา
    sname : ชื่อนักเรียน นักศึกษา
    scorekeep : คะแนนเก็บ
    scoremid : คะแนนสอบกลางภาค
    scoreproject : คะแนนรายงาน
    scorefinal : คะแนนสอบปลายภาค
    grade : ตัวอักษรเกรด เช่น A, B+, B หรือ F เป็นต้น

อ่านข้อมูลมาแสดงอย่างง่าย
Source code ของ sgrdlstt.asp
http://thaiall.thailandhosting.net/asp/sgrdlstt.asp
<html><title>Testing of grade listing</title>
<body><font face="microsoft sans serif">
Testing of grade listing<hr>
<table width=100% bgcolor=#ffffdd>
<%
Set objConn = CreateObject("ADODB.Connection")
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("grade.mdb"))
Set rsUser = objConn.Execute("SELECT tid,sid,sname,grade FROM grade")
do while not rsUser.eof
%>

<tr>
<td><%=rsUser("tid")%></td>
<td><%=rsUser("sid")%></td>
<td><%=rsUser("sname")%></td>
<td><%=rsUser("grade")%></td>
</tr>

<%
rsUser.movenext
loop
rsUser.close
set rsUser=nothing
%>
</table>
</body></html>
Click To View Source Code

แสดงผลจากรหัสการสอน
ซึ่งรับค่าได้ทั้งผ่าน form และ url
ฟอร์มส่งค่า Source code เขียน ฟอร์มส่งค่า
รหัสการสอน :
<form action=http://thaiall.thailandhosting.net/asp/sgrdlsts.asp method=post>
<b>รหัสการสอน</b> :
<input type="text" name=tid size=5 value=1><br>
<input type=submit value="Show grade report"><input type=reset value=Reset>
</form>
Source code ของ sgrdlsts.asp
<html><title>บริการประกาศผลการเรียน ทาง Internet</title>
<body bgcolor=#ffffdd><font face="microsoft sans serif">
<font size=4><center>บริการประกาศผลการเรียนทาง Internet</center></font>
<hr>
<%
xtid = request.form("tid") + request.querystring("tid")
response.write("รหัสการสอน  : <b><font color=#ff0000 size="2">"& xtid & "</font></b>")
Set objConn = CreateObject("ADODB.Connection")
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("grade.mdb"))
Set rsUser = objConn.Execute("SELECT tid,school,subj,tyear,tsem,tname,typeshow FROM teacher where teacher.tid=" & xtid)
response.write("( " & rsUser("tyear") &" / ")
response.write(rsUser("tsem") &" )<br>")
response.write("<center><font color=#0000ff><b>" & rsUser("school")&"</b></font><br>")
response.write("<b><font color=#008000 size="2">" & rsUser("subj") &"</font></b></center>")
tshow = rsUser("typeshow")
tname = rsUser("tname")
rsUser.close
set rsUser = objConn.execute("select tid,sid,sname,scorekeep,scoremid,scoreproject,scorefinal,grade from grade where grade.tid=" & xtid)
response.write("<table width=100% >")
response.write("<tr bgcolor=#00dddd><td>ลำดับ</td><td>รหัส</td><td>ชื่อ - สกุล</td>")
if tshow= "l" then
   response.write("<td>คะแนนเก็บ</td>")
   response.write("<td>คะแนนสอบกลางภาค</td>")
   response.write("<td>คะแนนรายงาน</td>")
   response.write("<td>คะแนนสอบปลายภาค</td>")
   response.write("<td>คะแนนรวม</td>")
end if
response.write("<td>เกรด</td></tr>")

i = 0
do while not rsUser.eof
   i = i + 1
   if (i mod 2) = 0 then  
      response.write("<tr bgcolor=#cccccc>") 
   else 
      response.write("<tr bgcolor=#fffffd>") 
   end if
   response.write("<td>" & i &"</td>")   
   response.write("<td>" & rsUser("sid")&"</td>")   
   response.write("<td>" & rsUser("sname")&"</td>")
   if tshow= "l" then
      response.write("<td>" & rsUser("scorekeep")&"</td>")
      response.write("<td>" & rsUser("scoremid")&"</td>")
      response.write("<td>" & rsUser("scoreproject")&"</td>")
      response.write("<td>" & rsUser("scorefinal")&"</td>")
      ss = rsUser("scorekeep")+rsUser("scoremid")+rsUser("scoreproject")+rsUser("scorefinal")
      response.write("<td><b>" & ss &"</b></td>")
   end if
   response.write("<td>" & rsUser("grade")&"</td></tr>")
   rsUser.movenext
loop
response.write("</table>")
response.write("ชื่อผู้สอน : <b>" & tname &"</b> [ ")
if tshow = "s" then response.write("s : รายงานแบบสั้น]<hr>")
if tshow = "l" then response.write("l : รายงานแบบสั้น พร้อมคะแนนสอน]<hr>")
rsUser.close
set rsUser=nothing
%>
</body>
</html>
Click To View Source Code

เพิ่มวิชา คะแนน และเกรด
(ส่วนนี้ใช้การส่งค่า 2 ช่วงคือ sgrdadd.asp และ sgrdaddx.asp)
ฟอร์มส่งค่า Source code เขียน ฟอร์มส่งค่า
ชื่อสถาบัน :
ปีการศึกษา : ภาคการศึกษา :
ชื่อวิชา :
ชื่อผู้สอน :
รหัสผ่าน :
รหัสผ่านอีกครั้ง :
จำนวนนักเรียน : เลขระบุช่องว่าง สำหรับข้อมูล
โปรดเลือกแบบ : การแสดงผล
เก็บ เกรดที่ต้องการแสดง
เก็บ คะแนน และเกรดอะไร

<form action=http://thaiall.thailandhosting.net/asp/sgrdadd.asp method=post>
ชื่อสถาบัน : <input type="text" name=school size=40 value="โรงเรียนบุญวาทย์วิทยาลัย"><br>
ปีการศึกษา : <input type="text" name=tyear size=6 value="2543">
ภาคการศึกษา : <input type="text" name=tsem size="2" value="1"><br>
รหัสวิชา หรือชื่อวิชา : <input type="text" name=subj size=30 value="คอมพิวเตอร์เบื้องต้น"><br>
ชื่อผู้สอน : <input type="text" name=tname size=40 value="อาจารย์เกิน กำดี"><br>
รหัสผ่าน : <input type=password name=passwd size=8>
รหัสผ่านอีกครั้ง : <input type=password name=passwdc size=8><br>
จำนวนนักเรียน : <input type="text" name=amount size=3 value=3> เลขระบุช่องว่าง สำหรับข้อมูล<br>
<b>โปรดเลือกแบบ</b> : ของการจัดเก็บข้อมูล และการแสดงผลเกรด<br>
<input type=radio name=typeshow value="s" checked>เก็บ เกรดที่ต้องการแสดง<br>
<input type=radio name=typeshow value="l">เก็บ คะแนน และเกรดอะไร<br>
<input type=submit value="Add new subject"><input type=reset value=Reset><br>
</form>
โปรแกรมสำหรับเพิ่มระเบียนในตาราง teacher
Source code ของ sgrdadd.asp
<body><font face="microsoft sans serif">
<%
if  len(request.form("passwd")) > 0 and (request.form("passwd") = request.form("passwdc")) then
   Set objConn = CreateObject("ADODB.Connection")
   objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("grade.mdb"))
   sql = "INSERT into teacher (school,tyear,tsem,subj,tname,typeshow,passwd) SELECT "
   sql = sql & " '" & request.form("school") & "' as school, "
   sql = sql & " " & request.form("tyear") & " as tyear, "
   sql = sql & " " & request.form("tsem") & " as tsem, "
   sql = sql & " '" & request.form("subj") & "' as subj, "
   sql = sql & " '" & request.form("tname") & "' as tname, "
   sql = sql & " '" & request.form("typeshow") & "' as typeshow, "
   sql = sql & " '" & request.form("passwd") & "' as passwd; "
   Set rsUser = objConn.Execute(sql)
   Set rsUser = objConn.Execute("SELECT tid from teacher order by tid desc;")
   response.write("รหัสการสอน ของท่านคือ <b>" & rsUser("tid") & "</b><hr>")
   response.write("<br>Step 1 of  2  : Put your information to TEACHER is OK <hr>")
   response.write("This is step 2 of 2 :")
   lasttid = rsUser("tid")
   rsUser.close
   Set rsUser = nothing
   response.write("<form action=http://thaiall.thailandhosting.net/asp/sgrdaddx.asp method=post>")
   response.write("<input type=hidden name=tid value=" & lasttid & ">")  
   response.write("<input type=hidden name=amount value=" & request.form("amount") & ">")  
   response.write("<input type=hidden name=typeshow value=" & request.form("typeshow") & ">")  
   for i = 1 to cint(request.form("amount"))
      response.write("รหัสนักเรียน<input type="text" size=10 name=sid" & i &" > ")      
      response.write("ชื่อ<input type="text" size="2"0 name=sname" & i &" > ")    
      if request.form("typeshow") = "s" then
        response.write("เกรด<input type="text" size=3 name=grade" & i &" ><br>")  
      end if
      if request.form("typeshow") = "l" then
         response.write("เก็บ <input type="text" size=3 name=scorekeep" & i &" >")  
         response.write("กลาง<input type="text" size=3 name=scoremid" & i &" >")  
         response.write("รายงาน <input type="text" size=3 name=scoreproject" & i &" >")  
         response.write("ปลาย<input type="text" size=3 name=scorefinal" & i &" > ")  
         response.write("เกรด<input type="text" size=3 name=grade" & i &" ><br>")  
      end if
      response.write("<br>")
   next
   response.write("<input type=submit value='Save all grade in file'>")
   response.write("<input type=reset value=Reset>")
   response.write("</form>")
else
   response.write("ข้อมูลมีปัญหา โปรแกรมกลับไปตรวจสอบให้เรียบร้อย<br>หรือ ท่านอาจไม่ได้ระบุรหัสผ่าน")
   response.write("<br>Your data have problem. Please back for checking.")
end if
%>
<hr>
</body>
โปรแกรมสำหรับเพิ่มระเบียนในตาราง grade
Source code ของ sgrdaddx.asp
<body><font face="microsoft sans serif">
<%
   Set objConn = CreateObject("ADODB.Connection")
   objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("grade.mdb"))
   for i = 1 to cint(request.form("amount"))
     ' type s
      if request.form("typeshow") = "s" then
         if len(request.form("tid")) > 0 and len(request.form("sid"&i)) > 0 and len(request.form("sname"&i)) > 0 then
         sql = "INSERT into grade (tid,sid,sname,grade) SELECT "
         sql = sql & " " & request.form("tid") & " as tid, "
         sql = sql & " " & request.form("sid"&i) & " as sid, "
         sql = sql & " '" & request.form("sname"&i) & "' as sname, "
         sql = sql & " '" & request.form("grade"&i) & "' as grade; "
         Set rsUser = objConn.Execute(sql)
         end if
      end if
     ' type l
      if request.form("typeshow") = "l" then
         if len(request.form("tid")) > 0 and len(request.form("sid"&i)) > 0 and len(request.form("sname"&i)) > 0 then
         sql = "INSERT into grade (tid,sid,sname,scorekeep,scoremid,scoreproject,scorefinal,grade) SELECT "
         sql = sql & " " & request.form("tid") & " as tid, "
         sql = sql & " " & request.form("sid"&i) & " as sid, "
         sql = sql & " '" & request.form("sname"&i) & "' as sname, "
         sql = sql & " " & request.form("scorekeep"&i) & " as scorekeep, "
         sql = sql & " " & request.form("scoremid"&i) & " as scoremid, "
         sql = sql & " " & request.form("scoreproject"&i) & " as scoreproject, "
         sql = sql & " " & request.form("scorefinal"&i) & " as scorefinal, "
         sql = sql & " '" & request.form("grade"&i) & "' as grade; "
         Set rsUser = objConn.Execute(sql)
         end if
      end if
   next
   Set rsUser = nothing
%>
Step 2 of 2 : Your student score is OK
<hr>
</body>

Click To View Source Code ของ sgrdadd.asp
Click To View Source Code ของ sgrdaddx.asp

แสดงผลสรุปว่ามี รหัสการสอนอะไรบ้าง และจำนวน
ซึ่งใช้วิธีการอ่านแฟ้ม query จาก group by ตาราง 2 ตาราง
Source code ของ sgrdlsta.asp
http://thaiall.thailandhosting.net/asp/sgrdlsta.asp
<html><title>สรุป จำนวนนักเรียน เรียงตามรหัสการสอน</title>
<body bgcolor=#000000><font face="microsoft sans serif">
<font size=4 color=#ff0000><center>สรุป จำนวนนักเรียน เรียงตามรหัสการสอน</center></font>
<hr>
<table width=100% bgcolor=#ffffdd>
<tr><td>ลำดับ</td><td>รหัสการสอน</td><td>ชื่อสถาบัน</td><td>ชื่อผู้สอน</td><td>ชื่อวิชา</td><td>จำนวน</td><td>แสดงผล</td>
<%
Set objConn = CreateObject("ADODB.Connection")
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("grade.mdb"))
Set rsUser = objConn.Execute("SELECT tid,school,tname,subj,cnts FROM cntstd order by tid desc;" )
i = 0
do while not rsUser.eof
   i = i + 1
   if (i mod 2) = 0 then  
      response.write("<tr bgcolor=#cccccc>") 
   else 
      response.write("<tr bgcolor=#fffffd>") 
   end if
%>

<td><%=i%></td>
<td><%=rsUser("tid")%></td>
<td><%=rsUser("school")%></td>
<td><%=rsUser("tname")%></td>
<td><%=rsUser("subj")%></td>
<td><%=rsUser("cnts")%></td>
<td><a href=sgrdlsts.asp?tid=<%=rsUser("tid")%>>Click here</a></td>
</tr>

<%
   rsUser.movenext
loop
rsUser.close
set rsUser=nothing
%>
</table>
<font color=#ffffdd>
<b>หมายเหตุ</b> :<br> 
ถ้าวิชาใด มีนักเรียน ไม่เกิน 3 คน หรือกรอกข้อมูลไม่สมบูรณ์ <b>ทีมงานขอใช้สิทธิ์ลบข้อมูล</b> ซึ่งไม่ก่อประโยชน์นั้นทั้งชุด
</body>
</html>
Click To View Source Code

ลบข้อมูลโดยใช้รหัสการสอน และรหัสผ่าน
โดยลบจากตาราง teacher และ grade ด้วย click เดียว
ฟอร์มส่งค่า Source code เขียน ฟอร์มส่งค่า
รหัสการสอน :
รหัสผ่าน :
<form action=http://thaiall.thailandhosting.net/asp/sgrddel.asp method=post>
รหัสการสอน : <input type="text" name=tid size=5 value=1><br>
รหัสผ่าน : <input type=password name=passwd size=10><br>
<input type=submit value="Delete all of your records"><input type=reset value=Reset>
</form>
Source code ของ sgrddel.asp
<body>
<%
Set objConn = CreateObject("ADODB.Connection")
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("grade.mdb"))
Set rsUser = objConn.Execute("SELECT tid,passwd FROM teacher where teacher.tid=" & request.form("tid"))
if not rsUser.eof then
   if request.form("passwd") = rsUser("passwd") then
      response.write("Delete ID :" & request.form("tid"))
      Set rsUser = objConn.Execute("DELETE tid,school FROM teacher WHERE teacher.tid= " & request.form("tid"))
      Set rsUser = objConn.Execute("DELETE tid FROM grade WHERE grade.tid= " & request.form("tid"))   
   else
      response.write("Your password is not correct.")
   end if
else
      response.write("Your tid is not found")
end if
Set rsUser = nothing
%>
<hr>
</body>
Click To View Source Code

แบบฝึกหัด
    ให้ทำตามโจทย์ต่อไปนี้
  1. ให้เขียนโปรแกรมตามตัวอย่างข้างบนนี้ ให้ได้ทุกโปรแกรม
  2. ให้สร้าง query เพิ่มเติม เพื่อสร้างรายงานหน้าตาแปลก ๆ เช่น นับจำนวนเกรดของแต่ละวิชา เป็นต้น
  3. ให้สร้าง SQL เรียกข้อมูลในลักษณะ group by แทนการใช้ query (ผมยังไม่ได้ทดสอบ แต่เชื่อว่าระบบต้องรองรับได้)

แนะนำเว็บใหม่ : ผลการจัดอันดับ
รักลำปาง : korattown.com : topsiam.com : มหาวิทยาลัยโยนก
ศูนย์สอบ : รวมบทความ : ไอทีในชีวิตประจำวัน : ดาวน์โหลด : yourname@thaiall.com
ติดต่อ ทีมงาน ชาวลำปาง มีฝันเพื่อการศึกษา Tel.08-1992-7223