การทำปุ่มในการเลื่อน ใน ms access
กระทู้เก่าบอร์ด อ.Yeadram

 2,279   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



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

1 @R07923
รบกวนผู้รู้ตอบด้วยนะค่ะ

ขอบคุณค่ะ
2 @R07932
ลองสลับบรรทัดเอา to_txt ขึ้นก่อน Firstnext ก่อนครับ
เพราะคุณต้องสั่งติดต่อ ฐานข้อมูลก่อนที่จะสั่งเลื่อน record

chk = "MoveFirst"
        to_txt
        Firstnext
       
3 @R07936
คุณ Nova

ได้ลองทำดูแล้วค่ะ และลอง F8 ดูด้วย ปรากฏว่าเข้า แต่มันก็ไม่เลื่อนนะค่ะ
งงๆ ไม่รู้ว่าติดตรงไหนกันแน่

คือ ยังไม่เลื่อนอยู่ดีค่ะ
4 @R07937
ดูไปดูมา สงสัยจังว่า sub to_txt() นั้นเรียกข้อมูลมาแสดงได้จริงเหรอครับ
ถ้าเรียกได้ คุณ 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" อาจจะทำให้แม่นยำได้กว่า
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 เพื่อนับแล้วละค่ะ


ขอบคุณที่แนะนำนะค่ะ
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

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

จริงๆ ด้วย

-


ขอบคุณค่ะ
10 @R08041
ขอบพระคุณ อาจารย์มากค่ะ ดิฉันทำได้แล้วค่ะ ดีใจจังเลย
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3024s