สอบถามการใช้ front end กับ backend



0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

22 พ.ค. 63 , 18:20:19
อ่าน 216 ครั้ง

Niky@cm5

  • สมาชิกไท.Access
  • กระทู้: 6

    • ดูรายละเอียด

สอบถามการใช้ front end กับ backend
« เมื่อ: 22 พ.ค. 63 , 18:20:19 »
ผมสอบถามผู้รู้ว่ากรณีการใช้ frontend โดยเชื่อม linking table มาทุกตารางที่เกี่ยวข้อง เวลาแก้ไขข้อมูลสามารถทำได้ในฟอร์มได้ทุกอย่างแต่ เมื่อทำจะทำการอัพเดทโดยการรันคิวรีอัพเดทหลายตารางพร้อมกันไม่สามารถทำได้ โปรแกรมจะฟ้องว่า การดำเนินการที่ไม่ถูกต้อง  ซึ่งกรณีดังกล่าวหากดำเนินการใน file back end ทำได้ทุกฟังก์ชั่น เมื่อแยก frontend ออกมาแล้วเชื่อม ทำไม่ได้ในรูปแบบที่กล่าว เพราะเหตุใดครับอยากถามมานานมากแล้ว เพราะไม่สามารถแก้ไข หรือเป็นเพราะ permission แต่สิทธิผมก็แก้ไขตารางได้ทุกอย่างนะครับ ยกเว้นแค่รันคิวรีอัพเดทแบบที่ผมบอกไม่สามารถทำได้เวลากดปุ่ม บันทึก ลืมบอก backend ผมเป็น access นะครับไม่ได้ใช้ sql แบบธรรมดาปกติ backend อยู่ drive z (แบ่งพาสที่ชั่นใหม่) ตัว frontend อยู่ หน้า desktop ส่วนในวงแลนผม map drive ไว้ที่ z เหมื่อนกันเผื่อให้  user ใช้ร่วมกัน ผมต้องเพิ่มอะไรไหมครับมันถึงจะได้ เบื้องต้นออกตัวไว้ก่อนนะครับผมไม่ได้เรียนมาด้านนี้เลยแต่อาศัยครูพักลักจำสามารถเขียนใช้ได้ในระดับหนึ่งครับ ต้องเพิ่มคำสั่งตรงไหนโปรดชี้แนะครับ
 
คำสั่ง vba command button ใช้ชุดนี้ครับ
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 Database, Td As Recordset
Dim ds As Recordset, ttran As Recordset
Set db = DBEngine.Workspaces(0).Databases(0)
Set ds = db.OpenRecordset("positid", DB_OPEN_TABLE)
Set Td = db.OpenRecordset("person", DB_OPEN_TABLE)
Set ttran = db.OpenRecordset("tranpolice", DB_OPEN_TABLE)
Td.Index = "Primarykey"
ds.Index = "Primarykey"
'Update person file
Td.Seek "=", mid
If Td.NoMatch Then
   MsgBox "ไม่มีข้อมูลรหัสตำแหน่ง " & mid_posit & " ในตาราง Person"
Else
Td.Edit
Td.Update

   Td.Edit
   Td("id_posit") = Null
   Td.Update
End If
Td.Close
'criterion = "id_posit = mid_posit"
ds.Seek "=", mid_posit
If ds.NoMatch Then
   MsgBox ("ไม่มีข้อมูลรหัสตำแหน่ง " & mid_posit & " ในตารางเลขตำแหน่ง")
Else
   ds.Edit
   ds("id") = 0
   ds.Update
End If
ds.Close
ttran.AddNew
ttran("id") = mid
ttran("id_posit") = mid_posit
ttran("trncode") = Me![trncode]
ttran("trndate") = Me![POSIT_DT]
ttran("destination") = Me![destination]
ttran("lastupdate") = Me![lastupdate]
ttran.Update
ttran.Close
Forms![POLICE]![search_text] = Null
Forms![POLICE]![MAIN_ID] = Null
Forms![POLICE]![by_code] = Null
Forms![POLICE]![by_name] = Null
Forms![POLICE]![by_name].RowSource = "SELECT DISTINCTROW Person.NAME, Positid.ID_POSIT, Person.ID FROM Positid LEFT JOIN Person ON Positid.ID_POSIT = Person.ID_POSIT ORDER BY Person.NAME;"
DoCmd.Close acForm, "out_Police"
Exit_Command139_Click:
    Exit Sub

Err_Command139_Click:
    MsgBox Err.Description
    Resume Exit_Command139_Click
   
End Sub
« แก้ไขครั้งสุดท้าย: 22 พ.ค. 63 , 23:37:29 โดย Niky@cm5 »

 

23 พ.ค. 63 , 12:11:17
ตอบกลับ #1

สันติสุข

: สอบถามการใช้ front end กับ backend
« ตอบกลับ #1 เมื่อ: 23 พ.ค. 63 , 12:11:17 »
เราอ้างถึงฐานข้อมูลตัวปัจจุบันที่โค้ดกำลังทำงานด้วย 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
...
...
...
« แก้ไขครั้งสุดท้าย: 23 พ.ค. 63 , 12:22:37 โดย สันติสุข »
ช่วยพกถุงผ้า/ถุงพลาสติกไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Niky@cm5

23 พ.ค. 63 , 12:23:20
ตอบกลับ #2

Niky@cm5

  • สมาชิกไท.Access
  • กระทู้: 6

    • ดูรายละเอียด

: สอบถามการใช้ front end กับ backend
« ตอบกลับ #2 เมื่อ: 23 พ.ค. 63 , 12:23:20 »
ขอบพระคุณมากครับท่านอาจารย์ ที่ให้วิทยาทานครับจะนำความรู้ไปเกิดประโยชน์ต่อไปครับ :love:

 


บอร์ดเรียนรู้ Access สำหรับคนไทย