ต้องการ Running ข้อมูลบน Form
กระทู้เก่าบอร์ด อ.Yeadram

 1,275   7
URL.หัวข้อ / URL
ต้องการ Running ข้อมูลบน Form

รบกวนขอเทคนิคด้วยครับ

ในฐานข้อมูลมีการทำ AutoNumber แล้ว แต่เมื่อมีการเรียกข้อมูลแบบมีเงื่อนไข ระบบก็จะดึงข้อมูลตามเงื่อนไขเป็นช่วง ๆ ออกมา ทำให้ Running กระโดด เป็น 1, 5 , 9 ,10,12,17,25 เป็นต้น

ความต้องการคืออยากให้ให้ Form รันเลขใหม่ครับ ตามตัวอย่างข้างต้นควรจะเป็นเลข 1 รัน ถึงเลข 7 เป็นเลขสุดท้าย รบกวนด้วยครับ

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

1 @R15649
ลองค้นหาดูเจอกระทู้นี้ http://www.thai-access.com/yeadram_view.php?topic_id=3286

แต่ผมลองทำตามดูก็ Error ตลอด ไม่ทราบว่าทำอะไรผิด Form ผมชื่อ Test_Form
ฟิลด์ที่ให้แสดง Running ชื่อฟิลด์ ID_From ทำอย่างไรก็ Error ไม่เข้าใจเหมือนกันครับ

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


- ใน TextBox ที่ต้องการให้แสดง ลำดับที่ บนฟอร์ม โดยสมมุติชื่อฟิลด์ในตารางข้อมูลที่เป็น AutoNumber ชื่อ ID เขียนคำสั่งใน Data > Control Source ดังนี้:
=IIf(IsNull([ID]),Null,myRunningSum([Form],"ID",[ID]))
2 @R15651
ใช้แบบนี้ครับ
myRunningSum()
myForm หมายถึง ใส่ Me หรือ Form อย่างใดก็ได้ ไม่ต้องใส่ชื่อฟอร์ม
myFieldName หมายถึง ใส่ชื่อฟิลด์ที่เป็นตัวเลข ต้องไม่ซ้ำกันนะครับ
myFieldNumber หมายถึง ฟิลด์ตัวเดียวกับข้างบน แต่เป็นรูปแบบการให้ค่า ไม่ใช่ใส่แบบ String

Form ผมชื่อ Test_Form ฟิลด์ที่ให้แสดง Running ชื่อฟิลด์ ID_From

ก็ใช้เป็น
=IIf(IsNull([ID_From]),Null,myRunningSum(Me,"ID_From",[ID_From]))

ประมาณนี้ครับ
3 @R15658
ขอบคุณคุณ TTT มากเลยครับ ผมก็ทำตามทุกอย่างเลยคือ

1. สร้าง Modules แล้วใส่คำสั่งตามด้านบน
2. ไปที่ Form ชื่อ Test_Form แล้วเลือกไปไปที่ฟิลด์ ID_Form
3. ใส่คำสั่งนี้ "=IIf(IsNull([ID_Form]),Null,myRunningSum([Me],[ID_Form],[ID_Form]))" ที่ Data>Control Source

ก็ยังไม่ได้ครับ ผลลัพธ์ออกมาเป็น #Name?
4 @R15660
2. ไปที่ Form ชื่อ Test_Form แล้วเลือกไปไปที่ฟิลด์ ID_Form
- สร้างฟิลด์ Textbox ใหม่ครับ

3. ใส่คำสั่งนี้ "=IIf(IsNull([ID_Form]),Null,myRunningSum([Me],[ID_Form],[ID_Form]))" ที่ Data>Control Source

- ชื่อฟิลด์ ID_Form ต้องเป็นชื่อฟิลด์ใน ตาราง Table นะครับ ไม่ได้เป็นชื่อ คอนโทรล Textbox ของฟอร์ม และต้องเป็นฟิลด์ที่ข้อมูลไม่ซ้ำกันในแต่ละเรคคอร์ดครับ

ลองตรวจสอบชื่อดูครับ ฟังก์ชั่นทั้งหมดใช้ชื่อฟิลด์ของตารางที่ดึงมาใช้บนฟอร์มนะครับ ไม่ใช่ชื่อคอนโทรล Textbox บนฟอร์ม หากผิดก็คงประมาณนี้ครับ
5 @R15672
2. สร้างฟิลด์ใหม่แล้ว
3. ชื่อฟิลด์ ID_Form ก็เป็นชื่อฟิลด์ใน Table ครับ และเป็นข้อมูลที่ไม่ซ้ำด้วยครับ

สร้างใหม่มาทดสอบก็ยังไม่ได้ครับ พยายามงมอยู่ครับ ขอบคุณครับ

ปล. ถ้าไม่เป็นการรบกวนคุณ TTT จนเกินไปรบกวนคุณ TTT ทำตัวอย่างเล็กมาให้ชมสักนิดครับ ขอบคุณครับ
6 @R15673
อะ! ลองทำตามตัวอย่างดูนะครับ
1. สร้างตารางขึ้นใหม่ สมมุติชื่อ Table1 มีฟิลด์ดังนี้:

ID_auto     aName     aCode
1     A     1
2     B     2
3     C     1
4     E     2

ID_auto เป็น AutoNumber
aName เป็น Text
aCode เป็น Number

2. สร้าง Module ใหม่ ใส่โค๊ดดังนี้:
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

- เซฟ Module ชื่ออะไรก็ได้ที่ไม่ใช่ myRunningSum

3. สร้างฟอร์มใหม่ชื่ออะไรก็ได้ กำหนด Property ดังนี้:
Format > Default View: Continuous Forms
Data > Record Source: Table1

4. สร้าง Textbox บนฟอร์ม เรียงกันแนวนอน 4 ตัว ดังนี้:
ชื่อ Text1 > Data > Record Source: ID_auto
ชื่อ Text2 > Data > Record Source: aName
ชื่อ Text3 > Data > Record Source: aCode
ชื่อ Text4 > Data > Record Source:
=IIf(IsNull([ID_auto]),Null,myRunningSum([Form],"ID_auto",[ID_auto]))

- เมื่อคุณรันฟอร์ม คุณจะได้ค่า Text1 กับ Text4 ที่เท่ากัน
ทดสอบ
- สร้างปุ่มใหม่ 1 ปุ่ม ใส่โค๊ดลงใน Event > On Click:
If Me.FilterOn = False Then
    Me.Filter = "aCode > 1"
    Me.FilterOn = True
Else
    Me.FilterOn = False
End If

- เมื่อรันฟอร์ม แล้วกดปุ่ม จะเป็นการกรองค่าในฟิลด์ aCode ที่มากกว่า 1 ก็ค่า 2 ซึ่งจะเห็นว่าค่าใน Text4 จะมีการนับแบบที่คุณต้องการ
ประมาณนี้ครับ ปรับใช้ดู
7 @R15674
ขอบคุณ คุณ TTT มากเลยครับ ถามตามตัวอย่างนี้ที่ให้มาได้แล้ว เดี่ยวจะลองดูของจริงอีกทีครับ ขอบคุณครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3417s