กระทู้เก่าบอร์ด อ.Yeadram
        
           2,464   10		  
          
					  
		    URL.หัวข้อ / 
		    URL
        
        การทำปุ่มในการเลื่อน ใน ms access      
    
      เรียน อาจารย์
รบกวนถามเรื่อง การสร้าง ปุ่ม move first , Move Previous , Move Next , Move last ใน Microsoft access นะค่ะ
พยายามทำอยู่หลายรอบ แต่ก็ไม่ไปซักกะที ไม่รู้ติดตรงไหนค่ะ
คือ ฐานข้อมูลเป็น Sql Server ต้องใช้ คำสั่ง Sql ทั้งหมดเลยค่ะ แต่มาติดตัวนี้ละ งง ๆ มากๆ เลยค่ะ
code ดังนี้
Private Sub CmdFirst_Click()
chk = "MoveFirst"
Firstnext
to_txt
End Sub
Private Sub CmdLast_Click()
chk = "Movelast"
Firstnext
to_txt
End Sub
Private Sub CmdNext_Click()
chk = "Movenext"
Firstnext
to_txt
End Sub
Private Sub CmdPrevious_Click()
chk = "Previous"
Firstnext
to_txt
End Sub
Sub Firstnext()
' OpendbUser
' SQLUser = "Select * from TTQC019901 order by TTQC01990101"
' With ConnectDBUser(SQLUser)
If rsUser.RecordCount = 0 Then MsgBox "¢éÍÁÙÅÇèÒ§", vbCritical + vbOKOnly, "Empty": Exit Sub
If chk = "Previous" Then
rsUser.MovePrevious
If rsUser.BOF Then rsUser.MoveFirst
ElseIf chk = "Movelast" Then
rsUser.MoveLast
If rsUser.EOF Then rsUser.MoveLast
ElseIf chk = "Movenext" Then
If rsUser.EOF Then rsUser.MovePrevious: Exit Sub
rsUser.MoveNext
ElseIf chk = "MoveFirst" Then
rsUser.MoveFirst
If rsUser.BOF Then rsUser.MoveFirst
End If
' End With
End Sub
Sub to_txt()
OpendbUser
SQLUser = "Select * from TTQC019901 order by TTQC01990101 DESC"
With ConnectDBUser(SQLUser)
TxtUser_account = .Fields("TTQC01990111")
txtname = .Fields("TTQC01990102")
TxtEmp_no = .Fields("TTQC01990101")
CmbCom = .Fields("TTQC01990108")
CmbDep = .Fields("TTQC01990109")
CmbSec = .Fields("TTQC01990110")
                        
If .Fields("TTQC01990103") = "Admin" Then
OptAdmin.Value = True
Else
OptUser.Value = True
End If
End With
End Sub
    
    
  รบกวนถามเรื่อง การสร้าง ปุ่ม move first , Move Previous , Move Next , Move last ใน Microsoft access นะค่ะ
