สอบถามการเขียนโค๊ดแสดงลำดับที่
กระทู้เก่าบอร์ด อ.Yeadram

 1,293   8
URL.หัวข้อ / URL
สอบถามการเขียนโค๊ดแสดงลำดับที่

เรียนอาจารย์ทุกท่านครับ คือสมมุติว่าผมมี ฟิลด์ที่เป็น text อยู่ 7 ฟิลด์ ดังตารางด้านล่าง

   Id          name         math     sci     eng     summark            rank
11001     ก             15             3        7          25          
11002     ข             15             3      10          28          
11003     ค             15             3        4          22          
11004     ง             15             3        4          22          
11005     จ             16             3        3          22          
11006     ฉ             15             3        1          19          
11007     ช             12             3        4          19          

ผมต้องการสร้างปุ่มคำสั่ง เพื่อเขียนโค๊ดคำสั่ง ให้ ฟิลด์ text ที่ชื่อ rank คำนวนหาลำดับที่ ให้เป็นเหมือนด้านล่าง

   Id          name         math     sci     eng     summark            rank
11001     ก             15             3        7          25           2
11002     ข             15             3      10          28           1
11003     ค             15             3        4          22           4
11004     ง             15             3        4          22           4
11005     จ             16             3        3          22           3
11006     ฉ             15             3        1          19           6
11007     ช             12             3        4          19           7

โดยมีข้อแม้ว่า
1. คะแนนรวม (summark) สูงสุด ให้ได้ลำดับที่ 1 เช่น id 11002
2. คะแนนรวม (summark) รองลงมา ให้ได้ลำดับที่ 2 เช่น id 11001
3. ถ้าคะแนนรวม (summark) เท่ากัน ให้ได้ลำดับที่เท่ากัน ( เหมือน id 11003 กับ id 11004
4. ถ้าคะแนนรวม (summark) เท่ากัน ให้ไปดูว่าถ้า คะแนน math สูงกว่าตามตัวอย่างจะได้ลำดับที่ 3
5.จากข้อ 4 ถ้าถ้าคะแนนรวม (summark) เท่ากัน และคะแนน math เท่ากันอีก ให้ไปดู คะแนน sci ว่าใครสูงกว่า จะได้ลำดับที่ (rank) ดีกว่า

*****ผมต้องเขียนโค๊ดคำสั่งอย่างไรครับให้ rank คำนวนและแสดงลำดับที่ออกมา ****


8 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R21932
ยังไม่มีคำตอบเลยครับ
2 @R21933
โค้ดที่เขียนนี้ จะนำค่าไปใส่ใน rank ส่วนคุณจะนำออกมาแสดงยังไง โดยคิวรี่ หรือโดยฟอร์ม ก็ตามแต่ต้องการเลยครับ ได้โค้ดไปแล้ว ลองศึกษาดูว่าโค้ดทำงานยังไงด้วยนะครับ เพราะอัลกอริธึมนี้เป็นระดับพื่นๆเอง

Private Sub InsertRank( )
   Dim DB as DAO.Database
   Dim RS as DAO.Recordset

   Dim NextRank as Integer

   Dim LastSumMark as integer
   Dim LastMath as integer
   Dim LastSci    as integer

   NextRank = 0

   Set DB = CurrentDB
   Set RS = DB.OpenRecordset("select * from ชื่อเทเบิล order by SumMark desc, Math desc, Sci desc")
   With RS
   Do While Not .EOF
      If (.AbsolutePosition <> 0) and (!SumMark = LastSumMark) and (!Math = LastMath) and (!Sci = LastSci) then
           ' Do Nothing
      Else
           NextRank = NextRank + 1
      End If

      .Edit : !Rank = NextRank : .Update

      LastSumMark = !SumMark
      LastMath = !Math
      LastSci = !Sci

      .MoveNext
   Loop
   End With

   RS.Close: Set RS = Nothing
End Sub

หมายเหตุ : โค้ดอาจผิดพลาดได้ เพราะไม่ได้ทดสอบนะครับ คุณไปลองเช็คผลลัพธ์ดูอีกที
3 @R21934
อาจารย์สันติสุขครับ ขึ้น

run-time error '3061':
Too few parameter. Expected 1. ครับ

และเป็นสีเหลืองที่โค๊ดตรงบรรทัดนี้ครับ
Set RS = DB.OpenRecordset("select * from M1_noi order by SumMark desc, Math desc, Sci desc")
4 @R21935
แน่ใจหรือเปล่าว่าฟิลด์ชื่อว่า SumMark, Math และ Sci ถ้าตัวไหนไม่ถูกก็แก้ไขด้วย และแก้ทุกที่ในโค้ดด้วย
5 @R21936
ขอบคุณมากครับอาจารย์ เจอที่ผิดแล้วครับ ผมเขียนชื่อฟิลด์ผิดครับ
6 @R21937
ผลออกมาเป็นอย่างนี้ครับ
math     sci     summark     rank
40             30         70      1
40             30         70      1
40             30         70      1
40             30         70      1
40             26         66      2
40             25         66      2
40             25         66      2
40             25         65      3
40             25         65      3
40             25         65      3
40             25         65      3
39             25         64      4
39             25         64      4
39             25         64      4

แต่ถ้าผมต้องการให้เป็นแบบนี้ครับจะแก้ไขตรงไหนครับ

math     sci     summark     rank
40             30         70      1
40             30         70      1
40             30         70      1
40             30         70      1
40             26         66      5
40             25         66      5
40             25         66      5
40             25         65      8
40             25         65      8
40             25         65      8
40             25         65      8
39             25         64      12
39             25         64      12
39             25         64      12
หมายถึงให้นับลำดับที่ (rank) ที่เท่ากัน แต่ถ้าไม่เท่ากัน ลำดับที่ถัดมาต้องบวกลำดับที่ที่เท่ากันลงมาด้วยครับ ผมรบกวนอาจารย์มากไปไหมครับ
7 @R21938
เพิ่ม Dim WriteRank as Integer

เปลี่ยน
      If (.AbsolutePosition <> 0) and (!SumMark = LastSumMark) and (!Math = LastMath) and (!Sci = LastSci) then
           ' Do Nothing
      Else
           NextRank = NextRank + 1
      End If

      .Edit : !Rank = NextRank : .Update

เป็น
      NextRank = NextRank + 1
      If (.AbsolutePosition <> 0) and (!SumMark = LastSumMark) and (!Math = LastMath) and (!Sci = LastSci) then
           ' Do Nothing
      Else
           WriteRank = NextRank
      End If

      .Edit : !Rank = WriteRank : .Update

8 @R21939
ทำตามที่อาจารย์สันติสุขบอก ได้แล้วครับ ได้รับความรู้จากอาจารย์ และอีกหลายๆท่าน บอร์ดนี้มีประโยชน์มากครับ ขอขอบพระคุณอาจารย์อีกครั้งมากน๊ะครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2207s