กระทู้เก่าบอร์ด อ.Yeadram
1,325 7
URL.หัวข้อ /
URL
ต้องการ Running ข้อมูลบน Form
รบกวนขอเทคนิคด้วยครับ
ในฐานข้อมูลมีการทำ AutoNumber แล้ว แต่เมื่อมีการเรียกข้อมูลแบบมีเงื่อนไข ระบบก็จะดึงข้อมูลตามเงื่อนไขเป็นช่วง ๆ ออกมา ทำให้ Running กระโดด เป็น 1, 5 , 9 ,10,12,17,25 เป็นต้น
ความต้องการคืออยากให้ให้ Form รันเลขใหม่ครับ ตามตัวอย่างข้างต้นควรจะเป็นเลข 1 รัน ถึงเลข 7 เป็นเลขสุดท้าย รบกวนด้วยครับ
ในฐานข้อมูลมีการทำ 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
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]))
ประมาณนี้ครับ
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?
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 บนฟอร์ม หากผิดก็คงประมาณนี้ครับ
- สร้างฟิลด์ 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 ทำตัวอย่างเล็กมาให้ชมสักนิดครับ ขอบคุณครับ
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 จะมีการนับแบบที่คุณต้องการ
ประมาณนี้ครับ ปรับใช้ดู
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 มากเลยครับ ถามตามตัวอย่างนี้ที่ให้มาได้แล้ว เดี่ยวจะลองดูของจริงอีกทีครับ ขอบคุณครับ
Time: 0.2268s
แต่ผมลองทำตามดูก็ 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]))