กระทู้เก่าบอร์ด อ.Yeadram
        
           3,263   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.2062s
    
      
		
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 ให้ตรงกับจำนวนเรคอร์ดในฟอร์มหลังจากเพิ่ม/ลบเรคอร์ดครับ