สอบถามเพิ่มเติมเกี่ยวกับ Running Num
กระทู้เก่าบอร์ด อ.Yeadram

 1,237   4
URL.หัวข้อ / URL
สอบถามเพิ่มเติมเกี่ยวกับ Running Num

จากหลายๆท่านได้เคยสอบถามการ Running Number บน Form มา

บางท่านก็เลือกใช้งานได้หลายๆแบบตามความเหมาะสมไม่ว่าจะเป็น
=IIf(IsNull([ID]),Null,myRunningSum([Form],"ID",[ID]))

หรือ

Function myRunningSum(myForm As Form, myFieldName As String, myFieldNumber As Long) As Long

    Dim rs As DAO.Recordset

    Set rs = myForm.RecordsetClone

    rs.FindFirst "[" & myFieldName & "] = " & myFieldNumber

    If Not rs.NoMatch Then

        myRunningSum = rs.AbsolutePosition + 1

    End If

    rs.Close: Set rs = Nothing

End Function

หรือ

Public Function Rec(A As Variant) As Variant
    Dim rst As DAO.Recordset
    Set rst = Me.RecordsetClone
If rst.RecordCount > 0 Then
rst.MoveLast
rst.MoveFirst
Else: Exit Function
End If
            Do Until rst.EOF
            If rst!A_NO = A Then
               Rec = rst.AbsolutePosition + 1
               Exit Function
              End If
            rst.MoveNext
            Loop
        rst.Close
        Set rst = Nothing
If Me.NewRecord Then GoTo Rec_Exit
Rec_Exit:
On Error Resume Next
rst.Close: Set rst = Nothing

End Function

ทั้งหมดนี้หากมี Record เยอะบน Form มันจะทำงานช้ามาก และก็จะค้างทำให้เลข Running ไม่หมดผมต้องเอาเม้าไปชี้ตั้งแต่ตัวที่ค้างไรจนถึงบรรทัดสุดท้ายถึงจะเห็นเลข Running จนครับ พอจะมีวิธีไหนที่ทำให้เลข Running ได้ไวขึ้นหรือไม่ครับ ผมเข้าใจว่าเลข Running ควรจะรันบนรายงานมากกว่าเพราะไม่ควรที่จะรันบนพอร์มเพราะมันไม่ได้ใช้ประโยชน์เต็มที่ หากอาจาร์ยมีวิธีใหม่ๆหรือวิธีที่ดีกว่าช่วยแนะนำและยกตัวอย่างให้ผมหน่อยครับ
ขอบคุณครับ


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

1 @R20940
อื่ม เท่าที่เคยลองและอ่านมาเมื่อก่อน ผมเคยสรุปไว้ประมาณนี้นะครับ ลองดู

1. ให้ทำในคิวรี่แทนการใช้ ADO หรือ DAO
2. ตารางต้องมีฟิลด์ Index ID คือพวก AutoNumber (ถ้าไม่มีก็สร้างเพิ่มได้เลย)
3. ให้ใช้คำสั่ง Count(1) หรือ Count([ฟิลด์ ID]) กำหนดไปเลย อย่าใช้ Count(*) จะช้าลง (แนะนำใช้ 1 ไปเลย)
4. ถ้าเป็น MS Access ให้ใช้ฟังก์ชั่น DCount() แทนการใช้ซับคิวรี่ เช่น
------------------------------------------------------------------------------------
SELECT Table1.ID, Table1.aName, (SELECT Count(1) FROM Table1 AS b WHERE b.ID <= Table1.ID) AS AutoNumber
FROM Table1
ORDER BY Table1.ID;
--------------------------------------------------------------------------------------
ให้เขียนเป็นอย่างนี้แทน
------------------------------------------------------------------------------------
SELECT Table1.ID, Table1.aName, DCount("1","Table1","[ID] <= " & [ID]) AS [Counter]
FROM Table1
ORDER BY Table1.ID;
--------------------------------------------------------------------------------------
- ผมเคยทดสอบกับข้อมูลระดับแสนกว่าๆ เอง แบบแรกใช้ซับคิวรี่ จากเรคคอร์แรกๆ จะกระโดดไปเรคคอร์ดสุดท้าย เครื่องไม่ยอมไป 10 นาทีได้ แต่หากใช้ DCount() มันจะกระโดดไปไหนก็ได้เลยครับ

สรุปคราวๆเทคนิคมีประมาณนี้ จะได้เร็วสุดเท่าที่จะทำได้ครับ ที่ผมเคยทำนะ
2 @R20943
ขอบคุณครับ เดี๋ยวทดลองแล้วได้ผลยังไงจะมาแจ้งแีกทีครับ
3 @R20970
อาจารย์ TTT ครับ
ผลลองทำตามที่บอก แต่ผมงงครับ

1.ต้องทำยังไงครับ เอา Code ที่อาจารย์แนะนำไปแปะตรงไหนครับใน Query ครับ
2.Teble1 ผมมีฟิวส์ ID เป็น Autonumber แล้วครับ
3 และ4. ผมใช้ Access 2003 เขียนครับ และรอวิธีการทำงานแบบ Code ของอาจารย์อยู่ แต่ไม่รู้จะทำตรงไหนครับ ไม่เป็นจริงๆครับ

แล้วก็ SELECT Table1.ID, Table1.aName, ในส่วนของ Table1.aName,
มันคือฟิวส์อะไรครับ ช่วยสอนและแนะการเขียนหน่อยครับ

ขอบคุณครับ
4 @R20971
ได้แล้วครับทำตามนี้เลยครับ
https://www.youtube.com/watch?v=l5Aj8dPH8KY

ไม่รู้ว่าเหมือนของคุณTTT หรือเปล่าแต่ ทำตาม VDO แล้วมันเร็วขึ้นครับ
แต่คลิปใช้ "*" แต่ผมเปลี่ยนให้เป็น 1 ตามคุณTTT บอกครับ
แจ่มเลย ขอบคุณครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3488s