พยายามทำอยู่หลายรอบ แต่ก็ไม่ไปซักกะที ไม่รู้ติดตรงไหนค่ะ
คือ ฐานข้อมูลเป็น Sql Server ต้องใช้ คำสั่ง Sql ทั้งหมดเลยค่ะ แต่มาติดตัวนี้ละ งง ๆ มากๆ เลยค่ะ
code ดังนี้
Private Sub CmdFirst_Click()
chk = "MoveFirst"
Firstnext
to_txt
End Sub
Private Sub CmdLast_Click()
chk = "Movelast"
Firstnext
to_txt
End Sub
Private Sub CmdNext_Click()
chk = "Movenext"
Firstnext
to_txt
End Sub
Private Sub CmdPrevious_Click()
chk = "Previous"
Firstnext
to_txt
End Sub
Sub Firstnext()
' OpendbUser
' SQLUser = "Select * from TTQC019901 order by TTQC01990101"
' With ConnectDBUser(SQLUser)
If rsUser.RecordCount = 0 Then MsgBox "¢éÍÁÙÅÇèÒ§", vbCritical + vbOKOnly, "Empty": Exit Sub
If chk = "Previous" Then
rsUser.MovePrevious
If rsUser.BOF Then rsUser.MoveFirst
ElseIf chk = "Movelast" Then
rsUser.MoveLast
If rsUser.EOF Then rsUser.MoveLast
ElseIf chk = "Movenext" Then
If rsUser.EOF Then rsUser.MovePrevious: Exit Sub
rsUser.MoveNext
ElseIf chk = "MoveFirst" Then
rsUser.MoveFirst
If rsUser.BOF Then rsUser.MoveFirst
End If
' End With
End Sub
Sub to_txt()
OpendbUser
SQLUser = "Select * from TTQC019901 order by TTQC01990101 DESC"
With ConnectDBUser(SQLUser)
TxtUser_account = .Fields("TTQC01990111")
txtname = .Fields("TTQC01990102")
TxtEmp_no = .Fields("TTQC01990101")
CmbCom = .Fields("TTQC01990108")
CmbDep = .Fields("TTQC01990109")
CmbSec = .Fields("TTQC01990110")
If .Fields("TTQC01990103") = "Admin" Then
OptAdmin.Value = True
Else
OptUser.Value = True
End If
End With
End Sub
				10 Reply in this Topic. Dispaly 1  pages and you are on page number 1 
				
        
    2 @R07932    
        
  
      ลองสลับบรรทัดเอา  to_txt ขึ้นก่อน Firstnext ก่อนครับ
เพราะคุณต้องสั่งติดต่อ ฐานข้อมูลก่อนที่จะสั่งเลื่อน record
chk = "MoveFirst"
to_txt
Firstnext
           
    
  เพราะคุณต้องสั่งติดต่อ ฐานข้อมูลก่อนที่จะสั่งเลื่อน record
chk = "MoveFirst"
to_txt
Firstnext
        
    3 @R07936    
        
  
      คุณ Nova
ได้ลองทำดูแล้วค่ะ และลอง F8 ดูด้วย ปรากฏว่าเข้า แต่มันก็ไม่เลื่อนนะค่ะ
งงๆ ไม่รู้ว่าติดตรงไหนกันแน่
คือ ยังไม่เลื่อนอยู่ดีค่ะ 
  
    
    
  ได้ลองทำดูแล้วค่ะ และลอง F8 ดูด้วย ปรากฏว่าเข้า แต่มันก็ไม่เลื่อนนะค่ะ
งงๆ ไม่รู้ว่าติดตรงไหนกันแน่
คือ ยังไม่เลื่อนอยู่ดีค่ะ
 
  
    
        
    4 @R07937    
        
  
      ดูไปดูมา สงสัยจังว่า sub to_txt() นั้นเรียกข้อมูลมาแสดงได้จริงเหรอครับ
ถ้าเรียกได้ คุณ Panvilai เอาข้อมูลไปเก็บไว้ที่ไหนครับเพราะใน code ไม่ได้บอก
ถ้าดูจาก sub Firstnext() If rsUser.RecordCount = 0
แสดงว่ามีการตรวจสอบข้อมูลจาก recordset ชื่อ rsUser
ดังนั้คุณ Panvilai ต้องสั่งใน sub to_txt() ก่อนครับให้นำข้อมูลที่ได้จาก Sqluserไปเก็บใน rsUser จากนั้น movelast movenext จึงจะใช้งานได้
    
    
  ถ้าเรียกได้ คุณ Panvilai เอาข้อมูลไปเก็บไว้ที่ไหนครับเพราะใน code ไม่ได้บอก
