กระทู้เก่าบอร์ด อ.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
รบกวนถามเรื่อง การสร้าง ปุ่ม 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.3024s
ขอบคุณค่ะ