กระทู้เก่าบอร์ด อ.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 ควรจะรันบนรายงานมากกว่าเพราะไม่ควรที่จะรันบนพอร์มเพราะมันไม่ได้ใช้ประโยชน์เต็มที่ หากอาจาร์ยมีวิธีใหม่ๆหรือวิธีที่ดีกว่าช่วยแนะนำและยกตัวอย่างให้ผมหน่อยครับ
ขอบคุณครับ
บางท่านก็เลือกใช้งานได้หลายๆแบบตามความเหมาะสมไม่ว่าจะเป็น
=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
2 @R20943
ขอบคุณครับ เดี๋ยวทดลองแล้วได้ผลยังไงจะมาแจ้งแีกทีครับ
3 @R20970
อาจารย์ TTT ครับ
ผลลองทำตามที่บอก แต่ผมงงครับ
1.ต้องทำยังไงครับ เอา Code ที่อาจารย์แนะนำไปแปะตรงไหนครับใน Query ครับ
2.Teble1 ผมมีฟิวส์ ID เป็น Autonumber แล้วครับ
3 และ4. ผมใช้ Access 2003 เขียนครับ และรอวิธีการทำงานแบบ Code ของอาจารย์อยู่ แต่ไม่รู้จะทำตรงไหนครับ ไม่เป็นจริงๆครับ
แล้วก็ SELECT Table1.ID, Table1.aName, ในส่วนของ Table1.aName,
มันคือฟิวส์อะไรครับ ช่วยสอนและแนะการเขียนหน่อยครับ
ขอบคุณครับ
ผลลองทำตามที่บอก แต่ผมงงครับ
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 บอกครับ
แจ่มเลย ขอบคุณครับ
https://www.youtube.com/watch?v=l5Aj8dPH8KY
ไม่รู้ว่าเหมือนของคุณTTT หรือเปล่าแต่ ทำตาม VDO แล้วมันเร็วขึ้นครับ
แต่คลิปใช้ "*" แต่ผมเปลี่ยนให้เป็น 1 ตามคุณTTT บอกครับ
แจ่มเลย ขอบคุณครับ
Time: 0.3488s
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() มันจะกระโดดไปไหนก็ได้เลยครับ
สรุปคราวๆเทคนิคมีประมาณนี้ จะได้เร็วสุดเท่าที่จะทำได้ครับ ที่ผมเคยทำนะ