วันอังคารที่ 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 ให้เลือกมุมมองแบบ ออกแบบ และคลิกปุ่ม ดังภาพ



วันอาทิตย์ที่ 7 มิถุนายน พ.ศ. 2558

การใช้โปรแกรม Inno Setup ช่วยติดตั้งโปรแกรม


โปรแกรม Inno Setup พัฒนาโดย Jordan Russell เป็นโปรแกรมฟรี (Freeware) สำหรับสร้าง โปรแกรมการติดตั้ง หรือ Setup บนเครื่องคอมพิวเตอร์ ซึ่งเป็นที่นิยมใช้กันมาก และมีประสิทธิภาพสูง รุ่นล่าสูดในขณะนี้ คือ รุ่น 5.5.5

สำหรับรุ่น 5.5.5 นี้ยังไม่มีภาษาไทยรองรับ แต่สามารถจัดการให้มีได้ โดยการแก้ไขไฟล์ default.isl

วิธีการใช้งาน

ดาวน์โหลดโปรแกรมได้ที่ http://www.jrsoftware.org และนำมาติดตั้งบนเครื่องคอมพิวเตอร์

วิธีการใช้โปรแกรม

เปิดโปรแกรม จะมีหน้าจอปรากฎให้เลือกวิธีการสร้างไฟล์ติดตั้ง ในตอนแรกให้เลือกใช้ตัวช่วยสร้าง หรือ Wizard ทำให้ไม่ต้องเขียนสคริปเอง 


ทำตามหน้าจอ โดยคลิก OK และ คลิก Next เพื่อกำหนดไฟล์ที่จะให้ติดตั้งและไฟล์ประกอบอื่น ๆ

เมื่อทำตามหน้าจอเสร็จแล้ว ให้บันทึกเป็นไฟล์ นามสกุล *.iss ซึ่งเป็น script สำหรับสร้างไฟล์ติดตั้งโปรแกรม ภายหลังสามารถเปิดไฟล์นี้มาแก้ไขได้ ไม่ต้องสร้างใหม่

เมื่อบันทึกเป็นไฟล์ *.iss แล้ว โปรแกรม inno จะเปิดไฟล์นี้ ซึ่งสามารถแก้ไขเพิ่มเติม เช่น เปลี่ยน folder สำหรับติดตั้ง ซึ่งของเดิม หรือ Default จะติดตั้งไว้ในห้อง Program Files

จากนั้น ให้ลอง Run เพื่อดูการทำงาน

เมื่อพร้อมที่จะสร้างไฟล์ *.exe สำหรับติดตั้ง ให้คลิก Build และกำหนดห้องสำหรับเก็บไฟล์ exe เป็นอันเสร็จการสร้างไฟล์สำหรับติดตั้งโปรแกรม


ปัญหาและการแก้ไข

1. การเพิ่มภาษาไทย

แม้ว่าโปรแกรมจะสามารถใช้ได้หลายภาษา แต่ภาษาไทย สำหรับรุ่นนี้ รุ่น 5.5.5 ยังไม่มี ทำให้เมื่อจัดการ Complie แล้ว หน้าจอจะเป็นภาษาอังกฤษ

การแก้ไข
ให้เปิดไฟล์ Default.isl ซึ่งเป็นไฟล์สำหรับภาษาอังกฤษ ไฟล์นี้ อยู่ในห้องที่ติดตั้งโปรแกรม Inno Setup และนำมาแก้ไขเพิ่มเติม โดยการเพิ่มภาษาไทย เช่น

; *** "Welcome" wizard page
WelcomeLabel1=ยินดีต้อนรับ [name] Setup Wizard
WelcomeLabel2=ติดตั้ง [name/ver] บนคอมพิวเตอร์ของท่าน.%n%nIt is recommended that you close all other applications before continuing. (ควรปิดโปรแกรมที่เปิดค้างไว้อยู่ทั้งหมด ก่อนการติดตั้งโปรแกรมนี้)

เมื่อผู้ใช้ เรียกใช้งาน ข้อความจะปรากฎ ดังนี้



2. การกำหนด Default Directory สำหรับติดตั้งโปรแกรม

โปรแกรม Windows มีระบบ User Control ซึ่งควบคุมการติดตั้งและใช้งานโปรแกรม การติดตั้งโปรแกรมถ้าจะให้ทำงานได้ดี ควรติดตั้งโปรแกรมในห้อง Documents ของผู้ใช้คนที่กำลังใช้งาน อย่างไรก็ตาม ค่าเริ่มต้น หรือ ค่า Default ที่จะให้ติดตั้งโปรแกรมที่ Inno Setup กำหนด อยู่ในห้อง Program Files ในกรณีของโปรแกรม Microsoft Access ถ้าติดตั้งในห้องนี้ จะอยู่ในสถานะ อ่านอย่างเดียว หรือ Read Only ซึ่งทำให้เกิดปัญหา ผู้ใช้ต้องคัดลอกไปไว้ที่อื่น จึงจะสามารถใช้งานได้