ถ้าดูจาก sub Firstnext() If rsUser.RecordCount = 0
แสดงว่ามีการตรวจสอบข้อมูลจาก recordset ชื่อ rsUser
ดังนั้คุณ Panvilai ต้องสั่งใน sub to_txt() ก่อนครับให้นำข้อมูลที่ได้จาก Sqluserไปเก็บใน rsUser จากนั้น movelast movenext จึงจะใช้งานได้
        
    5 @R07939    
        
  
      - คุณสั่ง คอนเน็คเอาข้อมูลมาโปรยลง textbox  (อาจจะสั่งตอนเปิดฟอร์ม) ถามว่าคุณได้สั่งปิดการ คอนเน็คหรือยัง 
ถ้ามีการเปิดและปิดการเชื่อมต่อทุกครั้ง ที่จะโปรยข้อมูล
ในโค้ดของคุณก็ต้องมีการ คอนเน็คใหม่ทุกๆ ครั้งที่มีการกดปุ่ม
ในการคอนเน็คใหม่แต่ละครั้งคุณจะได้ชุดข้อมูลมาทั้งชุด มาครบทุกเรคคอร์ด เช่นมี 125 เรคคอร์ดมันก็มาทั้งหมด และข้อมูลที่คุณได้มา แน่นอนครับ เคอร์เซอร์ของมันอยู่ที่เรคคอร์ดแรกเสมอ
เมื่อคุณสั่ง next หรือสั่ง ถอย มันก็ทำงานได้ลำบาก เพราะไม่มีโค้ดส่วนไหนของคุณเลยที่จะบอกมันว่า ขณะนี้ ปัจจุบันนี้ หน้าฟอร์มของคุณแสดงข้อมูลของเรคคอร์ดลำดับที่เท่าไหร่
คุณต้องลำดับการทำงาน หรือ เรียงโฟล์วชาร์ตใหม่ครับ
1 เปิดฟอร์ม
-ให้คอนเนค
-เอาข้อมูลลำดับแรกมาโปรย
-เก็บค่า "ลำดับ" ไว้ในตัวแปร public (ก็คือลำดับ=1)
2 เมื่อกด next ให้
- ให้คอนเนค
- ตรวจนับจำนวนเรคคอร์ดทั้งหมดที่ เก็บได้ใน recordset
- ตววจสอบเทียบค่าตัวแปร "ลำดับ" กับจำนวนเรคคอร์ดทั้งหมด ว่าน้อยกว่ากัน หรือมากกว่ากัน หรือเท่ากัน
-2.1 ถ้าการตรวจสอบถูกต้องตรงตามที่ต้องการ (พร้อมจะให้ next) ให้ move recordset ไปที่ (ตัวแปรลำดับ + 1) , สั่งโปรยข้อมูลที่ได้ลง textbox , และเก็บ "ลำดับ" ค่าใหม่ ไว้ในตัวแปรอีกครั้ง
-2.2 ถ้าตรวจพบว่า มันเป็นเรคคอร์ดสุดท้ายแล้ว ให้ movelast แล้วโปรยข้อมูล
-2.3 ถ้า recordcount =0 ให้ทำอย่างไร ก็ว่าไป
---- จบงานสำหรับปุ่ม next----
ปุ่มอื่นๆ ก็ควรจะมีลำดับงานคล้ายๆ กันอย่างนี้
การใช้ตัวแปรลำดับ อาจจะผิดเพี้ยนได้กรณีมีการทำงานร่วมกันหลายๆ client เพราะอาจมีการแทรก การสร้างการเสริม หรือการลบเรคคอร์ดจาก client อื่นๆ ได้ในเวลาเดียวกัน ดังนั้น ถ้าลองประยุกต์จากการเก็บ "ลำดับ และ move" ไปเป็นการเก็บ "ค่าของฟิลด์ primary ควบกับการ find หรือ seek" อาจจะทำให้แม่นยำได้กว่า
    
  ถ้ามีการเปิดและปิดการเชื่อมต่อทุกครั้ง ที่จะโปรยข้อมูล
