เราอ้างถึงฐานข้อมูลตัวปัจจุบันที่โค้ดกำลังทำงานด้วย DBEngine.Workspaces(0).Databases(0) (ปัจจุบันอ้างด้วย CurrentDB แทน) ซึ่งเทเบิลที่อยู่ในนี้เป็น Linked Table ดังนั้นเมื่อสั่งเปิดด้วย OpenRecordset ระบบจะเปิดเป็น dbOpenDynaset จะไม่สามารถเปิดเป็นเทเบิลโดยตรงแม้จะบังคับด้วยค่าคงที่ DB_OPEN_TABLE ก็ตาม (เป็นค่าคงที่รุ่นเก่าแล้ว ปัจจุบันเปลี่ยนไปใช้ dbOpenTable แทน) แต่เมื่อเอาโค้ดไปทำงานใน Back-End Database ซึ่งเทเบิลเป็นเทเบิลจริง ไม่ใช่ Linked Table โค้ดจึงทำงานได้ และเพราะ .Seek method ใช้ไม่ได้กับ Dynaset Recordset คิดว่านี่คือจุดที่ทำให้เกิด error นี้ ต้องใช้ .FindFirst method แทน
ยังไงก็ตามเนื่องจาก Recordset ก็เปิดมาเพื่ออัพเดตเท่านั้น เราสามารถสั่งอัพเดตแล้วเช็คจำนวนเรคอร์ดที่อัพเดตได้ ถ้าเป็นศูนย์ก็แปลว่ารหัสตำแหน่งนั้นไม่มี ไม่ต้องทำ .Seek หรือ .FindFirst ก่อน โค้ดก็จะเป็น
Private Sub cmdsave_Click()
On Error GoTo Err_Command139_Click
If IsNull(Me!POSIT_DT) Then
MsgBox "**** กรุณาบันทึกข้อมูลวันที่ ****"
Exit Sub
End If
DoCmd.SetWarnings False
Dim db As DAO.Database
Dim ttran As DAO.Recordset
Set db = CurrentDB
Set ttran = db.OpenRecordset("tranpolice")
db.execute "update person set id_posit = NULL where ชื่อฟิลด์primarykey = " & cstr(mid)
' แต่ถ้าฟิลด์primarykeyมี data type เป็น text ก็ต้องเปลี่ยนเป็น
' db.execute "update person set id_posit = NULL where ชื่อฟิลด์primarykey = '" & mid & "' "
if db.RecordsAffected = 0 then
MsgBox "ไม่มีข้อมูลรหัสตำแหน่ง " & mid_posit & " ในตาราง Person"
Exit Sub
End If
' หมายเหตุ โค้ดข้างบนนี่ถูกหรือเปล่า เพราะค้นหา primarykey ด้วยตัวแปร mid แต่ถ้าไม่เจอกลับแจ้งข้อความด้วยตัวแปร mid_posit ?
db.execute "update postid set id = 0 where ชื่อฟิลด์primarykey = " & cstr(mid_posit)
' หรือถ้าเหมือนกรณีอธิบายข้างบน ก็ต้องเปลี่ยนเป็น
' db.execute "update postid set id = 0 where ชื่อฟิลด์primarykey = '" & mid_posit & "' "
if db.RecordsAffected = 0 then
MsgBox "ไม่มีข้อมูลรหัสตำแหน่ง " & mid_posit & " ในตารางเลขตำแหน่ง"
Exit Sub
End If
' ข้างล่างนี้จนจบ โค้ดไม่ต้องมีเปลี่ยนอะไรครับ
ttran.AddNew
ttran("id") = mid
ttran("id_posit") = mid_posit
...
...
...
โพสต์นี้ได้รับคำขอบคุณจาก: Niky@cm5