กระทู้เก่าบอร์ด อ.Yeadram
3,075 15
URL.หัวข้อ /
URL
จะนับจำนวนเร็คคอร์ดในคิวรี่ได้อย่างไรคะ
หนูทำฟอร์มโดยใช้ข้อมูลจากคิวรี่ Quary-A นะคะ
ความต้องการของหนูก็คือ อยากจะสร้าง textbox ซักตัว บนหน้าฟอร์มดังกล่าว
เพื่อนับแสดงจำนวนเรคคอร์ดของ Quary-A ว่ามีกี่เรคคอร์ด
กรณีนี้ หนูต้องเขียนคำสั่งบน textbox อย่างไรคะ
ขอบคุณค่ะ
ความต้องการของหนูก็คือ อยากจะสร้าง textbox ซักตัว บนหน้าฟอร์มดังกล่าว
เพื่อนับแสดงจำนวนเรคคอร์ดของ Quary-A ว่ามีกี่เรคคอร์ด
กรณีนี้ หนูต้องเขียนคำสั่งบน textbox อย่างไรคะ
ขอบคุณค่ะ
15 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R10706
ขอบพระคุณอย่างยื่งค่ะอาจารย์
หนูจะลองนำไปทำตามดูนะคะ
ขอบคุณค่ะ
หนูจะลองนำไปทำตามดูนะคะ
ขอบคุณค่ะ
3 @R10707
หนูลองทำแล้วค่ะอาจารย์ โดย
สร้างโมดูลใหม่ขึ้นมา1อัน แล้วคัดลอกนำฟังชั่นที่ท่านแนะนำไปใส่
จากนั้นนำโค้ดไปใส่ที่ฟอร์มโหลด เมื่อโหลดฟอร์มแล้วมันขึ้น Error ตามในรูปค่ะ
รบกวนอาจารย์แนะนำเพิ่มเติมด้วยนะคะ
สร้างโมดูลใหม่ขึ้นมา1อัน แล้วคัดลอกนำฟังชั่นที่ท่านแนะนำไปใส่
จากนั้นนำโค้ดไปใส่ที่ฟอร์มโหลด เมื่อโหลดฟอร์มแล้วมันขึ้น Error ตามในรูปค่ะ
รบกวนอาจารย์แนะนำเพิ่มเติมด้วยนะคะ
4 @R10708
โมดูลค่ะ
5 @R10709
ผมว่าจะต้องเขียนไว้ที่ในฟอร์ม นะครับ
6 @R10711
เรียนอาจารย์ sjs
หนูได้ลองนำไปเขียนไว้ในฟอร์ม-เปิด
มันก็จะ Error ตามในรูปอีกค่ะ
ไม่ทราบว่าหนูทำผิดขั้นตอนไหน รบกวนอาจารย์ช่วยแนะนำด้วยนะคะ
ขอบคุณค่ะ
หนูได้ลองนำไปเขียนไว้ในฟอร์ม-เปิด
มันก็จะ Error ตามในรูปอีกค่ะ
ไม่ทราบว่าหนูทำผิดขั้นตอนไหน รบกวนอาจารย์ช่วยแนะนำด้วยนะคะ
ขอบคุณค่ะ
7 @R10712
ไม่นะ ไม่นะ ต้องแบบนี้นะ
Private Sub Form_Load()
Me.Text0 = TotalRecord()
End Sub
Private Function TotalRecord() As Long
Dim RS As DAO.Recordset
Set RS = Me.RecordsetClone
If Not RS.EOF Then RS.MoveLast
TotalRecord = RS.RecordCount
End Function
Private Sub Form_Load()
Me.Text0 = TotalRecord()
End Sub
Private Function TotalRecord() As Long
Dim RS As DAO.Recordset
Set RS = Me.RecordsetClone
If Not RS.EOF Then RS.MoveLast
TotalRecord = RS.RecordCount
End Function
8 @R10715
ขอบคุณค่ะ
หนูได้แก้ไขตามที่ท่านแนะนำแล้ว ตอนนี้ไม่ Error แล้วค่ะ
แต่ Text0 ยังไม่ยอมนับแสดงจำนวนเรคคอร์ดค่ะ
คือว่าแสดงเป็น 0 อย่างเดียว
ซึ่งหนูก็ได้เพิ่ม Me.Text0 = TotalRecord()
ไปไว้ที่ Form_AfterUpdate
และที่ Form_AfterDelConfirm
ก็ยังไม่ได้
ลองเปลี่ยนชื่อ Text0 เป็นอย่างอื่นแล้ว ก็ยังคงเดิมค่ะ
หนูได้แก้ไขตามที่ท่านแนะนำแล้ว ตอนนี้ไม่ Error แล้วค่ะ
แต่ Text0 ยังไม่ยอมนับแสดงจำนวนเรคคอร์ดค่ะ
คือว่าแสดงเป็น 0 อย่างเดียว
ซึ่งหนูก็ได้เพิ่ม Me.Text0 = TotalRecord()
ไปไว้ที่ Form_AfterUpdate
และที่ Form_AfterDelConfirm
ก็ยังไม่ได้
ลองเปลี่ยนชื่อ Text0 เป็นอย่างอื่นแล้ว ก็ยังคงเดิมค่ะ
9 @R10716
รบกวนถามอีกนิด ในฟอร์มคุณมาลีใช้ชื่อ Text0 หรือ Text9 ครับที่ต้องการโชว์
10 @R10718
เรียนอาจารย์ sjs
เดิมใช้ชื่อ Text9 แต่หลังจากได้ใช้โค้ดที่ท่านแนะนำ หนูก็เปลี่ยนเป็น Text0
เพื่อให้มันตรงกับคำสั่งในโค้ดแล้วค่ะ
เดิมใช้ชื่อ Text9 แต่หลังจากได้ใช้โค้ดที่ท่านแนะนำ หนูก็เปลี่ยนเป็น Text0
เพื่อให้มันตรงกับคำสั่งในโค้ดแล้วค่ะ
11 @R10719
เย้..ได้แล้วค่ะอาจารย์
เพิ่ม Me.Requery เข้าไปอีกบรรทัด ก็ใช้ได้เลยค่ะ
ขอขอบคุณอาจารย์อย่างยิ่งนะคะ
เพิ่ม Me.Requery เข้าไปอีกบรรทัด ก็ใช้ได้เลยค่ะ
ขอขอบคุณอาจารย์อย่างยิ่งนะคะ
12 @R10721
คุณมาลีใช้ Form_Open หรือ Form_Load ครับ
Form_Open เกิดก่อนที่ระบบจะโหลดเอาข้อมูลมาเพื่อแสดงบนฟอร์ม ส่วน Form_Load จะเกิดขึ้นหลังจาก Form_Open และเกิดหลังจากระบบโหลดข้อมูลมาแล้ว ดังนั้นถ้าใช้ Form_Load มันก็น่าจะให้ค่าออกมาได้เสมอครับ โดยไม่ต้องสั่ง Requery
Form_Open เกิดก่อนที่ระบบจะโหลดเอาข้อมูลมาเพื่อแสดงบนฟอร์ม ส่วน Form_Load จะเกิดขึ้นหลังจาก Form_Open และเกิดหลังจากระบบโหลดข้อมูลมาแล้ว ดังนั้นถ้าใช้ Form_Load มันก็น่าจะให้ค่าออกมาได้เสมอครับ โดยไม่ต้องสั่ง Requery
13 @R10722
ต้องขออภัยอย่างยิ่งค่ะอาจารย์
ตอนแรก หนูให้ข้อมูลไม่ครบถ้วน เพราะ(มั่ว)คิดเอาเองว่า คงไม่เกี่ยวกันกระมัง
แต่ที่ไหนได้ มาทราบภายหลังว่า มันเป็นประเด็นสำคัญมากเลย คือว่า
ที่ฟอร์ม หนูสร้าง Text2 เอาไว้ ซึ่งไปทำ Between กับฟิลด์ ใน Quary-A
ดังนั้นขณะเปิดหรือโหลดฟอร์ม Quary-A คงจะ ยังไม่ได้รัน จนกว่าจะใส่ข้อมูล
ใน Text2 เสียก่อน (ไม่ทราบว่าหนูเข้าใจถูกหรือไม่) ทำให้ Text0 นับจำนวนไม่ได้ จึงแสดงค่าเป็น 0
พอตั้งหลักได้ หนูก็เลยลองย้ายคำสั่งต่างๆ ไปผูกไว้กับ Text2 แทน พร้อมกับเพิ่ม Me.Requery ไปอีก เป็นดังนี้ค่ะ
Private Function TotalRecord() As Long
Dim RS As DAO.Recordset
Set RS = Me.RecordsetClone
If Not RS.EOF Then RS.MoveLast
TotalRecord = RS.RecordCount
End Function
Private Sub Text2_AfterUpdate()
Me.Requery
Me.Text0 = TotalRecord()
End Sub
พอปรับเปลี่ยนเป็นแบบนี้ มันก็ใช้ได้ค่ะ
ซึ่งไม่ทราบว่า หนูทำผิดขั้นตอนใดไปหรือเปล่าคะอาจารย์
ตอนแรก หนูให้ข้อมูลไม่ครบถ้วน เพราะ(มั่ว)คิดเอาเองว่า คงไม่เกี่ยวกันกระมัง
แต่ที่ไหนได้ มาทราบภายหลังว่า มันเป็นประเด็นสำคัญมากเลย คือว่า
ที่ฟอร์ม หนูสร้าง Text2 เอาไว้ ซึ่งไปทำ Between กับฟิลด์ ใน Quary-A
ดังนั้นขณะเปิดหรือโหลดฟอร์ม Quary-A คงจะ ยังไม่ได้รัน จนกว่าจะใส่ข้อมูล
ใน Text2 เสียก่อน (ไม่ทราบว่าหนูเข้าใจถูกหรือไม่) ทำให้ Text0 นับจำนวนไม่ได้ จึงแสดงค่าเป็น 0
พอตั้งหลักได้ หนูก็เลยลองย้ายคำสั่งต่างๆ ไปผูกไว้กับ Text2 แทน พร้อมกับเพิ่ม Me.Requery ไปอีก เป็นดังนี้ค่ะ
Private Function TotalRecord() As Long
Dim RS As DAO.Recordset
Set RS = Me.RecordsetClone
If Not RS.EOF Then RS.MoveLast
TotalRecord = RS.RecordCount
End Function
Private Sub Text2_AfterUpdate()
Me.Requery
Me.Text0 = TotalRecord()
End Sub
พอปรับเปลี่ยนเป็นแบบนี้ มันก็ใช้ได้ค่ะ
ซึ่งไม่ทราบว่า หนูทำผิดขั้นตอนใดไปหรือเปล่าคะอาจารย์
14 @R10724
"ดังนั้นขณะเปิดหรือโหลดฟอร์ม Quary-A คงจะ ยังไม่ได้รัน"
ไม่ถูกครับ หลังจาก Form_Open event แต่ก่อน Form_Load event ระบบจะหาเรคอร์ดตาม Query-A แล้ว แต่เพราะขณะเปิดฟอร์ม ค่า Text2 ยังไม่มี ดังนั้น RecordCount จึงได้เป็นศูนย์ครับ และเมื่อ Text2 เปลี่ยน ผลของ Query-A จะไม่ได้เปลี่ยนตามโดยอัตโนมัติครับ จึงต้องสั่ง .Requery ใน Text2_AfterUpdate event เพื่อให้ระบบหาผลลัพธ์มาใหม่
หลักการเขียนโปรแกรมด้วย Access (จริงๆมันหลักของ Event Driven Programming) ก็คือ เราไม่สามารถเขียนโค้ดไว้ที่ใดๆตามที่คิดเอาเองได้ เราต้องวางโค้ดลงใน event ที่ระบบให้มาเท่านั้น หรือไม่ก็ใน Module ถ้าเรารู้ว่า event อะไรเกิดเมื่อไหร่ และ event นั้นทำให้เกิดอะไรเป็นผลตามมาบ้าง event อะไรเกิดก่อนเกิดหลัง เราก็จะเลือกวางโค้ดได้ถูก event ครับ
ไม่ถูกครับ หลังจาก Form_Open event แต่ก่อน Form_Load event ระบบจะหาเรคอร์ดตาม Query-A แล้ว แต่เพราะขณะเปิดฟอร์ม ค่า Text2 ยังไม่มี ดังนั้น RecordCount จึงได้เป็นศูนย์ครับ และเมื่อ Text2 เปลี่ยน ผลของ Query-A จะไม่ได้เปลี่ยนตามโดยอัตโนมัติครับ จึงต้องสั่ง .Requery ใน Text2_AfterUpdate event เพื่อให้ระบบหาผลลัพธ์มาใหม่
หลักการเขียนโปรแกรมด้วย Access (จริงๆมันหลักของ Event Driven Programming) ก็คือ เราไม่สามารถเขียนโค้ดไว้ที่ใดๆตามที่คิดเอาเองได้ เราต้องวางโค้ดลงใน event ที่ระบบให้มาเท่านั้น หรือไม่ก็ใน Module ถ้าเรารู้ว่า event อะไรเกิดเมื่อไหร่ และ event นั้นทำให้เกิดอะไรเป็นผลตามมาบ้าง event อะไรเกิดก่อนเกิดหลัง เราก็จะเลือกวางโค้ดได้ถูก event ครับ
15 @R10725
ขอบคุณอาจารย์สันติสุขนะคะ
ที่กรุณาช่วยเหลือให้ความรู้แก่หนูมาโดยตลอด
ขอขอบคุณอาจารย์ทุกๆท่าน โดยเฉพาะท่านผู้ก่อตั้งบอร์ดนี้ด้วยนะคะ
จนมุมเมื่อไหร่ เข้ามาบอร์ดนี้ ได้เจอทางออกทุกครั้งเลยค่ะ...!!!
ที่กรุณาช่วยเหลือให้ความรู้แก่หนูมาโดยตลอด
ขอขอบคุณอาจารย์ทุกๆท่าน โดยเฉพาะท่านผู้ก่อตั้งบอร์ดนี้ด้วยนะคะ
จนมุมเมื่อไหร่ เข้ามาบอร์ดนี้ ได้เจอทางออกทุกครั้งเลยค่ะ...!!!
Time: 0.3828s
Private Function TotalRecord( ) as Long
Dim RS as DAO.Recordset
Set RS = Me.RecordsetClone
If Not RS.EOF Then RS.MoveLast
TotalRecord = RS.RecordCount
End Function
จากนั้นก็เขียนโค้ดใน Form_OnLoad ว่า
Me.[ชื่อ Textbox] = TotalRecord( )
เท่านี้เองครับ และถ้าผู้ใช้สามารถเพิ่ม/ลบเรคอร์ดจากหน้าฟอร์มนี้เองได้ด้วย เราก็ต้องสั่ง Me.[ชื่อ Textbox] = TotalRecord( ) ไว้ใน Form_AfterUpdate และ Form_AfterDelConfirm เพิ่มเติม เพื่อปรับผลใน Textbox ให้ตรงกับจำนวนเรคอร์ดในฟอร์มหลังจากเพิ่ม/ลบเรคอร์ดครับ