ในโค้ดของคุณก็ต้องมีการ คอนเน็คใหม่ทุกๆ ครั้งที่มีการกดปุ่ม
ในการคอนเน็คใหม่แต่ละครั้งคุณจะได้ชุดข้อมูลมาทั้งชุด มาครบทุกเรคคอร์ด เช่นมี 125 เรคคอร์ดมันก็มาทั้งหมด และข้อมูลที่คุณได้มา แน่นอนครับ เคอร์เซอร์ของมันอยู่ที่เรคคอร์ดแรกเสมอ
เมื่อคุณสั่ง next หรือสั่ง ถอย มันก็ทำงานได้ลำบาก เพราะไม่มีโค้ดส่วนไหนของคุณเลยที่จะบอกมันว่า ขณะนี้ ปัจจุบันนี้ หน้าฟอร์มของคุณแสดงข้อมูลของเรคคอร์ดลำดับที่เท่าไหร่
คุณต้องลำดับการทำงาน หรือ เรียงโฟล์วชาร์ตใหม่ครับ
1 เปิดฟอร์ม
-ให้คอนเนค
-เอาข้อมูลลำดับแรกมาโปรย
-เก็บค่า "ลำดับ" ไว้ในตัวแปร public (ก็คือลำดับ=1)
2 เมื่อกด next ให้
- ให้คอนเนค
- ตรวจนับจำนวนเรคคอร์ดทั้งหมดที่ เก็บได้ใน recordset
- ตววจสอบเทียบค่าตัวแปร "ลำดับ" กับจำนวนเรคคอร์ดทั้งหมด ว่าน้อยกว่ากัน หรือมากกว่ากัน หรือเท่ากัน
-2.1 ถ้าการตรวจสอบถูกต้องตรงตามที่ต้องการ (พร้อมจะให้ next) ให้ move recordset ไปที่ (ตัวแปรลำดับ + 1) , สั่งโปรยข้อมูลที่ได้ลง textbox , และเก็บ "ลำดับ" ค่าใหม่ ไว้ในตัวแปรอีกครั้ง
-2.2 ถ้าตรวจพบว่า มันเป็นเรคคอร์ดสุดท้ายแล้ว ให้ movelast แล้วโปรยข้อมูล
-2.3 ถ้า recordcount =0 ให้ทำอย่างไร ก็ว่าไป
---- จบงานสำหรับปุ่ม next----
ปุ่มอื่นๆ ก็ควรจะมีลำดับงานคล้ายๆ กันอย่างนี้
การใช้ตัวแปรลำดับ อาจจะผิดเพี้ยนได้กรณีมีการทำงานร่วมกันหลายๆ client เพราะอาจมีการแทรก การสร้างการเสริม หรือการลบเรคคอร์ดจาก client อื่นๆ ได้ในเวลาเดียวกัน ดังนั้น ถ้าลองประยุกต์จากการเก็บ "ลำดับ และ move" ไปเป็นการเก็บ "ค่าของฟิลด์ primary ควบกับการ find หรือ seek" อาจจะทำให้แม่นยำได้กว่า
        
    6 @R07940    
        
  
      คุณ yeadram
ตัว "ลำดับ" ดิฉันใช้เก็บ เป็นรหัสพนักงานค่ะ ซึ่งมันอาจจะไม่มีการเรียงกัน แต่ไม่ได้มีการเก็บแบบ Autorun ไว้ค่ะ
ดูจากข้อความของคุณ Nova
ดูไปดูมา สงสัยจังว่า sub to_txt() นั้นเรียกข้อมูลมาแสดงได้จริงเหรอครับ
ถ้าเรียกได้ คุณ Panvilai เอาข้อมูลไปเก็บไว้ที่ไหนครับเพราะใน code ไม่ได้บอก
ถ้าดูจาก sub Firstnext() If rsUser.RecordCount = 0
แสดงว่ามีการตรวจสอบข้อมูลจาก recordset ชื่อ rsUser
ดังนั้คุณ Panvilai ต้องสั่งใน sub to_txt() ก่อนครับให้นำข้อมูลที่ได้จาก Sqluserไปเก็บใน rsUser จากนั้น movelast movenext จึงจะใช้งานได้
พอจะเข้าใจนิดหน่อย
ข้อมูลที่ sub to_txt() มันไม่วนลูป เพราะนับครั้งเดียวแล้วออกเลย
คงต้องไปเพิ่ม Autorrun เพื่อนับแล้วละค่ะ
ขอบคุณที่แนะนำนะค่ะ
    
  ตัว "ลำดับ" ดิฉันใช้เก็บ เป็นรหัสพนักงานค่ะ ซึ่งมันอาจจะไม่มีการเรียงกัน แต่ไม่ได้มีการเก็บแบบ Autorun ไว้ค่ะ
