วันศุกร์ที่ 7 พฤศจิกายน พ.ศ. 2557

การแก้ไขข้อมูลจากหลายตาราง

ในกรณีที่ตารางหลักมีแต่ตัวเลข id ซึ่งมีการเชื่อมโยงจากตารางอื่น และต้องการให้ผู้ใช้แก้ไขข้อมูลในตารางหลัก จึงจำเป็นต้องนำข้อมูลจากตารางที่เกี่ยวข้องมาแสดง เพื่อให้ผู้ใช้เลือก และแก้ไขให้ถูกต้อง

ในตัวอย่างต่อไปนี้ มีข้อมูล 3 ตาราง โดยมีตารางหลักคือ tblCourseSchedule ซึ่งเชื่อมโยงจาก 2 ตาราง
แต่ละตาราง มีข้อมูลดังนี้
ต้องการให้ผู้ใช้แก้ไขข้อมูลในตาราง tblCourseSchedule ซึ่งมีแต่ตัวเลข จำเป็นต้องนำข้อมูลจากตารางอื่นมาแสดงให้เห็น โดยใช้ Listbox แสดงข้อมูลให้เลือก เพื่อแก้ไขอีกทีหนึ่ง หน้าจอ มีดังนี้

หลักการ
  1. สร้าง Query โดยใช้ข้อมูลจาก 3 ตาราง เพื่อให้แสดงข้อความของแต่ละ Record ในตาราง tblCourseSchedule
  2. สร้าง Listbox โดยกำหนดให้ใช้ Query ที่สร้่าง เป็น Row Source ของ Listbox
  3. เมื่อมีการคลิก ให้นำค่าไปไว้ใน Textbox และ Combobox 
  4. เมื่อคลิกปุ่มแก้ไข หรือ ลบ ให้ปรับข้อมูลในตาราง tblCourseSchedule
ปัญหา

          Combobox นำข้อมูลมาจากตาราง tblVenue เพื่อให้ผู้ใช้เลือกสถานที่ การนำชื่อสถานที่มาแสดง ทำอย่างไร จึงจะให้ตรงกับสถานที่ ที่อยู่ใน Listbox ที่ผู้ใช้ระบุว่าต้องการแก้ไข
           ทางออกคือ ใช้ id ของสถานที่จากใน Listbox และวน loop ใน Combox โดยใช้ Property Column() เพื่อหาว่า id นั้นอยู่ในแถวที่เท่าไรของ Combobox จากนั้น จึงใช้เป็นข้อมูล เพื่อนำมาแสดงใน Combox ด้วย Property itemData() ของ Combox อีกครั้งหนึ่ง

วิธีการ


  1. สร้าง Query ชื่อ qryEditCourseSchedule
  2. สร้างฟอร์ม โดยมี Textbox Combobox Listbox และปุ่ม ดังภาพ
    มีชื่อดังนี้ txtCourse_id, txtCourse_name, txtBeginDate, txtEndDate, cboVenue, lstCourseSchedule, cmdEdit และ cmdDelete
  3. กำหนด Row Source ของ lstCourseSchedule เป็น Query ที่สร้าง
  4. ที่ 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
  5. ที่ปุ่ม แก้ไข เขียนโค้ดที่ 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 ได้
  6. ที่ปุ่ม ลบ เขียนโค้ดที่ 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)






1 ความคิดเห็น:

  1. สวัสดีค่ะ คุณ ทองจุล ขันขาว

    ดิฉัน กำลังศึกษาและเขียนโปรแกรมใน Access อยู่ และรูปแบบที่ต้องการจะคล้ายกับที่คุณได้สอนไว้ข้างต้น แต่เนื่องจาก ปุ่มแก้ไข ที่ได้พยายามเขียน และปรับเปลี่ยนโค๊ดตามที่คุณได้แนะแนวทางมาแล้ว ไม่สามารถใช้งานได้ อยากให้คุณช่วยดูและแนะนำให้ค่ะ ขอบคุณล่วงหน้าค่ะ

    Private Sub cmd_editdata_Click()

    CurrentDb.Execute "UPDATE tb_data " & _
    "SET staff = '" & Me.txt_staff.Value & _
    "', date = " & toSTR(Me.txt_date) & _
    ", barcode = " & Me.txt_barcode.Value & _
    ", item = " & Me.txt_item.Value & _
    "', section = " & Me.cbo_section & _
    "', remark = " & Me.txt_remark.Value & _
    "', claim = " & Me.txt_claim.Value & _
    "', status = " & Me.chk_status.Value & _
    "', amount_repeating = " & Me.chk_amount_repeating.Value & _
    "', penalty_mth = " & Me.txt_penalty_mth.Value & _
    "', cashier = " & Me.cbo_cashier & _
    " WHERE id_data = " & Me.list_data.Column(0)

    Me.list_data.Requery
    Call MsgBox("แก้ไขข้อมูลเรียบร้อย")

    End Sub

    หรือพอจะมีช่องทางการติดต่อไหมคะ ดิฉันอยากได้คำแนะนำจริงๆค่ะ

    ตอบลบ