วันอังคารที่ 23 มิถุนายน พ.ศ. 2558

เทคนิค Access VBA

เป็นเทคนิค 4 อย่าง ที่เขียนเอาไว้ กันลืม

  • การใช้ฟอร์มย่อย หรือ subform
  • การใช้ Lookup ในฟิลด์ของตาราง
  • การสร้างฟอร์มค้นหาข้อมูล หรือ Search
  • การยกเลิก Layout
  1. การใช้ฟอร์มย่อย หรือ subform
    1. การอ้างอิง Control ใน ฟอร์มย่อย จากฟอร์มหลัก ใช้รูปแบบ คือ
      Forms![main form name]![subform control name].Form![control name]
      -Forms เป็นการอ้างถึง Collection ของฟอร์ม
      - [main form name]  คือชื่อฟอร์มหลัก
      - [subform control name] คือชื่อที่ตั้งเป็นชื่อ Control สำหรับใส่ฟอร์มย่อย ไม่ใช่ชื่อฟอร์มย่อย แต่ก็อาจจะเป็นชื่อเดียวกันได้ ถ้าตั้งชื่อเหมือนกัน นั่นคือ ฟอร์มย่อย ต้องอยู่ใน Control ของฟอร์มหลัก เวลาอ้างถึงจึงต้องอ้างชื่อของ Control ที่เป็นที่อยู่ของฟอร์มย่อย


      -Form หมายถึงฟอร์มย่อย
      -[control name] คือชื่อของ control ที่ต้องการอ้างถึง

      ตัวอย่าง

      Forms![frmLearnerUpdate]![learner_subform].Form![txtFname]

      สามารถทำให้สั้นเข้า โดยใช้เครื่องหมาย . แทนเครื่องหมาย ! และใช้คำว่า Me แทนฟอร์มหลัก เช่น

      Me.[learner_subform].Form.[txtFname]
    2. การเปิดฟอร์มย่อยแบบว่าง ๆ โดยไม่มีข้อมูลใด ๆ ดังภาพ

      โดยปกติ ถ้ากำหนดฟอร์มย่อย ให้ไปยัง Record ใหม่ (ใช้คำสั่ง DoCmd.GoToRecord , , acNewRec) จะทำให้แสดงฟอร์มที่ว่าง ไม่มีข้อมูล หรืออาจจะกำหนดที่ on load event ของ ฟอร์มย่อย โดยกำหนดเงื่อนไขของ RecordSource ของฟอร์มย่อย ให้มีข้อมูลในฟิลด์หลัก เป็นว่าง หรือ Null ก็จะไม่แสดงข้อมูลใด ๆ แต่จะแสดงเฉพาะแบบฟอร์มว่าง ๆ เหมือนภาพข้างบน เช่น ที่ onLoad even ของฟอร์มหลัก กำหนดให้ RecordSource ของฟอร์มย่อย มีฟิลด์หลักเป็นว่าง ดังนี้

      Private Sub Form_Load()
             Me.teacherUpdate_subForm.Form.RecordSource = "SELECT * FROM " & _
             "tblTeachers WHERE id is null"
      End Sub

      อย่างไรก็ตาม ถ้ามีการกำหนดให้ฟอร์มย่อยนั้น ไม่สามารถเพิ่มฟิลด์ใหม่ได้ เช่น มีการกำหนดใน Property Sheet ของฟอร์มย่อย ไม่อนุญาตให้มีการเพิ่มใหม่ หรือ Allow Additions

      หรือมีการใช้คำสั่ง AllowAdditions = False เพื่อห้ามการเพิ่ม Record ก็จะไม่สามารถไปยัง Record ใหม่ได้ เพราะมีการสั่งห้ามเอาไว้ ผลก็คือ แทนที่จะมีฟอร์มว่าง ๆ แต่จะไม่ปรากฏว่ามีฟอร์มใด ๆ ให้เห็นเลย จะเห็นเป็นส่วนที่ว่าง ดังภาพ


      อย่างนี้ก็ดีไปอีกแบบ แล้วแต่ละเลือกเอาว่า จะให้มีฟอร์มย่อยปรากฎ หรือจะให้เป็นพื้นที่ว่าง ก็สามารถทำได้ ผมชอบว่า ถ้ากำหนดฟอร์มย่อยเป็นแบบ Continuous Forms การเว้นที่ว่างไว้ก่อนจะดีกว่า เมื่อคลิกเพื่อให้แสดงข้อมูล จึงจะปรากฏข้อมูลเป็นแถว ๆ ลงมา ดังภาพ

    3. การ Lock ฟอร์มย่อยเมื่อเปิด บางครั้งต้องการเปิดฟอร์มย่อย แต่ยังไม่อนุญาตให้คลิกกรอกข้อมูล หรือทำกิจกรรมใด ๆ กับฟอร์มย่อย จนกว่าจะคลิกปุ่ม หรือทำกิจกรรมที่กำหนดบนฟอร์มหลักเสียก่อน การ Lock ฟอร์มย่อย ให้ทำที่ฟอร์มหลัก เช่น เมื่อเปิดฟอร์มหลัก ก็ให้กำหนด control ของฟอร์มย่อย ไม่ให้เข้าถึงได้ โดยกำหนดให้ enabled เป็น False เช่น

      Forms![frmLearnerUpdate]![learner_subform].Enabled = False

      การ unlock ก็ทำได้ โดยกำหนด ให้ enabled เป็น true เช่น

      Forms![frmLearnerUpdate]![learner_subform].Enabled = True
  2. การใช้ Lookup ในฟิลด์ของตาราง
         การใช้ Lookup ในตาราง ช่วยทำให้ดูข้อมูลในฟิลด์ของตารางนั้น ๆ ง่ายขึ้น เช่น ฟิลด์ที่เก็บข้อมูลหมายเลขประจำตัวของสมาชิก ที่เป็น Foreign Key จะเก็บเป็นตัวเลข แต่เราสามารถใช้ Lookup เพื่อให้ Access ไปค้นหาชื่อในตารางที่เก็บข้อมูลสมาชิก โดยให้นำชื่อมาแสดงได้ แต่การเก็บข้อมูล ก็จะเก็บเป็นตัวเลข

    เมื่อดูข้อมูลแบบตาราง จะเห็นว่า ฟิลด์ หมายเลขประจำตัว และรหัสวิชา เป็นชื่อ ไม่ใช่ตัวเลข แต่ข้อมูลจริงที่ Access เก็บ จะเก็บเป็นตัวเลข

    การนำไปใช้

    ในกรณีที่ต้องการสร้างฟอร์มเพื่อปรับ/แก้ไขข้อมูล การใช้ Lookup ฟิลด์ จะสะดวกมาก โดยเฉพาะถ้ากำหนดให้เป็น Combobox เพราะสามารถเลือกเปลี่ยนข้อมูล โดยใช้ข้อมูลที่มีอยุ่แล้วในตารางอื่น ซึ่ง ถ้าจะะขียนเป็นโค้ด ก็ทำได้ แต่ใช้ Lookup สะดวกกว่าไม่ต้องเขึยนโค้ด เช่น การเปลี่ยนชื่อผู้รับผิดชอบโครงการ หรือ การเปลี่ยนสถานที่ ซึ่งมีอยุ่ในฐานข้อมูลในตารางอื่น

  3. การสร้างฟอร์มค้นหาข้อมูล หรือ Search
    สมมติว่า มีข้อมูลการจัดการอบรมหลักสูตรต่าง ๆ

    ในตัวอย่าง ฟิล์ดสถานที่จัดอบรม และผู้รับผิดชอบ เก็บข้อมูลเป็นตัวเลข แต่ใช้ lookup เพื่อนำข้อมูลจากตารางอื่นมาแสดง จึงเห็นเป็นชื่อสถานที่ และชื่อผู้รับผิดชอบ

    ในตัวอย่างนี้ จะเป็นการสร้างฟอร์มให้ค้นหาหลักสูตร เพื่อแก้ไขข้อมูล สถานที่จัดและผู้รับผิดชอบ

    หลักการ

    สร้างฟอร์มโดยมี ตารางข้างต้น เป็น RecordSource ใช้ส่วนหัวของฟอร์ม เพื่อสร้าง Text box สำหรับคำค้นหา  ทั้งนี้โดยกำหนดฟอร์ม เป็นแบบต่อเนื่อง เพื่อให้แสดงหลายรายการ ในการค้นหาใช้คำสั่ง SQL เพื่อเปลี่ยน RecordSource ตามคำค้นที่ใช้เป็นเงื่อนไข

    วิธีการ
    1. สร้างฟอร์มใหม่ เป็นชนิด Continuous form กำหนด RecordSource คือ ตาราง tblCoursePlan ตั้งชื่อฟอร์มนี้ว่า frmSearch
    2. กำหนดไม่ให้สร้าง Recordใหม่ โดยกำหนดที่  Property Sheet ของฟอร์มนี้ และกำหนดให้ Allow Additions เป็น  No การกำหนดเช่นนี้ จะทำให้ผู้ใช้ไม่สามารถคลิกเพื่อเพิ่ม รายการใหม่ได้
    3. ที่ส่วนหัวของฟอร์ม สร้าง Text box ตั้งชื่อว่า txtSearch  และปุ่ม ใช้ข้อความปุ่มว่า ค้นหา ตั้งชื่อว่า cmdOK และนำ Field ในตารางมาวาง ในส่วนของ Detail ดังภาพ
    4. กำหนดให้เมื่อเปิดฟอร์ม เป็นฟอร์มว่าง ไม่เห็นข้อมูลในตาราง โดยเขียนคำสั่ง ที่ on load ของฟอร์ม ดังนี้

      การกำหนดเงื่อนไข ให้ฟิลด์ เป็น null จะทำให้ไม่มีข้อมูล จะแสดง Record ใหม่ที่ว่าง q แต่เราได้กำหนดว่า ไม่ให้สร้าง Record ใหม่ ดังนั้น จะไม่มีอะไรปรากฏให้เห็น นอกจากหัวของฟอร์มเท่านั้น ดังนี้
    5. เขียนคำสั่งที่ on click ของปุ่ม เพื่อให้ปรับ RecordSource ของฟอร์ม เพื่อให้ค้นหาชื่อหลักสูตร และนำข้อมูลมาแสดง ตามเงื่อนไขที่กำหนดใน text box ดังนี้ 

      เนื่องจาก ชื่อหลักสูตรเป็นข้อความ จึงต้องมีการใช้เครื่องหมายคำพูดคร่อมด้วย
    6. เมื่อนำมาแสดง จะได้ผลการค้นหาตามที่ต้องการ
    7. ถ้าต้องการให้ค้นหาในหลายฟิลด์ ก็เพิ่มเงื่อนไข OR ก็จะทำให้ สามารถค้นหาได้หลายฟิลด์
    8. มีข้อสังเกตว่า ถ้าเป็นฟิลด์ในตารางที่มีการใช้ Lookup จะไม่สามารถใช้คำที่เห็นปรากฏ เป็นคำค้นได้ เนื่องจากข้อมูลในตารางจริง เป็นตัวเลข ส่วนที่เห็นเป็นการนำมาแสดง จึงไม่สามารถใช้เป็นเงื่อนไขคำค้นได้ ถ้าจะใช้ ต้องเป็นตัวเลขที่เก็บในตารางจริงเท่านั้น


  4. การยกเลิก Layout
        Access 2010 มีการสร้าง layout ถ้าสร้างแบบฟอร์มโดยคลิกปุ่มฟอร์ม แต่ปัญหาคือ การเคลื่อนย้ายตำแหน่งไม่ค่อยสะดวก ถ้าจะยกเลิกการ Layout ให้เลือกมุมมองแบบ ออกแบบ และคลิกปุ่ม ดังภาพ



ไม่มีความคิดเห็น:

แสดงความคิดเห็น