การแก้ไข

หลังจากที่ Wizard สร้างสคริป นามสกุล .iss เรียบร้อยแล้ว ให้เข้าไปแก้ไขโค้ด โดยเปลี่ยนค่า สำหรับ DefaultDirName โดยกำหนดให้เป็นห้อง Documents ดังนี้

ของเดิม

DefaultDirName={pf}\{#MyAppName}

เปลี่ยนใหม่เป็น

DefaultDirName={userdocs}\{#MyAppName}

เมื่อเรียกใช้งาน ค่า Default ที่จะติดตั้งโปรแกรม จะอยู่ในห้อง Documents



3. ป้ญหา Font ในสคริป ไฟล์ .iss ไม่อ่านภาษาไทย กลายเป็นภาษาต่างดาว

การแก้ไข

เมื่อเปิดไฟล์สคริป iss แล้ว ให้ไปที่ Tools > Options > Font และเลือก Font ภาษาไทย และกำหนดให้เป็นภาษาไทย ไม่ใช่ Western


4. การสร้าง Shortcut Icon ที่หน้าจอ ถ้าต้องการให้ทีเครื่องหมายถูกคลิกเลือก ปรากฎ ให้ลบ flag ข้างท้ายออก (รวมทั้งเครื่องหมาย ; ด้วย)
               ของเดิม
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
               แก้ไขแล้ว
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

5. การกำหนดชื่อ Shortcut
     ปกติ โปรแกร inno จะใช้ชื่อโปรแกรมที่กำหนดสำหรับการติดตั้ง เป็นชื่อ shortcut ถ้าต้องการเปลี่ยน ให้ define ชื่อใหม่ และนำไปใช้เป็นชื่อ Shortcut
     การ define ชื่อ
     การนำไปใช้


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

การเปลี่ยนสีตัวอักษรตามเงื่อนไขบนรายงาน ของ Access 2010

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

วิธีนี้ถ้าจะใช้ VBA กำหนดลักษณะของตัวอักษรใน Control ก็สามารถทำได้ แต่มีวิธีที่ง่ายกว่ามาก คือการใช้การกำหนดรูปแบบตามเงื่อนไข ซึ่งทำได้ ดังนี้

    1. เปิดรายงาน ในมุมมองออกแบบ
    2. ในตัวอย่างนี้ ต้องการกำหนดเงื่อนไข ตามจำนวนเดือนที่เหลือ คือ ถ้าเหลือ 1 เดือน กำหนดให้ตัวอักษรเป็นสีชมพู ถ้าไม่เหลือเดือน ให้กำหนดสีตัวอักษร เป็นสีแดง
    3. Control ที่มีข้อมูลจำนวนเดือนที่เหลือ คือ monthsLeft ซึ่งเราจะใช้เป็นตัวกำหนดเงื่อนข
    4. คลิกเลือก Control ที่ต้องการให้ตัวอักษรเปลี่ยนทั้งหมด
    5. ไปที่เมนู รูปแบบ >  การจัดรูปแบบตามเงื่อนไข
    6. คลิกสร้างกฎ ซึ่งเป็นการระบุว่า ต้องการสร้างเงื่อนไขเพื่อจัดรูปแบบ
    7. จะเปิดหน้าต่างใหม่ ให้เลือก นิพจน์ที่จำเป็น เพื่อสร้างเงื่อนไขเอง และในช่องเงื่อนไข ให้พิมพ์เงื่อนไขที่ต้องการ ในที่นี้คือ ถ้าข้อมูลในฟิลด์ [monthsLeft] น้อยกว่าหรือเท่ากับ 0
    8. เลือกรูปแบบที่ต้องการให้แสดง ตามที่มีในหน้าจอ สามารถกำหนดได้ทั้งสีพื้น และตัวอักษร ในตัวอย่าง กำหนดเป็นตัวอักษรหนา สีแดง
    9. คลิกปุ่ม ตกลง
    10. ในกรณีของสีชมพู ต้องสร้างกฎเพิ่ม โดยคลิกที่ สร้างกฎ และทำตามขั้นตอนที่ 7-9 เงือนไข หรือกฎ คือ [monthsLeft] = 1
    11. เมื่อเสร็จแล้ว จะเห็นมีกฎ อยู่ 2 กฎ ซึ่งเป็นเงื่อนไขสำหรับ Control ที่เราเลือกไว้ในตอนที่ 4
    12. ในหน้าจอนี้ สามารถกลับมาแก้ไขได้ โดยคลิกที่ปุ่ม แก้ไขกฎ 
    13. คลิกปุ่มตกลง
    14. เมื่อดูแบบฟอร์ม จะเห็นข้อมูลเปลี่ยนสีตามที่ต้องการ