ดูจากข้อความของคุณ Nova
ดูไปดูมา สงสัยจังว่า sub to_txt() นั้นเรียกข้อมูลมาแสดงได้จริงเหรอครับ
ถ้าเรียกได้ คุณ Panvilai เอาข้อมูลไปเก็บไว้ที่ไหนครับเพราะใน code ไม่ได้บอก
ถ้าดูจาก sub Firstnext() If rsUser.RecordCount = 0
แสดงว่ามีการตรวจสอบข้อมูลจาก recordset ชื่อ rsUser
ดังนั้คุณ Panvilai ต้องสั่งใน sub to_txt() ก่อนครับให้นำข้อมูลที่ได้จาก Sqluserไปเก็บใน rsUser จากนั้น movelast movenext จึงจะใช้งานได้
พอจะเข้าใจนิดหน่อย
ข้อมูลที่ sub to_txt() มันไม่วนลูป เพราะนับครั้งเดียวแล้วออกเลย
คงต้องไปเพิ่ม Autorrun เพื่อนับแล้วละค่ะ
ขอบคุณที่แนะนำนะค่ะ
        
    7 @R07941    
        
  
      คุณ yeadram
ถ้ามีโค๊ซของตัวนี้ รบกวน นำมาแปะไว้ จัพเป็นพระคุณค่ะ
แต่ถ้าไม่มีก็ไม่เป็นไรค่ะ ..........
ขอบคุณมากมายเลยละค่ะ
 
    
    
  ถ้ามีโค๊ซของตัวนี้ รบกวน นำมาแปะไว้ จัพเป็นพระคุณค่ะ
แต่ถ้าไม่มีก็ไม่เป็นไรค่ะ ..........
ขอบคุณมากมายเลยละค่ะ
 
    
        
    8 @R07951    
        
  
      Private Sub CmdFirst_Click() 
Firstnext "First"
End Sub
Private Sub CmdLast_Click()
Firstnext "Last"
End Sub
Private Sub CmdNext_Click()
Firstnext "Next"
End Sub
Private Sub CmdPrevious_Click()
Firstnext "Previous"
End Sub
    
  Firstnext "First"
End Sub
Private Sub CmdLast_Click()
Firstnext "Last"
End Sub
Private Sub CmdNext_Click()
Firstnext "Next"
End Sub
Private Sub CmdPrevious_Click()
Firstnext "Previous"
End Sub
Sub Firstnext( chk as string) 
dim CEi as string     ' รหัสลูกค้าเดิมก่อนจะเลื่อนเรคคอร์ด
dim cnt as long     ' จำนวนเรคคอร์ดทั้งหมดของ recordset
dim curr as long     ' ลำดับที่ของเรคคอร์ดเดิม
dim i as string     ' จำนวนรอบ วนลูป
CEi = me.TxtEmp_no
    OpendbUser 
    SQLUser = "Select * from TTQC019901 order by TTQC01990101" 
    
    
' อันนี้ไม่แน่ใจ ในโค้ดเก่าของคุณไม่เห็นมีการเปิด recordset
' ไม่รู้ว่าคุณเปิดมันยังไง ตั้งค่ายังไง    ผมก็มั่วๆ เอา
    set rsUser =ConnectDBUser(SQLUser)      
    
