การแก้ไขข้อมูลจากหลายตาราง
ในกรณีที่ตารางหลักมีแต่ตัวเลข id ซึ่งมีการเชื่อมโยงจากตารางอื่น และต้องการให้ผู้ใช้แก้ไขข้อมูลในตารางหลัก จึงจำเป็นต้องนำข้อมูลจากตารางที่เกี่ยวข้องมาแสดง เพื่อให้ผู้ใช้เลือก และแก้ไขให้ถูกต้อง
ในตัวอย่างต่อไปนี้ มีข้อมูล 3 ตาราง โดยมีตารางหลักคือ tblCourseSchedule ซึ่งเชื่อมโยงจาก 2 ตาราง
แต่ละตาราง มีข้อมูลดังนี้
ในตัวอย่างต่อไปนี้ มีข้อมูล 3 ตาราง โดยมีตารางหลักคือ tblCourseSchedule ซึ่งเชื่อมโยงจาก 2 ตาราง
แต่ละตาราง มีข้อมูลดังนี้
ต้องการให้ผู้ใช้แก้ไขข้อมูลในตาราง tblCourseSchedule ซึ่งมีแต่ตัวเลข จำเป็นต้องนำข้อมูลจากตารางอื่นมาแสดงให้เห็น โดยใช้ Listbox แสดงข้อมูลให้เลือก เพื่อแก้ไขอีกทีหนึ่ง หน้าจอ มีดังนี้
หลักการ
- สร้าง Query โดยใช้ข้อมูลจาก 3 ตาราง เพื่อให้แสดงข้อความของแต่ละ Record ในตาราง tblCourseSchedule
- สร้าง Listbox โดยกำหนดให้ใช้ Query ที่สร้่าง เป็น Row Source ของ Listbox
- เมื่อมีการคลิก ให้นำค่าไปไว้ใน Textbox และ Combobox
- เมื่อคลิกปุ่มแก้ไข หรือ ลบ ให้ปรับข้อมูลในตาราง tblCourseSchedule
ปัญหา
Combobox นำข้อมูลมาจากตาราง tblVenue เพื่อให้ผู้ใช้เลือกสถานที่ การนำชื่อสถานที่มาแสดง ทำอย่างไร จึงจะให้ตรงกับสถานที่ ที่อยู่ใน Listbox ที่ผู้ใช้ระบุว่าต้องการแก้ไข
ทางออกคือ ใช้ id ของสถานที่จากใน Listbox และวน loop ใน Combox โดยใช้ Property Column() เพื่อหาว่า id นั้นอยู่ในแถวที่เท่าไรของ Combobox จากนั้น จึงใช้เป็นข้อมูล เพื่อนำมาแสดงใน Combox ด้วย Property itemData() ของ Combox อีกครั้งหนึ่ง
วิธีการ
- สร้าง Query ชื่อ qryEditCourseSchedule
- สร้างฟอร์ม โดยมี Textbox Combobox Listbox และปุ่ม ดังภาพ
มีชื่อดังนี้ txtCourse_id, txtCourse_name, txtBeginDate, txtEndDate, cboVenue, lstCourseSchedule, cmdEdit และ cmdDelete
- กำหนด Row Source ของ lstCourseSchedule เป็น Query ที่สร้าง
- ที่ Event On Click ของ Listbox เขียน โค้ดดังนี้
Private Sub lstCourseSchedule_Click()
If Me.lstCourseSchedule.ListCount > 0 Then
Me.txtCourse_id = Me.lstCourseSchedule.Column(1)
Me.txtCourse_name = Me.lstCourseSchedule.Column(2)
Me.txtBeginDate = Me.lstCourseSchedule.Column(3)
Me.txtEndDate = Me.lstCourseSchedule.Column(4)
Me.cboVenue.RowSource = "SELECT id, venue, address FROM tblVenue ORDER by venue"
' หาตำแหน่งของชื่อสถานที่ เพื่อนำไปแสดงใน Combobox
Dim i As Long
Dim thisItem As Long
' ตรวจหาข้อมูลทีละแถวใน Combobox เพื่อหาว่า id ของสถานที่ ที่เลือก อยู่แถวที่เท่าไร
For i = 0 To Me.cboVenue.ListCount - 1
If Me.cboVenue.Column(0, i) = Me.lstCourseSchedule.Column(6) Then
' id ของสถานที่ใน Combobox อยู่ในคอลัมน์ที่ 1 แต่อยู่ในคอลัมน์ที่ 7 ใน listbox
' index เริ่มจาก 0 คอลัมน์ที่ 1 จึงเป็น 0 และ คอลัมน์ที่ 7 จึงเป็น 6
thisItem = i
Exit For
End If
Next i
' แสดงข้อมูลชื่อสถานที่ใน Combobox
Me.cboVenue.Value = Me.cboVenue.ItemData(thisItem)
Me.cboVenue.Requery
Else
Call MsgBox("ไม่พบข้อมูล")
End If
End Sub - ที่ปุ่ม แก้ไข เขียนโค้ดที่ On Click ดังนี้
Private Sub cmdEdit_Click()
CurrentDb.Execute "UPDATE tblCourseSchedule " & _
"SET course_id = '" & Me.txtCourse_id.Value & _
"', begin_date = " & toSTR(Me.txtBeginDate) & _
", end_date = " & toSTR(Me.txtEndDate) & _
", venue_id = " & Me.cboVenue & _
" WHERE cs_id = " & Me.lstCourseSchedule.Column(0)
Me.lstCourseSchedule.Requery
Call MsgBox("แก้ไขข้อมูลเรียบร้อยแล้ว")
End Sub
'ใช้ฟังก์ชัน toStr() เพื่อปรับรูปแบบวันที่ภาษาไทย ให้ใช้กับ vba ได้ - ที่ปุ่ม ลบ เขียนโค้ดที่ On Click ดังนี้
Private Sub cmdDelete_Click()
CurrentDb.Execute "DELETE FROM tblCourseSchedule WHERE cs_id = " & Me.lstCourseSchedule.Column(0)
Me.lstCourseSchedule.Requery
Call MsgBox("ลบข้อมูลเรียบร้อยแล้ว")
End Sub
ดาวน์โหลดไฟล์ ตัวอย่าง (688 Kb)
ความคิดเห็นนี้ถูกผู้เขียนลบ
ตอบลบ