With rsUser
     
' ตรวจนับจำนวนเรคคอร์ด     
    .movelast
    cnt=.recordcount
    .movefirst
     If cnt = 0 Then
     ' กรณีไม่มีเรคคอร์ด
         MsgBox "No record.", vbCritical + vbOKOnly, "Empty"
         go to FirstNext_Exit
     elseif CEi="" or isnull(CEi) then 
     ' หรือกรณี ไม่มีเลขที่ลูกค้าเดิม ค้างบนฟอร์ม
     ' ให้ถือว่าเรคคอร์ดแรก  เป็นเรคคอร์ดเดิมก่อนจะสั่งเลื่อนเรคคอร์ด
         CEi= .Fields("TTQC01990101")
     end if
' ค้นหาว่า เรคคอร์ดเดิมอยู่ลำดับที่เท่าไหร่     
     i=0               
     do while not(.eof) and not(.bof)
          if .Fields("TTQC01990101") = CEi then 
               i = .absoluteposition
               exit do
          end if
          .movenext
     loop
' เตรียมพร้อมก่อนสั่งเลื่อนเรคคอร์ด หากไม่สามารถเลื่อนได้ตามที่สั่ง ต้องเปลี่ยนค่าของ อาร์กิวเมนต์
     if i < 2 and chk = "Previous" then chk ="First"
     if i=(cnt -1) and chk= "Next" then chk = "Last"
' สั่งเลื่อนเรคคอร์ด ตามค่าของ อาร์กิวเมนต์
     select case chk
          case "Previous"
               .moveprevious
          case "Last"
               .movelast
          case "Next"
               .movenext
          case "First"
               .movefirst
     end select   
' เอาข้อมูลจากเรคคอร์ดที่เลื่อนไปหา  มาโปรยลงคอนโทรล
    TxtUser_account = .Fields("TTQC01990111") 
    txtname = .Fields("TTQC01990102") 
    TxtEmp_no = .Fields("TTQC01990101") 
    CmbCom = .Fields("TTQC01990108") 
    CmbDep = .Fields("TTQC01990109") 
    CmbSec = .Fields("TTQC01990110") 
        
    If .Fields("TTQC01990103") = "Admin" Then 
        OptAdmin.Value = True 
    Else 
        OptUser.Value = True 
    End If 
    
End With 
     
' จบการทำงาน
FirstNext_Exit:     
     on error resume next
          rsUser.close
          set rsUser = nothing
     on error goto 0
     exit Sub
' ตรวจจับข้อผิดพลาด
FirstNext_debug:
     if err < > 0 then 
          msgbox "Error = " & err & vbclrf & err.description
          ' debug.print "Error = " & err & vbclrf & err.description
          err.clear
          resume FirstNext_Exit:     
     end if     
     
End Sub    
        
    9 @R07954    
        
  
      คุณ yeadram
ขอบคุณมากเลยค่ะ ถ้ายังไงจะไปลองทำดู แล้วจะมาให้คำตอบว่าทำได้หรือไม่
ยังไงก็ขอบคุณมากมายเลยค่ะ
เป็นเพราะ ไม่ได้เปิด recordset
จริงๆ ด้วย
-
ขอบคุณค่ะ 
    
    
  ขอบคุณมากเลยค่ะ ถ้ายังไงจะไปลองทำดู แล้วจะมาให้คำตอบว่าทำได้หรือไม่
ยังไงก็ขอบคุณมากมายเลยค่ะ
เป็นเพราะ ไม่ได้เปิด recordset
จริงๆ ด้วย
-
ขอบคุณค่ะ
 
    
        
    10 @R08041    
        
    
      ขอบพระคุณ อาจารย์มากค่ะ ดิฉันทำได้แล้วค่ะ ดีใจจังเลย
 
    
    
   
    
      Time: 0.0717s
    
      
		
ขอบคุณค่ะ